keep current bluetooth state when starting bt-service
[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 gboolean _bt_stop_discovery_timeout_cb(gpointer user_data)
601 {
602         DBusGProxy *adapter_proxy;
603
604         event_id = 0;
605
606         adapter_proxy = _bt_get_adapter_proxy();
607         retv_if(adapter_proxy == NULL, FALSE);
608
609         /* Need to stop searching */
610         dbus_g_proxy_call(adapter_proxy,
611                                 "StopDiscovery",
612                                 NULL,
613                                 G_TYPE_INVALID,
614                                 G_TYPE_INVALID);
615
616         return FALSE;
617 }
618
619 void _bt_stop_discovery_timeout(void)
620 {
621         if (event_id > 0)
622                 return;
623
624         event_id = g_timeout_add(BT_STOP_DISCOVERY_TIMEOUT,
625                 (GSourceFunc)_bt_stop_discovery_timeout_cb, NULL);
626 }
627
628 static gboolean __bt_discovery_finished()
629 {
630         int result = BLUETOOTH_ERROR_NONE;
631
632         if (_bt_get_cancel_by_user() == TRUE) {
633                 result = BLUETOOTH_ERROR_CANCEL_BY_USER;
634         }
635
636         _bt_set_cancel_by_user(FALSE);
637         _bt_set_discovery_status(FALSE);
638         _bt_send_event(BT_ADAPTER_EVENT,
639                 BLUETOOTH_EVENT_DISCOVERY_FINISHED,
640                 DBUS_TYPE_INT32, &result,
641                 DBUS_TYPE_INVALID);
642
643         return FALSE;
644 }
645
646 void __bt_adapter_property_changed_event(DBusMessageIter *msg_iter, const char *path)
647 {
648         DBusGProxy *adapter_proxy;
649         int mode = 0;
650         int result = BLUETOOTH_ERROR_NONE;
651         DBusMessageIter value_iter;
652         DBusMessageIter dict_iter;
653         DBusMessageIter item_iter;
654         GValue timeout = { 0 };
655         const char *property = NULL;
656
657         dbus_message_iter_recurse(msg_iter, &item_iter);
658
659         if (dbus_message_iter_get_arg_type(&item_iter)
660                                         != DBUS_TYPE_DICT_ENTRY) {
661                 BT_ERR("This is bad format dbus\n");
662                 return;
663         }
664
665         dbus_message_iter_recurse(&item_iter, &dict_iter);
666
667         dbus_message_iter_get_basic(&dict_iter, &property);
668         ret_if(property == NULL);
669
670         ret_if(!dbus_message_iter_next(&dict_iter));
671
672         if (strcasecmp(property, "Discovering") == 0) {
673                 gboolean discovering = FALSE;
674
675                 dbus_message_iter_recurse(&dict_iter, &value_iter);
676                 dbus_message_iter_get_basic(&value_iter, &discovering);
677
678                 /* Send event to application */
679                 if (discovering == TRUE) {
680                         _bt_set_discovery_status(TRUE);
681                         _bt_send_event(BT_ADAPTER_EVENT,
682                                 BLUETOOTH_EVENT_DISCOVERY_STARTED,
683                                 DBUS_TYPE_INT32, &result,
684                                 DBUS_TYPE_INVALID);
685                         _bt_get_temp_remote_devinfo();
686                 } else {
687                         if (event_id > 0){
688                                 g_source_remove(event_id);
689                                 event_id = 0;
690                         }
691                         __bt_discovery_finished();
692                 }
693         } else if (strcasecmp(property, "Alias") == 0) {
694                 char *name = NULL;
695
696                 dbus_message_iter_recurse(&dict_iter, &value_iter);
697                 dbus_message_iter_get_basic(&value_iter, &name);
698
699                 /* Send event to application */
700                 _bt_send_event(BT_ADAPTER_EVENT,
701                                 BLUETOOTH_EVENT_LOCAL_NAME_CHANGED,
702                                 DBUS_TYPE_INT32, &result,
703                                 DBUS_TYPE_STRING, &name,
704                                 DBUS_TYPE_INVALID);
705         } else if (strcasecmp(property, "Powered") == 0) {
706                 gboolean power = FALSE;
707
708                 dbus_message_iter_recurse(&dict_iter, &value_iter);
709                 dbus_message_iter_get_basic(&value_iter, &power);
710
711                 BT_DBG("power state changed: %d", power);
712
713                 if (power == TRUE)
714                         _bt_set_enabled();
715                 else
716                         _bt_set_disabled();
717
718         } else if (strcasecmp(property, "Discoverable") == 0) {
719                 gboolean discoverable = FALSE;
720
721                 dbus_message_iter_recurse(&dict_iter, &value_iter);
722                 dbus_message_iter_get_basic(&value_iter, &discoverable);
723
724                 if (discoverable == FALSE) {
725                         if (_bt_get_discoverable_timeout_property() > 0) {
726                                 g_value_init(&timeout, G_TYPE_UINT);
727                                 g_value_set_uint(&timeout, 0);
728
729                                 adapter_proxy = _bt_get_adapter_properties_proxy();
730                                 ret_if(adapter_proxy == NULL);
731
732                                 dbus_g_proxy_call_no_reply(adapter_proxy, "Set",
733                                                 G_TYPE_STRING, BT_ADAPTER_INTERFACE,
734                                                 G_TYPE_STRING, "DiscoverableTimeout",
735                                                 G_TYPE_VALUE, &timeout,
736                                                 G_TYPE_INVALID);
737
738                                 g_value_unset(&timeout);
739                         }
740
741                         mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
742
743                         /* Send event to application */
744                         _bt_send_event(BT_ADAPTER_EVENT,
745                                         BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
746                                         DBUS_TYPE_INT32, &result,
747                                         DBUS_TYPE_INT16, &mode,
748                                         DBUS_TYPE_INVALID);
749                 } else {
750                         _bt_get_discoverable_mode(&mode);
751
752                         /* Event will be sent by "DiscoverableTimeout" signal */
753                         ret_if(mode != BLUETOOTH_DISCOVERABLE_MODE_GENERAL_DISCOVERABLE);
754
755                         /* Send event to application */
756                         _bt_send_event(BT_ADAPTER_EVENT,
757                                         BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
758                                         DBUS_TYPE_INT32, &result,
759                                         DBUS_TYPE_INT16, &mode,
760                                         DBUS_TYPE_INVALID);
761                 }
762         } else if (strcasecmp(property, "DiscoverableTimeout") == 0) {
763                 _bt_get_discoverable_mode(&mode);
764
765                 /* Event was already sent by "Discoverable" signal */
766                 ret_if(mode == BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE);
767
768                 /* Send event to application */
769                 _bt_send_event(BT_ADAPTER_EVENT,
770                                 BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED,
771                                 DBUS_TYPE_INT32, &result,
772                                 DBUS_TYPE_INT16, &mode,
773                                 DBUS_TYPE_INVALID);
774         }
775 }
776
777 static void __bt_device_remote_connected_properties(
778                                 bt_remote_dev_info_t *remote_dev_info,
779                                 char *address, gboolean connected)
780 {
781         int result = BLUETOOTH_ERROR_NONE;
782         int i;
783
784         BT_DBG("+");
785
786         if (remote_dev_info->uuid_count > 0 ) {
787                 for (i = 0; i<remote_dev_info->uuid_count; i++) {
788                         char *uuid = remote_dev_info->uuids[i];
789                         if (strcasecmp(uuid, HID_UUID) == 0){
790                                 int event = BLUETOOTH_EVENT_NONE;
791
792                                 event = (connected == TRUE) ?
793                                         BLUETOOTH_HID_CONNECTED :
794                                         BLUETOOTH_HID_DISCONNECTED;
795
796                                 _bt_send_event(BT_HID_EVENT, event,
797                                         DBUS_TYPE_INT32, &result,
798                                         DBUS_TYPE_STRING, &address,
799                                         DBUS_TYPE_INVALID);
800                                 break;
801                         }
802                 }
803         }
804
805         BT_DBG("-");
806 }
807
808 void __bt_device_property_changed_event(DBusMessageIter *msg_iter, const char *path)
809 {
810         int event;
811         int result = BLUETOOTH_ERROR_NONE;
812         DBusMessageIter value_iter;
813         DBusMessageIter dict_iter;
814         DBusMessageIter item_iter;
815         const char *property = NULL;
816         char *address;
817         bt_remote_dev_info_t *remote_dev_info;
818
819         dbus_message_iter_recurse(msg_iter, &item_iter);
820
821         do {
822                 if (dbus_message_iter_get_arg_type(&item_iter)
823                                                 != DBUS_TYPE_DICT_ENTRY) {
824                         BT_ERR("This is bad format dbus\n");
825                         return;
826                 }
827
828                 dbus_message_iter_recurse(&item_iter, &dict_iter);
829
830                 dbus_message_iter_get_basic(&dict_iter, &property);
831                 ret_if(property == NULL);
832
833                 ret_if(!dbus_message_iter_next(&dict_iter));
834
835                 if (strcasecmp(property, "Connected") == 0) {
836                         gboolean connected = FALSE;
837
838                         dbus_message_iter_recurse(&dict_iter, &value_iter);
839                         dbus_message_iter_get_basic(&value_iter, &connected);
840
841                         event = connected ? BLUETOOTH_EVENT_DEVICE_CONNECTED :
842                                         BLUETOOTH_EVENT_DEVICE_DISCONNECTED;
843
844                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
845
846                         _bt_convert_device_path_to_address(path, address);
847
848                         BT_DBG("connected: %d", connected);
849                         BT_DBG("address: %s", address);
850
851                         remote_dev_info = _bt_get_remote_device_info(address);
852
853                         if (remote_dev_info != NULL) {
854                                 __bt_device_remote_connected_properties(
855                                 remote_dev_info, address, connected);
856                         }
857
858                         /* Send event to application */
859                         _bt_send_event(BT_DEVICE_EVENT,
860                                         event,
861                                         DBUS_TYPE_INT32, &result,
862                                         DBUS_TYPE_STRING, &address,
863                                         DBUS_TYPE_INVALID);
864
865                         g_free(address);
866
867                 } else if (strcasecmp(property, "Paired") == 0) {
868                         gboolean paired = FALSE;
869
870                         GList *node;
871                         bt_remote_dev_info_t *dev_info;
872                         bt_remote_dev_info_t *new_dev_info;
873
874                         dbus_message_iter_recurse(&dict_iter, &value_iter);
875                         dbus_message_iter_get_basic(&value_iter, &paired);
876
877                         ret_if(paired == FALSE);
878
879                         /* BlueZ sends paired signal for each paired device */
880                         /* during activation, We should ignore this, otherwise*/
881                         /* application thinks that a new device got paired */
882                         if (_bt_adapter_get_status() != BT_ACTIVATED) {
883                                 BT_DBG("BT is not activated, so ignore this");
884                                 return;
885                         }
886
887                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
888
889                         _bt_convert_device_path_to_address(path, address);
890
891                         remote_dev_info = _bt_get_remote_device_info(address);
892                         if (remote_dev_info == NULL) {
893                                 g_free(address);
894                                 return;
895                         }
896
897                         node = g_list_first(g_list);
898
899                         while (node != NULL) {
900                                 dev_info = (bt_remote_dev_info_t *)node->data;
901                                 if (strcasecmp(dev_info->address, address) == 0) {
902                                         g_list = g_list_remove(g_list, dev_info);
903                                         _bt_free_device_info(dev_info);
904
905                                         new_dev_info =  _bt_get_remote_device_info(address);
906                                         if (new_dev_info == NULL) {
907                                                 g_free(address);
908                                                 return;
909                                         }
910                                         g_list = g_list_append(g_list, new_dev_info);
911                                 }
912                                 node = g_list_next(node);
913                         }
914
915                         if (_bt_is_device_creating() == TRUE) {
916                                 BT_DBG("Try to Pair by me or already paired");
917                         } else {
918                                 _bt_send_event(BT_ADAPTER_EVENT,
919                                         BLUETOOTH_EVENT_BONDING_FINISHED,
920                                         DBUS_TYPE_INT32, &result,
921                                         DBUS_TYPE_STRING, &address,
922                                         DBUS_TYPE_UINT32, &remote_dev_info->class,
923                                         DBUS_TYPE_INT16, &remote_dev_info->rssi,
924                                         DBUS_TYPE_STRING, &remote_dev_info->name,
925                                         DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
926                                         DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
927                                         DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
928                                         DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
929                                         &remote_dev_info->uuids, remote_dev_info->uuid_count,
930                                         DBUS_TYPE_INVALID);
931                         }
932
933                         _bt_free_device_info(remote_dev_info);
934                         g_free(address);
935                 }
936         } while (dbus_message_iter_next(&item_iter));
937 }
938
939 void __bt_obex_property_changed_event(DBusMessageIter *msg_iter, const char *path)
940 {
941         DBusMessageIter value_iter;
942         DBusMessageIter dict_iter;
943         DBusMessageIter item_iter;
944         const char *property = NULL;
945
946         dbus_message_iter_recurse(msg_iter, &item_iter);
947
948         if (dbus_message_iter_get_arg_type(&item_iter)
949                                         != DBUS_TYPE_DICT_ENTRY) {
950                 BT_ERR("This is bad format dbus\n");
951                 return;
952         }
953
954         dbus_message_iter_recurse(&item_iter, &dict_iter);
955
956         dbus_message_iter_get_basic(&dict_iter, &property);
957         ret_if(property == NULL);
958
959         ret_if(!dbus_message_iter_next(&dict_iter));
960
961         if (strcasecmp(property, "Status") == 0) {
962                 const char  *status;
963                 dbus_message_iter_recurse(&dict_iter, &value_iter);
964                 dbus_message_iter_get_basic(&value_iter, &status);
965
966                 if (strcasecmp(status, "active") == 0){
967                         _bt_obex_transfer_started(path);
968                 }else if (strcasecmp(status, "complete") == 0) {
969                         _bt_obex_transfer_completed(path, TRUE);
970                 }else if (strcasecmp(status, "error") == 0){
971                         _bt_obex_transfer_completed(path, FALSE);
972                 }
973         } else if (strcasecmp(property, "Transferred") == 0) {
974                 static int transferred  = 0;
975                 dbus_message_iter_recurse(&dict_iter, &value_iter);
976                 dbus_message_iter_get_basic(&value_iter, &transferred);
977
978                 _bt_obex_transfer_progress(path,transferred);
979         }
980 }
981
982 void _bt_handle_input_event(DBusMessage *msg)
983 {
984         int result = BLUETOOTH_ERROR_NONE;
985         DBusMessageIter item_iter;
986         DBusMessageIter value_iter;
987         gboolean property_flag = FALSE;
988         const char *member = dbus_message_get_member(msg);
989         const char *path = dbus_message_get_path(msg);
990         const char *property = NULL;
991
992         ret_if(member == NULL);
993
994         dbus_message_iter_init(msg, &item_iter);
995
996         if (dbus_message_iter_get_arg_type(&item_iter)
997                                         != DBUS_TYPE_STRING) {
998                 BT_ERR("This is bad format dbus\n");
999                 return;
1000         }
1001
1002         dbus_message_iter_get_basic(&item_iter, &property);
1003
1004         ret_if(property == NULL);
1005
1006         if (strcasecmp(property, "Connected") == 0) {
1007                 int event = BLUETOOTH_EVENT_NONE;
1008                 char *address;
1009
1010                 dbus_message_iter_next(&item_iter);
1011                 dbus_message_iter_recurse(&item_iter, &value_iter);
1012                 dbus_message_iter_get_basic(&value_iter, &property_flag);
1013
1014                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1015
1016                 _bt_convert_device_path_to_address(path, address);
1017
1018                 event = (property_flag == TRUE) ?
1019                                 BLUETOOTH_HID_CONNECTED :
1020                                 BLUETOOTH_HID_DISCONNECTED;
1021
1022                 _bt_send_event(BT_HID_EVENT, event,
1023                         DBUS_TYPE_INT32, &result,
1024                         DBUS_TYPE_STRING, &address,
1025                         DBUS_TYPE_INVALID);
1026
1027                 g_free(address);
1028         }
1029  }
1030
1031 void _bt_handle_network_server_event(DBusMessage *msg)
1032 {
1033         int result = BLUETOOTH_ERROR_NONE;
1034         char *address = NULL;
1035         char *device = NULL;
1036         const char *member = dbus_message_get_member(msg);
1037
1038         ret_if(member == NULL);
1039
1040         if (strcasecmp(member, "PeerConnected") == 0) {
1041                 if (!dbus_message_get_args(msg, NULL,
1042                         DBUS_TYPE_STRING, &device,
1043                         DBUS_TYPE_STRING, &address,
1044                         DBUS_TYPE_INVALID)) {
1045                         BT_ERR("Unexpected parameters in signal");
1046                         return;
1047                 }
1048
1049                 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED,
1050                         DBUS_TYPE_INT32, &result,
1051                         DBUS_TYPE_STRING, &device,
1052                         DBUS_TYPE_STRING, &address,
1053                         DBUS_TYPE_INVALID);
1054         } else if (strcasecmp(member, "PeerDisconnected") == 0) {
1055                 if (!dbus_message_get_args(msg, NULL,
1056                         DBUS_TYPE_STRING, &device,
1057                         DBUS_TYPE_STRING, &address,
1058                         DBUS_TYPE_INVALID)) {
1059                         BT_ERR("Unexpected parameters in signal");
1060                         return;
1061                 }
1062
1063                 _bt_send_event(BT_NETWORK_EVENT, BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED,
1064                         DBUS_TYPE_INT32, &result,
1065                         DBUS_TYPE_STRING, &device,
1066                         DBUS_TYPE_STRING, &address,
1067                         DBUS_TYPE_INVALID);
1068         }
1069 }
1070
1071 void __bt_handle_network_client_event(DBusMessageIter *msg_iter, const char *path)
1072 {
1073         int result = BLUETOOTH_ERROR_NONE;
1074         DBusMessageIter item_iter;
1075         DBusMessageIter value_iter;
1076         DBusMessageIter dict_iter;
1077         gboolean property_flag = FALSE;
1078         const char *property = NULL;
1079
1080         dbus_message_iter_recurse(msg_iter, &item_iter);
1081
1082         if (dbus_message_iter_get_arg_type(&item_iter)
1083                                 != DBUS_TYPE_DICT_ENTRY) {
1084                 BT_ERR("This is bad format dbus\n");
1085                 return;
1086         }
1087
1088         dbus_message_iter_recurse(&item_iter, &dict_iter);
1089         dbus_message_iter_get_basic(&dict_iter, &property);
1090
1091         ret_if(property == NULL);
1092
1093         ret_if(!dbus_message_iter_next(&dict_iter));
1094
1095         if (strcasecmp(property, "Connected") == 0) {
1096                 int event = BLUETOOTH_EVENT_NONE;
1097                 char *address;
1098
1099                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1100                 dbus_message_iter_get_basic(&value_iter, &property_flag);
1101
1102                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1103
1104                 _bt_convert_device_path_to_address(path, address);
1105
1106                 if (property_flag == TRUE) {
1107                         event = BLUETOOTH_EVENT_NETWORK_CONNECTED;
1108                 } else {
1109                         event = BLUETOOTH_EVENT_NETWORK_DISCONNECTED;
1110                 }
1111
1112                 _bt_send_event(BT_NETWORK_EVENT, event,
1113                         DBUS_TYPE_INT32, &result,
1114                         DBUS_TYPE_STRING, &address,
1115                         DBUS_TYPE_INVALID);
1116
1117                 g_free(address);
1118         }
1119 }
1120
1121 void _bt_handle_device_event(DBusMessage *msg)
1122 {
1123         int event;
1124         int result = BLUETOOTH_ERROR_NONE;
1125         DBusMessageIter item_iter;
1126         DBusMessageIter value_iter;
1127         char *address;
1128         const char *member = dbus_message_get_member(msg);
1129         const char *path = dbus_message_get_path(msg);
1130         const char *property = NULL;
1131
1132         ret_if(path == NULL);
1133         ret_if(member == NULL);
1134
1135         if (strcasecmp(member, "PropertyChanged") == 0) {
1136                 dbus_message_iter_init(msg, &item_iter);
1137
1138                 if (dbus_message_iter_get_arg_type(&item_iter)
1139                                                 != DBUS_TYPE_STRING) {
1140                         BT_ERR("This is bad format dbus\n");
1141                         return;
1142                 }
1143
1144                 dbus_message_iter_get_basic(&item_iter, &property);
1145
1146                 ret_if(property == NULL);
1147
1148                 if (strcasecmp(property, "Connected") == 0) {
1149                         gboolean connected = FALSE;
1150                         dbus_message_iter_next(&item_iter);
1151                         dbus_message_iter_recurse(&item_iter, &value_iter);
1152                         dbus_message_iter_get_basic(&value_iter, &connected);
1153
1154                         event = connected ? BLUETOOTH_EVENT_DEVICE_CONNECTED :
1155                                         BLUETOOTH_EVENT_DEVICE_DISCONNECTED;
1156
1157                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1158
1159                         _bt_convert_device_path_to_address(path, address);
1160
1161                         BT_DBG("connected: %d", connected);
1162                         BT_DBG("address: %s", address);
1163
1164                         /* Send event to application */
1165                         _bt_send_event(BT_DEVICE_EVENT,
1166                                         event,
1167                                         DBUS_TYPE_INT32, &result,
1168                                         DBUS_TYPE_STRING, &address,
1169                                         DBUS_TYPE_INVALID);
1170
1171                         g_free(address);
1172                 } else if (strcasecmp(property, "Paired") == 0) {
1173                         gboolean paired = FALSE;
1174                         bt_remote_dev_info_t *remote_dev_info;
1175                         dbus_message_iter_next(&item_iter);
1176                         dbus_message_iter_recurse(&item_iter, &value_iter);
1177                         dbus_message_iter_get_basic(&value_iter, &paired);
1178
1179                         ret_if(paired == FALSE);
1180
1181                         /* BlueZ sends paired signal for each paired device */
1182                         /* during activation, We should ignore this, otherwise*/
1183                         /* application thinks that a new device got paired */
1184                         if (_bt_adapter_get_status() != BT_ACTIVATED) {
1185                                 BT_DBG("BT is not activated, so ignore this");
1186                                 return;
1187                         }
1188
1189                         if (_bt_is_device_creating() == TRUE) {
1190                                 BT_DBG("Try to Pair by me");
1191                                 return;
1192                         }
1193
1194                         address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1195
1196                         _bt_convert_device_path_to_address(path, address);
1197
1198                         remote_dev_info = _bt_get_remote_device_info(address);
1199                         if (remote_dev_info == NULL) {
1200                                 g_free(address);
1201                                 return;
1202                         }
1203
1204                         _bt_send_event(BT_ADAPTER_EVENT,
1205                                 BLUETOOTH_EVENT_BONDING_FINISHED,
1206                                 DBUS_TYPE_INT32, &result,
1207                                 DBUS_TYPE_STRING, &address,
1208                                 DBUS_TYPE_UINT32, &remote_dev_info->class,
1209                                 DBUS_TYPE_INT16, &remote_dev_info->rssi,
1210                                 DBUS_TYPE_STRING, &remote_dev_info->name,
1211                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->paired,
1212                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->connected,
1213                                 DBUS_TYPE_BOOLEAN, &remote_dev_info->trust,
1214                                 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1215                                 &remote_dev_info->uuids, remote_dev_info->uuid_count,
1216                                 DBUS_TYPE_INVALID);
1217
1218                         _bt_free_device_info(remote_dev_info);
1219                         g_free(address);
1220                 }
1221         }
1222 }
1223
1224 void __bt_handle_media_control_event(DBusMessageIter *msg_iter,
1225                                                 const char *path)
1226 {
1227         int result = BLUETOOTH_ERROR_NONE;
1228         DBusMessageIter item_iter;
1229         DBusMessageIter value_iter;
1230         DBusMessageIter dict_iter;
1231         gboolean property_flag = FALSE;
1232         const char *property = NULL;
1233
1234         dbus_message_iter_recurse(msg_iter, &item_iter);
1235
1236         if (dbus_message_iter_get_arg_type(&item_iter)
1237                                 != DBUS_TYPE_DICT_ENTRY) {
1238                 BT_ERR("This is bad format dbus\n");
1239                 return;
1240         }
1241
1242         dbus_message_iter_recurse(&item_iter, &dict_iter);
1243
1244         dbus_message_iter_get_basic(&dict_iter, &property);
1245         ret_if(property == NULL);
1246
1247         ret_if(!dbus_message_iter_next(&dict_iter));
1248
1249         if (strcasecmp(property, "Connected") == 0) {
1250                 int event = BLUETOOTH_EVENT_NONE;
1251                 char *address;
1252
1253                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1254                 dbus_message_iter_get_basic(&value_iter, &property_flag);
1255
1256                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1257
1258                 _bt_convert_device_path_to_address(path, address);
1259
1260                 event = (property_flag == TRUE) ?
1261                                 BLUETOOTH_EVENT_AV_CONNECTED :
1262                                 BLUETOOTH_EVENT_AV_DISCONNECTED;
1263
1264                 _bt_send_event(BT_AVRCP_EVENT, event,
1265                         DBUS_TYPE_INT32, &result,
1266                         DBUS_TYPE_STRING, &address,
1267                 DBUS_TYPE_INVALID);
1268
1269                 g_free(address);
1270         }
1271 }
1272
1273 void _bt_handle_property_changed_event(DBusMessage *msg)
1274 {
1275         DBusMessageIter item_iter;
1276         const char *member = dbus_message_get_member(msg);
1277         const char *interface_name = NULL;
1278
1279         ret_if(member == NULL);
1280
1281         dbus_message_iter_init(msg, &item_iter);
1282
1283         if (dbus_message_iter_get_arg_type(&item_iter)
1284                                         != DBUS_TYPE_STRING) {
1285                 BT_ERR("This is bad format dbus\n");
1286                 return;
1287         }
1288
1289         dbus_message_iter_get_basic(&item_iter, &interface_name);
1290
1291         ret_if(interface_name == NULL);
1292
1293         BT_DBG("interface: %s", interface_name);
1294
1295         ret_if(dbus_message_iter_next(&item_iter) == FALSE);
1296
1297         ret_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY);
1298
1299         if (strcasecmp(interface_name, BT_ADAPTER_INTERFACE) == 0) {
1300                 __bt_adapter_property_changed_event(&item_iter,
1301                                         dbus_message_get_path(msg));
1302         } else if (strcasecmp(interface_name, BT_DEVICE_INTERFACE) == 0) {
1303                 __bt_device_property_changed_event(&item_iter,
1304                                         dbus_message_get_path(msg));
1305         } else if (strcasecmp(interface_name,
1306                                         BT_OBEX_TRANSFER_INTERFACE) == 0) {
1307                 __bt_obex_property_changed_event(&item_iter,
1308                                         dbus_message_get_path(msg));
1309         } else if (strcasecmp(interface_name,
1310                                         BT_MEDIA_CONTROL_INTERFACE) == 0) {
1311                 __bt_handle_media_control_event(&item_iter,
1312                                         dbus_message_get_path(msg));
1313         } else if (strcasecmp(interface_name,
1314                                         BT_NETWORK_CLIENT_INTERFACE) == 0) {
1315                 __bt_handle_network_client_event(&item_iter,
1316                                         dbus_message_get_path(msg));
1317         } else {
1318                 BT_DBG("No bluez interface");
1319         }
1320 }
1321
1322 void __bt_set_audio_values(gboolean connected, char *address)
1323 {
1324         char *name = NULL;
1325         int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
1326
1327         /*  Set the headset name */
1328         if (connected == TRUE) {
1329                 name = __bt_get_headset_name(address);
1330         } else {
1331                 name = g_strdup("");
1332         }
1333
1334         if (vconf_set_str(VCONFKEY_BT_HEADSET_NAME,
1335                                         name) != 0) {
1336                 BT_ERR("vconf_set_str failed");
1337         }
1338
1339         g_free(name);
1340
1341         /*  Set the headset state */
1342         if (vconf_get_int(VCONFKEY_BT_DEVICE,
1343                                 &bt_device_state) != 0) {
1344                 BT_ERR("vconf_get_str failed");
1345         }
1346
1347         if (connected == TRUE) {
1348                 bt_device_state |= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
1349         } else if (bt_device_state & VCONFKEY_BT_DEVICE_HEADSET_CONNECTED) {
1350                 bt_device_state ^= VCONFKEY_BT_DEVICE_HEADSET_CONNECTED;
1351         }
1352
1353         if (vconf_set_int(VCONFKEY_BT_DEVICE,
1354                                 bt_device_state) != 0) {
1355                 BT_ERR("vconf_set_int failed");
1356         }
1357 }
1358
1359 void _bt_handle_headset_event(DBusMessage *msg)
1360 {
1361         int result = BLUETOOTH_ERROR_NONE;
1362         DBusMessageIter item_iter;
1363         DBusMessageIter value_iter;
1364         gboolean property_flag = FALSE;
1365         const char *member = dbus_message_get_member(msg);
1366         const char *path = dbus_message_get_path(msg);
1367         const char *property = NULL;
1368
1369         ret_if(member == NULL);
1370
1371         dbus_message_iter_init(msg, &item_iter);
1372
1373         if (dbus_message_iter_get_arg_type(&item_iter)
1374                                         != DBUS_TYPE_STRING) {
1375                 BT_ERR("This is bad format dbus\n");
1376                 return;
1377         }
1378
1379         dbus_message_iter_get_basic(&item_iter, &property);
1380
1381         ret_if(property == NULL);
1382
1383         /* We allow only 1 headset connection (HSP or HFP)*/
1384         if (strcasecmp(property, "Connected") == 0) {
1385                 int event = BLUETOOTH_EVENT_NONE;
1386                 char *address;
1387
1388                 dbus_message_iter_next(&item_iter);
1389                 dbus_message_iter_recurse(&item_iter, &value_iter);
1390                 dbus_message_iter_get_basic(&value_iter, &property_flag);
1391
1392                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1393
1394                 _bt_convert_device_path_to_address(path, address);
1395
1396                 if (property_flag == TRUE) {
1397                         event = BLUETOOTH_EVENT_AG_CONNECTED;
1398                 } else {
1399                         event = BLUETOOTH_EVENT_AG_DISCONNECTED;
1400                 }
1401
1402                 __bt_set_audio_values(property_flag, address);
1403
1404                 _bt_send_event(BT_HEADSET_EVENT, event,
1405                         DBUS_TYPE_INT32, &result,
1406                         DBUS_TYPE_STRING, &address,
1407                         DBUS_TYPE_INVALID);
1408
1409                 g_free(address);
1410         } else if (strcasecmp(property, "State") == 0) {
1411                 int event = BLUETOOTH_EVENT_NONE;
1412                 int sco_connected = FALSE;
1413                 char *state = NULL;
1414                 char *address;
1415
1416                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1417
1418                 _bt_convert_device_path_to_address(path, address);
1419
1420                 dbus_message_iter_next(&item_iter);
1421                 dbus_message_iter_recurse(&item_iter, &value_iter);
1422                 dbus_message_iter_get_basic(&value_iter, &state);
1423
1424                 /* This code assumes we support only 1 headset connection */
1425                 /* Need to use the headset list, if we support multi-headsets */
1426                 if (strcasecmp(property, "Playing") == 0) {
1427                         event = BLUETOOTH_EVENT_AG_AUDIO_CONNECTED;
1428                         sco_connected = TRUE;
1429                 } else if (strcasecmp(property, "connected") == 0 ||
1430                             strcasecmp(property, "disconnected") == 0) {
1431                         event = BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED;
1432                         sco_connected = FALSE;
1433                 } else {
1434                         BT_ERR("Not handled state");
1435                         g_free(address);
1436                         return;
1437                 }
1438
1439                 if (vconf_set_bool(VCONFKEY_BT_HEADSET_SCO, sco_connected) < 0)
1440                         BT_ERR("vconf_set_bool - Failed\n");
1441
1442                 _bt_send_event(BT_HEADSET_EVENT, event,
1443                         DBUS_TYPE_INT32, &result,
1444                         DBUS_TYPE_STRING, &address,
1445                         DBUS_TYPE_INVALID);
1446
1447                 g_free(address);
1448         } else if (strcasecmp(property, "SpeakerGain") == 0) {
1449                 guint16 spkr_gain;
1450                 char *address;
1451
1452                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1453
1454                 _bt_convert_device_path_to_address(path, address);
1455
1456                 dbus_message_iter_next(&item_iter);
1457                 dbus_message_iter_recurse(&item_iter, &value_iter);
1458                 dbus_message_iter_get_basic(&value_iter, &spkr_gain);
1459
1460                 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_SPEAKER_GAIN,
1461                         DBUS_TYPE_INT32, &result,
1462                         DBUS_TYPE_STRING, &address,
1463                         DBUS_TYPE_UINT16, &spkr_gain,
1464                         DBUS_TYPE_INVALID);
1465
1466                 g_free(address);
1467         } else if (strcasecmp(property, "MicrophoneGain") == 0) {
1468                 guint16 mic_gain;
1469                 char *address;
1470
1471                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1472
1473                 _bt_convert_device_path_to_address(path, address);
1474
1475                 dbus_message_iter_next(&item_iter);
1476                 dbus_message_iter_recurse(&item_iter, &value_iter);
1477                 dbus_message_iter_get_basic(&value_iter, &mic_gain);
1478
1479                 _bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AG_MIC_GAIN,
1480                         DBUS_TYPE_INT32, &result,
1481                         DBUS_TYPE_STRING, &address,
1482                         DBUS_TYPE_UINT16, &mic_gain,
1483                         DBUS_TYPE_INVALID);
1484
1485                 g_free(address);
1486         }
1487 }
1488
1489 void _bt_handle_agent_event(DBusMessage *msg)
1490 {
1491         const char *member = dbus_message_get_member(msg);
1492         int result = BLUETOOTH_ERROR_NONE;
1493         char *address = NULL;
1494         char *name = NULL;
1495         char *uuid = NULL;
1496
1497         ret_if(member == NULL);
1498
1499         if (strcasecmp(member, "ObexAuthorize") == 0) {
1500                 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
1501
1502                 _bt_send_event(BT_OPP_SERVER_EVENT,
1503                         BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
1504                         DBUS_TYPE_INT32, &result,
1505                         DBUS_TYPE_STRING, &address,
1506                         DBUS_TYPE_STRING, &name,
1507                         DBUS_TYPE_INVALID);
1508         } else if (strcasecmp(member, "RfcommAuthorize") == 0) {
1509                 bt_rfcomm_server_info_t *server_info;
1510
1511                 __bt_get_agent_signal_info(msg, &address, &name, &uuid);
1512
1513                 server_info = _bt_rfcomm_get_server_info_using_uuid(uuid);
1514                 ret_if(server_info == NULL);
1515                 ret_if(server_info->server_type != BT_CUSTOM_SERVER);
1516
1517                 _bt_send_event(BT_RFCOMM_SERVER_EVENT,
1518                         BLUETOOTH_EVENT_RFCOMM_AUTHORIZE,
1519                         DBUS_TYPE_INT32, &result,
1520                         DBUS_TYPE_STRING, &address,
1521                         DBUS_TYPE_STRING, &uuid,
1522                         DBUS_TYPE_STRING, &name,
1523                         DBUS_TYPE_INT16, &server_info->control_fd,
1524                         DBUS_TYPE_INVALID);
1525         }
1526 }
1527
1528 static int __bt_get_object_path(DBusMessage *msg, char **path)
1529 {
1530         DBusMessageIter item_iter;
1531
1532         dbus_message_iter_init(msg, &item_iter);
1533
1534         if (dbus_message_iter_get_arg_type(&item_iter)
1535                                         != DBUS_TYPE_OBJECT_PATH) {
1536                 BT_ERR("This is bad format dbus\n");
1537                 return BLUETOOTH_ERROR_INTERNAL;
1538         }
1539
1540         dbus_message_iter_get_basic(&item_iter, path);
1541
1542         if (*path == NULL)
1543                 return BLUETOOTH_ERROR_INTERNAL;
1544
1545         return BLUETOOTH_ERROR_NONE;
1546 }
1547
1548 static void __bt_devices_list_free()
1549 {
1550         bt_remote_dev_info_t *dev_info;
1551         GList *node;
1552
1553         node = g_list_first(g_list);
1554
1555         while (node != NULL){
1556                 dev_info = (bt_remote_dev_info_t *)node->data;
1557
1558                 g_list = g_list_remove(g_list, dev_info);
1559                 _bt_free_device_info(dev_info);
1560
1561                 node = g_list_next(node);
1562         }
1563 }
1564
1565 static DBusHandlerResult __bt_manager_event_filter(DBusConnection *conn,
1566                                            DBusMessage *msg, void *data)
1567 {
1568         const char *member = dbus_message_get_member(msg);
1569         bt_event_type_t bt_event;
1570
1571         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1572                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1573
1574         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1575
1576         BT_DBG("interface: %s | member: %s", dbus_message_get_interface(msg), member);
1577
1578         if (strcasecmp(member, "InterfacesAdded") == 0) {
1579                 char *object_path = NULL;
1580
1581                 if (__bt_get_object_path(msg, &object_path)) {
1582                         BT_ERR("Fail to get the path");
1583                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1584                 }
1585
1586                 bt_event = __bt_parse_event(msg);
1587
1588                 if (bt_event == BT_DEVICE_EVENT) {
1589                         bt_remote_dev_info_t *dev_info;
1590                         int result = BLUETOOTH_ERROR_NONE;
1591
1592                         retv_if(_bt_is_discovering() == FALSE,
1593                                 DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1594
1595                         dev_info = __bt_parse_interface(msg);
1596
1597                         if (dev_info == NULL) {
1598                                 BT_ERR("Fail to parse the properies");
1599                                 return
1600                                 DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1601                         }
1602
1603                         if (dev_info->name == NULL)
1604                                 dev_info->name = g_strdup("");
1605
1606                         _bt_send_event(BT_ADAPTER_EVENT,
1607                                 BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
1608                                 DBUS_TYPE_INT32, &result,
1609                                 DBUS_TYPE_STRING, &dev_info->address,
1610                                 DBUS_TYPE_UINT32, &dev_info->class,
1611                                 DBUS_TYPE_INT16, &dev_info->rssi,
1612                                 DBUS_TYPE_STRING, &dev_info->name,
1613                                 DBUS_TYPE_BOOLEAN, &dev_info->paired,
1614                                 DBUS_TYPE_BOOLEAN,
1615                                                 &dev_info->connected,
1616                                 DBUS_TYPE_BOOLEAN, &dev_info->trust,
1617                                 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1618                                 &dev_info->uuids, dev_info->uuid_count,
1619                                 DBUS_TYPE_INVALID);
1620                         g_list = g_list_append(g_list, dev_info);
1621                 } else if (bt_event == BT_MEDIA_TRANSFER_EVENT) {
1622                         __bt_parse_audio_properties(msg);
1623                 }
1624
1625         } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1626
1627                 bt_event = __bt_parse_remove_event(msg);
1628
1629                 if (bt_event == BT_MEDIA_TRANSFER_EVENT){
1630                         _bt_parse_audio_remove_properties(msg);
1631                 } else if (bt_event == BT_DEVICE_EVENT) {
1632                         char *object_path = NULL;
1633                         if (__bt_get_object_path(msg, &object_path)) {
1634                                 BT_ERR("Fail to get the path");
1635                                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1636                         }
1637
1638                         if (strncasecmp(object_path, BT_BLUEZ_HCI_DEV_PATH, strlen(BT_BLUEZ_HCI_DEV_PATH)) == 0) {
1639                                 int result = BLUETOOTH_ERROR_NONE;
1640                                 char *address;
1641                                 bt_remote_dev_info_t * dev_info;
1642                                 GList * node;
1643
1644                                 BT_DBG("device interface removed | path: %s", object_path);
1645
1646                                 /* Remove bonding from remote device */
1647                                 address = g_malloc0(BT_ADDRESS_STRING_SIZE);
1648
1649                                 _bt_convert_device_path_to_address(object_path, address);
1650
1651                                 node = g_list_first(g_list);
1652
1653                                 while (node != NULL){
1654                                         dev_info = (bt_remote_dev_info_t *)node->data;
1655                                         if (strcasecmp(dev_info->address, address) == 0) {
1656                                                 if (dev_info->paired) {
1657                                                         BT_DBG("send bt bond destroy event");
1658                                                         _bt_send_event(BT_ADAPTER_EVENT,
1659                                                                 BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED,
1660                                                                 DBUS_TYPE_INT32, &result,
1661                                                                 DBUS_TYPE_STRING, &address,
1662                                                                 DBUS_TYPE_INVALID);
1663                                                 } else {
1664                                                         BT_DBG("Bluez removes device %s, send device disappear event", dev_info->name);
1665                                                         _bt_send_event(BT_ADAPTER_EVENT,
1666                                                                 BLUETOOTH_EVENT_REMOTE_DEVICE_DISAPPEARED,
1667                                                                 DBUS_TYPE_INT32, &result,
1668                                                                 DBUS_TYPE_STRING, &dev_info->address,
1669                                                                 DBUS_TYPE_UINT32, &dev_info->class,
1670                                                                 DBUS_TYPE_INT16, &dev_info->rssi,
1671                                                                 DBUS_TYPE_STRING, &dev_info->name,
1672                                                                 DBUS_TYPE_BOOLEAN, &dev_info->paired,
1673                                                                 DBUS_TYPE_BOOLEAN, &dev_info->connected,
1674                                                                 DBUS_TYPE_BOOLEAN, &dev_info->trust,
1675                                                                 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
1676                                                                 &dev_info->uuids, dev_info->uuid_count,
1677                                                                 DBUS_TYPE_INVALID);
1678                                                 }
1679                                                 g_list = g_list_remove(g_list, dev_info);
1680                                                 _bt_free_device_info(dev_info);
1681                                                 break;
1682                                         }
1683                                         node = g_list_next(node);
1684                                 }
1685
1686                                 g_free(address);
1687                         }
1688                 } else {
1689                         char *object_path = NULL;
1690                         if (__bt_get_object_path(msg, &object_path)) {
1691                                 BT_ERR("Fail to get the path");
1692                                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1693                         }
1694                 }
1695         } else if (strcasecmp(member, "NameOwnerChanged") == 0) {
1696                 gboolean value;
1697                 char *name = NULL;
1698                 char *previous = NULL;
1699                 char *current = NULL;
1700
1701                 BT_DBG("NameOwnerChanged");
1702
1703                 if (__bt_get_owner_info(msg, &name, &previous, &current)) {
1704                         BT_ERR("Fail to get the owner info");
1705                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1706                 }
1707
1708                 if (*current != '\0')
1709                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1710
1711                 if (strcasecmp(name, "org.bluez") == 0) {
1712                         BT_DBG("Bluetoothd is terminated");
1713                         _bt_handle_adapter_removed();
1714                         __bt_devices_list_free();
1715                 }
1716
1717                 _bt_obex_server_check_allocation(&value);
1718
1719                 if (value == TRUE) {
1720                         /* Check if the obex server was terminated abnormally */
1721                         _bt_obex_server_check_termination(name);
1722                 }
1723
1724                 _bt_rfcomm_server_check_existence(&value);
1725
1726                 if (value == TRUE) {
1727                         /* The obex server was terminated abnormally */
1728                         _bt_rfcomm_server_check_termination(name);
1729                 }
1730         } else  if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1731                 _bt_handle_property_changed_event(msg);
1732         } else  if (dbus_message_has_interface(msg, BT_INPUT_INTERFACE)) {
1733                 _bt_handle_input_event(msg);
1734         } else  if (dbus_message_has_interface(msg, BT_NETWORK_SERVER_INTERFACE)) {
1735                 _bt_handle_network_server_event(msg);
1736         } else  if (dbus_message_has_interface(msg, BT_HFP_AGENT_INTERFACE)) {
1737                 _bt_handle_headset_event(msg);
1738         } else  if (dbus_message_has_interface(msg, BT_AGENT_INTERFACE)) {
1739                 _bt_handle_agent_event(msg);
1740         } else  if (dbus_message_has_interface(msg, BT_DEVICE_INTERFACE)) {
1741                 _bt_handle_device_event(msg);
1742         }
1743
1744         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1745 }
1746
1747 static gboolean __bt_is_obexd_event(DBusMessage *msg)
1748 {
1749         const char *member = dbus_message_get_member(msg);
1750
1751         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1752                 return FALSE;
1753
1754         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1755
1756         if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1757
1758                 DBusMessageIter item_iter;
1759                 const char *interface_name = NULL;
1760
1761                 dbus_message_iter_init(msg, &item_iter);
1762
1763                 if (dbus_message_iter_get_arg_type(&item_iter)
1764                                         != DBUS_TYPE_STRING) {
1765                         BT_ERR("This is bad format dbus\n");
1766                         return FALSE;
1767                 }
1768
1769                 dbus_message_iter_get_basic(&item_iter, &interface_name);
1770
1771                 retv_if(interface_name == NULL, FALSE);
1772
1773                 BT_DBG("interface: %s", interface_name);
1774
1775                 retv_if(dbus_message_iter_next(&item_iter) == FALSE, FALSE);
1776
1777                 retv_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY,
1778                                                                         FALSE);
1779
1780                 if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0)
1781                         return TRUE;
1782         }
1783
1784         return FALSE;
1785 }
1786
1787 void __bt_opc_property_changed_event(DBusMessageIter *msg_iter,
1788                                                 const char *path)
1789 {
1790         DBusMessageIter value_iter;
1791         DBusMessageIter dict_iter;
1792         DBusMessageIter item_iter;
1793         const char *property = NULL;
1794
1795         dbus_message_iter_recurse(msg_iter, &item_iter);
1796
1797         if (dbus_message_iter_get_arg_type(&item_iter)
1798                                 != DBUS_TYPE_DICT_ENTRY) {
1799                 BT_ERR("This is bad format dbus\n");
1800                 return;
1801         }
1802
1803         dbus_message_iter_recurse(&item_iter, &dict_iter);
1804
1805         dbus_message_iter_get_basic(&dict_iter, &property);
1806         ret_if(property == NULL);
1807
1808         ret_if(!dbus_message_iter_next(&dict_iter));
1809
1810         if (strcasecmp(property, "Status") == 0) {
1811                 const char *status = NULL;
1812                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1813                 dbus_message_iter_get_basic(&value_iter, &status);
1814
1815                 if(strcasecmp(status, "active") == 0){
1816                         _bt_obex_client_started(path);
1817                 }else if (strcasecmp(status, "complete") == 0) {
1818                         _bt_obex_client_completed(TRUE);
1819                 }else if (strcasecmp(status, "error") == 0){
1820                         _bt_obex_client_completed(FALSE);
1821                 }
1822         } else if (strcasecmp(property, "Transferred") == 0) {
1823                 static int transferred  = 0;
1824                 dbus_message_iter_recurse(&dict_iter, &value_iter);
1825                 dbus_message_iter_get_basic(&value_iter, &transferred);
1826
1827                 _bt_obex_client_progress(transferred);
1828         }
1829 }
1830
1831 void _bt_opc_property_changed_event(DBusMessage *msg)
1832 {
1833         DBusMessageIter item_iter;
1834         const char *member = dbus_message_get_member(msg);
1835         const char *interface_name = NULL;
1836
1837         ret_if(member == NULL);
1838
1839         dbus_message_iter_init(msg, &item_iter);
1840
1841         if (dbus_message_iter_get_arg_type(&item_iter)
1842                                 != DBUS_TYPE_STRING) {
1843                 BT_ERR("This is bad format dbus\n");
1844                 return;
1845         }
1846
1847         dbus_message_iter_get_basic(&item_iter, &interface_name);
1848
1849         ret_if(interface_name == NULL);
1850
1851         BT_DBG("interface: %s", interface_name);
1852
1853         ret_if(dbus_message_iter_next(&item_iter) == FALSE);
1854
1855         ret_if(dbus_message_iter_get_arg_type(&item_iter) != DBUS_TYPE_ARRAY);
1856
1857         if (strcasecmp(interface_name, BT_OBEX_TRANSFER_INTERFACE) == 0) {
1858                 __bt_opc_property_changed_event(&item_iter,
1859                                         dbus_message_get_path(msg));
1860         } else {
1861                 BT_DBG("No bluez interface");
1862         }
1863 }
1864
1865 static gboolean __bt_is_obexd_client_event(DBusMessage *msg)
1866 {
1867         const char *member = dbus_message_get_member(msg);
1868
1869         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1870                 return FALSE;
1871
1872         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1873
1874         if (dbus_message_has_interface(msg, BT_PROPERTIES_INTERFACE)) {
1875                 DBusMessageIter item_iter;
1876                 const char *interface_name = NULL;
1877
1878                 dbus_message_iter_init(msg, &item_iter);
1879
1880                 if (dbus_message_iter_get_arg_type(&item_iter)
1881                                                 != DBUS_TYPE_STRING) {
1882                         BT_ERR("This is bad format dbus\n");
1883                         return FALSE;
1884                 }
1885
1886                 dbus_message_iter_get_basic(&item_iter, &interface_name);
1887
1888                 retv_if(interface_name == NULL, FALSE);
1889
1890                 BT_DBG("interface: %s", interface_name);
1891
1892                 retv_if(dbus_message_iter_next(&item_iter) == FALSE,
1893                                                                 FALSE);
1894
1895                 retv_if(dbus_message_iter_get_arg_type(&item_iter)
1896                                         != DBUS_TYPE_ARRAY, FALSE);
1897
1898                 if (strcasecmp(interface_name,
1899                                         BT_OBEX_TRANSFER_INTERFACE) == 0)
1900                         return TRUE;
1901         }
1902
1903         return FALSE;
1904 }
1905
1906 static DBusHandlerResult __bt_opc_event_filter(DBusConnection *conn,
1907                                                 DBusMessage *msg, void *data)
1908 {
1909         const char *member = dbus_message_get_member(msg);
1910
1911         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1912                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1913
1914         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1915
1916         if (strcasecmp(member, "InterfacesAdded") == 0) {
1917                 BT_DBG("InterfacesAdded");
1918         }else if (strcasecmp(member, "InterfacesRemoved") == 0) {
1919                 char *object_path = NULL;
1920
1921                 if (__bt_get_object_path(msg, &object_path)) {
1922                         BT_ERR("Fail to get the path");
1923                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1924                 }
1925
1926                 BT_DBG("object_path =%s",object_path);
1927
1928                 if (strncmp(object_path, BT_SESSION_BASEPATH_CLIENT,
1929                         strlen(BT_SESSION_BASEPATH_CLIENT)) != 0
1930                         || strstr(object_path, "transfer") == NULL)
1931                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1932
1933                 _bt_sending_files();
1934
1935         }else if (__bt_is_obexd_client_event(msg) == TRUE){
1936                 const char *path = dbus_message_get_path(msg);
1937
1938                 if (strncmp(path, BT_SESSION_BASEPATH_CLIENT,
1939                         strlen(BT_SESSION_BASEPATH_CLIENT)) != 0)
1940                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1941
1942                 _bt_opc_property_changed_event(msg);
1943         }
1944
1945         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1946 }
1947
1948 static DBusHandlerResult __bt_obexd_event_filter(DBusConnection *conn,
1949                                                 DBusMessage *msg, void *data)
1950 {
1951         const char *member = dbus_message_get_member(msg);
1952
1953         if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
1954                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1955
1956         retv_if(member == NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
1957
1958         if (__bt_is_obexd_event(msg) == TRUE){
1959                 const char *path = dbus_message_get_path(msg);
1960
1961                 if (strncmp(path, BT_SESSION_BASEPATH_SERVER,
1962                         strlen(BT_SESSION_BASEPATH_SERVER)) != 0)
1963                         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1964
1965                 _bt_handle_property_changed_event(msg);
1966         }
1967
1968         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1969 }
1970
1971 int _bt_register_service_event(DBusGConnection *g_conn, int event_type)
1972 {
1973         DBusError dbus_error;
1974         char *match1 = NULL;
1975         char *match2 = NULL;
1976         char *match3 = NULL;
1977         char *match4 = NULL;
1978         DBusConnection *conn;
1979         DBusHandleMessageFunction event_func = NULL;
1980
1981         retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1982
1983         conn = dbus_g_connection_get_connection(g_conn);
1984         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
1985
1986         switch (event_type) {
1987         case BT_MANAGER_EVENT:
1988                 event_func = __bt_manager_event_filter;
1989                 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1990                                         BT_MANAGER_INTERFACE,
1991                                         BT_INTERFACES_ADDED);
1992
1993                 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1994                                         BT_MANAGER_INTERFACE,
1995                                         BT_INTERFACES_REMOVED);
1996
1997                 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
1998                                         BT_FREEDESKTOP_INTERFACE,
1999                                         BT_NAME_OWNER_CHANGED);
2000
2001                 match4 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2002                                         BT_PROPERTIES_INTERFACE,
2003                                         BT_PROPERTIES_CHANGED);
2004                 break;
2005         case BT_DEVICE_EVENT:
2006                 match1 = g_strdup_printf(EVENT_MATCH_RULE,
2007                                         BT_DEVICE_INTERFACE);
2008                 break;
2009         case BT_HID_EVENT:
2010                 match1 = g_strdup_printf(EVENT_MATCH_RULE,
2011                                         BT_INPUT_INTERFACE);
2012                 break;
2013         case BT_NETWORK_EVENT:
2014                 match1 = g_strdup_printf(EVENT_MATCH_RULE,
2015                                         BT_NETWORK_SERVER_INTERFACE);
2016
2017                 match2 = g_strdup_printf(EVENT_MATCH_RULE,
2018                                         BT_NETWORK_CLIENT_INTERFACE);
2019                 break;
2020         case BT_HEADSET_EVENT:
2021                 match1 = g_strdup_printf(EVENT_MATCH_RULE,
2022                                         BT_HFP_AGENT_INTERFACE);
2023
2024                 match2 = g_strdup_printf(EVENT_MATCH_RULE,
2025                                         BT_SINK_INTERFACE);
2026                 break;
2027         case BT_OPP_SERVER_EVENT:
2028                 event_func = __bt_obexd_event_filter;
2029                 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2030                                         BT_PROPERTIES_INTERFACE,
2031                                         BT_PROPERTIES_CHANGED);
2032                 break;
2033         case BT_OPP_CLIENT_EVENT:
2034                 event_func = __bt_opc_event_filter;
2035                 match1 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2036                                         BT_PROPERTIES_INTERFACE,
2037                                         BT_PROPERTIES_CHANGED);
2038
2039                 match2 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2040                                         BT_MANAGER_INTERFACE,
2041                                         BT_INTERFACES_ADDED);
2042
2043                 match3 = g_strdup_printf(MANAGER_EVENT_MATCH_RULE,
2044                                         BT_MANAGER_INTERFACE,
2045                                         BT_INTERFACES_REMOVED);
2046                 break;
2047         default:
2048                 BT_ERR("Unknown event");
2049                 return BLUETOOTH_ERROR_INTERNAL;
2050         }
2051
2052         if (event_func) {
2053                 if (!dbus_connection_add_filter(conn, event_func,
2054                                                 NULL, NULL)) {
2055                         BT_ERR("Fail to add filter");
2056                         goto fail;
2057                 }
2058         }
2059
2060         dbus_error_init(&dbus_error);
2061
2062         if (match1)
2063                 dbus_bus_add_match(conn, match1, &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 (match2)
2072                 dbus_bus_add_match(conn, match2, &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         if (match3)
2081                 dbus_bus_add_match(conn, match3, &dbus_error);
2082
2083         if (dbus_error_is_set(&dbus_error)) {
2084                 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2085                 dbus_error_free(&dbus_error);
2086                 goto fail;
2087         }
2088
2089         if (match4)
2090                 dbus_bus_add_match(conn, match4, &dbus_error);
2091
2092         if (dbus_error_is_set(&dbus_error)) {
2093                 BT_ERR("Fail to add match: %s\n", dbus_error.message);
2094                 dbus_error_free(&dbus_error);
2095                 goto fail;
2096         }
2097
2098         g_free(match1);
2099         g_free(match2);
2100         g_free(match3);
2101         g_free(match4);
2102
2103         return BLUETOOTH_ERROR_NONE;
2104 fail:
2105         g_free(match1);
2106         g_free(match2);
2107         g_free(match3);
2108         g_free(match4);
2109         return BLUETOOTH_ERROR_INTERNAL;
2110 }
2111
2112 void _bt_unregister_service_event(DBusGConnection *g_conn, int event_type)
2113 {
2114         DBusConnection *conn;
2115         DBusHandleMessageFunction event_func;
2116
2117         ret_if(g_conn == NULL);
2118         conn = dbus_g_connection_get_connection(g_conn);
2119
2120         switch (event_type) {
2121         case BT_MANAGER_EVENT:
2122                 event_func = __bt_manager_event_filter;
2123                 break;
2124         case BT_OPP_SERVER_EVENT:
2125                 event_func = __bt_obexd_event_filter;
2126                 break;
2127         case BT_OPP_CLIENT_EVENT:
2128                 event_func = __bt_opc_event_filter;
2129                 break;
2130         default:
2131                 BT_ERR("Unknown event");
2132                 return;
2133         }
2134
2135         ret_if(conn == NULL);
2136
2137         dbus_connection_remove_filter(conn, event_func, NULL);
2138 }
2139
2140 static int __bt_init_manager_receiver(void)
2141 {
2142         GError *error = NULL;
2143
2144         if (manager_conn == NULL) {
2145                 manager_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
2146                 if (error != NULL) {
2147                         BT_ERR("ERROR: Can't get on system bus [%s]", error->message);
2148                         g_error_free(error);
2149                 }
2150                 retv_if(manager_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2151         }
2152
2153         if (_bt_register_service_event(manager_conn,
2154                                 BT_MANAGER_EVENT) != BLUETOOTH_ERROR_NONE)
2155                 goto fail;
2156
2157         if (_bt_register_service_event(manager_conn,
2158                                 BT_DEVICE_EVENT) != BLUETOOTH_ERROR_NONE)
2159                 goto fail;
2160
2161         if (_bt_register_service_event(manager_conn,
2162                                 BT_HID_EVENT) != BLUETOOTH_ERROR_NONE)
2163                 goto fail;
2164
2165         if (_bt_register_service_event(manager_conn,
2166                                 BT_HEADSET_EVENT) != BLUETOOTH_ERROR_NONE)
2167                 goto fail;
2168
2169         if (_bt_register_service_event(manager_conn,
2170                                 BT_NETWORK_EVENT) != BLUETOOTH_ERROR_NONE)
2171                 goto fail;
2172
2173         return BLUETOOTH_ERROR_NONE;
2174 fail:
2175         if (manager_conn) {
2176                 dbus_g_connection_unref(manager_conn);
2177                 manager_conn = NULL;
2178         }
2179
2180         return BLUETOOTH_ERROR_INTERNAL;
2181 }
2182
2183 static int __bt_init_obexd_receiver(void)
2184 {
2185         GError *error = NULL;
2186
2187         if (obexd_conn == NULL) {
2188                 obexd_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
2189                 if (error != NULL) {
2190                         BT_ERR("ERROR: Can't get on session bus [%s]", error->message);
2191                         g_error_free(error);
2192                 }
2193                 retv_if(obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2194         }
2195
2196         if (_bt_register_service_event(obexd_conn,
2197                                 BT_OPP_SERVER_EVENT) != BLUETOOTH_ERROR_NONE) {
2198                 dbus_g_connection_unref(obexd_conn);
2199                 obexd_conn = NULL;
2200                 return BLUETOOTH_ERROR_INTERNAL;
2201         }
2202
2203         return BLUETOOTH_ERROR_NONE;
2204 }
2205
2206 /* To receive the event from bluez */
2207 int _bt_init_service_event_receiver(void)
2208 {
2209         int result;
2210
2211         result = __bt_init_manager_receiver();
2212         retv_if(result != BLUETOOTH_ERROR_NONE, result);
2213
2214         result = __bt_init_obexd_receiver();
2215         if (result != BLUETOOTH_ERROR_NONE)
2216                 BT_ERR("Fail to init obexd receiver");
2217
2218         return BLUETOOTH_ERROR_NONE;
2219 }
2220
2221 void _bt_deinit_service_event_reciever(void)
2222 {
2223         _bt_unregister_service_event(manager_conn, BT_MANAGER_EVENT);
2224
2225         _bt_unregister_service_event(obexd_conn, BT_OPP_SERVER_EVENT);
2226
2227         if (manager_conn) {
2228                 dbus_g_connection_unref(manager_conn);
2229                 manager_conn = NULL;
2230         }
2231
2232         if (obexd_conn) {
2233                 dbus_g_connection_unref(obexd_conn);
2234                 obexd_conn = NULL;
2235         }
2236
2237         if (event_id > 0)
2238                 g_source_remove(event_id);
2239 }
2240
2241 int _bt_opp_client_event_init(void)
2242 {
2243         GError *error = NULL;
2244
2245         if (opc_obexd_conn == NULL) {
2246                 opc_obexd_conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
2247                 if (error != NULL) {
2248                         BT_ERR("ERROR: Can't get on session bus [%s]",
2249                                                          error->message);
2250                         g_error_free(error);
2251                 }
2252
2253                 retv_if(opc_obexd_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
2254         }
2255
2256         if (_bt_register_service_event(opc_obexd_conn,
2257                         BT_OPP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
2258                 dbus_g_connection_unref(opc_obexd_conn);
2259                 opc_obexd_conn = NULL;
2260                 return BLUETOOTH_ERROR_INTERNAL;
2261         }
2262
2263         return BLUETOOTH_ERROR_NONE;
2264 }
2265
2266 void _bt_opp_client_event_deinit(void)
2267 {
2268         if (opc_obexd_conn) {
2269                 _bt_unregister_service_event(opc_obexd_conn,
2270                                                 BT_OPP_CLIENT_EVENT);
2271                 dbus_g_connection_unref(opc_obexd_conn);
2272                 opc_obexd_conn = NULL;
2273         }
2274 }
2275
2276 void _bt_get_temp_remote_devinfo(void)
2277 {
2278         bt_remote_dev_info_t *dev_info;
2279         GList *node;
2280         int result = BLUETOOTH_ERROR_NONE;
2281
2282         node = g_list_first(g_list);
2283
2284         while (node != NULL) {
2285                 dev_info = (bt_remote_dev_info_t *)node->data;
2286                 /* do not search paired devices.
2287                  * Paired devices are in g_list in order to trig device disappear
2288                  * or remove bonding events */
2289                 if (!dev_info->paired) {
2290                         _bt_send_event(BT_ADAPTER_EVENT,
2291                                 BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND,
2292                                 DBUS_TYPE_INT32, &result,
2293                                 DBUS_TYPE_STRING, &dev_info->address,
2294                                 DBUS_TYPE_UINT32, &dev_info->class,
2295                                 DBUS_TYPE_INT16, &dev_info->rssi,
2296                                 DBUS_TYPE_STRING, &dev_info->name,
2297                                 DBUS_TYPE_BOOLEAN, &dev_info->paired,
2298                                 DBUS_TYPE_BOOLEAN, &dev_info->connected,
2299                                 DBUS_TYPE_BOOLEAN, &dev_info->trust,
2300                                 DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
2301                                 &dev_info->uuids, dev_info->uuid_count,
2302                                 DBUS_TYPE_INVALID);
2303                 }
2304                 node = g_list_next(node);
2305         }
2306 }