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