Code Merge [Tizen3.0]: Applied tizen.org patches
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-event-sender.c
1 /*
2  * Bluetooth-frwk
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact:  Hocheol Seo <hocheol.seo@samsung.com>
7  *               Girishashok Joshi <girish.joshi@samsung.com>
8  *               Chanyeol Park <chanyeol.park@samsung.com>
9  *
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *              http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  *
22  */
23
24 #include <dbus/dbus-glib.h>
25 #include <dbus/dbus.h>
26 #include <glib.h>
27 #include <dlog.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
35 static DBusConnection *event_conn;
36 static DBusConnection *hf_local_term_event_conn;
37
38 int _bt_send_event(int event_type, int event, int type, ...)
39 {
40         BT_DBG("+");
41
42         DBusMessage *msg;
43         char *path;
44         char *signal;
45         va_list arguments;
46
47         retv_if(event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
48
49         BT_DBG("event_type [%d], event [%d]", event_type, event);
50
51         switch (event_type) {
52         case BT_ADAPTER_EVENT:
53                 path = BT_ADAPTER_PATH;
54                 break;
55         case BT_LE_ADAPTER_EVENT:
56                 path = BT_LE_ADAPTER_PATH;
57                 break;
58         case BT_DEVICE_EVENT:
59                 path = BT_DEVICE_PATH;
60                 break;
61         case BT_HID_EVENT:
62                 path = BT_HID_PATH;
63                 break;
64         case BT_HEADSET_EVENT:
65                 path = BT_HEADSET_PATH;
66                 break;
67         case BT_AVRCP_EVENT:
68                 path = BT_AVRCP_PATH;
69                 break;
70         case BT_AVRCP_CONTROL_EVENT:
71                 path = BT_AVRCP_CONTROL_PATH;
72                 break;
73         case BT_NETWORK_EVENT:
74                 path = BT_NETWORK_PATH;
75                 break;
76         case BT_OPP_CLIENT_EVENT:
77                 path = BT_OPP_CLIENT_PATH;
78                 break;
79         case BT_OPP_SERVER_EVENT:
80                 path = BT_OPP_SERVER_PATH;
81                 break;
82         case BT_PBAP_CLIENT_EVENT:
83                 path = BT_PBAP_CLIENT_PATH;
84                 break;
85         case BT_RFCOMM_CLIENT_EVENT:
86                 path = BT_RFCOMM_CLIENT_PATH;
87                 break;
88         case BT_RFCOMM_SERVER_EVENT:
89                 path = BT_RFCOMM_SERVER_PATH;
90                 break;
91         default:
92                 BT_ERR("Unknown event");
93                 return BLUETOOTH_ERROR_INTERNAL;
94         }
95
96         switch (event) {
97         case BLUETOOTH_EVENT_ENABLED:
98                 signal = BT_ENABLED;
99                 break;
100         case BLUETOOTH_EVENT_DISABLED:
101                 signal = BT_DISABLED;
102                 break;
103         case BLUETOOTH_EVENT_LE_ENABLED:
104                 signal = BT_LE_ENABLED;
105                 break;
106         case BLUETOOTH_EVENT_LE_DISABLED:
107                 signal = BT_LE_DISABLED;
108                 break;
109         case BLUETOOTH_EVENT_LOCAL_NAME_CHANGED:
110                 signal = BT_ADAPTER_NAME_CHANGED;
111                 break;
112         case BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED:
113                 signal = BT_DISCOVERABLE_MODE_CHANGED;
114                 break;
115         case BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED:
116                 signal = BT_DISCOVERABLE_TIMEOUT_CHANGED;
117                 break;
118         case BLUETOOTH_EVENT_CONNECTABLE_CHANGED:
119                 signal = BT_CONNECTABLE_CHANGED;
120                 break;
121         case BLUETOOTH_EVENT_DISCOVERY_STARTED:
122                 signal = BT_DISCOVERY_STARTED;
123                 break;
124         case BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND:
125                 signal = BT_DEVICE_FOUND;
126                 break;
127         case BLUETOOTH_EVENT_REMOTE_DEVICE_DISAPPEARED:
128                 signal = BT_DEVICE_DISAPPEARED;
129                 break;
130         case BLUETOOTH_EVENT_DISCOVERY_FINISHED:
131                 signal = BT_DISCOVERY_FINISHED;
132                 break;
133         case BLUETOOTH_EVENT_LE_DISCOVERY_STARTED:
134                 signal = BT_LE_DISCOVERY_STARTED;
135                 break;
136         case BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND:
137                 signal = BT_LE_DEVICE_FOUND;
138                 break;
139         case BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED:
140                 signal = BT_LE_DISCOVERY_FINISHED;
141                 break;
142         case BLUETOOTH_EVENT_ADVERTISING_STARTED:
143                 signal = BT_ADVERTISING_STARTED;
144                 break;
145         case BLUETOOTH_EVENT_ADVERTISING_STOPPED:
146                 signal = BT_ADVERTISING_STOPPED;
147                 break;
148         case BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED:
149                 signal = BT_ADVERTISING_MANUFACTURER_DATA_CHANGED;
150                 break;
151         case BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED:
152                 signal = BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED;
153                 break;
154         case BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED:
155                 signal = BT_MANUFACTURER_DATA_CHANGED;
156                 break;
157         case BLUETOOTH_EVENT_BONDING_FINISHED:
158                 signal = BT_BOND_CREATED;
159                 break;
160         case BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED:
161                 signal = BT_BOND_DESTROYED;
162                 break;
163         case BLUETOOTH_EVENT_DEVICE_AUTHORIZED:
164                 signal = BT_DEVICE_AUTHORIZED;
165                 break;
166         case BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED:
167                 signal = BT_DEVICE_UNAUTHORIZED;
168                 break;
169         case BLUETOOTH_EVENT_RSSI_ENABLED:
170                 signal = BT_RSSI_MONITORING_ENABLED;
171                 break;
172         case BLUETOOTH_EVENT_RSSI_ALERT:
173                 signal = BT_RSSI_ALERT;
174                 break;
175         case BLUETOOTH_EVENT_RAW_RSSI:
176                 signal = BT_RAW_RSSI_EVENT;
177                 break;
178         case BLUETOOTH_EVENT_SERVICE_SEARCHED:
179                 signal = BT_SERVICE_SEARCHED;
180                 break;
181         case BLUETOOTH_HID_CONNECTED:
182                 signal = BT_INPUT_CONNECTED;
183                 BT_INFO_C("Connected [HID]");
184                 break;
185         case BLUETOOTH_HID_DISCONNECTED:
186                 signal = BT_INPUT_DISCONNECTED;
187                 BT_INFO_C("Disconnected [HID]");
188                 break;
189         case BLUETOOTH_PBAP_CONNECTED:
190                 signal = BT_PBAP_CONNECTED;
191                 BT_INFO_C("Connected [PBAP Client]");
192                 break;
193         case BLUETOOTH_PBAP_PHONEBOOK_SIZE:
194                 signal = BT_PBAP_PHONEBOOK_SIZE;
195                 break;
196         case BLUETOOTH_PBAP_PHONEBOOK_PULL:
197                 signal = BT_PBAP_PHONEBOOK_PULL;
198                 break;
199         case BLUETOOTH_PBAP_VCARD_LIST:
200                 signal = BT_PBAP_VCARD_LIST;
201                 break;
202         case BLUETOOTH_PBAP_VCARD_PULL:
203                 signal = BT_PBAP_VCARD_PULL;
204                 break;
205         case BLUETOOTH_PBAP_PHONEBOOK_SEARCH:
206                 signal = BT_PBAP_SEARCH_PHONEBOOK;
207                 break;
208         case BLUETOOTH_EVENT_AG_CONNECTED:
209                 signal = BT_HEADSET_CONNECTED;
210                 BT_INFO_C("Connected [HSP/HFP]");
211                 break;
212         case BLUETOOTH_EVENT_AG_DISCONNECTED:
213                 signal = BT_HEADSET_DISCONNECTED;
214                 BT_INFO_C("Disconnected [HSP/HFP]");
215                 break;
216         case BLUETOOTH_EVENT_AV_CONNECTED:
217                 signal = BT_STEREO_HEADSET_CONNECTED;
218                 BT_INFO_C("Connected [A2DP]");
219                 break;
220         case BLUETOOTH_EVENT_AV_DISCONNECTED:
221                 signal = BT_STEREO_HEADSET_DISCONNECTED;
222                 BT_INFO_C("Disconnected [A2DP]");
223                 break;
224         case BLUETOOTH_EVENT_AG_AUDIO_CONNECTED:
225                 signal = BT_SCO_CONNECTED;
226                 BT_INFO_C("Connected [SCO]");
227                 break;
228         case BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED:
229                 signal = BT_SCO_DISCONNECTED;
230                 BT_INFO_C("Disonnected [SCO]");
231                 break;
232         case BLUETOOTH_EVENT_AG_SPEAKER_GAIN:
233                 signal = BT_SPEAKER_GAIN;
234                 break;
235         case BLUETOOTH_EVENT_AG_MIC_GAIN:
236                 signal = BT_MICROPHONE_GAIN;
237                 break;
238         case BLUETOOTH_EVENT_NETWORK_CONNECTED:
239                 signal = BT_NETWORK_CONNECTED;
240                 BT_INFO_C("Connected [Newwork]");
241                 break;
242         case BLUETOOTH_EVENT_NETWORK_DISCONNECTED:
243                 signal = BT_NETWORK_DISCONNECTED;
244                 BT_INFO_C("Disconnected [Newwork]");
245                 break;
246         case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
247                 signal = BT_NETWORK_SERVER_CONNECTED;
248                 BT_INFO_C("Connected [Network Server]");
249                 break;
250         case BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED:
251                 signal = BT_NETWORK_SERVER_DISCONNECTED;
252                 BT_INFO_C("Disconnected [Network Server]");
253                 break;
254         case BLUETOOTH_EVENT_OPC_CONNECTED:
255                 signal = BT_OPP_CONNECTED;
256                 BT_INFO_C("Connected [OPP]");
257                 break;
258         case BLUETOOTH_EVENT_OPC_DISCONNECTED:
259                 signal = BT_OPP_DISCONNECTED;
260                 BT_INFO_C("Disconnected [OPP]");
261                 break;
262         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED:
263                 signal = BT_TRANSFER_CONNECTED;
264                 break;
265         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED:
266                 signal = BT_TRANSFER_DISCONNECTED;
267                 break;
268         case BLUETOOTH_EVENT_OPC_TRANSFER_STARTED:
269         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED:
270                 signal = BT_TRANSFER_STARTED;
271                 break;
272         case BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS:
273         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
274                 signal = BT_TRANSFER_PROGRESS;
275                 break;
276         case BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE:
277         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
278                 signal = BT_TRANSFER_COMPLETED;
279                 break;
280         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE:
281                 signal = BT_TRANSFER_AUTHORIZED;
282                 break;
283         case BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE:
284         case BLUETOOTH_EVENT_RFCOMM_AUTHORIZE:
285                 signal = BT_CONNECTION_AUTHORIZED;
286                 break;
287         case BLUETOOTH_EVENT_RFCOMM_CONNECTED:
288                 signal = BT_RFCOMM_CONNECTED;
289                 break;
290         case BLUETOOTH_EVENT_RFCOMM_DISCONNECTED:
291                 signal = BT_RFCOMM_DISCONNECTED;
292                 break;
293         case BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED:
294                 signal = BT_RFCOMM_DATA_RECEIVED;
295                 break;
296         case BLUETOOTH_EVENT_RFCOMM_SERVER_REMOVED:
297                 signal = BT_RFCOMM_SERVER_REMOVED;
298                 break;
299         case BLUETOOTH_EVENT_DEVICE_CONNECTED:
300                 signal = BT_DEVICE_CONNECTED;
301                 break;
302         case BLUETOOTH_EVENT_DEVICE_DISCONNECTED:
303                 signal = BT_DEVICE_DISCONNECTED;
304                 break;
305         case BLUETOOTH_EVENT_AVRCP_CONNECTED:
306         case BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED:
307                 signal = BT_AVRCP_CONNECTED;
308                 BT_INFO_C("Connected [AVRCP]");
309                 break;
310         case BLUETOOTH_EVENT_AVRCP_DISCONNECTED:
311         case BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED:
312                 signal = BT_AVRCP_DISCONNECTED;
313                 BT_INFO_C("Disconnected [AVRCP]");
314                 break;
315         case BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS:
316         case BLUETOOTH_EVENT_AVRCP_CONTROL_SHUFFLE_STATUS:
317                 signal = BT_MEDIA_SHUFFLE_STATUS;
318                 break;
319         case BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
320         case BLUETOOTH_EVENT_AVRCP_CONTROL_EQUALIZER_STATUS:
321                 signal = BT_MEDIA_EQUALIZER_STATUS;
322                 break;
323         case BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS:
324         case BLUETOOTH_EVENT_AVRCP_CONTROL_REPEAT_STATUS:
325                 signal = BT_MEDIA_REPEAT_STATUS;
326                 break;
327         case BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS:
328         case BLUETOOTH_EVENT_AVRCP_CONTROL_SCAN_STATUS:
329                 signal = BT_MEDIA_SCAN_STATUS;
330                 break;
331         case BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS:
332                 signal = BT_MEDIA_POSITION_STATUS;
333                 break;
334         case BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED:
335                 signal = BT_MEDIA_PLAY_STATUS;
336                 break;
337         case BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED:
338                 signal = BT_MEDIA_TRACK_CHANGE;
339                 break;
340         case BLUETOOTH_EVENT_GATT_CONNECTED:
341                 signal = BT_GATT_CONNECTED;
342                 break;
343         case BLUETOOTH_EVENT_GATT_DISCONNECTED:
344                 signal = BT_GATT_DISCONNECTED;
345                 break;
346         default:
347                 BT_ERR("Unknown event");
348                 return BLUETOOTH_ERROR_INTERNAL;
349         }
350
351         BT_DBG("Path : %s", path);
352         BT_INFO_C("Signal : %s", signal);
353
354         msg = dbus_message_new_signal(path, BT_EVENT_SERVICE,
355                                 signal);
356
357         if (msg == NULL) {
358                 BT_ERR("Message is NULL");
359                 return BLUETOOTH_ERROR_INTERNAL;
360         }
361
362         if (type) {
363                 /* Set the arguments of the dbus message */
364                 va_start(arguments, type);
365
366                 if (!dbus_message_append_args_valist(msg, type, arguments)) {
367                         dbus_message_unref(msg);
368                         va_end(arguments);
369                         return BLUETOOTH_ERROR_INTERNAL;
370                 }
371
372                 va_end(arguments);
373         }
374
375         if (!dbus_connection_send(event_conn, msg, NULL)) {
376                 BT_ERR("send failed");
377                 dbus_message_unref(msg);
378                 return BLUETOOTH_ERROR_INTERNAL;
379         }
380
381         dbus_connection_flush(event_conn);
382         dbus_message_unref(msg);
383
384         BT_DBG("-");
385
386         return BLUETOOTH_ERROR_NONE;
387 }
388
389 int _bt_send_event_to_dest(const char* dest, int event_type, int event, int type, ...)
390 {
391         BT_DBG("+");
392
393         DBusMessage *msg;
394         char *path;
395         char *signal;
396         va_list arguments;
397
398         retv_if(event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
399
400         BT_DBG("event_type [%d], event [%d]", event_type, event);
401
402         switch (event_type) {
403         case BT_ADAPTER_EVENT:
404                 path = BT_ADAPTER_PATH;
405                 break;
406         default:
407                 BT_ERR("Unknown event");
408                 return BLUETOOTH_ERROR_INTERNAL;
409         }
410
411         switch (event) {
412         case BLUETOOTH_EVENT_ADVERTISING_STARTED:
413                 signal = BT_ADVERTISING_STARTED;
414                 break;
415         case BLUETOOTH_EVENT_ADVERTISING_STOPPED:
416                 signal = BT_ADVERTISING_STOPPED;
417                 break;
418         default:
419                 BT_ERR("Unknown event");
420                 return BLUETOOTH_ERROR_INTERNAL;
421         }
422
423         BT_DBG("Path : %s", path);
424         BT_INFO_C("Signal : %s", signal);
425
426         msg = dbus_message_new_signal(path, BT_EVENT_SERVICE,
427                                 signal);
428
429         if (msg == NULL) {
430                 BT_ERR("Message is NULL");
431                 return BLUETOOTH_ERROR_INTERNAL;
432         }
433
434         if (dbus_message_set_destination(msg, dest) == FALSE)
435                 BT_ERR("Setting destination is failed");
436
437         if (type) {
438                 /* Set the arguments of the dbus message */
439                 va_start(arguments, type);
440
441                 if (!dbus_message_append_args_valist(msg, type, arguments)) {
442                         dbus_message_unref(msg);
443                         va_end(arguments);
444                         return BLUETOOTH_ERROR_INTERNAL;
445                 }
446
447                 va_end(arguments);
448         }
449
450         if (!dbus_connection_send(event_conn, msg, NULL)) {
451                 BT_ERR("send failed");
452                 dbus_message_unref(msg);
453                 return BLUETOOTH_ERROR_INTERNAL;
454         }
455
456         dbus_connection_flush(event_conn);
457         dbus_message_unref(msg);
458
459         BT_DBG("-");
460
461         return BLUETOOTH_ERROR_NONE;
462 }
463
464 int _bt_send_hf_local_term_event(char *address)
465 {
466         DBusMessage *msg;
467         char *signal = BT_HF_LOCAL_TERM;
468
469         retv_if(hf_local_term_event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
470
471         msg = dbus_message_new_signal(BT_HF_LOCAL_TERM_EVENT_PATH,
472                         BT_HF_LOCAL_TERM_EVENT_INTERFACE, signal);
473         if (msg == NULL) {
474                 BT_ERR("Message is NULL\n");
475                 return BLUETOOTH_ERROR_INTERNAL;
476         }
477
478         dbus_message_append_args(msg, DBUS_TYPE_STRING, &address, DBUS_TYPE_INVALID);
479
480         if (!dbus_connection_send(hf_local_term_event_conn, msg, NULL)) {
481                 BT_ERR("send failed\n");
482                 dbus_message_unref(msg);
483                 return BLUETOOTH_ERROR_INTERNAL;
484         }
485
486         dbus_connection_flush(hf_local_term_event_conn);
487         dbus_message_unref(msg);
488
489         return BLUETOOTH_ERROR_NONE;
490 }
491
492 /* To send the event from service daemon to application*/
493 int _bt_init_service_event_sender(void)
494 {
495         DBusConnection *conn;
496         DBusError err;
497         int ret;
498
499         if (event_conn) {
500                 BT_ERR("Event handler is already exist");
501                 return BLUETOOTH_ERROR_INTERNAL;
502         }
503
504         conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL);
505         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
506
507         dbus_error_init(&err);
508
509         ret = dbus_bus_request_name(conn, BT_EVENT_SERVICE,
510                                 DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
511
512         if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
513                 if (dbus_error_is_set(&err) == TRUE) {
514                         BT_ERR("Event init failed, %s", err.message);
515                         dbus_error_free(&err);
516                 }
517                 return BLUETOOTH_ERROR_INTERNAL;
518         }
519
520         event_conn = conn;
521
522         return BLUETOOTH_ERROR_NONE;
523 }
524
525 void _bt_deinit_service_event_sender(void)
526 {
527         if (event_conn) {
528                 dbus_connection_close(event_conn);
529                 event_conn = NULL;
530         }
531 }
532
533 int _bt_init_hf_local_term_event_sender(void)
534 {
535         DBusConnection *conn;
536         DBusError err;
537         int ret;
538
539         if (hf_local_term_event_conn) {
540                 BT_ERR("Event handler is already exist");
541                 return BLUETOOTH_ERROR_INTERNAL;
542         }
543
544         conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL);
545         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
546
547         dbus_error_init(&err);
548
549         ret = dbus_bus_request_name(conn, BT_HF_LOCAL_TERM_EVENT_INTERFACE,
550                                 DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
551
552         if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
553                 if (dbus_error_is_set(&err) == TRUE) {
554                         BT_ERR("Event init failed, %s", err.message);
555                         dbus_error_free(&err);
556                 }
557                 return BLUETOOTH_ERROR_INTERNAL;
558         }
559
560         hf_local_term_event_conn = conn;
561
562         return BLUETOOTH_ERROR_NONE;
563 }
564
565 void _bt_deinit_hf_local_term_event_sender(void)
566 {
567         if (hf_local_term_event_conn) {
568                 dbus_connection_close(hf_local_term_event_conn);
569                 hf_local_term_event_conn = NULL;
570         }
571 }