9c1b9f470e9e8d630f38b2525de64dfebf9f766d
[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 <glib.h>
25 #include <dlog.h>
26 #include <gio/gio.h>
27 #include "bluetooth-api.h"
28 #include "bt-internal-types.h"
29
30 #include "bt-service-common.h"
31 #include "bt-service-event.h"
32
33 static GDBusConnection *event_conn;
34 static GDBusConnection *hf_local_term_event_conn;
35
36 int _bt_send_event(int event_type, int event, GVariant *param)
37 {
38         BT_DBG("+");
39         char *path;
40         char *signal;
41         GDBusMessage *msg1 = NULL;
42
43         retv_if(event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
44
45         BT_DBG("event_type [%d], event [%d]", event_type, event);
46
47         switch (event_type) {
48         case BT_ADAPTER_EVENT:
49                 path = BT_ADAPTER_PATH;
50                 break;
51         case BT_LE_ADAPTER_EVENT:
52                 path = BT_LE_ADAPTER_PATH;
53                 break;
54         case BT_DEVICE_EVENT:
55                 path = BT_DEVICE_PATH;
56                 break;
57         case BT_HID_EVENT:
58                 path = BT_HID_PATH;
59                 break;
60         case BT_HEADSET_EVENT:
61                 path = BT_HEADSET_PATH;
62                 break;
63         case BT_AVRCP_EVENT:
64                 path = BT_AVRCP_PATH;
65                 break;
66         case BT_AVRCP_CONTROL_EVENT:
67                 path = BT_AVRCP_CONTROL_PATH;
68                 break;
69         case BT_NETWORK_EVENT:
70                 path = BT_NETWORK_PATH;
71                 break;
72         case BT_OPP_CLIENT_EVENT:
73                 path = BT_OPP_CLIENT_PATH;
74                 break;
75         case BT_OPP_SERVER_EVENT:
76                 path = BT_OPP_SERVER_PATH;
77                 break;
78         case BT_PBAP_CLIENT_EVENT:
79                 path = BT_PBAP_CLIENT_PATH;
80                 break;
81         case BT_RFCOMM_CLIENT_EVENT:
82                 path = BT_RFCOMM_CLIENT_PATH;
83                 break;
84         case BT_RFCOMM_SERVER_EVENT:
85                 path = BT_RFCOMM_SERVER_PATH;
86                 break;
87         case BT_A2DP_SOURCE_EVENT:
88                 path = BT_A2DP_SOURCE_PATH;
89                 break;
90         default:
91                 BT_ERR("Unknown event");
92                 return BLUETOOTH_ERROR_INTERNAL;
93         }
94
95         switch (event) {
96         case BLUETOOTH_EVENT_ENABLED:
97                 signal = BT_ENABLED;
98                 break;
99         case BLUETOOTH_EVENT_DISABLED:
100                 signal = BT_DISABLED;
101                 break;
102         case BLUETOOTH_EVENT_LE_ENABLED:
103                 signal = BT_LE_ENABLED;
104                 break;
105         case BLUETOOTH_EVENT_LE_DISABLED:
106                 signal = BT_LE_DISABLED;
107                 break;
108         case BLUETOOTH_EVENT_LOCAL_NAME_CHANGED:
109                 signal = BT_ADAPTER_NAME_CHANGED;
110                 break;
111         case BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED:
112                 signal = BT_DISCOVERABLE_MODE_CHANGED;
113                 break;
114         case BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED:
115                 signal = BT_DISCOVERABLE_TIMEOUT_CHANGED;
116                 break;
117         case BLUETOOTH_EVENT_CONNECTABLE_CHANGED:
118                 signal = BT_CONNECTABLE_CHANGED;
119                 break;
120         case BLUETOOTH_EVENT_DISCOVERY_STARTED:
121                 signal = BT_DISCOVERY_STARTED;
122                 break;
123         case BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND:
124                 signal = BT_DEVICE_FOUND;
125                 break;
126         case BLUETOOTH_EVENT_DISCOVERY_FINISHED:
127                 signal = BT_DISCOVERY_FINISHED;
128                 break;
129         case BLUETOOTH_EVENT_LE_DISCOVERY_STARTED:
130                 signal = BT_LE_DISCOVERY_STARTED;
131                 break;
132         case BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND:
133                 signal = BT_LE_DEVICE_FOUND;
134                 break;
135         case BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED:
136                 signal = BT_LE_DISCOVERY_FINISHED;
137                 break;
138         case BLUETOOTH_EVENT_ADVERTISING_STARTED:
139                 signal = BT_ADVERTISING_STARTED;
140                 break;
141         case BLUETOOTH_EVENT_ADVERTISING_STOPPED:
142                 signal = BT_ADVERTISING_STOPPED;
143                 break;
144         case BLUETOOTH_EVENT_ADVERTISING_MANUFACTURER_DATA_CHANGED:
145                 signal = BT_ADVERTISING_MANUFACTURER_DATA_CHANGED;
146                 break;
147         case BLUETOOTH_EVENT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED:
148                 signal = BT_SCAN_RESPONSE_MANUFACTURER_DATA_CHANGED;
149                 break;
150         case BLUETOOTH_EVENT_MANUFACTURER_DATA_CHANGED:
151                 signal = BT_MANUFACTURER_DATA_CHANGED;
152                 break;
153         case BLUETOOTH_EVENT_BONDING_FINISHED:
154                 signal = BT_BOND_CREATED;
155                 break;
156         case BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED:
157                 signal = BT_BOND_DESTROYED;
158                 break;
159         case BLUETOOTH_EVENT_DEVICE_AUTHORIZED:
160                 signal = BT_DEVICE_AUTHORIZED;
161                 break;
162         case BLUETOOTH_EVENT_DEVICE_UNAUTHORIZED:
163                 signal = BT_DEVICE_UNAUTHORIZED;
164                 break;
165         case BLUETOOTH_EVENT_RSSI_ENABLED:
166                 signal = BT_RSSI_MONITORING_ENABLED;
167                 break;
168         case BLUETOOTH_EVENT_RSSI_ALERT:
169                 signal = BT_RSSI_ALERT;
170                 break;
171         case BLUETOOTH_EVENT_RAW_RSSI:
172                 signal = BT_RAW_RSSI_EVENT;
173                 break;
174         case BLUETOOTH_EVENT_SERVICE_SEARCHED:
175                 signal = BT_SERVICE_SEARCHED;
176                 break;
177         case BLUETOOTH_HID_CONNECTED:
178                 signal = BT_INPUT_CONNECTED;
179                 BT_INFO_C("Connected [HID]");
180                 break;
181         case BLUETOOTH_HID_DISCONNECTED:
182                 signal = BT_INPUT_DISCONNECTED;
183                 BT_INFO_C("Disconnected [HID]");
184                 break;
185         case BLUETOOTH_PBAP_CONNECTED:
186                 signal = BT_PBAP_CONNECTED;
187                 BT_INFO_C("Connected [PBAP Client]");
188                 break;
189         case BLUETOOTH_PBAP_DISCONNECTED:
190                 signal = BT_PBAP_DISCONNECTED;
191                 BT_INFO_C("Disconnected [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_AV_SOURCE_CONNECTED:
306                 signal = BT_A2DP_SOURCE_CONNECTED;
307                 BT_INFO_C("Connected [A2DP Source]");
308                 break;
309         case BLUETOOTH_EVENT_AV_SOURCE_DISCONNECTED:
310                 signal = BT_A2DP_SOURCE_DISCONNECTED;
311                 BT_INFO_C("Disconnected [A2DP Source]");
312                 break;
313         case BLUETOOTH_EVENT_AVRCP_CONNECTED:
314         case BLUETOOTH_EVENT_AVRCP_CONTROL_CONNECTED:
315                 signal = BT_AVRCP_CONNECTED;
316                 BT_INFO_C("Connected [AVRCP]");
317                 break;
318         case BLUETOOTH_EVENT_AVRCP_DISCONNECTED:
319         case BLUETOOTH_EVENT_AVRCP_CONTROL_DISCONNECTED:
320                 signal = BT_AVRCP_DISCONNECTED;
321                 BT_INFO_C("Disconnected [AVRCP]");
322                 break;
323         case BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS:
324         case BLUETOOTH_EVENT_AVRCP_CONTROL_SHUFFLE_STATUS:
325                 signal = BT_MEDIA_SHUFFLE_STATUS;
326                 break;
327         case BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
328         case BLUETOOTH_EVENT_AVRCP_CONTROL_EQUALIZER_STATUS:
329                 signal = BT_MEDIA_EQUALIZER_STATUS;
330                 break;
331         case BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS:
332         case BLUETOOTH_EVENT_AVRCP_CONTROL_REPEAT_STATUS:
333                 signal = BT_MEDIA_REPEAT_STATUS;
334                 break;
335         case BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS:
336         case BLUETOOTH_EVENT_AVRCP_CONTROL_SCAN_STATUS:
337                 signal = BT_MEDIA_SCAN_STATUS;
338                 break;
339         case BLUETOOTH_EVENT_AVRCP_SONG_POSITION_STATUS:
340                 signal = BT_MEDIA_POSITION_STATUS;
341                 break;
342         case BLUETOOTH_EVENT_AVRCP_PLAY_STATUS_CHANGED:
343                 signal = BT_MEDIA_PLAY_STATUS;
344                 break;
345         case BLUETOOTH_EVENT_AVRCP_TRACK_CHANGED:
346                 signal = BT_MEDIA_TRACK_CHANGE;
347                 break;
348         case BLUETOOTH_EVENT_GATT_CONNECTED:
349                 signal = BT_GATT_CONNECTED;
350                 break;
351         case BLUETOOTH_EVENT_GATT_DISCONNECTED:
352                 signal = BT_GATT_DISCONNECTED;
353                 break;
354         case BLUETOOTH_EVENT_GATT_CHAR_VAL_CHANGED:
355                 signal = BT_GATT_CHAR_VAL_CHANGED;
356                 break;
357         default:
358                 BT_ERR("Unknown event");
359                 return BLUETOOTH_ERROR_INTERNAL;
360         }
361
362         BT_DBG("Path : %s", path);
363         BT_INFO_C("Signal : %s", signal);
364
365         msg1 = g_dbus_message_new_signal(path, BT_EVENT_SERVICE, signal);
366         g_dbus_message_set_body(msg1, param);
367         if (!g_dbus_connection_send_message(event_conn, msg1,G_DBUS_SEND_MESSAGE_FLAGS_NONE, 0, NULL)) {
368                 BT_ERR("Error while sending");
369         }
370
371         g_object_unref(msg1);
372         BT_DBG("-");
373         return BLUETOOTH_ERROR_NONE;
374 }
375
376 int _bt_send_event_to_dest(const char* dest, int event_type,
377                 int event, GVariant *param)
378 {
379         BT_DBG("+");
380         char *path;
381         char *signal;
382         GError *error = NULL;
383
384         retv_if(event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
385
386         BT_DBG("event_type [%d], event [%d]", event_type, event);
387
388         switch (event_type) {
389         case BT_ADAPTER_EVENT:
390                 path = BT_ADAPTER_PATH;
391                 break;
392         case BT_LE_ADAPTER_EVENT:
393                 path = BT_LE_ADAPTER_PATH;
394                 break;
395         default:
396                 BT_ERR("Unknown event");
397                 return BLUETOOTH_ERROR_INTERNAL;
398         }
399
400         switch (event) {
401         case BLUETOOTH_EVENT_ADVERTISING_STARTED:
402                 signal = BT_ADVERTISING_STARTED;
403                 break;
404         case BLUETOOTH_EVENT_ADVERTISING_STOPPED:
405                 signal = BT_ADVERTISING_STOPPED;
406                 break;
407         case BLUETOOTH_EVENT_LE_DISCOVERY_STARTED:
408                 signal = BT_LE_DISCOVERY_STARTED;
409                 break;
410         case BLUETOOTH_EVENT_REMOTE_LE_DEVICE_FOUND:
411                 signal = BT_LE_DEVICE_FOUND;
412                 break;
413         case BLUETOOTH_EVENT_LE_DISCOVERY_FINISHED:
414                 signal = BT_LE_DISCOVERY_FINISHED;
415                 break;
416         default:
417                 BT_ERR("Unknown event");
418                 return BLUETOOTH_ERROR_INTERNAL;
419         }
420
421         BT_DBG("Path : %s", path);
422         BT_INFO_C("Signal : %s", signal);
423
424         if (!g_dbus_connection_emit_signal(event_conn, dest, path, BT_EVENT_SERVICE,
425                         signal, param, &error)) {
426                 BT_ERR("Error while sending Signal: %s", signal);
427                 if (error) {
428                         BT_ERR("Error Code [%d], Error Message [%s]",
429                                         error->code, error->message);
430                         g_clear_error(&error);
431                 }
432         }
433
434         BT_DBG("-");
435         return BLUETOOTH_ERROR_NONE;
436 }
437
438 int _bt_send_hf_local_term_event(char *address)
439 {
440         GError *error = NULL;
441
442         retv_if(hf_local_term_event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
443
444         if (!g_dbus_connection_emit_signal(hf_local_term_event_conn, NULL,
445                         BT_HF_LOCAL_TERM_EVENT_PATH,
446                         BT_HF_LOCAL_TERM_EVENT_INTERFACE,
447                         BT_HF_LOCAL_TERM, g_variant_new("s", address),
448                         &error)) {
449                 BT_ERR("Error while sending Signal: %s", signal);
450                 if (error) {
451                         BT_ERR("Error Code [%d], Error Message [%s]",
452                                         error->code, error->message);
453                         g_clear_error(&error);
454                 }
455         }
456
457         return BLUETOOTH_ERROR_NONE;
458 }
459
460 /* To send the event from service daemon to application*/
461 int _bt_init_service_event_sender(void)
462 {
463         GDBusConnection *conn;
464         GError *err = NULL;
465
466         if (event_conn) {
467                 BT_ERR("Event handler is already exist");
468                 return BLUETOOTH_ERROR_INTERNAL;
469         }
470
471         conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
472         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
473         if (conn == NULL) {
474                 BT_ERR("conn == NULL");
475                 if (err) {
476                         BT_ERR("Code[%d], Message[%s]",
477                                         err->code, err->message);
478                         g_clear_error(&err);
479                 }
480
481                 return BLUETOOTH_ERROR_INTERNAL;
482         }
483
484         event_conn = conn;
485         return BLUETOOTH_ERROR_NONE;
486 }
487
488 void _bt_deinit_service_event_sender(void)
489 {
490         if (event_conn) {
491                 g_object_unref(event_conn);
492                 event_conn = NULL;
493         }
494 }
495
496 int _bt_init_hf_local_term_event_sender(void)
497 {
498         GDBusConnection *conn;
499         GError *err = NULL;
500
501         if (hf_local_term_event_conn) {
502                 BT_ERR("Event handler is already exist");
503                 return BLUETOOTH_ERROR_INTERNAL;
504         }
505
506         conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
507         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
508         if (conn == NULL) {
509                 BT_ERR("conn == NULL");
510                 if (err) {
511                         BT_ERR("Code[%d], Message[%s]",
512                                         err->code, err->message);
513                         g_clear_error(&err);
514                 }
515
516                 return BLUETOOTH_ERROR_INTERNAL;
517         }
518
519         hf_local_term_event_conn = conn;
520
521         return BLUETOOTH_ERROR_NONE;
522 }
523
524 void _bt_deinit_hf_local_term_event_sender(void)
525 {
526         if (hf_local_term_event_conn) {
527                 g_object_unref(hf_local_term_event_conn);
528                 hf_local_term_event_conn = NULL;
529         }
530 }