8c60c1ea5ad66c3aa936d9497be5403c986031c5
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-event-receiver.c
1 /*
2  * bluetooth-frwk
3  *
4  * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *              http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <dbus/dbus-glib.h>
21 #include <dbus/dbus-glib-lowlevel.h>
22 #include <dbus/dbus.h>
23 #include <glib.h>
24 #include <string.h>
25 #include <dlog.h>
26 #include <vconf.h>
27 #include <vconf-internal-bt-keys.h>
28
29 #include "bluetooth-api.h"
30 #include "bt-internal-types.h"
31
32 #include "bt-service-common.h"
33 #include "bt-service-event.h"
34 #include "bt-service-main.h"
35 #include "bt-service-adapter.h"
36 #include "bt-service-device.h"
37 #include "bt-service-obex-server.h"
38 #include "bt-service-rfcomm-server.h"
39 #include "bt-service-opp-client.h"
40 #include "bt-service-audio.h"
41
42 static DBusGConnection *manager_conn = NULL;
43 static DBusGConnection *obexd_conn = NULL;
44 static DBusGConnection *opc_obexd_conn = NULL;
45 static GList *g_list = NULL;
46
47 static guint event_id;
48
49 static bt_remote_dev_info_t *__bt_parse_device_properties(DBusMessageIter *item_iter)
50 {
51         DBusMessageIter value_iter;
52         char *value;
53         bt_remote_dev_info_t *dev_info;
54
55         dbus_message_iter_recurse(item_iter, &value_iter);
56
57         if (dbus_message_iter_get_arg_type(&value_iter) != DBUS_TYPE_DICT_ENTRY) {
58                 BT_DBG("No entry");
59                 return NULL;
60         }
61
62         dev_info = g_malloc0(sizeof(bt_remote_dev_info_t));
63
64         while (dbus_message_iter_get_arg_type(&value_iter) ==
65                                                 DBUS_TYPE_DICT_ENTRY) {
66                 char *key;
67                 DBusMessageIter dict_entry;
68                 DBusMessageIter iter_dict_val;
69
70                 dbus_message_iter_recurse(&value_iter, &dict_entry);
71
72                 dbus_message_iter_get_basic(&dict_entry, &key);
73
74                 if (key == NULL) {
75                         dbus_message_iter_next(&value_iter);
76                         continue;
77                 }
78
79                 if (!dbus_message_iter_next(&dict_entry)) {
80                         dbus_message_iter_next(&value_iter);
81                         continue;
82                 }
83                 dbus_message_iter_recurse(&dict_entry, &iter_dict_val);
84
85                 if (strcasecmp(key, "Address") == 0) {
86                         const char *address = NULL;
87                         dbus_message_iter_get_basic(&iter_dict_val, &address);
88                         dev_info->address = g_strdup(address);
89                 } else if (strcasecmp(key, "Class") == 0) {
90                         dbus_message_iter_get_basic(&iter_dict_val, &dev_info->class);
91                 } else if (strcasecmp(key, "name") == 0) {
92                         dbus_message_iter_get_basic(&iter_dict_val, &value);
93                         if (dev_info->name == NULL)
94                                 dev_info->name = g_strdup(value);
95                 } else if (strcasecmp(key, "Connected") == 0) {
96                         dbus_message_iter_get_basic(&iter_dict_val,
97                                                 &dev_info->connected);
98                 } else if (strcasecmp(key, "paired") == 0) {
99                         dbus_message_iter_get_basic(&iter_dict_val,
100                                                 &dev_info->paired);
101                 } else if (strcasecmp(key, "Trusted") == 0) {
102                         dbus_message_iter_get_basic(&iter_dict_val,
103                                                 &dev_info->trust);
104                 } else if (strcasecmp(key, "RSSI") == 0) {
105                         dbus_message_iter_get_basic(&iter_dict_val,
106                                                 &dev_info->rssi);
107                 } else if (strcasecmp(key, "UUIDs") == 0) {
108                         DBusMessageIter uuid_iter;
109                         DBusMessageIter tmp_iter;
110                         int i = 0;
111
112                         dbus_message_iter_recurse(&iter_dict_val, &uuid_iter);
113
114                         tmp_iter = uuid_iter;
115
116                         /* Store the uuid count */
117                         while (dbus_message_iter_get_arg_type(&tmp_iter) != DBUS_TYPE_INVALID) {
118                                 dbus_message_iter_get_basic(&tmp_iter,
119                                                         &value);
120
121                                 dev_info->uuid_count++;
122                                 if (!dbus_message_iter_next(&tmp_iter))
123                                         break;
124                         }
125
126                         /* Store the uuids */
127                         if (dev_info->uuid_count > 0) {
128                                 dev_info->uuids = g_new0(char *,
129                                                 dev_info->uuid_count + 1);
130                         } else {
131                                 dbus_message_iter_next(&value_iter);
132                                 continue;
133                         }
134
135                         while (dbus_message_iter_get_arg_type(&uuid_iter) != DBUS_TYPE_INVALID) {
136                                 dbus_message_iter_get_basic(&uuid_iter,
137                                                         &value);
138                                 dev_info->uuids[i] = g_strdup(value);
139                                 i++;
140                                 if (!dbus_message_iter_next(&uuid_iter)) {
141                                         break;
142                                 }
143                         }
144
145                 }
146
147                 dbus_message_iter_next(&value_iter);
148         }
149
150         return dev_info;
151 }
152
153 void __bt_parse_media_properties(DBusMessageIter *item_iter)
154 {
155         DBusMessageIter value_iter;
156         char *address = NULL;
157         char *uuid = NULL;
158         int result = BLUETOOTH_ERROR_NONE;
159
160         dbus_message_iter_recurse(item_iter, &value_iter);
161
162         if (dbus_message_iter_get_arg_type(&value_iter) !=
163                                         DBUS_TYPE_DICT_ENTRY) {
164                 BT_DBG("No entry");
165                 return;
166         }
167
168         while (dbus_message_iter_get_arg_type(&value_iter) ==
169                                         DBUS_TYPE_DICT_ENTRY) {
170                 char *key;
171                 DBusMessageIter dict_entry;
172                 DBusMessageIter iter_dict_val;
173
174                 dbus_message_iter_recurse(&value_iter, &dict_entry);
175                 dbus_message_iter_get_basic(&dict_entry, &key);
176
177                 if (key == NULL) {
178                         dbus_message_iter_next(&value_iter);
179                         continue;
180                 }
181
182                 if (!dbus_message_iter_next(&dict_entry)) {
183                         dbus_message_iter_next(&value_iter);
184                         continue;
185                 }
186
187                 dbus_message_iter_recurse(&dict_entry, &iter_dict_val);
188
189                 BT_DBG("key: %s", key);
190
191                 if (strcasecmp(key, "Device") == 0) {
192                         char *object_path = NULL;
193
194                         dbus_message_iter_get_basic(&iter_dict_val, &object_path);
195                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
196                         _bt_convert_device_path_to_address(object_path, address);
197
198                 }else if (strcasecmp(key, "UUID") == 0) {
199                         dbus_message_iter_get_basic(&iter_dict_val, &uuid);
200                 }
201
202                 dbus_message_iter_next(&value_iter);
203         }
204
205         if (address != NULL && uuid != NULL){
206                 int event = BLUETOOTH_EVENT_AV_CONNECTED;
207                 char connected_address[BT_ADDRESS_STRING_SIZE + 1];
208                 bluetooth_device_address_t device_address;
209                 gboolean connected;
210
211                 _bt_send_event(BT_HEADSET_EVENT, event,
212                         DBUS_TYPE_INT32, &result,
213                         DBUS_TYPE_STRING, &address,
214                         DBUS_TYPE_INVALID);
215
216                 connected = _bt_is_headset_type_connected(BT_AUDIO_A2DP,
217                                                 connected_address);
218                 if (connected) {
219                         if (g_strcmp0(connected_address, address) != 0) {
220                                 _bt_convert_addr_string_to_type(
221                                         device_address.addr,
222                                         connected_address);
223                                 _bt_audio_disconnect(0, BT_AUDIO_A2DP,
224                                         &device_address, NULL);
225                         }
226                 }
227
228                 _bt_add_headset_to_list(BT_AUDIO_A2DP,
229                                         BT_STATE_CONNECTED, address);
230
231                 g_free(address);
232         }
233 }
234
235 static void __bt_parse_audio_properties(DBusMessage *msg)
236 {
237         DBusMessageIter msg_iter;
238         DBusMessageIter value_iter;
239
240         ret_if(dbus_message_iter_init(msg, &msg_iter) == FALSE);
241
242         /* object array (oa) */
243         ret_if(dbus_message_iter_next(&msg_iter) == FALSE);
244         ret_if(dbus_message_iter_get_arg_type(&msg_iter) !=
245                                         DBUS_TYPE_ARRAY);
246
247         dbus_message_iter_recurse(&msg_iter, &value_iter);
248
249         /* string array (sa) */
250         while (dbus_message_iter_get_arg_type(&value_iter) ==
251                                         DBUS_TYPE_DICT_ENTRY) {
252                 char *interface_name = NULL;
253                 DBusMessageIter interface_iter;
254
255                 dbus_message_iter_recurse(&value_iter, &interface_iter);
256
257                 ret_if(dbus_message_iter_get_arg_type(&interface_iter) !=
258                                                 DBUS_TYPE_STRING);
259
260                 dbus_message_iter_get_basic(&interface_iter, &interface_name);
261
262                 ret_if(dbus_message_iter_next(&interface_iter) == FALSE);
263
264                 ret_if(dbus_message_iter_get_arg_type(&interface_iter) !=
265                                         DBUS_TYPE_ARRAY);
266
267                 BT_DBG("interface: %s", interface_name);
268
269                 if (g_strcmp0(interface_name,
270                                 "org.bluez.MediaTransport1") == 0) {
271                         __bt_parse_media_properties(&interface_iter);
272                         return;
273                 }
274                 dbus_message_iter_next(&value_iter);
275         }
276
277         return;
278 }
279
280 static int __bt_parse_event(DBusMessage *msg)
281 {
282         DBusMessageIter msg_iter;
283         DBusMessageIter value_iter;
284
285         retv_if(dbus_message_iter_init(msg, &msg_iter) == FALSE, 0);
286
287         /* object array (oa) */
288         retv_if(dbus_message_iter_next(&msg_iter) == FALSE, 0);
289         retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
290                                         DBUS_TYPE_ARRAY, 0);
291
292         dbus_message_iter_recurse(&msg_iter, &value_iter);
293
294         /* string array (sa) */
295         while (dbus_message_iter_get_arg_type(&value_iter) ==
296                                         DBUS_TYPE_DICT_ENTRY) {
297                 char *interface_name = NULL;
298                 DBusMessageIter interface_iter;
299
300                 dbus_message_iter_recurse(&value_iter, &interface_iter);
301
302                 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
303                                                 DBUS_TYPE_STRING, 0);
304
305                 dbus_message_iter_get_basic(&interface_iter,
306                                                 &interface_name);
307
308                 retv_if(dbus_message_iter_next(&interface_iter) == FALSE,
309                                                                 0);
310
311                 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
312                                         DBUS_TYPE_ARRAY, 0);
313
314                 BT_DBG("interface: %s", interface_name);
315
316                 if (g_strcmp0(interface_name,
317                                         "org.bluez.Device1") == 0) {
318                         return BT_DEVICE_EVENT;
319                 }else if (g_strcmp0(interface_name,
320                                 "org.bluez.MediaTransport1") == 0) {
321                         return BT_MEDIA_TRANSFER_EVENT;
322                 }
323                 dbus_message_iter_next(&value_iter);
324         }
325
326         return 0;
327 }
328
329 static int __bt_parse_remove_event(DBusMessage *msg)
330 {
331         DBusMessageIter msg_iter;
332         DBusMessageIter value_iter;
333
334         retv_if(dbus_message_iter_init(msg, &msg_iter) ==
335                                         FALSE, 0);
336
337         retv_if(dbus_message_iter_next(&msg_iter) == FALSE,
338                                                 0);
339         retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
340                                         DBUS_TYPE_ARRAY, 0);
341
342         dbus_message_iter_recurse(&msg_iter, &value_iter);
343
344         while (dbus_message_iter_get_arg_type(&value_iter)
345                                         != DBUS_TYPE_INVALID) {
346                 char *key;
347
348                 dbus_message_iter_get_basic(&value_iter, &key);
349
350                 if (key == NULL) {
351                         dbus_message_iter_next(&value_iter);
352                         continue;
353                 }
354
355                 BT_DBG("key = %s", key);
356
357                 if (g_strcmp0(key, "org.bluez.MediaTransport1") == 0) {
358                         return BT_MEDIA_TRANSFER_EVENT;
359                 }else if (g_strcmp0(key, "org.bluez.Device1") == 0) {
360                         return BT_DEVICE_EVENT;
361                 }
362                 dbus_message_iter_next(&value_iter);
363         }
364
365         return 0;
366 }
367
368 gboolean  _bt_parse_audio_remove_properties(DBusMessage *msg)
369 {
370         DBusMessageIter msg_iter;
371         DBusMessageIter value_iter;
372         char *object_path = NULL;
373         char *address = NULL;
374         int result = BLUETOOTH_ERROR_NONE;
375         bt_headset_wait_t *wait_list;
376
377         retv_if(dbus_message_iter_init(msg, &msg_iter) == FALSE, FALSE);
378
379         dbus_message_iter_get_basic(&msg_iter, &object_path);
380         retv_if(object_path == NULL, FALSE);
381
382         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
383         _bt_convert_device_path_to_address(object_path, address);
384
385         retv_if(dbus_message_iter_next(&msg_iter) == FALSE, FALSE);
386         retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
387                                         DBUS_TYPE_ARRAY, FALSE);
388
389         dbus_message_iter_recurse(&msg_iter, &value_iter);
390
391         while (dbus_message_iter_get_arg_type(&value_iter)
392                                         != DBUS_TYPE_INVALID) {
393                 char *key;
394
395                 dbus_message_iter_get_basic(&value_iter, &key);
396
397                 if (key == NULL) {
398                         dbus_message_iter_next(&value_iter);
399                         continue;
400                 }
401
402                 BT_DBG("key = %s", key);
403
404                 if (g_strcmp0(key, "org.bluez.MediaTransport1") == 0) {
405                         int event = BLUETOOTH_EVENT_AV_DISCONNECTED;
406
407                                 _bt_send_event(BT_HEADSET_EVENT, event,
408                                         DBUS_TYPE_INT32, &result,
409                                         DBUS_TYPE_STRING, &address,
410                                         DBUS_TYPE_INVALID);
411
412                         /* Remove data from the connected list */
413                         _bt_remove_headset_from_list(BT_AUDIO_A2DP, address);
414                         wait_list = _bt_get_audio_wait_data();
415
416                         if (wait_list == NULL) {
417                                 g_free(address);
418                                 return TRUE;
419                         }
420
421                         if (((wait_list->type == BT_AUDIO_ALL) &&
422                                 (wait_list->ag_flag == TRUE)) ||
423                                 (wait_list->type == BT_AUDIO_A2DP) ||
424                                 (wait_list->disconnection_type == BT_AUDIO_A2DP)) {
425                                 bluetooth_device_address_t device_address;
426                                 _bt_convert_addr_string_to_type(
427                                                         device_address.addr,
428                                                         wait_list->address);
429
430                                 _bt_audio_connect(wait_list->req_id,
431                                                         wait_list->type,
432                                                         &device_address,
433                                                         wait_list->out_param1);
434                         }
435
436                         g_free(address);
437                         return TRUE;
438                 }
439                 dbus_message_iter_next(&value_iter);
440         }
441
442         g_free(address);
443         return FALSE;
444 }
445
446 static bt_remote_dev_info_t *__bt_parse_interface(DBusMessage *msg)
447 {
448         DBusMessageIter msg_iter;
449         DBusMessageIter value_iter;
450         char *object_path = NULL;
451         bt_remote_dev_info_t *dev_info = NULL;
452
453         retv_if(dbus_message_iter_init(msg, &msg_iter) == FALSE, NULL);
454
455         dbus_message_iter_get_basic(&msg_iter, &object_path);
456         retv_if(object_path == NULL, NULL);
457
458         /* object array (oa) */
459         retv_if(dbus_message_iter_next(&msg_iter) == FALSE, NULL);
460         retv_if(dbus_message_iter_get_arg_type(&msg_iter) !=
461                                 DBUS_TYPE_ARRAY, NULL);
462
463         dbus_message_iter_recurse(&msg_iter, &value_iter);
464
465         /* string array (sa) */
466         while (dbus_message_iter_get_arg_type(&value_iter) ==
467                                         DBUS_TYPE_DICT_ENTRY) {
468                 char *interface_name = NULL;
469                 DBusMessageIter interface_iter;
470
471                 dbus_message_iter_recurse(&value_iter, &interface_iter);
472
473                 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
474                         DBUS_TYPE_STRING, NULL);
475
476                 dbus_message_iter_get_basic(&interface_iter, &interface_name);
477
478                 retv_if(dbus_message_iter_next(&interface_iter) == FALSE, NULL);
479
480                 retv_if(dbus_message_iter_get_arg_type(&interface_iter) !=
481                         DBUS_TYPE_ARRAY, NULL);
482
483                 BT_DBG("interface: %s", interface_name);
484
485                 if (g_strcmp0(interface_name, "org.bluez.Device1") == 0) {
486                         BT_DBG("Found a device: %s", object_path);
487
488                         dev_info = __bt_parse_device_properties(&interface_iter);
489
490                         if (dev_info == NULL) {
491                                 BT_ERR("Fail to parse the properies");
492                                 return NULL;
493                         }
494                 }
495
496                 dbus_message_iter_next(&value_iter);
497         }
498
499         return dev_info;
500 }
501
502 char *__bt_get_headset_name(char *address)
503 {
504         bluetooth_device_address_t device_address = { {0} };
505         bluetooth_device_info_t dev_info;
506
507         retv_if(address == NULL, strdup(""));
508
509         _bt_convert_addr_string_to_type(device_address.addr, address);
510
511         memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
512
513         _bt_get_bonded_device_info(&device_address, &dev_info);
514
515         return g_strdup(dev_info.device_name.name);
516 }
517
518 static int __bt_get_owner_info(DBusMessage *msg, char **name,
519                                 char **previous, char **current)
520 {
521         DBusMessageIter item_iter;
522
523         dbus_message_iter_init(msg, &item_iter);
524
525         if (dbus_message_iter_get_arg_type(&item_iter)
526                                         != DBUS_TYPE_STRING) {
527                 BT_ERR("This is bad format dbus\n");
528                 return BLUETOOTH_ERROR_INTERNAL;
529         }
530
531         dbus_message_iter_get_basic(&item_iter, name);
532
533         retv_if(*name == NULL, BLUETOOTH_ERROR_INTERNAL);
534
535         dbus_message_iter_next(&item_iter);
536
537         if (dbus_message_iter_get_arg_type(&item_iter)
538                                         != DBUS_TYPE_STRING) {
539                 BT_ERR("This is bad format dbus\n");
540                 return BLUETOOTH_ERROR_INTERNAL;
541         }
542
543         dbus_message_iter_get_basic(&item_iter, previous);
544
545         retv_if(*previous == NULL, BLUETOOTH_ERROR_INTERNAL);
546
547         dbus_message_iter_next(&item_iter);
548
549         if (dbus_message_iter_get_arg_type(&item_iter)
550                                         != DBUS_TYPE_STRING) {
551                 BT_ERR("This is bad format dbus\n");
552                 return BLUETOOTH_ERROR_INTERNAL;
553         }
554
555         dbus_message_iter_get_basic(&item_iter, current);
556
557         retv_if(*current == NULL, BLUETOOTH_ERROR_INTERNAL);
558
559         return BLUETOOTH_ERROR_NONE;
560 }
561
562 static int __bt_get_agent_signal_info(DBusMessage *msg, char **address,
563                                 char **name, char **uuid)
564 {
565         DBusMessageIter item_iter;
566
567         dbus_message_iter_init(msg, &item_iter);
568
569         if (dbus_message_iter_get_arg_type(&item_iter)
570                                         != DBUS_TYPE_STRING) {
571                 BT_ERR("This is bad format dbus\n");
572                 return BLUETOOTH_ERROR_INTERNAL;
573         }
574
575         dbus_message_iter_get_basic(&item_iter, address);
576
577         dbus_message_iter_next(&item_iter);
578
579         if (dbus_message_iter_get_arg_type(&item_iter)
580                                         != DBUS_TYPE_STRING) {
581                 BT_ERR("This is bad format dbus\n");
582                 return BLUETOOTH_ERROR_INTERNAL;
583         }
584
585         dbus_message_iter_get_basic(&item_iter, name);
586
587         dbus_message_iter_next(&item_iter);
588
589         if (dbus_message_iter_get_arg_type(&item_iter)
590                                         != DBUS_TYPE_STRING) {
591                 BT_ERR("This is bad format dbus\n");
592                 return BLUETOOTH_ERROR_INTERNAL;
593         }
594
595         dbus_message_iter_get_basic(&item_iter, uuid);
596
597         return BLUETOOTH_ERROR_NONE;
598 }
599
600 void _bt_handle_adapter_event(DBusMessage *msg)
601 {
602         int result = BLUETOOTH_ERROR_NONE;
603         DBusMessageIter item_iter;
604         const char *member = dbus_message_get_member(msg);
605
606         ret_if(member == NULL);
607
608         if (strcasecmp(member, "DeviceCreated") == 0) {
609                 const char *object_path = NULL;
610                 char *address;
611                 bt_remote_dev_info_t *remote_dev_info;
612
613                 ret_if(_bt_is_device_creating() == FALSE);
614
615                 /* Bonding from remote device */
616                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
617
618                 dbus_message_iter_init(msg, &item_iter);
619                 dbus_message_iter_get_basic(&item_iter, &object_path);
620                 dbus_message_iter_next(&item_iter);
621
622                 _bt_convert_device_path_to_address(object_path, address);
623
624                 remote_dev_info = _bt_get_remote_device_info(address);
625                 if (remote_dev_info == NULL) {
626                         g_free(address);
627                         return;
628                 }
629
630                 _bt_free_device_info(remote_dev_info);
631                 g_free(address);
632         } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
633                 const char *object_path = NULL;
634                 char *address;
635                 bt_remote_dev_info_t * dev_info;
636                 GList * node;
637
638                 /* Bonding from remote device */
639                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
640
641                 dbus_message_iter_init(msg, &item_iter);
642                 dbus_message_iter_get_basic(&item_iter, &object_path);
643                 dbus_message_iter_next(&item_iter);
644
645                 _bt_convert_device_path_to_address(object_path, address);
646
647                 _bt_send_event(BT_ADAPTER_EVENT,
648                         BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
649                         DBUS_TYPE_INT32, &result,
650                         DBUS_TYPE_STRING, &address,
651                         DBUS_TYPE_INVALID);
652
653                 node = g_list_first(g_list);
654
655                 while (node != NULL){
656                         dev_info = (bt_remote_dev_info_t *)node->data;
657                         if (strcasecmp(dev_info->address,
658                                                         address) == 0) {
659                                 g_list = g_list_remove(g_list, dev_info);
660                                 _bt_free_device_info(dev_info);
661                                 break;
662                         }
663                         node = g_list_next(node);
664                 }
665
666                 g_free(address);
667         }
668 }
669
670 gboolean _bt_stop_discovery_timeout_cb(gpointer user_data)
671 {
672         DBusGProxy *adapter_proxy;
673
674         event_id = 0;
675
676         adapter_proxy = _bt_get_adapter_proxy();
677         retv_if(adapter_proxy == NULL, FALSE);
678
679         /* Need to stop searching */
680         dbus_g_proxy_call(adapter_proxy,
681                                 "StopDiscovery",
682                                 NULL,
683                                 G_TYPE_INVALID,
684                                 G_TYPE_INVALID);
685
686         return FALSE;
687 }
688
689 void _bt_stop_discovery_timeout(void)
690 {
691         if (event_id > 0)
692                 return;
693
694         event_id = g_timeout_add(BT_STOP_DISCOVERY_TIMEOUT,
695                 (GSourceFunc)_bt_stop_discovery_timeout_cb, NULL);
696 }
697
698 static gboolean __bt_discovery_finished()
699 {
700         int result = BLUETOOTH_ERROR_NONE;
701
702         if (_bt_get_cancel_by_user() == TRUE) {
703                 result = BLUETOOTH_ERROR_CANCEL_BY_USER;
704         }
705
706         _bt_set_cancel_by_user(FALSE);
707         _bt_set_discovery_status(FALSE);
708         _bt_send_event(BT_ADAPTER_EVENT,
709                 BLUETOOTH_EVENT_DISCOVERY_FINISHED,
710                 DBUS_TYPE_INT32, &result,
711                 DBUS_TYPE_INVALID);
712
713         return FALSE;
714 }
715
716 void __bt_adapter_property_changed_event(DBusMessageIter *msg_iter, const char *path)
717 {
718         DBusGProxy *adapter_proxy;
719         int mode = 0;
720         int result = BLUETOOTH_ERROR_NONE;
721         DBusMessageIter value_iter;
722         DBusMessageIter dict_iter;
723         DBusMessageIter item_iter;
724         GValue timeout = { 0 };
725         const char *property = NULL;
726
727         dbus_message_iter_recurse(msg_iter, &item_iter);
728
729         if (dbus_message_iter_get_arg_type(&item_iter)
730                                         != DBUS_TYPE_DICT_ENTRY) {
731                 BT_ERR("This is bad format dbus\n");
732                 return;
733         }
734
735         dbus_message_iter_recurse(&item_iter, &dict_iter);
736
737         dbus_message_iter_get_basic(&dict_iter, &property);
738         ret_if(property == NULL);
739
740         ret_if(!dbus_message_iter_next(&dict_iter));
741
742         if (strcasecmp(property, "Discovering") == 0) {
743                 gboolean discovering = FALSE;
744
745                 dbus_message_iter_recurse(&dict_iter, &value_iter);
746                 dbus_message_iter_get_basic(&value_iter, &discovering);
747
748                 /* Send event to application */
749                 if (discovering == TRUE) {
750                         _bt_set_discovery_status(TRUE);
751                         _bt_send_event(BT_ADAPTER_EVENT,
752                                 BLUETOOTH_EVENT_DISCOVERY_STARTED,
753                                 DBUS_TYPE_INT32, &result,
754                                 DBUS_TYPE_INVALID);
755                         _bt_get_temp_remote_devinfo();
756                 } else {
757                         if (event_id > 0){
758                                 g_source_remove(event_id);
759                                 event_id = 0;
760                         }
761                         __bt_discovery_finished();
762                 }
763         } else if (strcasecmp(property, "Name") == 0) {
764                 char *name = NULL;
765
766                 dbus_message_iter_recurse(&dict_iter, &value_iter);
767                 dbus_message_iter_get_basic(&value_iter, &name);
768
769                 /* Send event to application */
770                 _bt_send_event(BT_ADAPTER_EVENT,
771                                 BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
772                                 DBUS_TYPE_INT32, &result,
773                                 DBUS_TYPE_STRING, &name,
774                                 DBUS_TYPE_INVALID);
775         } else if (strcasecmp(property, "Discoverable") == 0) {
776                 gboolean discoverable = FALSE;
777
778                 dbus_message_iter_recurse(&dict_iter, &value_iter);
779                 dbus_message_iter_get_basic(&value_iter, &discoverable);
780
781                 if (discoverable == FALSE) {
782                         if (_bt_get_discoverable_timeout_property() > 0) {
783                                 g_value_init(&timeout, G_TYPE_UINT);
784                                 g_value_set_uint(&timeout, 0);
785
786                                 adapter_proxy = _bt_get_adapter_properties_proxy();
787                                 ret_if(adapter_proxy == NULL);
788
789                                 dbus_g_proxy_call_no_reply(adapter_proxy, "Set",
790                                                 G_TYPE_STRING, BT_ADAPTER_INTERFACE,
791                                                 G_TYPE_STRING, "DiscoverableTimeout",
792                                                 G_TYPE_VALUE, &timeout,
793                                                 G_TYPE_INVALID);
794
795                                 g_value_unset(&timeout);
796                         }
797
798                         mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
799
800                         /* Send event to application */
801                         _bt_send_event(BT_ADAPTER_EVENT,
802                                         BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
803                                         DBUS_TYPE_INT32, &result,
804                                         DBUS_TYPE_INT16, &mode,
805                                         DBUS_TYPE_INVALID);
806                 } else {
807                         _bt_get_discoverable_mode(&mode);
808
809                         /* Event will be sent by "DiscoverableTimeout" signal */
810                         ret_if(mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE);
811
812                         /* Send event to application */
813                         _bt_send_event(BT_ADAPTER_EVENT,
814                                         BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
815                                         DBUS_TYPE_INT32, &result,
816                                         DBUS_TYPE_INT16, &mode,
817                                         DBUS_TYPE_INVALID);
818                 }
819         } else if (strcasecmp(property, "DiscoverableTimeout") == 0) {
820                 _bt_get_discoverable_mode(&mode);
821
822                 /* Event was already sent by "Discoverable" signal */
823                 ret_if(mode == BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE);
824
825                 /* Send event to application */
826                 _bt_send_event(BT_ADAPTER_EVENT,
827                                 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
828                                 DBUS_TYPE_INT32, &result,
829                                 DBUS_TYPE_INT16, &mode,
830                                 DBUS_TYPE_INVALID);
831         }
832 }
833
834 static void __bt_device_remote_connected_properties(
835                                 bt_remote_dev_info_t *remote_dev_info,
836                                 char *address, gboolean connected)
837 {
838         int result = BLUETOOTH_ERROR_NONE;
839         int i;
840
841         BT_DBG("+");
842
843         if (remote_dev_info->uuid_count > 0 ) {
844                 for (i = 0; i<remote_dev_info->uuid_count; i++) {
845                         char *uuid = remote_dev_info->uuids[i];
846                         if (strcasecmp(uuid, HID_UUID) == 0){
847                                 int event = BLUETOOTH_EVENT_NONE;
848
849                                 event = (connected == TRUE) ?
850                                         BLUETOOTH_HID_CONNECTED :
851                                         BLUETOOTH_HID_DISCONNECTED;
852
853                                 _bt_send_event(BT_HID_EVENT, event,
854                                         DBUS_TYPE_INT32, &result,
855                                         DBUS_TYPE_STRING, &address,
856                                         DBUS_TYPE_INVALID);
857                                 break;
858                         }
859                 }
860         }
861
862         BT_DBG("-");
863 }
864
865 void __bt_device_property_changed_event(DBusMessageIter *msg_iter, const char *path)
866 {
867         int event;
868         int result = BLUETOOTH_ERROR_NONE;
869         DBusMessageIter value_iter;
870         DBusMessageIter dict_iter;
871         DBusMessageIter item_iter;
872         const char *property = NULL;
873         char *address;
874         bt_remote_dev_info_t *remote_dev_info;
875
876         dbus_message_iter_recurse(msg_iter, &item_iter);
877
878         do {
879                 if (dbus_message_iter_get_arg_type(&item_iter)
880                                                 != DBUS_TYPE_DICT_ENTRY) {
881                         BT_ERR("This is bad format dbus\n");
882                         return;
883                 }
884
885                 dbus_message_iter_recurse(&item_iter, &dict_iter);
886
887                 dbus_message_iter_get_basic(&dict_iter, &property);
888                 ret_if(property == NULL);
889
890                 ret_if(!dbus_message_iter_next(&dict_iter));
891
892                 if (strcasecmp(property, "Connected") == 0) {
893                         gboolean connected = FALSE;
894
895                         dbus_message_iter_recurse(&dict_iter, &value_iter);
896                         dbus_message_iter_get_basic(&value_iter, &connected);
897
898                         event = connected ? BLUETOOTH_EVENT_DEVICE_CONNECTED :
899                                         BLUETOOTH_EVENT_DEVICE_DISCONNECTED;
900
901                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
902
903                         _bt_convert_device_path_to_address(path, address);
904
905                         BT_DBG("connected: %d", connected);
906                         BT_DBG("address: %s", address);
907
908                         remote_dev_info = _bt_get_remote_device_info(address);
909
910                         if (remote_dev_info != NULL) {
911                                 __bt_device_remote_connected_properties(
912                                 remote_dev_info, address, connected);
913                         }
914
915                         /* Send event to application */
916                         _bt_send_event(BT_DEVICE_EVENT,
917                                         event,
918                                         DBUS_TYPE_INT32, &result,
919                                         DBUS_TYPE_STRING, &address,
920                                         DBUS_TYPE_INVALID);
921
922                         g_free(address);
923
924                 } else if (strcasecmp(property, "Paired") == 0) {
925                         gboolean paired = FALSE;
926                         bt_remote_dev_info_t *remote_dev_info;
927
928                         dbus_message_iter_recurse(&dict_iter, &value_iter);
929                         dbus_message_iter_get_basic(&value_iter, &paired);
930
931                         ret_if(paired == FALSE);
932
933                         /* BlueZ sends paired signal for each paired device */
934                         /* during activation, We should ignore this, otherwise*/
935                         /* application thinks that a new device got paired */
936                         if (_bt_adapter_get_status() != BT_ACTIVATED) {
937                                 BT_DBG("BT is not activated, so ignore this");
938                                 return;
939                         }
940
941                         if (_bt_is_device_creating() == TRUE) {
942                                 BT_DBG("Try to Pair by me");
943                                 return;
944                         }
945
946                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
947
948                         _bt_convert_device_path_to_address(path, address);
949
950                         remote_dev_info = _bt_get_remote_device_info(address);
951                         if (remote_dev_info == NULL) {
952                                 g_free(address);
953                                 return;
954                         }
955
956                         _bt_send_event(BT_ADAPTER_EVENT,
957                                 BLUETOOTH_EVENT_BONDING_FINISHED,
958                                 DBUS_TYPE_INT32, &result,
959                                 DBUS_TYPE_STRING, &address,
960                                 DBUS_TYPE_UINT32, &remote_dev_info->class,
961                                 DBUS_TYPE_INT16, &remote_dev_info->rssi,
962                                 DBUS_TYPE_STRING, &remote_dev_info->name,
963                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
964                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
965                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
966                                 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
967                                 &remote_dev_info->uuids, remote_dev_info->uuid_count,
968                                 DBUS_TYPE_INVALID);
969
970                         _bt_free_device_info(remote_dev_info);
971                         g_free(address);
972                 }
973         } while (dbus_message_iter_next(&item_iter));
974 }
975
976 void __bt_obex_property_changed_event(DBusMessageIter *msg_iter, const char *path)
977 {
978         DBusMessageIter value_iter;
979         DBusMessageIter dict_iter;
980         DBusMessageIter item_iter;
981         const char *property = NULL;
982
983         dbus_message_iter_recurse(msg_iter, &item_iter);
984
985         if (dbus_message_iter_get_arg_type(&item_iter)
986                                         != DBUS_TYPE_DICT_ENTRY) {
987                 BT_ERR("This is bad format dbus\n");
988                 return;
989         }
990
991         dbus_message_iter_recurse(&item_iter, &dict_iter);
992
993         dbus_message_iter_get_basic(&dict_iter, &property);
994         ret_if(property == NULL);
995
996         ret_if(!dbus_message_iter_next(&dict_iter));
997
998         if (strcasecmp(property, "Status") == 0) {
999                 const char  *status;
1000                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1001                 dbus_message_iter_get_basic(&value_iter, &status);
1002
1003                 if (strcasecmp(status, "active") == 0){
1004                         _bt_obex_transfer_started(path);
1005                 }else if (strcasecmp(status, "complete") == 0) {
1006                         _bt_obex_transfer_completed(path, TRUE);
1007                 }else if (strcasecmp(status, "error") == 0){
1008                         _bt_obex_transfer_completed(path, FALSE);
1009                 }
1010         } else if (strcasecmp(property, "Transferred") == 0) {
1011                 static int transferred  = 0;
1012                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1013                 dbus_message_iter_get_basic(&value_iter, &transferred);
1014
1015                 _bt_obex_transfer_progress(path,transferred);
1016         }
1017 }
1018
1019 void _bt_handle_input_event(DBusMessage *msg)
1020 {
1021         int result = BLUETOOTH_ERROR_NONE;
1022         DBusMessageIter item_iter;
1023         DBusMessageIter value_iter;
1024         gboolean property_flag = FALSE;
1025         const char *member = dbus_message_get_member(msg);
1026         const char *path = dbus_message_get_path(msg);
1027         const char *property = NULL;
1028
1029         ret_if(member == NULL);
1030
1031         dbus_message_iter_init(msg, &item_iter);
1032
1033         if (dbus_message_iter_get_arg_type(&item_iter)
1034                                         != DBUS_TYPE_STRING) {
1035                 BT_ERR("This is bad format dbus\n");
1036                 return;
1037         }
1038
1039         dbus_message_iter_get_basic(&item_iter, &property);
1040
1041         ret_if(property == NULL);
1042
1043         if (strcasecmp(property, "Connected") == 0) {
1044                 int event = BLUETOOTH_EVENT_NONE;
1045                 char *address;
1046
1047                 dbus_message_iter_next(&item_iter);
1048                 dbus_message_iter_recurse(&item_iter, &value_iter);
1049                 dbus_message_iter_get_basic(&value_iter, &property_flag);
1050
1051                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1052
1053                 _bt_convert_device_path_to_address(path, address);
1054
1055                 event = (property_flag == TRUE) ?
1056                                 BLUETOOTH_HID_CONNECTED :
1057                                 BLUETOOTH_HID_DISCONNECTED;
1058
1059                 _bt_send_event(BT_HID_EVENT, event,
1060                         DBUS_TYPE_INT32, &result,
1061                         DBUS_TYPE_STRING, &address,
1062                         DBUS_TYPE_INVALID);
1063
1064                 g_free(address);
1065         }
1066  }
1067
1068 void _bt_handle_network_server_event(DBusMessage *msg)
1069 {
1070         int result = BLUETOOTH_ERROR_NONE;
1071         char *address = NULL;
1072         char *device = NULL;
1073         const char *member = dbus_message_get_member(msg);
1074
1075         ret_if(member == NULL);
1076
1077         if (strcasecmp(member, "PeerConnected") == 0) {
1078                 if (!dbus_message_get_args(msg, NULL,
1079                         DBUS_TYPE_STRING, &device,
1080                         DBUS_TYPE_STRING, &address,
1081                         DBUS_TYPE_INVALID)) {
1082                         BT_ERR("Unexpected parameters in signal");
1083                         return;
1084                 }
1085
1086                 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1087                         DBUS_TYPE_INT32, &result,
1088                         DBUS_TYPE_STRING, &device,
1089                         DBUS_TYPE_STRING, &address,
1090                         DBUS_TYPE_INVALID);
1091         } else if (strcasecmp(member, "PeerDisconnected") == 0) {
1092                 if (!dbus_message_get_args(msg, NULL,
1093                         DBUS_TYPE_STRING, &device,
1094                         DBUS_TYPE_STRING, &address,
1095                         DBUS_TYPE_INVALID)) {
1096                         BT_ERR("Unexpected parameters in signal");
1097                         return;
1098                 }
1099
1100                 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1101                         DBUS_TYPE_INT32, &result,
1102                         DBUS_TYPE_STRING, &device,
1103                         DBUS_TYPE_STRING, &address,
1104                         DBUS_TYPE_INVALID);
1105         }
1106 }
1107
1108 void __bt_handle_network_client_event(DBusMessageIter *msg_iter, const char *path)
1109 {
1110         int result = BLUETOOTH_ERROR_NONE;
1111         DBusMessageIter item_iter;
1112         DBusMessageIter value_iter;
1113         DBusMessageIter dict_iter;
1114         gboolean property_flag = FALSE;
1115         const char *property = NULL;
1116
1117         dbus_message_iter_recurse(msg_iter, &item_iter);
1118
1119         if (dbus_message_iter_get_arg_type(&item_iter)
1120                                 != DBUS_TYPE_DICT_ENTRY) {
1121                 BT_ERR("This is bad format dbus\n");
1122                 return;
1123         }
1124
1125         dbus_message_iter_recurse(&item_iter, &dict_iter);
1126         dbus_message_iter_get_basic(&dict_iter, &property);
1127
1128         ret_if(property == NULL);
1129
1130         ret_if(!dbus_message_iter_next(&dict_iter));
1131
1132         if (strcasecmp(property, "Connected") == 0) {
1133                 int event = BLUETOOTH_EVENT_NONE;
1134                 char *address;
1135
1136                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1137                 dbus_message_iter_get_basic(&value_iter, &property_flag);
1138
1139                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1140
1141                 _bt_convert_device_path_to_address(path, address);
1142
1143                 if (property_flag == TRUE) {
1144                         event = BLUETOOTH_EVENT_NETWORK_CONNECTED;
1145                 } else {
1146                         event = BLUETOOTH_EVENT_NETWORK_DISCONNECTED;
1147                 }
1148
1149                 _bt_send_event(BT_NETWORK_EVENT, event,
1150                         DBUS_TYPE_INT32, &result,
1151                         DBUS_TYPE_STRING, &address,
1152                         DBUS_TYPE_INVALID);
1153
1154                 g_free(address);
1155         }
1156 }
1157
1158 void _bt_handle_device_event(DBusMessage *msg)
1159 {
1160         int event;
1161         int result = BLUETOOTH_ERROR_NONE;
1162         DBusMessageIter item_iter;
1163         DBusMessageIter value_iter;
1164         char *address;
1165         const char *member = dbus_message_get_member(msg);
1166         const char *path = dbus_message_get_path(msg);
1167         const char *property = NULL;
1168
1169         ret_if(path == NULL);
1170         ret_if(member == NULL);
1171
1172         if (strcasecmp(member, "PropertyChanged") == 0) {
1173                 dbus_message_iter_init(msg, &item_iter);
1174
1175                 if (dbus_message_iter_get_arg_type(&item_iter)
1176                                                 != DBUS_TYPE_STRING) {
1177                         BT_ERR("This is bad format dbus\n");
1178                         return;
1179                 }
1180
1181                 dbus_message_iter_get_basic(&item_iter, &property);
1182
1183                 ret_if(property == NULL);
1184
1185                 if (strcasecmp(property, "Connected") == 0) {
1186                         gboolean connected = FALSE;
1187                         dbus_message_iter_next(&item_iter);
1188                         dbus_message_iter_recurse(&item_iter, &value_iter);
1189                         dbus_message_iter_get_basic(&value_iter, &connected);
1190
1191                         event = connected ? BLUETOOTH_EVENT_DEVICE_CONNECTED :
1192                                         BLUETOOTH_EVENT_DEVICE_DISCONNECTED;
1193
1194                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1195
1196                         _bt_convert_device_path_to_address(path, address);
1197
1198                         BT_DBG("connected: %d", connected);
1199                         BT_DBG("address: %s", address);
1200
1201                         /* Send event to application */
1202                         _bt_send_event(BT_DEVICE_EVENT,
1203                                         event,
1204                                         DBUS_TYPE_INT32, &result,
1205                                         DBUS_TYPE_STRING, &address,
1206                                         DBUS_TYPE_INVALID);
1207
1208                         g_free(address);
1209                 } else if (strcasecmp(property, "Paired") == 0) {
1210                         gboolean paired = FALSE;
1211                         bt_remote_dev_info_t *remote_dev_info;
1212                         dbus_message_iter_next(&item_iter);
1213                         dbus_message_iter_recurse(&item_iter, &value_iter);
1214                         dbus_message_iter_get_basic(&value_iter, &paired);
1215
1216                         ret_if(paired == FALSE);
1217
1218                         /* BlueZ sends paired signal for each paired device */
1219                         /* during activation, We should ignore this, otherwise*/
1220                         /* application thinks that a new device got paired */
1221                         if (_bt_adapter_get_status() != BT_ACTIVATED) {
1222                                 BT_DBG("BT is not activated, so ignore this");
1223                                 return;
1224                         }
1225
1226                         if (_bt_is_device_creating() == TRUE) {
1227                                 BT_DBG("Try to Pair by me");
1228                                 return;
1229                         }
1230
1231                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1232
1233                         _bt_convert_device_path_to_address(path, address);
1234
1235                         remote_dev_info = _bt_get_remote_device_info(address);
1236                         if (remote_dev_info == NULL) {
1237                                 g_free(address);
1238                                 return;
1239                         }
1240
1241                         _bt_send_event(BT_ADAPTER_EVENT,
1242                                 BLUETOOTH_EVENT_BONDING_FINISHED,
1243                                 DBUS_TYPE_INT32, &result,
1244                                 DBUS_TYPE_STRING, &address,
1245                                 DBUS_TYPE_UINT32, &remote_dev_info->class,
1246                                 DBUS_TYPE_INT16, &remote_dev_info->rssi,
1247                                 DBUS_TYPE_STRING, &remote_dev_info->name,
1248                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
1249                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
1250                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
1251                                 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1252                                 &remote_dev_info->uuids, remote_dev_info->uuid_count,
1253                                 DBUS_TYPE_INVALID);
1254
1255                         _bt_free_device_info(remote_dev_info);
1256                         g_free(address);
1257                 }
1258         }
1259 }
1260
1261 void __bt_handle_media_control_event(DBusMessageIter *msg_iter,
1262                                                 const char *path)
1263 {
1264         int result = BLUETOOTH_ERROR_NONE;
1265         DBusMessageIter item_iter;
1266         DBusMessageIter value_iter;
1267         DBusMessageIter dict_iter;
1268         gboolean property_flag = FALSE;
1269         const char *property = NULL;
1270
1271         dbus_message_iter_recurse(msg_iter, &item_iter);
1272
1273         if (dbus_message_iter_get_arg_type(&item_iter)
1274                                 != DBUS_TYPE_DICT_ENTRY) {
1275                 BT_ERR("This is bad format dbus\n");
1276                 return;
1277         }
1278
1279         dbus_message_iter_recurse(&item_iter, &dict_iter);
1280
1281         dbus_message_iter_get_basic(&dict_iter, &property);
1282         ret_if(property == NULL);
1283
1284         ret_if(!dbus_message_iter_next(&dict_iter));
1285
1286         if (strcasecmp(property, "Connected") == 0) {
1287                 int event = BLUETOOTH_EVENT_NONE;
1288                 char *address;
1289
1290                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1291                 dbus_message_iter_get_basic(&value_iter, &property_flag);
1292
1293                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1294
1295                 _bt_convert_device_path_to_address(path, address);
1296
1297                 event = (property_flag == TRUE) ?
1298                                 BLUETOOTH_EVENT_AV_CONNECTED :
1299                                 BLUETOOTH_EVENT_AV_DISCONNECTED;
1300
1301                 _bt_send_event(BT_AVRCP_EVENT, event,
1302                         DBUS_TYPE_INT32, &result,
1303                         DBUS_TYPE_STRING, &address,
1304                 DBUS_TYPE_INVALID);
1305
1306                 g_free(address);
1307         }
1308 }
1309
1310 void _bt_handle_property_changed_event(DBusMessage *msg)
1311 {
1312         DBusMessageIter item_iter;
1313         const char *member = dbus_message_get_member(msg);
1314         const char *interface_name = NULL;
1315
1316         ret_if(member == NULL);
1317
1318         dbus_message_iter_init(msg, &item_iter);
1319
1320         if (dbus_message_iter_get_arg_type(&item_iter)
1321                                         != DBUS_TYPE_STRING) {
1322                 BT_ERR("This is bad format dbus\n");
1323                 return;
1324         }
1325
1326         dbus_message_iter_get_basic(&item_iter, &interface_name);
1327
1328         ret_if(interface_name == NULL);
1329
1330         BT_DBG("interface: %s", interface_name);
1331
1332         ret_if(dbus_message_iter_next(&item_iter) == FALSE);
1333
1334         ret_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY);
1335
1336         if (strcasecmp(interface_name, BT_ADAPTER_INTERFACE) == 0) {
1337                 __bt_adapter_property_changed_event(&item_iter,
1338                                         dbus_message_get_path(msg));
1339         } else if (strcasecmp(interface_name, BT_DEVICE_INTERFACE) == 0) {
1340                 __bt_device_property_changed_event(&item_iter,
1341                                         dbus_message_get_path(msg));
1342         } else if (strcasecmp(interface_name,
1343                                         BT_OBEX_TRANSFER_INTERFACE) == 0) {
1344                 __bt_obex_property_changed_event(&item_iter,
1345                                         dbus_message_get_path(msg));
1346         } else if (strcasecmp(interface_name,
1347                                         BT_MEDIA_CONTROL_INTERFACE) == 0) {
1348                 __bt_handle_media_control_event(&item_iter,
1349                                         dbus_message_get_path(msg));
1350         } else if (strcasecmp(interface_name,
1351                                         BT_NETWORK_CLIENT_INTERFACE) == 0) {
1352                 __bt_handle_network_client_event(&item_iter,
1353                                         dbus_message_get_path(msg));
1354         } else {
1355                 BT_DBG("No bluez interface");
1356         }
1357 }
1358
1359 void __bt_set_audio_values(gboolean connected, char *address)
1360 {
1361         char *name = NULL;
1362         int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
1363
1364         /*  Set the headset name */
1365         if (connected == TRUE) {
1366                 name = __bt_get_headset_name(address);
1367         } else {
1368                 name = g_strdup("");
1369         }
1370
1371         if (vconf_set_str(VCONFKEY_BT_HEADSET_NAME,
1372                                         name) != 0) {
1373                 BT_ERR("vconf_set_str failed");
1374         }
1375
1376         g_free(name);
1377
1378         /*  Set the headset state */
1379         if (vconf_get_int(VCONFKEY_BT_DEVICE,
1380                                 &bt_device_state) != 0) {
1381                 BT_ERR("vconf_get_str failed");
1382         }
1383
1384         if (connected == TRUE) {
1385                 bt_device_state |= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
1386         } else if (bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED) {
1387                 bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
1388         }
1389
1390         if (vconf_set_int(VCONFKEY_BT_DEVICE,
1391                                 bt_device_state) != 0) {
1392                 BT_ERR("vconf_set_int failed");
1393         }
1394 }
1395
1396 void _bt_handle_headset_event(DBusMessage *msg)
1397 {
1398         int result = BLUETOOTH_ERROR_NONE;
1399         DBusMessageIter item_iter;
1400         DBusMessageIter value_iter;
1401         gboolean property_flag = FALSE;
1402         const char *member = dbus_message_get_member(msg);
1403         const char *path = dbus_message_get_path(msg);
1404         const char *property = NULL;
1405
1406         ret_if(member == NULL);
1407
1408         dbus_message_iter_init(msg, &item_iter);
1409
1410         if (dbus_message_iter_get_arg_type(&item_iter)
1411                                         != DBUS_TYPE_STRING) {
1412                 BT_ERR("This is bad format dbus\n");
1413                 return;
1414         }
1415
1416         dbus_message_iter_get_basic(&item_iter, &property);
1417
1418         ret_if(property == NULL);
1419
1420         /* We allow only 1 headset connection (HSP or HFP)*/
1421         if (strcasecmp(property, "Connected") == 0) {
1422                 int event = BLUETOOTH_EVENT_NONE;
1423                 char *address;
1424
1425                 dbus_message_iter_next(&item_iter);
1426                 dbus_message_iter_recurse(&item_iter, &value_iter);
1427                 dbus_message_iter_get_basic(&value_iter, &property_flag);
1428
1429                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1430
1431                 _bt_convert_device_path_to_address(path, address);
1432
1433                 if (property_flag == TRUE) {
1434                         event = BLUETOOTH_EVENT_AG_CONNECTED;
1435                 } else {
1436                         event = BLUETOOTH_EVENT_AG_DISCONNECTED;
1437                 }
1438
1439                 __bt_set_audio_values(property_flag, address);
1440
1441                 _bt_send_event(BT_HEADSET_EVENT, event,
1442                         DBUS_TYPE_INT32, &result,
1443                         DBUS_TYPE_STRING, &address,
1444                         DBUS_TYPE_INVALID);
1445
1446                 g_free(address);
1447         } else if (strcasecmp(property, "State") == 0) {
1448                 int event = BLUETOOTH_EVENT_NONE;
1449                 int sco_connected = FALSE;
1450                 char *state = NULL;
1451                 char *address;
1452
1453                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1454
1455                 _bt_convert_device_path_to_address(path, address);
1456
1457                 dbus_message_iter_next(&item_iter);
1458                 dbus_message_iter_recurse(&item_iter, &value_iter);
1459                 dbus_message_iter_get_basic(&value_iter, &state);
1460
1461                 /* This code assumes we support only 1 headset connection */
1462                 /* Need to use the headset list, if we support multi-headsets */
1463                 if (strcasecmp(property, "Playing") == 0) {
1464                         event = BLUETOOTH_EVENT_AG_AUDIO_CONNECTED;
1465                         sco_connected = TRUE;
1466                 } else if (strcasecmp(property, "connected") == 0 ||
1467                             strcasecmp(property, "disconnected") == 0) {
1468                         event = BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED;
1469                         sco_connected = FALSE;
1470                 } else {
1471                         BT_ERR("Not handled state");
1472                         g_free(address);
1473                         return;
1474                 }
1475
1476                 if (vconf_set_bool(VCONFKEY_BT_HEADSET_SCO, sco_connected) < 0)
1477                         BT_ERR("vconf_set_bool - Failed\n");
1478
1479                 _bt_send_event(BT_HEADSET_EVENT, event,
1480                         DBUS_TYPE_INT32, &result,
1481                         DBUS_TYPE_STRING, &address,
1482                         DBUS_TYPE_INVALID);
1483
1484                 g_free(address);
1485         } else if (strcasecmp(property, "SpeakerGain") == 0) {
1486                 guint16 spkr_gain;
1487                 char *address;
1488
1489                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1490
1491                 _bt_convert_device_path_to_address(path, address);
1492
1493                 dbus_message_iter_next(&item_iter);
1494                 dbus_message_iter_recurse(&item_iter, &value_iter);
1495                 dbus_message_iter_get_basic(&value_iter, &spkr_gain);
1496
1497                 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
1498                         DBUS_TYPE_INT32, &result,
1499                         DBUS_TYPE_STRING, &address,
1500                         DBUS_TYPE_UINT16, &spkr_gain,
1501                         DBUS_TYPE_INVALID);
1502
1503                 g_free(address);
1504         } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1505                 guint16 mic_gain;
1506                 char *address;
1507
1508                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1509
1510                 _bt_convert_device_path_to_address(path, address);
1511
1512                 dbus_message_iter_next(&item_iter);
1513                 dbus_message_iter_recurse(&item_iter, &value_iter);
1514                 dbus_message_iter_get_basic(&value_iter, &mic_gain);
1515
1516                 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_MIC_GAIN,
1517                         DBUS_TYPE_INT32, &result,
1518                         DBUS_TYPE_STRING, &address,
1519                         DBUS_TYPE_UINT16, &mic_gain,
1520                         DBUS_TYPE_INVALID);
1521
1522                 g_free(address);
1523         }
1524 }
1525
1526 void _bt_handle_agent_event(DBusMessage *msg)
1527 {
1528         const char *member = dbus_message_get_member(msg);
1529         int result = BLUETOOTH_ERROR_NONE;
1530         char *address = NULL;
1531         char *name = NULL;
1532         char *uuid = NULL;
1533
1534         ret_if(member == NULL);
1535
1536         if (strcasecmp(member, "ObexAuthorize") == 0) {
1537                 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
1538
1539                 _bt_send_event(BT_OPP_SERVER_EVENT,
1540                         BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1541                         DBUS_TYPE_INT32, &result,
1542                         DBUS_TYPE_STRING, &address,
1543                         DBUS_TYPE_STRING, &name,
1544                         DBUS_TYPE_INVALID);
1545         } else if (strcasecmp(member, "RfcommAuthorize") == 0) {
1546                 bt_rfcomm_server_info_t *server_info;
1547
1548                 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
1549
1550                 server_info = _bt_rfcomm_get_server_info_using_uuid(uuid);
1551                 ret_if(server_info == NULL);
1552                 ret_if(server_info->server_type != BT_CUSTOM_SERVER);
1553
1554                 _bt_send_event(BT_RFCOMM_SERVER_EVENT,
1555                         BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
1556                         DBUS_TYPE_INT32, &result,
1557                         DBUS_TYPE_STRING, &address,
1558                         DBUS_TYPE_STRING, &uuid,
1559                         DBUS_TYPE_STRING, &name,
1560                         DBUS_TYPE_INT16, &server_info->control_fd,
1561                         DBUS_TYPE_INVALID);
1562         }
1563 }
1564
1565 static int __bt_get_object_path(DBusMessage *msg, char **path)
1566 {
1567         DBusMessageIter item_iter;
1568
1569         dbus_message_iter_init(msg, &item_iter);
1570
1571         if (dbus_message_iter_get_arg_type(&item_iter)
1572                                         != DBUS_TYPE_OBJECT_PATH) {
1573                 BT_ERR("This is bad format dbus\n");
1574                 return BLUETOOTH_ERROR_INTERNAL;
1575         }
1576
1577         dbus_message_iter_get_basic(&item_iter, path);
1578
1579         if (*path == NULL)
1580                 return BLUETOOTH_ERROR_INTERNAL;
1581
1582         return BLUETOOTH_ERROR_NONE;
1583 }
1584
1585 static void __bt_devices_list_free()
1586 {
1587         bt_remote_dev_info_t *dev_info;
1588         GList *node;
1589
1590         node = g_list_first(g_list);
1591
1592         while (node != NULL){
1593                 dev_info = (bt_remote_dev_info_t *)node->data;
1594
1595                 g_list = g_list_remove(g_list, dev_info);
1596                 _bt_free_device_info(dev_info);
1597
1598                 node = g_list_next(node);
1599         }
1600 }
1601
1602 static DBusHandlerResult __bt_manager_event_filter(DBusConnection *conn,
1603                                            DBusMessage *msg, void *data)
1604 {
1605         const char *member = dbus_message_get_member(msg);
1606         bt_event_type_t bt_event;
1607
1608         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1609                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1610
1611         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1612
1613         if (strcasecmp(member, "InterfacesAdded") == 0) {
1614                 char *object_path = NULL;
1615
1616                 BT_DBG("InterfacesAdded");
1617
1618                 if (__bt_get_object_path(msg, &object_path)) {
1619                         BT_ERR("Fail to get the path");
1620                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1621                 }
1622
1623                 if (strcasecmp(object_path, BT_BLUEZ_HCI_PATH) == 0) {
1624                         _bt_handle_adapter_added();
1625                 } else {
1626                         bt_event = __bt_parse_event(msg);
1627
1628                         if (bt_event == BT_DEVICE_EVENT) {
1629                                 bt_remote_dev_info_t *dev_info;
1630                                 int result = BLUETOOTH_ERROR_NONE;
1631
1632                                 retv_if(_bt_is_discovering() == FALSE,
1633                                         DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1634
1635                                 dev_info = __bt_parse_interface(msg);
1636
1637                                 if (dev_info == NULL) {
1638                                         BT_ERR("Fail to parse the properies");
1639                                         return
1640                                         DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1641                                 }
1642
1643                                 if (dev_info->name == NULL)
1644                                         dev_info->name = g_strdup("");
1645
1646                                 _bt_send_event(BT_ADAPTER_EVENT,
1647                                         BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
1648                                         DBUS_TYPE_INT32, &result,
1649                                         DBUS_TYPE_STRING, &dev_info->address,
1650                                         DBUS_TYPE_UINT32, &dev_info->class,
1651                                         DBUS_TYPE_INT16, &dev_info->rssi,
1652                                         DBUS_TYPE_STRING, &dev_info->name,
1653                                         DBUS_TYPE_BOOLEAN, &dev_info->paired,
1654                                         DBUS_TYPE_BOOLEAN,
1655                                                         &dev_info->connected,
1656                                         DBUS_TYPE_BOOLEAN, &dev_info->trust,
1657                                         DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1658                                         &dev_info->uuids, dev_info->uuid_count,
1659                                         DBUS_TYPE_INVALID);
1660
1661                                 g_list = g_list_append(g_list, dev_info);
1662                         }else if (bt_event == BT_MEDIA_TRANSFER_EVENT) {
1663                                 __bt_parse_audio_properties(msg);
1664                         }
1665                 }
1666         } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1667                 BT_DBG("InterfacesRemoved");
1668                 bt_event = __bt_parse_remove_event(msg);
1669
1670                 if (bt_event == BT_MEDIA_TRANSFER_EVENT){
1671                         _bt_parse_audio_remove_properties(msg);
1672                 }else{
1673                         _bt_handle_adapter_event(msg);
1674                 }
1675         } else if (strcasecmp(member, "NameOwnerChanged") == 0) {
1676                 gboolean value;
1677                 char *name = NULL;
1678                 char *previous = NULL;
1679                 char *current = NULL;
1680
1681                 BT_DBG("NameOwnerChanged");
1682
1683                 if (__bt_get_owner_info(msg, &name, &previous, &current)) {
1684                         BT_ERR("Fail to get the owner info");
1685                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1686                 }
1687
1688                 if (*current != '\0')
1689                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1690
1691                 if (strcasecmp(name, "org.bluez") == 0) {
1692                         BT_DBG("Bluetoothd is terminated");
1693                         _bt_handle_adapter_removed();
1694                         __bt_devices_list_free();
1695                 }
1696
1697                 _bt_obex_server_check_allocation(&value);
1698
1699                 if (value == TRUE) {
1700                         /* Check if the obex server was terminated abnormally */
1701                         _bt_obex_server_check_termination(name);
1702                 }
1703
1704                 _bt_rfcomm_server_check_existence(&value);
1705
1706                 if (value == TRUE) {
1707                         /* The obex server was terminated abnormally */
1708                         _bt_rfcomm_server_check_termination(name);
1709                 }
1710         } else  if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1711                 _bt_handle_property_changed_event(msg);
1712         } else  if (dbus_message_has_interface(msg, BT_ADAPTER_INTERFACE)) {
1713                 _bt_handle_adapter_event(msg);
1714         } else  if (dbus_message_has_interface(msg, BT_INPUT_INTERFACE)) {
1715                 _bt_handle_input_event(msg);
1716         } else  if (dbus_message_has_interface(msg, BT_NETWORK_SERVER_INTERFACE)) {
1717                 _bt_handle_network_server_event(msg);
1718         } else  if (dbus_message_has_interface(msg, BT_HFP_AGENT_INTERFACE)) {
1719                 _bt_handle_headset_event(msg);
1720         } else  if (dbus_message_has_interface(msg, BT_AGENT_INTERFACE)) {
1721                 _bt_handle_agent_event(msg);
1722         } else  if (dbus_message_has_interface(msg, BT_DEVICE_INTERFACE)) {
1723                 _bt_handle_device_event(msg);
1724         }
1725
1726         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1727 }
1728
1729 static gboolean __bt_is_obexd_event(DBusMessage *msg)
1730 {
1731         const char *member = dbus_message_get_member(msg);
1732
1733         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1734                 return FALSE;
1735
1736         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1737
1738         if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1739
1740                 DBusMessageIter item_iter;
1741                 const char *interface_name = NULL;
1742
1743                 dbus_message_iter_init(msg, &item_iter);
1744
1745                 if (dbus_message_iter_get_arg_type(&item_iter)
1746                                         != DBUS_TYPE_STRING) {
1747                         BT_ERR("This is bad format dbus\n");
1748                         return FALSE;
1749                 }
1750
1751                 dbus_message_iter_get_basic(&item_iter, &interface_name);
1752
1753                 retv_if(interface_name == NULL, FALSE);
1754
1755                 BT_DBG("interface: %s", interface_name);
1756
1757                 retv_if(dbus_message_iter_next(&item_iter) == FALSE, FALSE);
1758
1759                 retv_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY,
1760                                                                         FALSE);
1761
1762                 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0)
1763                         return TRUE;
1764         }
1765
1766         return FALSE;
1767 }
1768
1769 void __bt_opc_property_changed_event(DBusMessageIter *msg_iter,
1770                                                 const char *path)
1771 {
1772         DBusMessageIter value_iter;
1773         DBusMessageIter dict_iter;
1774         DBusMessageIter item_iter;
1775         const char *property = NULL;
1776
1777         dbus_message_iter_recurse(msg_iter, &item_iter);
1778
1779         if (dbus_message_iter_get_arg_type(&item_iter)
1780                                 != DBUS_TYPE_DICT_ENTRY) {
1781                 BT_ERR("This is bad format dbus\n");
1782                 return;
1783         }
1784
1785         dbus_message_iter_recurse(&item_iter, &dict_iter);
1786
1787         dbus_message_iter_get_basic(&dict_iter, &property);
1788         ret_if(property == NULL);
1789
1790         ret_if(!dbus_message_iter_next(&dict_iter));
1791
1792         if (strcasecmp(property, "Status") == 0) {
1793                 const char *status = NULL;
1794                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1795                 dbus_message_iter_get_basic(&value_iter, &status);
1796
1797                 if(strcasecmp(status, "active") == 0){
1798                         _bt_obex_client_started(path);
1799                 }else if (strcasecmp(status, "complete") == 0) {
1800                         _bt_obex_client_completed(TRUE);
1801                 }else if (strcasecmp(status, "error") == 0){
1802                         _bt_obex_client_completed(FALSE);
1803                 }
1804         } else if (strcasecmp(property, "Transferred") == 0) {
1805                 static int transferred  = 0;
1806                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1807                 dbus_message_iter_get_basic(&value_iter, &transferred);
1808
1809                 _bt_obex_client_progress(transferred);
1810         }
1811 }
1812
1813 void _bt_opc_property_changed_event(DBusMessage *msg)
1814 {
1815         DBusMessageIter item_iter;
1816         const char *member = dbus_message_get_member(msg);
1817         const char *interface_name = NULL;
1818
1819         ret_if(member == NULL);
1820
1821         dbus_message_iter_init(msg, &item_iter);
1822
1823         if (dbus_message_iter_get_arg_type(&item_iter)
1824                                 != DBUS_TYPE_STRING) {
1825                 BT_ERR("This is bad format dbus\n");
1826                 return;
1827         }
1828
1829         dbus_message_iter_get_basic(&item_iter, &interface_name);
1830
1831         ret_if(interface_name == NULL);
1832
1833         BT_DBG("interface: %s", interface_name);
1834
1835         ret_if(dbus_message_iter_next(&item_iter) == FALSE);
1836
1837         ret_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY);
1838
1839         if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
1840                 __bt_opc_property_changed_event(&item_iter,
1841                                         dbus_message_get_path(msg));
1842         } else {
1843                 BT_DBG("No bluez interface");
1844         }
1845 }
1846
1847 static gboolean __bt_is_obexd_client_event(DBusMessage *msg)
1848 {
1849         const char *member = dbus_message_get_member(msg);
1850
1851         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1852                 return FALSE;
1853
1854         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1855
1856         if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1857                 DBusMessageIter item_iter;
1858                 const char *interface_name = NULL;
1859
1860                 dbus_message_iter_init(msg, &item_iter);
1861
1862                 if (dbus_message_iter_get_arg_type(&item_iter)
1863                                                 != DBUS_TYPE_STRING) {
1864                         BT_ERR("This is bad format dbus\n");
1865                         return FALSE;
1866                 }
1867
1868                 dbus_message_iter_get_basic(&item_iter, &interface_name);
1869
1870                 retv_if(interface_name == NULL, FALSE);
1871
1872                 BT_DBG("interface: %s", interface_name);
1873
1874                 retv_if(dbus_message_iter_next(&item_iter) == FALSE,
1875                                                                 FALSE);
1876
1877                 retv_if(dbus_message_iter_get_arg_type(&item_iter)
1878                                         != DBUS_TYPE_ARRAY, FALSE);
1879
1880                 if (strcasecmp(interface_name,
1881                                         BT_OBEX_TRANSFER_INTERFACE) == 0)
1882                         return TRUE;
1883         }
1884
1885         return FALSE;
1886 }
1887
1888 static DBusHandlerResult __bt_opc_event_filter(DBusConnection *conn,
1889                                                 DBusMessage *msg, void *data)
1890 {
1891         const char *member = dbus_message_get_member(msg);
1892
1893         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1894                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1895
1896         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1897
1898         if (strcasecmp(member, "InterfacesAdded") == 0) {
1899                 BT_DBG("InterfacesAdded");
1900         }else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1901                 char *object_path = NULL;
1902
1903                 if (__bt_get_object_path(msg, &object_path)) {
1904                         BT_ERR("Fail to get the path");
1905                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1906                 }
1907
1908                 BT_DBG("object_path =%s",object_path);
1909
1910                 if (strncmp(object_path, BT_SESSION_BASEPATH_CLIENT,
1911                         strlen(BT_SESSION_BASEPATH_CLIENT)) != 0
1912                         || strstr(object_path, "transfer") == NULL)
1913                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1914
1915                 _bt_sending_files();
1916
1917         }else if (__bt_is_obexd_client_event(msg) == TRUE){
1918                 const char *path = dbus_message_get_path(msg);
1919
1920                 if (strncmp(path, BT_SESSION_BASEPATH_CLIENT,
1921                         strlen(BT_SESSION_BASEPATH_CLIENT)) != 0)
1922                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1923
1924                 _bt_opc_property_changed_event(msg);
1925         }
1926
1927         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1928 }
1929
1930 static DBusHandlerResult __bt_obexd_event_filter(DBusConnection *conn,
1931                                                 DBusMessage *msg, void *data)
1932 {
1933         const char *member = dbus_message_get_member(msg);
1934
1935         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1936                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1937
1938         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1939
1940         if (__bt_is_obexd_event(msg) == TRUE){
1941                 const char *path = dbus_message_get_path(msg);
1942
1943                 if (strncmp(path, BT_SESSION_BASEPATH_SERVER,
1944                         strlen(BT_SESSION_BASEPATH_SERVER)) != 0)
1945                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1946
1947                 _bt_handle_property_changed_event(msg);
1948         }
1949
1950         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1951 }
1952
1953 int _bt_register_service_event(DBusGConnection *g_conn, int event_type)
1954 {
1955         DBusError dbus_error;
1956         char *match1 = NULL;
1957         char *match2 = NULL;
1958         char *match3 = NULL;
1959         char *match4 = NULL;
1960         DBusConnection *conn;
1961         DBusHandleMessageFunction event_func = NULL;
1962
1963         retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1964
1965         conn = dbus_g_connection_get_connection(g_conn);
1966         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1967
1968         switch (event_type) {
1969         case BT_MANAGER_EVENT:
1970                 event_func = __bt_manager_event_filter;
1971                 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1972                                         BT_MANAGER_INTERFACE,
1973                                         BT_INTERFACES_ADDED);
1974
1975                 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1976                                         BT_MANAGER_INTERFACE,
1977                                         BT_INTERFACES_REMOVED);
1978
1979                 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1980                                         BT_FREEDESKTOP_INTERFACE,
1981                                         BT_NAME_OWNER_CHANGED);
1982
1983                 match4 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1984                                         BT_PROPERTIES_INTERFACE,
1985                                         BT_PROPERTIES_CHANGED);
1986                 break;
1987         case BT_DEVICE_EVENT:
1988                 match1 = g_strdup_printf(EVENT_MATCH_RULE,
1989                                         BT_DEVICE_INTERFACE);
1990                 break;
1991         case BT_HID_EVENT:
1992                 match1 = g_strdup_printf(EVENT_MATCH_RULE,
1993                                         BT_INPUT_INTERFACE);
1994                 break;
1995         case BT_NETWORK_EVENT:
1996                 match1 = g_strdup_printf(EVENT_MATCH_RULE,
1997                                         BT_NETWORK_SERVER_INTERFACE);
1998
1999                 match2 = g_strdup_printf(EVENT_MATCH_RULE,
2000                                         BT_NETWORK_CLIENT_INTERFACE);
2001                 break;
2002         case BT_HEADSET_EVENT:
2003                 match1 = g_strdup_printf(EVENT_MATCH_RULE,
2004                                         BT_HFP_AGENT_INTERFACE);
2005
2006                 match2 = g_strdup_printf(EVENT_MATCH_RULE,
2007                                         BT_SINK_INTERFACE);
2008                 break;
2009         case BT_OPP_SERVER_EVENT:
2010                 event_func = __bt_obexd_event_filter;
2011                 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2012                                         BT_PROPERTIES_INTERFACE,
2013                                         BT_PROPERTIES_CHANGED);
2014                 break;
2015         case BT_OPP_CLIENT_EVENT:
2016                 event_func = __bt_opc_event_filter;
2017                 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2018                                         BT_PROPERTIES_INTERFACE,
2019                                         BT_PROPERTIES_CHANGED);
2020
2021                 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2022                                         BT_MANAGER_INTERFACE,
2023                                         BT_INTERFACES_ADDED);
2024
2025                 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2026                                         BT_MANAGER_INTERFACE,
2027                                         BT_INTERFACES_REMOVED);
2028                 break;
2029         default:
2030                 BT_ERR("Unknown event");
2031                 return BLUETOOTH_ERROR_INTERNAL;
2032         }
2033
2034         if (event_func) {
2035                 if (!dbus_connection_add_filter(conn, event_func,
2036                                                 NULL, NULL)) {
2037                         BT_ERR("Fail to add filter");
2038                         goto fail;
2039                 }
2040         }
2041
2042         dbus_error_init(&dbus_error);
2043
2044         if (match1)
2045                 dbus_bus_add_match(conn, match1, &dbus_error);
2046
2047         if (dbus_error_is_set(&dbus_error)) {
2048                 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2049                 dbus_error_free(&dbus_error);
2050                 goto fail;
2051         }
2052
2053         if (match2)
2054                 dbus_bus_add_match(conn, match2, &dbus_error);
2055
2056         if (dbus_error_is_set(&dbus_error)) {
2057                 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2058                 dbus_error_free(&dbus_error);
2059                 goto fail;
2060         }
2061
2062         if (match3)
2063                 dbus_bus_add_match(conn, match3, &dbus_error);
2064
2065         if (dbus_error_is_set(&dbus_error)) {
2066                 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2067                 dbus_error_free(&dbus_error);
2068                 goto fail;
2069         }
2070
2071         if (match4)
2072                 dbus_bus_add_match(conn, match4, &dbus_error);
2073
2074         if (dbus_error_is_set(&dbus_error)) {
2075                 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2076                 dbus_error_free(&dbus_error);
2077                 goto fail;
2078         }
2079
2080         g_free(match1);
2081         g_free(match2);
2082         g_free(match3);
2083         g_free(match4);
2084
2085         return BLUETOOTH_ERROR_NONE;
2086 fail:
2087         g_free(match1);
2088         g_free(match2);
2089         g_free(match3);
2090         g_free(match4);
2091         return BLUETOOTH_ERROR_INTERNAL;
2092 }
2093
2094 void _bt_unregister_service_event(DBusGConnection *g_conn, int event_type)
2095 {
2096         DBusConnection *conn;
2097         DBusHandleMessageFunction event_func;
2098
2099         ret_if(g_conn == NULL);
2100         conn = dbus_g_connection_get_connection(g_conn);
2101
2102         switch (event_type) {
2103         case BT_MANAGER_EVENT:
2104                 event_func = __bt_manager_event_filter;
2105                 break;
2106         case BT_OPP_SERVER_EVENT:
2107                 event_func = __bt_obexd_event_filter;
2108                 break;
2109         case BT_OPP_CLIENT_EVENT:
2110                 event_func = __bt_opc_event_filter;
2111                 break;
2112         default:
2113                 BT_ERR("Unknown event");
2114                 return;
2115         }
2116
2117         ret_if(conn == NULL);
2118
2119         dbus_connection_remove_filter(conn, event_func, NULL);
2120 }
2121
2122 static int __bt_init_manager_receiver(void)
2123 {
2124         GError *error = NULL;
2125
2126         if (manager_conn == NULL) {
2127                 manager_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
2128                 if (error != NULL) {
2129                         BT_ERR("ERROR: Can't get on system bus [%s]", error->message);
2130                         g_error_free(error);
2131                 }
2132                 retv_if(manager_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2133         }
2134
2135         if (_bt_register_service_event(manager_conn,
2136                                 BT_MANAGER_EVENT) != BLUETOOTH_ERROR_NONE)
2137                 goto fail;
2138
2139         if (_bt_register_service_event(manager_conn,
2140                                 BT_DEVICE_EVENT) != BLUETOOTH_ERROR_NONE)
2141                 goto fail;
2142
2143         if (_bt_register_service_event(manager_conn,
2144                                 BT_HID_EVENT) != BLUETOOTH_ERROR_NONE)
2145                 goto fail;
2146
2147         if (_bt_register_service_event(manager_conn,
2148                                 BT_HEADSET_EVENT) != BLUETOOTH_ERROR_NONE)
2149                 goto fail;
2150
2151         if (_bt_register_service_event(manager_conn,
2152                                 BT_NETWORK_EVENT) != BLUETOOTH_ERROR_NONE)
2153                 goto fail;
2154
2155         return BLUETOOTH_ERROR_NONE;
2156 fail:
2157         if (manager_conn) {
2158                 dbus_g_connection_unref(manager_conn);
2159                 manager_conn = NULL;
2160         }
2161
2162         return BLUETOOTH_ERROR_INTERNAL;
2163 }
2164
2165 static int __bt_init_obexd_receiver(void)
2166 {
2167         GError *error = NULL;
2168
2169         if (obexd_conn == NULL) {
2170                 obexd_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
2171                 if (error != NULL) {
2172                         BT_ERR("ERROR: Can't get on session bus [%s]", error->message);
2173                         g_error_free(error);
2174                 }
2175                 retv_if(obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2176         }
2177
2178         if (_bt_register_service_event(obexd_conn,
2179                                 BT_OPP_SERVER_EVENT) != BLUETOOTH_ERROR_NONE) {
2180                 dbus_g_connection_unref(obexd_conn);
2181                 obexd_conn = NULL;
2182                 return BLUETOOTH_ERROR_INTERNAL;
2183         }
2184
2185         return BLUETOOTH_ERROR_NONE;
2186 }
2187
2188 /* To receive the event from bluez */
2189 int _bt_init_service_event_receiver(void)
2190 {
2191         int result;
2192
2193         result = __bt_init_manager_receiver();
2194         retv_if(result != BLUETOOTH_ERROR_NONE, result);
2195
2196         result = __bt_init_obexd_receiver();
2197         if (result != BLUETOOTH_ERROR_NONE)
2198                 BT_ERR("Fail to init obexd receiver");
2199
2200         return BLUETOOTH_ERROR_NONE;
2201 }
2202
2203 void _bt_deinit_service_event_reciever(void)
2204 {
2205         _bt_unregister_service_event(manager_conn, BT_MANAGER_EVENT);
2206
2207         _bt_unregister_service_event(obexd_conn, BT_OPP_SERVER_EVENT);
2208
2209         if (manager_conn) {
2210                 dbus_g_connection_unref(manager_conn);
2211                 manager_conn = NULL;
2212         }
2213
2214         if (obexd_conn) {
2215                 dbus_g_connection_unref(obexd_conn);
2216                 obexd_conn = NULL;
2217         }
2218
2219         if (event_id > 0)
2220                 g_source_remove(event_id);
2221 }
2222
2223 int _bt_opp_client_event_init(void)
2224 {
2225         GError *error = NULL;
2226
2227         if (opc_obexd_conn == NULL) {
2228                 opc_obexd_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
2229                 if (error != NULL) {
2230                         BT_ERR("ERROR: Can't get on session bus [%s]",
2231                                                          error->message);
2232                         g_error_free(error);
2233                 }
2234
2235                 retv_if(opc_obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2236         }
2237
2238         if (_bt_register_service_event(opc_obexd_conn,
2239                         BT_OPP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
2240                 dbus_g_connection_unref(opc_obexd_conn);
2241                 opc_obexd_conn = NULL;
2242                 return BLUETOOTH_ERROR_INTERNAL;
2243         }
2244
2245         return BLUETOOTH_ERROR_NONE;
2246 }
2247
2248 void _bt_opp_client_event_deinit(void)
2249 {
2250         if (opc_obexd_conn) {
2251                 _bt_unregister_service_event(opc_obexd_conn,
2252                                                 BT_OPP_CLIENT_EVENT);
2253                 dbus_g_connection_unref(opc_obexd_conn);
2254                 opc_obexd_conn = NULL;
2255         }
2256 }
2257
2258 void _bt_get_temp_remote_devinfo(void)
2259 {
2260         bt_remote_dev_info_t *dev_info;
2261         GList *node;
2262         int result = BLUETOOTH_ERROR_NONE;
2263
2264         node = g_list_first(g_list);
2265
2266         while (node != NULL){
2267                 dev_info = (bt_remote_dev_info_t *)node->data;
2268
2269                 _bt_send_event(BT_ADAPTER_EVENT,
2270                         BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
2271                         DBUS_TYPE_INT32, &result,
2272                         DBUS_TYPE_STRING, &dev_info->address,
2273                         DBUS_TYPE_UINT32, &dev_info->class,
2274                         DBUS_TYPE_INT16, &dev_info->rssi,
2275                         DBUS_TYPE_STRING, &dev_info->name,
2276                         DBUS_TYPE_BOOLEAN, &dev_info->paired,
2277                         DBUS_TYPE_BOOLEAN, &dev_info->connected,
2278                         DBUS_TYPE_BOOLEAN, &dev_info->trust,
2279                         DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
2280                         &dev_info->uuids, dev_info->uuid_count,
2281                         DBUS_TYPE_INVALID);
2282
2283                 node = g_list_next(node);
2284         }
2285 }