Support the RPI3 target for TV profile
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / 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 _bt_service_event_handler_callback adapter_cb;
40 _bt_service_event_handler_callback device_cb;
41 _bt_service_event_handler_callback hid_cb;
42 _bt_service_event_handler_callback hid_device_cb;
43 _bt_service_event_handler_callback socket_cb;
44 _bt_service_event_handler_callback audio_event_cb;
45 _bt_service_event_handler_callback a2dp_source_cb;
46 _bt_service_event_handler_callback a2dp_sink_cb;
47 _bt_service_event_handler_callback ag_cb;
48 _bt_service_event_handler_callback hdp_cb;
49 _bt_service_event_handler_callback avrcp_ctrl_cb;
50 _bt_service_event_handler_callback avrcp_cb;
51 _bt_service_event_handler_callback adapter_le_cb;
52 _bt_service_event_handler_callback adapter_gatt_cb;
53 _bt_service_event_handler_callback hf_client_cb;
54
55 void _bt_service_register_event_handler_callback(
56                 bt_service_module_t module, _bt_service_event_handler_callback cb)
57 {
58         switch (module) {
59         case BT_ADAPTER_MODULE:
60                 BT_INFO("Register BT_ADAPTER_MODULE Callback");
61                 adapter_cb = cb;
62                 break;
63         case BT_DEVICE_MODULE:
64                 BT_INFO("Register BT_DEVICE_MODULE Callback");
65                 device_cb = cb;
66                 break;
67         case BT_HID_MODULE:
68                 BT_INFO("Register BT_HID_MODULE Callback");
69                 hid_cb = cb;
70                 break;
71         case BT_HID_DEVICE_MODULE:
72                 BT_INFO("Register BT_HID_DEVICE_MODULE Callback");
73                 hid_device_cb = cb;
74                 break;
75         case BT_SOCKET_MODULE:
76                 BT_INFO("Register BT_SOCKET_MODULE Callback");
77                 socket_cb = cb;
78                 break;
79         case BT_AUDIO_ALL_MODULE:
80                 BT_INFO("Register BT_AUDIO_ALL_MODULE Callback");
81                 audio_event_cb = cb;
82                 break;
83         case BT_A2DP_SOURCE_MODULE:
84                 BT_INFO("Register BT_A2DP_SOURCE_MODULE Callback");
85                 a2dp_source_cb = cb;
86                 break;
87         case BT_A2DP_SINK_MODULE:
88                 BT_INFO("Register BT_A2DP_SINK_MODULE Callback");
89                 a2dp_sink_cb = cb;
90                 break;
91         case BT_AG_MODULE:
92                 BT_INFO("Register BT_AG_MODULE callback");
93                 ag_cb = cb;
94                 break;
95         case BT_HFP_MODULE:
96                 BT_INFO("Register BT_HFP_MODULE callback");
97                 hf_client_cb = cb;
98                 break;
99         case BT_HEALTH_MODULE:
100                 BT_INFO("Register BT_HEALTH_MODULE callback");
101                 hdp_cb = cb;
102                 break;
103         case BT_AVRCP_MODULE:
104                 BT_INFO("Register BT_AVRCP_MODULE callback");
105                 avrcp_cb = cb;
106                 break;
107         case BT_AVRCP_CTRL_MODULE:
108                 BT_INFO("Register BT_AVRCP_CTRL_MODULE callback");
109                 avrcp_ctrl_cb = cb;
110                 break;
111         case BT_ADAPTER_LE_MODULE:
112                 BT_INFO("Register BT_ADAPTER_LE_MODULE callback");
113                 adapter_le_cb = cb;
114                 break;
115         case BT_GATT_MODULE:
116                 BT_INFO("Register BT_GATT_MODULE callback");
117                 adapter_gatt_cb = cb;
118                 break;
119         default:
120                 BT_INFO("Unknown module");
121         }
122 }
123
124 void _bt_service_unregister_event_handler_callback(bt_service_module_t module)
125 {
126         switch (module) {
127         case BT_ADAPTER_MODULE:
128                 BT_INFO("Un-Register BT_ADAPTER_MODULE Callback");
129                 adapter_cb = NULL;
130                 break;
131         case BT_DEVICE_MODULE:
132                 BT_INFO("Un-Register BT_DEVICE_MODULE Callback");
133                 device_cb = NULL;
134                 break;
135         case BT_HID_MODULE:
136                 BT_INFO("Un-Register BT_HID_MODULE Callback");
137                 hid_cb = NULL;
138                 break;
139         case BT_HID_DEVICE_MODULE:
140                 BT_INFO("Un-Register BT_HID_DEVICE_MODULE Callback");
141                 hid_device_cb = NULL;
142                 break;
143         case BT_SOCKET_MODULE:
144                 BT_INFO("Un-Register BT_SOCKET_MODULE Callback");
145                 socket_cb = NULL;
146                 break;
147         case BT_A2DP_SINK_MODULE:
148                 BT_INFO("Un-Register BT_A2DP_SINK_MODULE Callback");
149                 a2dp_sink_cb = NULL;
150                 break;
151         case BT_HEALTH_MODULE:
152                 BT_INFO("Un-Register BT_HEALTH_MODULE callback");
153                 hdp_cb = NULL;
154                 break;
155         case BT_AVRCP_MODULE:
156                 BT_INFO("Unregister BT_AVRCP_MODULE callback");
157                 avrcp_cb = NULL;
158                 break;
159         case BT_AVRCP_CTRL_MODULE:
160                 BT_INFO("Un-Register BT_AVRCP_CTRL_MODULE callback");
161                 avrcp_ctrl_cb = NULL;
162                 break;
163         case BT_ADAPTER_LE_MODULE:
164                 BT_INFO("Un-Register BT_ADAPTER_MODULE callback");
165                 adapter_le_cb = NULL;
166                 break;
167         case BT_GATT_MODULE:
168                 BT_INFO("Un-Register BT_GATT_MODULE callback");
169                 adapter_gatt_cb = NULL;
170                 break;
171         default:
172                 BT_INFO("Unknown module");
173         }
174 }
175
176 static gboolean __bt_handle_oal_events(gpointer data)
177 {
178         bt_service_oal_event_data_t *oal_event = data;
179         int event_type = oal_event->type;
180         gpointer event_data = oal_event->data;
181         _bt_bm_event_handler(data);
182
183         switch (event_type) {
184         case OAL_EVENT_ADAPTER_ENABLED:
185         case OAL_EVENT_ADAPTER_DISABLED:
186                 if (audio_event_cb)
187                         audio_event_cb(event_type, event_data);
188                 if (adapter_cb)
189                         adapter_cb(event_type, event_data);
190                 break;
191         case OAL_EVENT_OAL_INITIALISED_SUCCESS:
192         case OAL_EVENT_OAL_INITIALISED_FAILED:
193         case OAL_EVENT_ADAPTER_PROPERTY_ADDRESS:
194         case OAL_EVENT_ADAPTER_PROPERTY_NAME:
195         case OAL_EVENT_ADAPTER_PROPERTY_VERSION:
196         case OAL_EVENT_ADAPTER_PROPERTY_SERVICES:
197         case OAL_EVENT_ADAPTER_PROPERTY_A2DP_ROLE:
198         case OAL_EVENT_ADAPTER_BONDED_DEVICE_LIST:
199         case OAL_EVENT_ADAPTER_MODE_NON_CONNECTABLE:
200         case OAL_EVENT_ADAPTER_MODE_CONNECTABLE:
201         case OAL_EVENT_ADAPTER_MODE_DISCOVERABLE:
202         case OAL_EVENT_ADAPTER_MODE_DISCOVERABLE_TIMEOUT:
203         case OAL_EVENT_ADAPTER_INQUIRY_STARTED:
204         case OAL_EVENT_ADAPTER_INQUIRY_FINISHED:
205                 if (adapter_cb)
206                         adapter_cb(event_type, event_data);
207                 break;
208         case OAL_EVENT_ADAPTER_INQUIRY_RESULT_BREDR_ONLY:
209         case OAL_EVENT_ADAPTER_INQUIRY_RESULT_BLE:
210         case OAL_EVENT_DEVICE_BONDING_SUCCESS:
211         case OAL_EVENT_DEVICE_BONDING_REMOVED:
212         case OAL_EVENT_DEVICE_BONDING_FAILED:
213         case OAL_EVENT_DEVICE_ACL_CONNECTED:
214         case OAL_EVENT_DEVICE_ACL_DISCONNECTED:
215         case OAL_EVENT_DEVICE_LE_CONNECTED:
216         case OAL_EVENT_DEVICE_LE_DISCONNECTED:
217         case OAL_EVENT_DEVICE_PIN_REQUEST:
218         case OAL_EVENT_DEVICE_PASSKEY_ENTRY_REQUEST:
219         case OAL_EVENT_DEVICE_PASSKEY_CONFIRMATION_REQUEST:
220         case OAL_EVENT_DEVICE_PASSKEY_DISPLAY:
221         case OAL_EVENT_DEVICE_SSP_CONSENT_REQUEST:
222         case OAL_EVENT_DEVICE_SERVICES:
223         case OAL_EVENT_DEVICE_AUTHORIZE_REQUEST:
224         case OAL_EVENT_DEVICE_TRUSTED:
225         case OAL_EVENT_DEVICE_UNTRUSTED:
226         case OAL_EVENT_DEVICE_NAME:
227         case OAL_EVENT_DEVICE_TRUSTED_PROFILES_CHANGED:
228         case OAL_EVENT_RSSI_MONITORING_ENABLED:
229         case OAL_EVENT_RSSI_MONITORING_DISABLED:
230         case OAL_EVENT_RAW_RSSI_RECEIVED:
231         case OAL_EVENT_RSSI_ALERT_RECEIVED:
232         case OAL_EVENT_DEVICE_DBFW_PLUS_INFO:
233                 if (device_cb)
234                         device_cb(event_type, event_data);
235                 if (adapter_gatt_cb)
236                         adapter_gatt_cb(event_type, event_data);
237                 break;
238         case OAL_EVENT_DEVICE_PROPERTIES:
239                 if (audio_event_cb) {
240                         BT_INFO("Device properties received, Audio callback registered, call it...");
241                         audio_event_cb(event_type, event_data);
242                 }
243 #if 0
244                 if (hid_cb)
245                         hid_cb(event_type, event_data);
246 #endif
247                 if (device_cb)
248                         device_cb(event_type, event_data);
249                 break;
250         case OAL_EVENT_HID_CONNECTED:
251         case OAL_EVENT_HID_DISCONNECTED:
252                 if (hid_cb)
253                         hid_cb(event_type, event_data);
254                 break;
255         case OAL_EVENT_HID_DEVICE_CONNECTED:
256         case OAL_EVENT_HID_DEVICE_DISCONNECTED:
257                 if (hid_device_cb)
258                         hid_device_cb(event_type, event_data);
259                 break;
260         case OAL_EVENT_SOCKET_OUTGOING_CONNECTED:
261         case OAL_EVENT_SOCKET_DISCONNECTED:
262         case OAL_EVENT_SOCKET_AUTHORIZE_REQUEST:
263                 if (socket_cb)
264                         socket_cb(event_type, event_data);
265                 break;
266         case OAL_EVENT_AUDIO_CONNECTING:
267         case OAL_EVENT_AUDIO_DISCONNECTING:
268         case OAL_EVENT_AUDIO_CONNECTED:
269         case OAL_EVENT_AUDIO_DISCONNECTED:
270         case OAL_EVENT_AUDIO_STOPPED:
271         case OAL_EVENT_AUDIO_STARTED:
272                 if (a2dp_source_cb)
273                         a2dp_source_cb(event_type, event_data);
274                 break;
275         case OAL_EVENT_A2DP_SINK_DISCONNECTED:
276         case OAL_EVENT_A2DP_SINK_CONNECTED:
277         case OAL_EVENT_A2DP_SINK_DISCONNECTING:
278         case OAL_EVENT_A2DP_SINK_CONNECTING:
279                 if (a2dp_sink_cb)
280                         a2dp_sink_cb(event_type, event_data);
281                 break;
282         case OAL_EVENT_HFP_CONNECTING:
283         case OAL_EVENT_HFP_DISCONNECTING:
284         case OAL_EVENT_HFP_CONNECTED:
285         case OAL_EVENT_HFP_DISCONNECTED:
286         case OAL_EVENT_HFP_AUDIO_CONNECTED:
287         case OAL_EVENT_HFP_AUDIO_DISCONNECTED:
288         case OAL_EVENT_HFP_AUDIO_CONNECTING:
289         case OAL_EVENT_HFP_AUDIO_DISCONNECTING:
290                 if (ag_cb)
291                         ag_cb(event_type, event_data);
292                 break;
293         case OAL_EVENT_HF_CLIENT_CONNECTING:
294         case OAL_EVENT_HF_CLIENT_DISCONNECTING:
295         case OAL_EVENT_HF_CLIENT_CONNECTED:
296         case OAL_EVENT_HF_CLIENT_DISCONNECTED:
297                 if (hf_client_cb)
298                         hf_client_cb(event_type, event_data);
299                 break;
300         case OAL_EVENT_HDP_APP_REGISTERED:
301         case OAL_EVENT_HDP_APP_UNREGISTERED:
302         case OAL_EVENT_HDP_CHANNEL_CONNECTED:
303         case OAL_EVENT_HDP_CHANNEL_DESTROYED:
304                 if (hdp_cb)
305                         hdp_cb(event_type, event_data);
306                 break;
307         case OAL_EVENT_AVRCP_CONNECTED:
308         case OAL_EVENT_AVRCP_DISCONNECTED:
309         case OAL_EVENT_AVRCP_REMOTE_FEATURES:
310         case OAL_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
311         case OAL_EVENT_AVRCP_SETTING_REPEAT_STATUS:
312         case OAL_EVENT_AVRCP_SETTING_SHUFFLE_STATUS:
313         case OAL_EVENT_AVRCP_SETTING_SCAN_STATUS:
314         case OAL_EVENT_AVRCP_VOLUME_MUTE_CHANGED:
315         case OAL_EVENT_AVRCP_DELAY_CHANGED:
316                 if (avrcp_cb)
317                         avrcp_cb(event_type, event_data);
318                 break;
319         case OAL_EVENT_AVRCP_CT_CONNECTED:
320         case OAL_EVENT_AVRCP_CT_DISCONNECTED:
321         case OAL_EVENT_AVRCP_CT_EQUALIZER_STATUS:
322         case OAL_EVENT_AVRCP_CT_REPEAT_STATUS:
323         case OAL_EVENT_AVRCP_CT_SHUFFLE_STATUS:
324         case OAL_EVENT_AVRCP_CT_SCAN_STATUS:
325         case OAL_EVENT_AVRCP_CT_NOTIF_PLAY_STATUS_CHANGED:
326         case OAL_EVENT_AVRCP_CT_NOTIF_PLAY_POS_CHANGED:
327         case OAL_EVENT_AVRCP_CT_NOTIF_TRACK_CHANGE:
328         case OAL_EVENT_AVRCP_CT_MEDIA_INFO:
329         case OAL_EVENT_AVRCP_CT_PLAY_STATUS:
330         case OAL_EVENT_AVRCP_CT_PASS_CMD_RES:
331         case OAL_EVENT_AVRCP_CT_PLAYER_SETTING_RES:
332         case OAL_EVENT_AVRCP_CT_GET_PROPERTY_RES:
333                 if (avrcp_ctrl_cb)
334                         avrcp_ctrl_cb(event_type, event_data);
335                 break;
336         case OAL_EVENT_BLE_ENABLED:
337         case OAL_EVENT_BLE_DISABLED:
338         case OAL_EVENT_BLE_SERVER_INSTANCE_INITIALISED:
339         case OAL_EVENT_BLE_ADVERTISING_STARTED:
340         case OAL_EVENT_BLE_ADVERTISING_STOPPED:
341         case OAL_EVENT_BLE_MULTI_ADVERTISING_ENABLE:
342         case OAL_EVENT_BLE_MULTI_ADVERTISING_DISABLE:
343         case OAL_EVENT_BLE_MULTI_ADVERTISING_SET_INST_DATA:
344         case OAL_EVENT_BLE_MULTI_ADVERTISING_UPDATE:
345         /* GATT Server Events */
346         case OAL_EVENT_GATTS_SERVICE_ADDED:                     /* gatts Service Added Done */\
347         case OAL_EVENT_GATTS_CHARACTERISTIC_ADDED:              /* gatts Characteristic Added Done */\
348         case OAL_EVENT_GATTS_DESCRIPTOR_ADDED:                  /* gatts Descriptor added done */\
349         case OAL_EVENT_GATTS_SERVICE_STARTED:                   /* gatts Service Started  */\
350         case OAL_EVENT_GATTS_SERVICE_STOPED:                    /* gatts Service Stoped */\
351         case OAL_EVENT_GATTS_SERVICE_DELETED:           /* gatts Service Deleted  */\
352         case OAL_EVENT_GATTS_CONNECTION_COMPLETED:              /* gatts Connection completed */\
353         case OAL_EVENT_GATTS_DISCONNECTION_COMPLETED:           /* gatts Disconnection completed */\
354         case OAL_EVENT_GATTS_REQUEST_READ:                      /* gatts Request Read from client */\
355         case OAL_EVENT_GATTS_REQUEST_WRITE:                     /* gatts Request Write from client */\
356         case OAL_EVENT_GATTS_IND_CONFIRM:                       /* gatts Indicate confirmation from remote client */\
357         case OAL_EVENT_GATTS_REQUEST_ACQUIRE_WRITE:
358         case OAL_EVENT_GATTS_REQUEST_ACQUIRE_NOTIFY:
359         /* Tizen Platform Specific */
360         case OAL_EVENT_GATTS_NOTIFICATION:                      /* gatts Notification changed event */\
361         case OAL_EVENT_GATTS_MTU_CHANGED:                       /* gatts MTU changed event */\
362                 if (adapter_gatt_cb)
363                         adapter_gatt_cb(event_type, event_data);
364                 if (adapter_le_cb)
365                         adapter_le_cb(event_type, event_data);
366                 break;
367 #ifdef TIZEN_GATT_CLIENT
368         case OAL_EVENT_GATTC_DISCONNECTION_COMPLETED:
369         case OAL_EVENT_GATTC_SERVICE_SEARCH_RESULT:
370         case OAL_EVENT_GATTC_SERVICE_SEARCH_DONE:
371         case OAL_EVENT_GATTC_INCL_SRVC_SERACH_RESULT:
372         case OAL_EVENT_GATTC_CHARAC_SERACH_RESULT:
373         case OAL_EVENT_GATTC_DESC_SERACH_RESULT:
374         case OAL_EVENT_GATTC_READ_CHARAC:
375         case OAL_EVENT_GATTC_WRITE_CHARAC:
376         case OAL_EVENT_GATTC_READ_DESCR:
377         case OAL_EVENT_GATTC_WRITE_DESCR:
378         case OAL_EVENT_GATTC_SERVICE_CHANGED_IND:
379         case OAL_EVENT_GATTC_MTU_EXCHANGE_COMPLETED:
380         case OAL_EVENT_GATTC_REMOTE_RSSI:
381         case OAL_EVENT_GATTC_NOTIFICATION_REGISTERED:
382         case OAL_EVENT_GATTC_NOTIFICATION_DEREGISTERED:
383         case OAL_EVENT_GATTC_NOTIFY_DATA:
384         case OAL_EVENT_GATTC_CONNECTION_COMPLETED:
385         case OAL_EVENT_GATTC_REGISTRATION:
386                 if (adapter_gatt_cb)
387                         adapter_gatt_cb(event_type, event_data);
388                 if (adapter_le_cb)
389                         adapter_le_cb(event_type, event_data);
390                 break;
391 #endif
392         case OAL_EVENT_BLE_DISCOVERY_STARTED:
393         case OAL_EVENT_BLE_DISCOVERY_STOPPED:
394         case OAL_EVENT_BLE_DISCOVERY_FINISHED:
395         case OAL_EVENT_BLE_REMOTE_DEVICE_FOUND:
396         case OAL_EVENT_BLE_LOCAL_FEATURES:
397                 if (adapter_le_cb)
398                         adapter_le_cb(event_type, event_data);
399                 break;
400         default:
401                 BT_ERR("Unhandled Event: %d", event_type);
402                 break;
403         }
404
405         if (oal_event->data)
406                 g_free(oal_event->data);
407         g_free(oal_event);
408         return FALSE;
409 }
410
411 void _bt_service_oal_event_receiver(int event_type, gpointer event_data, gsize len)
412 {
413         bt_service_oal_event_data_t *oal_event = g_new0(bt_service_oal_event_data_t, 1);
414
415         BT_DBG("event_type: [%d], data size: [%zu]", event_type, len);
416
417         oal_event->type = event_type;
418         if (event_data)
419                 oal_event->data = g_memdup(event_data, len);
420
421         g_idle_add(__bt_handle_oal_events, oal_event);
422 }