8289a3ee38e4c69fcf42630730a9de860c4fa485
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / services / bt-service-event-receiver.c
1 /*
2  * Bluetooth-frwk
3  *
4  * Copyright (c) 2015 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact:  Atul Kumar Rai <a.rai@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *              http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 #include <glib.h>
23 #include <string.h>
24 #include <dlog.h>
25 #include <vconf.h>
26 #include <vconf-internal-bt-keys.h>
27
28 #include <oal-event.h>
29
30 #include "bt-service-common.h"
31 #include "bt-service-event-receiver.h"
32 #include "bt-service-battery-monitor.h"
33
34 typedef struct {
35         int type;
36         void *data;
37 } bt_service_oal_event_data_t;
38
39 static _bt_service_event_handler_callback adapter_cb;
40 static _bt_service_event_handler_callback device_cb;
41 static _bt_service_event_handler_callback hid_cb;
42 static _bt_service_event_handler_callback hid_device_cb;
43 static _bt_service_event_handler_callback socket_cb;
44 static _bt_service_event_handler_callback audio_event_cb;
45 static _bt_service_event_handler_callback a2dp_source_cb;
46 static _bt_service_event_handler_callback a2dp_sink_cb;
47 static _bt_service_event_handler_callback ag_cb;
48 static _bt_service_event_handler_callback hdp_cb;
49 static _bt_service_event_handler_callback avrcp_ctrl_cb;
50 static _bt_service_event_handler_callback avrcp_cb;
51 static _bt_service_event_handler_callback adapter_le_cb;
52 static _bt_service_event_handler_callback adapter_gatt_cb;
53 static _bt_service_event_handler_callback hf_client_cb;
54 static _bt_service_event_handler_callback mesh_cb;
55
56 void _bt_service_register_event_handler_callback(
57                 bt_service_module_t module, _bt_service_event_handler_callback cb)
58 {
59         switch (module) {
60         case BT_ADAPTER_MODULE:
61                 BT_INFO("Register BT_ADAPTER_MODULE Callback");
62                 adapter_cb = cb;
63                 break;
64         case BT_DEVICE_MODULE:
65                 BT_INFO("Register BT_DEVICE_MODULE Callback");
66                 device_cb = cb;
67                 break;
68         case BT_HID_MODULE:
69                 BT_INFO("Register BT_HID_MODULE Callback");
70                 hid_cb = cb;
71                 break;
72         case BT_HID_DEVICE_MODULE:
73                 BT_INFO("Register BT_HID_DEVICE_MODULE Callback");
74                 hid_device_cb = cb;
75                 break;
76         case BT_SOCKET_MODULE:
77                 BT_INFO("Register BT_SOCKET_MODULE Callback");
78                 socket_cb = cb;
79                 break;
80         case BT_AUDIO_ALL_MODULE:
81                 BT_INFO("Register BT_AUDIO_ALL_MODULE Callback");
82                 audio_event_cb = cb;
83                 break;
84         case BT_A2DP_SOURCE_MODULE:
85                 BT_INFO("Register BT_A2DP_SOURCE_MODULE Callback");
86                 a2dp_source_cb = cb;
87                 break;
88         case BT_A2DP_SINK_MODULE:
89                 BT_INFO("Register BT_A2DP_SINK_MODULE Callback");
90                 a2dp_sink_cb = cb;
91                 break;
92         case BT_AG_MODULE:
93                 BT_INFO("Register BT_AG_MODULE callback");
94                 ag_cb = cb;
95                 break;
96         case BT_HFP_MODULE:
97                 BT_INFO("Register BT_HFP_MODULE callback");
98                 hf_client_cb = cb;
99                 break;
100         case BT_HEALTH_MODULE:
101                 BT_INFO("Register BT_HEALTH_MODULE callback");
102                 hdp_cb = cb;
103                 break;
104         case BT_AVRCP_MODULE:
105                 BT_INFO("Register BT_AVRCP_MODULE callback");
106                 avrcp_cb = cb;
107                 break;
108         case BT_AVRCP_CTRL_MODULE:
109                 BT_INFO("Register BT_AVRCP_CTRL_MODULE callback");
110                 avrcp_ctrl_cb = cb;
111                 break;
112         case BT_ADAPTER_LE_MODULE:
113                 BT_INFO("Register BT_ADAPTER_LE_MODULE callback");
114                 adapter_le_cb = cb;
115                 break;
116         case BT_GATT_MODULE:
117                 BT_INFO("Register BT_GATT_MODULE callback");
118                 adapter_gatt_cb = cb;
119                 break;
120         case BT_MESH_MODULE:
121                 BT_INFO("Register BT_MESH_MODULE callback");
122                 mesh_cb = cb;
123                 break;
124         default:
125                 BT_INFO("Unknown module");
126         }
127 }
128
129 void _bt_service_unregister_event_handler_callback(bt_service_module_t module)
130 {
131         switch (module) {
132         case BT_ADAPTER_MODULE:
133                 BT_INFO("Un-Register BT_ADAPTER_MODULE Callback");
134                 adapter_cb = NULL;
135                 break;
136         case BT_DEVICE_MODULE:
137                 BT_INFO("Un-Register BT_DEVICE_MODULE Callback");
138                 device_cb = NULL;
139                 break;
140         case BT_HID_MODULE:
141                 BT_INFO("Un-Register BT_HID_MODULE Callback");
142                 hid_cb = NULL;
143                 break;
144         case BT_HID_DEVICE_MODULE:
145                 BT_INFO("Un-Register BT_HID_DEVICE_MODULE Callback");
146                 hid_device_cb = NULL;
147                 break;
148         case BT_SOCKET_MODULE:
149                 BT_INFO("Un-Register BT_SOCKET_MODULE Callback");
150                 socket_cb = NULL;
151                 break;
152         case BT_A2DP_SINK_MODULE:
153                 BT_INFO("Un-Register BT_A2DP_SINK_MODULE Callback");
154                 a2dp_sink_cb = NULL;
155                 break;
156         case BT_HEALTH_MODULE:
157                 BT_INFO("Un-Register BT_HEALTH_MODULE callback");
158                 hdp_cb = NULL;
159                 break;
160         case BT_AVRCP_MODULE:
161                 BT_INFO("Unregister BT_AVRCP_MODULE callback");
162                 avrcp_cb = NULL;
163                 break;
164         case BT_AVRCP_CTRL_MODULE:
165                 BT_INFO("Un-Register BT_AVRCP_CTRL_MODULE callback");
166                 avrcp_ctrl_cb = NULL;
167                 break;
168         case BT_ADAPTER_LE_MODULE:
169                 BT_INFO("Un-Register BT_ADAPTER_MODULE callback");
170                 adapter_le_cb = NULL;
171                 break;
172         case BT_GATT_MODULE:
173                 BT_INFO("Un-Register BT_GATT_MODULE callback");
174                 adapter_gatt_cb = NULL;
175                 break;
176         case BT_MESH_MODULE:
177                 BT_INFO("Un-Register BT_MESH_MODULE callback");
178                 mesh_cb = NULL;
179                 break;
180         default:
181                 BT_INFO("Unknown module");
182         }
183 }
184
185 static gboolean __bt_handle_oal_events(gpointer data)
186 {
187         bt_service_oal_event_data_t *oal_event = data;
188         int event_type = oal_event->type;
189         gpointer event_data = oal_event->data;
190         _bt_bm_event_handler(data);
191
192         switch (event_type) {
193         case OAL_EVENT_ADAPTER_ENABLED:
194         case OAL_EVENT_ADAPTER_DISABLED:
195                 if (audio_event_cb)
196                         audio_event_cb(event_type, event_data);
197                 if (adapter_cb)
198                         adapter_cb(event_type, event_data);
199                 break;
200         case OAL_EVENT_OAL_INITIALISED_SUCCESS:
201         case OAL_EVENT_OAL_INITIALISED_FAILED:
202         case OAL_EVENT_ADAPTER_PROPERTY_ADDRESS:
203         case OAL_EVENT_ADAPTER_PROPERTY_NAME:
204         case OAL_EVENT_ADAPTER_PROPERTY_VERSION:
205         case OAL_EVENT_ADAPTER_PROPERTY_SERVICES:
206         case OAL_EVENT_ADAPTER_PROPERTY_A2DP_ROLE:
207         case OAL_EVENT_ADAPTER_BONDED_DEVICE_LIST:
208         case OAL_EVENT_ADAPTER_MODE_NON_CONNECTABLE:
209         case OAL_EVENT_ADAPTER_MODE_CONNECTABLE:
210         case OAL_EVENT_ADAPTER_MODE_DISCOVERABLE:
211         case OAL_EVENT_ADAPTER_MODE_DISCOVERABLE_TIMEOUT:
212         case OAL_EVENT_ADAPTER_INQUIRY_STARTED:
213         case OAL_EVENT_ADAPTER_INQUIRY_FINISHED:
214         case OAL_EVENT_CONTROLLER_ERROR_RECEIVED:
215         case OAL_EVENT_ADAPTER_PROFILE_CONNECTED_DEVICES:
216                 if (adapter_cb)
217                         adapter_cb(event_type, event_data);
218                 break;
219         case OAL_EVENT_ADAPTER_INQUIRY_RESULT_BREDR_ONLY:
220         case OAL_EVENT_ADAPTER_INQUIRY_RESULT_BLE:
221         case OAL_EVENT_DEVICE_BONDING_SUCCESS:
222         case OAL_EVENT_DEVICE_BONDING_REMOVED:
223         case OAL_EVENT_DEVICE_BONDING_FAILED:
224         case OAL_EVENT_DEVICE_ACL_CONNECTED:
225         case OAL_EVENT_DEVICE_ACL_DISCONNECTED:
226         case OAL_EVENT_DEVICE_LE_CONNECTED:
227         case OAL_EVENT_DEVICE_LE_DISCONNECTED:
228         case OAL_EVENT_DEVICE_PIN_REQUEST:
229         case OAL_EVENT_DEVICE_PASSKEY_ENTRY_REQUEST:
230         case OAL_EVENT_DEVICE_PASSKEY_CONFIRMATION_REQUEST:
231         case OAL_EVENT_DEVICE_PASSKEY_DISPLAY:
232         case OAL_EVENT_DEVICE_SSP_CONSENT_REQUEST:
233         case OAL_EVENT_DEVICE_SERVICES:
234         case OAL_EVENT_DEVICE_AUTHORIZE_REQUEST:
235         case OAL_EVENT_DEVICE_TRUSTED:
236         case OAL_EVENT_DEVICE_UNTRUSTED:
237         case OAL_EVENT_DEVICE_NAME:
238         case OAL_EVENT_DEVICE_TRUSTED_PROFILES_CHANGED:
239         case OAL_EVENT_RSSI_MONITORING_ENABLED:
240         case OAL_EVENT_RSSI_MONITORING_DISABLED:
241         case OAL_EVENT_RAW_RSSI_RECEIVED:
242         case OAL_EVENT_RSSI_ALERT_RECEIVED:
243         case OAL_EVENT_DEVICE_DBFW_PLUS_INFO:
244                 if (device_cb)
245                         device_cb(event_type, event_data);
246                 if (adapter_gatt_cb)
247                         adapter_gatt_cb(event_type, event_data);
248                 break;
249         case OAL_EVENT_DEVICE_PROPERTIES:
250                 if (audio_event_cb) {
251                         BT_INFO("Device properties received, Audio callback registered, call it...");
252                         audio_event_cb(event_type, event_data);
253                 }
254 #if 0
255                 if (hid_cb)
256                         hid_cb(event_type, event_data);
257 #endif
258                 if (device_cb)
259                         device_cb(event_type, event_data);
260                 break;
261         case OAL_EVENT_HID_CONNECTED:
262         case OAL_EVENT_HID_DISCONNECTED:
263                 if (hid_cb)
264                         hid_cb(event_type, event_data);
265                 break;
266         case OAL_EVENT_HID_DEVICE_CONNECTED:
267         case OAL_EVENT_HID_DEVICE_DISCONNECTED:
268                 if (hid_device_cb)
269                         hid_device_cb(event_type, event_data);
270                 break;
271         case OAL_EVENT_SOCKET_OUTGOING_CONNECTED:
272         case OAL_EVENT_SOCKET_DISCONNECTED:
273         case OAL_EVENT_SOCKET_AUTHORIZE_REQUEST:
274                 if (socket_cb)
275                         socket_cb(event_type, event_data);
276                 break;
277         case OAL_EVENT_AUDIO_CONNECTING:
278         case OAL_EVENT_AUDIO_DISCONNECTING:
279         case OAL_EVENT_AUDIO_CONNECTED:
280         case OAL_EVENT_AUDIO_DISCONNECTED:
281         case OAL_EVENT_AUDIO_STOPPED:
282         case OAL_EVENT_AUDIO_STARTED:
283                 if (a2dp_source_cb)
284                         a2dp_source_cb(event_type, event_data);
285                 break;
286         case OAL_EVENT_A2DP_SINK_DISCONNECTED:
287         case OAL_EVENT_A2DP_SINK_CONNECTED:
288         case OAL_EVENT_A2DP_SINK_DISCONNECTING:
289         case OAL_EVENT_A2DP_SINK_CONNECTING:
290                 if (a2dp_sink_cb)
291                         a2dp_sink_cb(event_type, event_data);
292                 break;
293         case OAL_EVENT_HFP_CONNECTING:
294         case OAL_EVENT_HFP_DISCONNECTING:
295         case OAL_EVENT_HFP_CONNECTED:
296         case OAL_EVENT_HFP_DISCONNECTED:
297         case OAL_EVENT_HFP_AUDIO_CONNECTED:
298         case OAL_EVENT_HFP_AUDIO_DISCONNECTED:
299         case OAL_EVENT_HFP_AUDIO_CONNECTING:
300         case OAL_EVENT_HFP_AUDIO_DISCONNECTING:
301                 if (ag_cb)
302                         ag_cb(event_type, event_data);
303                 break;
304         case OAL_EVENT_HF_CLIENT_CONNECTING:
305         case OAL_EVENT_HF_CLIENT_DISCONNECTING:
306         case OAL_EVENT_HF_CLIENT_CONNECTED:
307         case OAL_EVENT_HF_CLIENT_DISCONNECTED:
308                 if (hf_client_cb)
309                         hf_client_cb(event_type, event_data);
310                 break;
311         case OAL_EVENT_HDP_APP_REGISTERED:
312         case OAL_EVENT_HDP_APP_UNREGISTERED:
313         case OAL_EVENT_HDP_CHANNEL_CONNECTED:
314         case OAL_EVENT_HDP_CHANNEL_DESTROYED:
315                 if (hdp_cb)
316                         hdp_cb(event_type, event_data);
317                 break;
318         case OAL_EVENT_AVRCP_CONNECTED:
319         case OAL_EVENT_AVRCP_DISCONNECTED:
320         case OAL_EVENT_AVRCP_REMOTE_FEATURES:
321         case OAL_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
322         case OAL_EVENT_AVRCP_SETTING_REPEAT_STATUS:
323         case OAL_EVENT_AVRCP_SETTING_SHUFFLE_STATUS:
324         case OAL_EVENT_AVRCP_SETTING_SCAN_STATUS:
325         case OAL_EVENT_AVRCP_VOLUME_MUTE_CHANGED:
326         case OAL_EVENT_AVRCP_DELAY_CHANGED:
327                 if (avrcp_cb)
328                         avrcp_cb(event_type, event_data);
329                 break;
330         case OAL_EVENT_AVRCP_CT_CONNECTED:
331         case OAL_EVENT_AVRCP_CT_DISCONNECTED:
332         case OAL_EVENT_AVRCP_CT_EQUALIZER_STATUS:
333         case OAL_EVENT_AVRCP_CT_REPEAT_STATUS:
334         case OAL_EVENT_AVRCP_CT_SHUFFLE_STATUS:
335         case OAL_EVENT_AVRCP_CT_SCAN_STATUS:
336         case OAL_EVENT_AVRCP_CT_NOTIF_PLAY_STATUS_CHANGED:
337         case OAL_EVENT_AVRCP_CT_NOTIF_PLAY_POS_CHANGED:
338         case OAL_EVENT_AVRCP_CT_NOTIF_TRACK_CHANGE:
339         case OAL_EVENT_AVRCP_CT_MEDIA_INFO:
340         case OAL_EVENT_AVRCP_CT_PLAY_STATUS:
341         case OAL_EVENT_AVRCP_CT_PASS_CMD_RES:
342         case OAL_EVENT_AVRCP_CT_PLAYER_SETTING_RES:
343         case OAL_EVENT_AVRCP_CT_GET_PROPERTY_RES:
344                 if (avrcp_ctrl_cb)
345                         avrcp_ctrl_cb(event_type, event_data);
346                 break;
347         case OAL_EVENT_BLE_ENABLED:
348         case OAL_EVENT_BLE_DISABLED:
349         case OAL_EVENT_BLE_SERVER_INSTANCE_INITIALISED:
350         case OAL_EVENT_BLE_ADVERTISING_STARTED:
351         case OAL_EVENT_BLE_ADVERTISING_STOPPED:
352         case OAL_EVENT_BLE_MULTI_ADVERTISING_ENABLE:
353         case OAL_EVENT_BLE_MULTI_ADVERTISING_DISABLE:
354         case OAL_EVENT_BLE_MULTI_ADVERTISING_SET_INST_DATA:
355         case OAL_EVENT_BLE_MULTI_ADVERTISING_UPDATE:
356         /* GATT Server Events */
357         case OAL_EVENT_GATTS_SERVICE_ADDED:                     /* gatts Service Added Done */\
358         case OAL_EVENT_GATTS_CHARACTERISTIC_ADDED:              /* gatts Characteristic Added Done */\
359         case OAL_EVENT_GATTS_DESCRIPTOR_ADDED:                  /* gatts Descriptor added done */\
360         case OAL_EVENT_GATTS_SERVICE_STARTED:                   /* gatts Service Started  */\
361         case OAL_EVENT_GATTS_SERVICE_STOPED:                    /* gatts Service Stoped */\
362         case OAL_EVENT_GATTS_SERVICE_DELETED:           /* gatts Service Deleted  */\
363         case OAL_EVENT_GATTS_CONNECTION_COMPLETED:              /* gatts Connection completed */\
364         case OAL_EVENT_GATTS_DISCONNECTION_COMPLETED:           /* gatts Disconnection completed */\
365         case OAL_EVENT_GATTS_REQUEST_READ:                      /* gatts Request Read from client */\
366         case OAL_EVENT_GATTS_REQUEST_WRITE:                     /* gatts Request Write from client */\
367         case OAL_EVENT_GATTS_IND_CONFIRM:                       /* gatts Indicate confirmation from remote client */\
368         case OAL_EVENT_GATTS_REQUEST_ACQUIRE_WRITE:
369         case OAL_EVENT_GATTS_REQUEST_ACQUIRE_NOTIFY:
370         /* Tizen Platform Specific */
371         case OAL_EVENT_GATTS_NOTIFICATION:                      /* gatts Notification changed event */\
372         case OAL_EVENT_GATTS_MTU_CHANGED:                       /* gatts MTU changed event */\
373                 if (adapter_gatt_cb)
374                         adapter_gatt_cb(event_type, event_data);
375                 if (adapter_le_cb)
376                         adapter_le_cb(event_type, event_data);
377                 break;
378 #ifdef TIZEN_GATT_CLIENT
379         case OAL_EVENT_GATTC_DISCONNECTION_COMPLETED:
380         case OAL_EVENT_GATTC_SERVICE_SEARCH_RESULT:
381         case OAL_EVENT_GATTC_SERVICE_SEARCH_DONE:
382         case OAL_EVENT_GATTC_INCL_SRVC_SERACH_RESULT:
383         case OAL_EVENT_GATTC_CHARAC_SERACH_RESULT:
384         case OAL_EVENT_GATTC_DESC_SERACH_RESULT:
385         case OAL_EVENT_GATTC_READ_CHARAC:
386         case OAL_EVENT_GATTC_WRITE_CHARAC:
387         case OAL_EVENT_GATTC_READ_DESCR:
388         case OAL_EVENT_GATTC_WRITE_DESCR:
389         case OAL_EVENT_GATTC_SERVICE_CHANGED_IND:
390         case OAL_EVENT_GATTC_MTU_EXCHANGE_COMPLETED:
391         case OAL_EVENT_GATTC_REMOTE_RSSI:
392         case OAL_EVENT_GATTC_NOTIFICATION_REGISTERED:
393         case OAL_EVENT_GATTC_NOTIFICATION_DEREGISTERED:
394         case OAL_EVENT_GATTC_NOTIFY_DATA:
395         case OAL_EVENT_GATTC_CONNECTION_COMPLETED:
396         case OAL_EVENT_GATTC_REGISTRATION:
397                 if (adapter_gatt_cb)
398                         adapter_gatt_cb(event_type, event_data);
399                 if (adapter_le_cb)
400                         adapter_le_cb(event_type, event_data);
401                 break;
402 #endif
403         case OAL_EVENT_BLE_DISCOVERY_STARTED:
404         case OAL_EVENT_BLE_DISCOVERY_STOPPED:
405         case OAL_EVENT_BLE_DISCOVERY_FINISHED:
406         case OAL_EVENT_BLE_REMOTE_DEVICE_FOUND:
407         case OAL_EVENT_BLE_LOCAL_FEATURES:
408                 if (adapter_le_cb)
409                         adapter_le_cb(event_type, event_data);
410                 break;
411         case OAL_EVENT_MESH_NETWORK_ATTACHED:
412         case OAL_EVENT_MESH_NETWORK_DESTROYED:
413         case OAL_EVENT_MESH_SCAN_STARTED:
414         case OAL_EVENT_MESH_SCAN_FINISHED:
415         case OAL_EVENT_MESH_SCAN_RESULT:
416         case OAL_EVENT_MESH_PROVISIONING_STARTED:
417         case OAL_EVENT_MESH_PROVISIONING_FAILED:
418         case OAL_EVENT_MESH_PROVISIONING_FINISHED:
419         case OAL_EVENT_MESH_PROVISIONING_DATA_REQUESTED:
420         case OAL_EVENT_MESH_AUTHENTICATION_REQUESTED:
421         case OAL_EVENT_MESH_NETKEY_EXECUTE_EVENT:
422         case OAL_EVENT_MESH_APPKEY_EXECUTE_EVENT:
423         case OAL_EVENT_MESH_DEVKEY_MESSAGE_RECEIVED:
424         case OAL_EVENT_MESH_MODEL_MESSAGE_RECEIVED:
425                 BT_INFO("Mesh: Event");
426                 if (mesh_cb)
427                         mesh_cb(event_type, event_data);
428                 break;
429         default:
430                 BT_ERR("Unhandled Event: %d", event_type);
431                 break;
432         }
433
434         if (oal_event->data)
435                 g_free(oal_event->data);
436         g_free(oal_event);
437         return FALSE;
438 }
439
440 void _bt_service_oal_event_receiver(int event_type, gpointer event_data, gsize len)
441 {
442         bt_service_oal_event_data_t *oal_event = g_new0(bt_service_oal_event_data_t, 1);
443
444         BT_DBG("event_type: [%d], data size: [%zu]", event_type, len);
445
446         oal_event->type = event_type;
447         if (event_data)
448                 oal_event->data = g_memdup(event_data, len);
449
450         g_idle_add(__bt_handle_oal_events, oal_event);
451 }