Code Sync [Tizen3.0]: Merged the tizen_2.4 Spin code to tizen.org
[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_DISCOVERY_FINISHED:
128                 signal = BT_DISCOVERY_FINISHED;
129                 break;
130         case BLUETOOTH_EVENT_LE_DISCOVERY_STARTED:
131                 signal = BT_LE_DISCOVERY_STARTED;
132                 break;
133         case BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND:
134                 signal = BT_LE_DEVICE_FOUND;
135                 break;
136         case BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED:
137                 signal = BT_LE_DISCOVERY_FINISHED;
138                 break;
139         case BLUETOOTH_EVENT_ADVERTISING_STARTED:
140                 signal = BT_ADVERTISING_STARTED;
141                 break;
142         case BLUETOOTH_EVENT_ADVERTISING_STOPPED:
143                 signal = BT_ADVERTISING_STOPPED;
144                 break;
145         case BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED:
146                 signal = BT_ADVERTISING_MANUFACTURER_DATA_CHANGED;
147                 break;
148         case BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED:
149                 signal = BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED;
150                 break;
151         case BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED:
152                 signal = BT_MANUFACTURER_DATA_CHANGED;
153                 break;
154         case BLUETOOTH_EVENT_BONDING_FINISHED:
155                 signal = BT_BOND_CREATED;
156                 break;
157         case BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED:
158                 signal = BT_BOND_DESTROYED;
159                 break;
160         case BLUETOOTH_EVENT_DEVICE_AUTHORIZED:
161                 signal = BT_DEVICE_AUTHORIZED;
162                 break;
163         case BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED:
164                 signal = BT_DEVICE_UNAUTHORIZED;
165                 break;
166         case BLUETOOTH_EVENT_RSSI_ENABLED:
167                 signal = BT_RSSI_MONITORING_ENABLED;
168                 break;
169         case BLUETOOTH_EVENT_RSSI_ALERT:
170                 signal = BT_RSSI_ALERT;
171                 break;
172         case BLUETOOTH_EVENT_RAW_RSSI:
173                 signal = BT_RAW_RSSI_EVENT;
174                 break;
175         case BLUETOOTH_EVENT_SERVICE_SEARCHED:
176                 signal = BT_SERVICE_SEARCHED;
177                 break;
178         case BLUETOOTH_HID_CONNECTED:
179                 signal = BT_INPUT_CONNECTED;
180                 BT_INFO_C("Connected [HID]");
181                 break;
182         case BLUETOOTH_HID_DISCONNECTED:
183                 signal = BT_INPUT_DISCONNECTED;
184                 BT_INFO_C("Disconnected [HID]");
185                 break;
186         case BLUETOOTH_PBAP_CONNECTED:
187                 signal = BT_PBAP_CONNECTED;
188                 BT_INFO_C("Connected [PBAP Client]");
189                 break;
190         case BLUETOOTH_PBAP_PHONEBOOK_SIZE:
191                 signal = BT_PBAP_PHONEBOOK_SIZE;
192                 break;
193         case BLUETOOTH_PBAP_PHONEBOOK_PULL:
194                 signal = BT_PBAP_PHONEBOOK_PULL;
195                 break;
196         case BLUETOOTH_PBAP_VCARD_LIST:
197                 signal = BT_PBAP_VCARD_LIST;
198                 break;
199         case BLUETOOTH_PBAP_VCARD_PULL:
200                 signal = BT_PBAP_VCARD_PULL;
201                 break;
202         case BLUETOOTH_PBAP_PHONEBOOK_SEARCH:
203                 signal = BT_PBAP_SEARCH_PHONEBOOK;
204                 break;
205         case BLUETOOTH_EVENT_AG_CONNECTED:
206                 signal = BT_HEADSET_CONNECTED;
207                 BT_INFO_C("Connected [HSP/HFP]");
208                 break;
209         case BLUETOOTH_EVENT_AG_DISCONNECTED:
210                 signal = BT_HEADSET_DISCONNECTED;
211                 BT_INFO_C("Disconnected [HSP/HFP]");
212                 break;
213         case BLUETOOTH_EVENT_AV_CONNECTED:
214                 signal = BT_STEREO_HEADSET_CONNECTED;
215                 BT_INFO_C("Connected [A2DP]");
216                 break;
217         case BLUETOOTH_EVENT_AV_DISCONNECTED:
218                 signal = BT_STEREO_HEADSET_DISCONNECTED;
219                 BT_INFO_C("Disconnected [A2DP]");
220                 break;
221         case BLUETOOTH_EVENT_AG_AUDIO_CONNECTED:
222                 signal = BT_SCO_CONNECTED;
223                 BT_INFO_C("Connected [SCO]");
224                 break;
225         case BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED:
226                 signal = BT_SCO_DISCONNECTED;
227                 BT_INFO_C("Disonnected [SCO]");
228                 break;
229         case BLUETOOTH_EVENT_AG_SPEAKER_GAIN:
230                 signal = BT_SPEAKER_GAIN;
231                 break;
232         case BLUETOOTH_EVENT_AG_MIC_GAIN:
233                 signal = BT_MICROPHONE_GAIN;
234                 break;
235         case BLUETOOTH_EVENT_NETWORK_CONNECTED:
236                 signal = BT_NETWORK_CONNECTED;
237                 BT_INFO_C("Connected [Newwork]");
238                 break;
239         case BLUETOOTH_EVENT_NETWORK_DISCONNECTED:
240                 signal = BT_NETWORK_DISCONNECTED;
241                 BT_INFO_C("Disconnected [Newwork]");
242                 break;
243         case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
244                 signal = BT_NETWORK_SERVER_CONNECTED;
245                 BT_INFO_C("Connected [Network Server]");
246                 break;
247         case BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED:
248                 signal = BT_NETWORK_SERVER_DISCONNECTED;
249                 BT_INFO_C("Disconnected [Network Server]");
250                 break;
251         case BLUETOOTH_EVENT_OPC_CONNECTED:
252                 signal = BT_OPP_CONNECTED;
253                 BT_INFO_C("Connected [OPP]");
254                 break;
255         case BLUETOOTH_EVENT_OPC_DISCONNECTED:
256                 signal = BT_OPP_DISCONNECTED;
257                 BT_INFO_C("Disconnected [OPP]");
258                 break;
259         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED:
260                 signal = BT_TRANSFER_CONNECTED;
261                 break;
262         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED:
263                 signal = BT_TRANSFER_DISCONNECTED;
264                 break;
265         case BLUETOOTH_EVENT_OPC_TRANSFER_STARTED:
266         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED:
267                 signal = BT_TRANSFER_STARTED;
268                 break;
269         case BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS:
270         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
271                 signal = BT_TRANSFER_PROGRESS;
272                 break;
273         case BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE:
274         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
275                 signal = BT_TRANSFER_COMPLETED;
276                 break;
277         case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE:
278                 signal = BT_TRANSFER_AUTHORIZED;
279                 break;
280         case BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE:
281         case BLUETOOTH_EVENT_RFCOMM_AUTHORIZE:
282                 signal = BT_CONNECTION_AUTHORIZED;
283                 break;
284         case BLUETOOTH_EVENT_RFCOMM_CONNECTED:
285                 signal = BT_RFCOMM_CONNECTED;
286                 break;
287         case BLUETOOTH_EVENT_RFCOMM_DISCONNECTED:
288                 signal = BT_RFCOMM_DISCONNECTED;
289                 break;
290         case BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED:
291                 signal = BT_RFCOMM_DATA_RECEIVED;
292                 break;
293         case BLUETOOTH_EVENT_RFCOMM_SERVER_REMOVED:
294                 signal = BT_RFCOMM_SERVER_REMOVED;
295                 break;
296         case BLUETOOTH_EVENT_DEVICE_CONNECTED:
297                 signal = BT_DEVICE_CONNECTED;
298                 break;
299         case BLUETOOTH_EVENT_DEVICE_DISCONNECTED:
300                 signal = BT_DEVICE_DISCONNECTED;
301                 break;
302         case BLUETOOTH_EVENT_AVRCP_CONNECTED:
303         case BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED:
304                 signal = BT_AVRCP_CONNECTED;
305                 BT_INFO_C("Connected [AVRCP]");
306                 break;
307         case BLUETOOTH_EVENT_AVRCP_DISCONNECTED:
308         case BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED:
309                 signal = BT_AVRCP_DISCONNECTED;
310                 BT_INFO_C("Disconnected [AVRCP]");
311                 break;
312         case BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS:
313         case BLUETOOTH_EVENT_AVRCP_CONTROL_SHUFFLE_STATUS:
314                 signal = BT_MEDIA_SHUFFLE_STATUS;
315                 break;
316         case BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
317         case BLUETOOTH_EVENT_AVRCP_CONTROL_EQUALIZER_STATUS:
318                 signal = BT_MEDIA_EQUALIZER_STATUS;
319                 break;
320         case BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS:
321         case BLUETOOTH_EVENT_AVRCP_CONTROL_REPEAT_STATUS:
322                 signal = BT_MEDIA_REPEAT_STATUS;
323                 break;
324         case BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS:
325         case BLUETOOTH_EVENT_AVRCP_CONTROL_SCAN_STATUS:
326                 signal = BT_MEDIA_SCAN_STATUS;
327                 break;
328         case BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS:
329                 signal = BT_MEDIA_POSITION_STATUS;
330                 break;
331         case BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED:
332                 signal = BT_MEDIA_PLAY_STATUS;
333                 break;
334         case BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED:
335                 signal = BT_MEDIA_TRACK_CHANGE;
336                 break;
337         case BLUETOOTH_EVENT_GATT_CONNECTED:
338                 signal = BT_GATT_CONNECTED;
339                 break;
340         case BLUETOOTH_EVENT_GATT_DISCONNECTED:
341                 signal = BT_GATT_DISCONNECTED;
342                 break;
343         default:
344                 BT_ERR("Unknown event");
345                 return BLUETOOTH_ERROR_INTERNAL;
346         }
347
348         BT_DBG("Path : %s", path);
349         BT_INFO_C("Signal : %s", signal);
350
351         msg = dbus_message_new_signal(path, BT_EVENT_SERVICE,
352                                 signal);
353
354         if (msg == NULL) {
355                 BT_ERR("Message is NULL");
356                 return BLUETOOTH_ERROR_INTERNAL;
357         }
358
359         if (type) {
360                 /* Set the arguments of the dbus message */
361                 va_start(arguments, type);
362
363                 if (!dbus_message_append_args_valist(msg, type, arguments)) {
364                         dbus_message_unref(msg);
365                         va_end(arguments);
366                         return BLUETOOTH_ERROR_INTERNAL;
367                 }
368
369                 va_end(arguments);
370         }
371
372         if (!dbus_connection_send(event_conn, msg, NULL)) {
373                 BT_ERR("send failed");
374                 dbus_message_unref(msg);
375                 return BLUETOOTH_ERROR_INTERNAL;
376         }
377
378         dbus_connection_flush(event_conn);
379         dbus_message_unref(msg);
380
381         BT_DBG("-");
382
383         return BLUETOOTH_ERROR_NONE;
384 }
385
386 int _bt_send_event_to_dest(const char* dest, int event_type, int event, int type, ...)
387 {
388         BT_DBG("+");
389
390         DBusMessage *msg;
391         char *path;
392         char *signal;
393         va_list arguments;
394
395         retv_if(event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
396
397         BT_DBG("event_type [%d], event [%d]", event_type, event);
398
399         switch (event_type) {
400         case BT_ADAPTER_EVENT:
401                 path = BT_ADAPTER_PATH;
402                 break;
403         default:
404                 BT_ERR("Unknown event");
405                 return BLUETOOTH_ERROR_INTERNAL;
406         }
407
408         switch (event) {
409         case BLUETOOTH_EVENT_ADVERTISING_STARTED:
410                 signal = BT_ADVERTISING_STARTED;
411                 break;
412         case BLUETOOTH_EVENT_ADVERTISING_STOPPED:
413                 signal = BT_ADVERTISING_STOPPED;
414                 break;
415         default:
416                 BT_ERR("Unknown event");
417                 return BLUETOOTH_ERROR_INTERNAL;
418         }
419
420         BT_DBG("Path : %s", path);
421         BT_INFO_C("Signal : %s", signal);
422
423         msg = dbus_message_new_signal(path, BT_EVENT_SERVICE,
424                                 signal);
425
426         if (msg == NULL) {
427                 BT_ERR("Message is NULL");
428                 return BLUETOOTH_ERROR_INTERNAL;
429         }
430
431         if (dbus_message_set_destination(msg, dest) == FALSE)
432                 BT_ERR("Setting destination is failed");
433
434         if (type) {
435                 /* Set the arguments of the dbus message */
436                 va_start(arguments, type);
437
438                 if (!dbus_message_append_args_valist(msg, type, arguments)) {
439                         dbus_message_unref(msg);
440                         va_end(arguments);
441                         return BLUETOOTH_ERROR_INTERNAL;
442                 }
443
444                 va_end(arguments);
445         }
446
447         if (!dbus_connection_send(event_conn, msg, NULL)) {
448                 BT_ERR("send failed");
449                 dbus_message_unref(msg);
450                 return BLUETOOTH_ERROR_INTERNAL;
451         }
452
453         dbus_connection_flush(event_conn);
454         dbus_message_unref(msg);
455
456         BT_DBG("-");
457
458         return BLUETOOTH_ERROR_NONE;
459 }
460
461 int _bt_send_hf_local_term_event(char *address)
462 {
463         DBusMessage *msg;
464         char *signal = BT_HF_LOCAL_TERM;
465
466         retv_if(hf_local_term_event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
467
468         msg = dbus_message_new_signal(BT_HF_LOCAL_TERM_EVENT_PATH,
469                         BT_HF_LOCAL_TERM_EVENT_INTERFACE, signal);
470         if (msg == NULL) {
471                 BT_ERR("Message is NULL\n");
472                 return BLUETOOTH_ERROR_INTERNAL;
473         }
474
475         dbus_message_append_args(msg, DBUS_TYPE_STRING, &address, DBUS_TYPE_INVALID);
476
477         if (!dbus_connection_send(hf_local_term_event_conn, msg, NULL)) {
478                 BT_ERR("send failed\n");
479                 dbus_message_unref(msg);
480                 return BLUETOOTH_ERROR_INTERNAL;
481         }
482
483         dbus_connection_flush(hf_local_term_event_conn);
484         dbus_message_unref(msg);
485
486         return BLUETOOTH_ERROR_NONE;
487 }
488
489 /* To send the event from service daemon to application*/
490 int _bt_init_service_event_sender(void)
491 {
492         DBusConnection *conn;
493         DBusError err;
494         int ret;
495
496         if (event_conn) {
497                 BT_ERR("Event handler is already exist");
498                 return BLUETOOTH_ERROR_INTERNAL;
499         }
500
501         conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL);
502         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
503
504         dbus_error_init(&err);
505
506         ret = dbus_bus_request_name(conn, BT_EVENT_SERVICE,
507                                 DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
508
509         if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
510                 if (dbus_error_is_set(&err) == TRUE) {
511                         BT_ERR("Event init failed, %s", err.message);
512                         dbus_error_free(&err);
513                 }
514                 return BLUETOOTH_ERROR_INTERNAL;
515         }
516
517         event_conn = conn;
518
519         return BLUETOOTH_ERROR_NONE;
520 }
521
522 void _bt_deinit_service_event_sender(void)
523 {
524         if (event_conn) {
525                 dbus_connection_close(event_conn);
526                 event_conn = NULL;
527         }
528 }
529
530 int _bt_init_hf_local_term_event_sender(void)
531 {
532         DBusConnection *conn;
533         DBusError err;
534         int ret;
535
536         if (hf_local_term_event_conn) {
537                 BT_ERR("Event handler is already exist");
538                 return BLUETOOTH_ERROR_INTERNAL;
539         }
540
541         conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL);
542         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
543
544         dbus_error_init(&err);
545
546         ret = dbus_bus_request_name(conn, BT_HF_LOCAL_TERM_EVENT_INTERFACE,
547                                 DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
548
549         if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
550                 if (dbus_error_is_set(&err) == TRUE) {
551                         BT_ERR("Event init failed, %s", err.message);
552                         dbus_error_free(&err);
553                 }
554                 return BLUETOOTH_ERROR_INTERNAL;
555         }
556
557         hf_local_term_event_conn = conn;
558
559         return BLUETOOTH_ERROR_NONE;
560 }
561
562 void _bt_deinit_hf_local_term_event_sender(void)
563 {
564         if (hf_local_term_event_conn) {
565                 dbus_connection_close(hf_local_term_event_conn);
566                 hf_local_term_event_conn = NULL;
567         }
568 }