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