2 * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License")
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "ua-internal.h"
20 #include "ua-common.h"
26 } uam_event_handler_data_t;
28 static gboolean is_registered = FALSE;
29 static uam_event_handler_data_t *event_handler_data = NULL;
31 static void __uam_copy_sensor_data(uam_sensor_info_s *sensor_info, int status,
32 unsigned int bitmask, unsigned long long timestamp, int accuracy, int count, double *values)
36 ret_if(NULL == sensor_info);
38 memset(sensor_info, 0, sizeof(uam_sensor_info_s));
39 sensor_info->status = status;
40 sensor_info->sensor_bitmask = bitmask;
41 sensor_info->timestamp = timestamp;
42 sensor_info->accuracy = accuracy;
43 sensor_info->count = count;
44 for (int i = 0; i < UAM_SENSOR_MAX_VALUES; i++) {
45 sensor_info->values[i] = values[i];
48 UAM_INFO("status [%d] sensor bitmask [%u] timestamp [%llu] accuracy [%d]" \
49 "count [%d] value0 [%f] value1 [%f] value2 [%f] value3 [%f]",
50 sensor_info->status, sensor_info->sensor_bitmask, sensor_info->timestamp,
51 sensor_info->accuracy, sensor_info->count, sensor_info->values[0],
52 sensor_info->values[1], sensor_info->values[2], sensor_info->values[3]);
57 static void __uam_send_event(int event, int result,
58 void *data, void *callback, void *user_data)
61 uam_event_data_s event_data;
63 UAM_INFO("Event: %s [0x%4.4X], result= %s [0x%4.4X]",
64 _uam_event_to_str(event), event,
65 _uam_error_to_str(result), result);
67 ret_if(NULL == callback);
69 memset(&event_data, 0x00, sizeof(uam_event_data_s));
70 event_data.result = result;
71 event_data.data = data;
73 ((uam_event_cb)callback)(event, &event_data, user_data);
78 static void __uam_event_handler(GDBusConnection *connection,
79 const gchar *sender_name,
80 const gchar *object_path,
81 const gchar *interface_name,
82 const gchar *signal_name,
87 int result = UAM_ERROR_NONE;
90 uam_event_handler_data_t *event_info = user_data;
92 ret_if(NULL == event_info);
94 if (0 != strcasecmp(object_path, UAM_EVENT_PATH))
97 if (0 != strcasecmp(interface_name, UAM_EVENT_INTERFACE))
100 if (0 == strcasecmp(signal_name, UAM_SIGNAL_USER_PRESENCE_DETECTED)) {
101 uam_detection_event_data_s event_data;
102 unsigned int sensor_bitmask;
103 const char *account = NULL;
104 const char *service = NULL;
105 const char *device_id = NULL;
106 unsigned long long timestamp;
108 g_variant_get(parameters, "(u&s&s&st)", &sensor_bitmask, &account,
109 &service, &device_id, ×tamp);
111 UAM_DBG("Sensor: 0x%8.8X, User: %s, Device: %s", sensor_bitmask,
113 event = UAM_EVENT_USER_PRESENCE_DETECTED;
114 event_data.sensor_bitmask = sensor_bitmask;
115 g_strlcpy(event_data.account, account,
116 UAM_USER_ACCOUNT_MAX_STRING_LEN);
117 g_strlcpy(event_data.service, service, UAM_SERVICE_MAX_STRING_LEN);
118 event_data.timestamp = timestamp;
119 g_strlcpy(event_data.device_id, device_id, UAM_DEVICE_ID_MAX_STRING_LEN);
121 __uam_send_event(event, result, &event_data,
122 event_info->cb, event_info->user_data);
123 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_USER_ABSENCE_DETECTED)) {
124 uam_detection_event_data_s event_data;
125 unsigned int sensor_bitmask;
126 char *account = NULL;
127 char *service = NULL;
128 unsigned long long timestamp;
130 g_variant_get(parameters, "(u&s&st)", &sensor_bitmask, &account,
131 &service, ×tamp);
133 UAM_DBG("Sensor: 0x%8.8X, User: %s", sensor_bitmask, account);
134 event = UAM_EVENT_USER_ABSENCE_DETECTED;
135 event_data.sensor_bitmask = sensor_bitmask;
136 g_strlcpy(event_data.account, account,
137 UAM_USER_ACCOUNT_MAX_STRING_LEN);
138 g_strlcpy(event_data.service, service, UAM_SERVICE_MAX_STRING_LEN);
139 event_data.timestamp = timestamp;
141 __uam_send_event(event, result, &event_data,
142 event_info->cb, event_info->user_data);
143 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_PRESENCE_DETECTED)) {
144 uam_sensor_info_s sensor_info;
145 unsigned int sensor_bitmask;
146 unsigned long long timestamp;
148 double values[UAM_SENSOR_MAX_VALUES];
150 g_variant_get(parameters, "(utiidddd)", &sensor_bitmask, ×tamp,
151 &accuracy, &count, &values[0], &values[1],
152 &values[2], &values[3]);
154 __uam_copy_sensor_data(&sensor_info, 0, sensor_bitmask, timestamp,
155 accuracy, count, values);
157 event = UAM_EVENT_PRESENCE_DETECTED;
159 __uam_send_event(event, result, &sensor_info,
160 event_info->cb, event_info->user_data);
161 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_ABSENCE_DETECTED)) {
162 uam_sensor_info_s sensor_info;
163 unsigned int sensor_bitmask;
164 unsigned long long timestamp;
166 double values[UAM_SENSOR_MAX_VALUES];
168 g_variant_get(parameters, "(utiidddd)", &sensor_bitmask, ×tamp,
169 &accuracy, &count, &values[0], &values[1],
170 &values[2], &values[3]);
172 __uam_copy_sensor_data(&sensor_info, 0, sensor_bitmask, timestamp,
173 accuracy, count, values);
175 event = UAM_EVENT_ABSENCE_DETECTED;
177 __uam_send_event(event, result, &sensor_info,
178 event_info->cb, event_info->user_data);
179 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_SENSOR_STATE_READY)) {
182 g_variant_get(parameters, "(iu)", &result,
185 event = UAM_EVENT_SENSOR_STATE_READY;
186 __uam_send_event(event, result, &sensor,
187 event_info->cb, event_info->user_data);
188 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_SENSOR_STATE_NOT_READY)) {
191 g_variant_get(parameters, "(iu)", &result,
194 event = UAM_EVENT_SENSOR_STATE_NOT_READY;
195 __uam_send_event(event, result, &sensor,
196 event_info->cb, event_info->user_data);
197 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_USER_ADDED)) {
198 uam_user_info_s user_info;
199 char *account = NULL;
202 memset(&user_info, 0, sizeof(uam_user_info_s));
203 g_variant_get(parameters, "(i&s&s)", &result,
206 g_strlcpy(user_info.account,
207 account, UAM_USER_ACCOUNT_MAX_STRING_LEN);
208 g_strlcpy(user_info.name,
209 name, UAM_USER_NAME_MAX_STRING_LEN);
211 event = UAM_EVENT_USER_ADDED;
212 __uam_send_event(event, result, &user_info,
213 event_info->cb, event_info->user_data);
214 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_USER_REMOVED)) {
215 uam_user_info_s user_info;
216 char *account = NULL;
219 memset(&user_info, 0, sizeof(uam_user_info_s));
220 g_variant_get(parameters, "(i&s&s)", &result,
223 g_strlcpy(user_info.account,
224 account, UAM_USER_ACCOUNT_MAX_STRING_LEN);
225 g_strlcpy(user_info.name,
226 name, UAM_USER_NAME_MAX_STRING_LEN);
228 event = UAM_EVENT_USER_REMOVED;
229 __uam_send_event(event, result, &user_info,
230 event_info->cb, event_info->user_data);
231 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_DEVICE_ADDED)) {
232 uam_device_info_s dev_info;
235 char *ipv4_addr = NULL;
236 char *device_id = NULL;
238 g_variant_get(parameters, "(iii&s&s&s)", &result,
239 &os, &type, &mac, &ipv4_addr, &device_id);
241 dev_info.operating_system = os;
242 dev_info.type = type;
243 g_strlcpy(dev_info.mac,
244 mac, UAM_MAC_ADDRESS_STRING_LEN);
245 g_strlcpy(dev_info.ipv4_addr,
246 ipv4_addr, UAM_IP_ADDRESS_MAX_STRING_LEN);
247 g_strlcpy(dev_info.device_id,
248 device_id, UAM_DEVICE_ID_MAX_STRING_LEN);
250 event = UAM_EVENT_DEVICE_ADDED;
251 __uam_send_event(event, result, &dev_info,
252 event_info->cb, event_info->user_data);
253 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_DEVICE_REMOVED)) {
254 uam_device_info_s dev_info;
257 char *ipv4_addr = NULL;
258 char *device_id = NULL;
260 g_variant_get(parameters, "(iii&s&s&s)", &result,
261 &os, &type, &mac, &ipv4_addr, &device_id);
263 dev_info.operating_system = os;
264 dev_info.type = type;
265 g_strlcpy(dev_info.mac,
266 mac, UAM_MAC_ADDRESS_STRING_LEN);
267 g_strlcpy(dev_info.ipv4_addr,
268 ipv4_addr, UAM_IP_ADDRESS_MAX_STRING_LEN);
269 g_strlcpy(dev_info.device_id,
270 device_id, UAM_DEVICE_ID_MAX_STRING_LEN);
272 event = UAM_EVENT_DEVICE_REMOVED;
273 __uam_send_event(event, result, &dev_info,
274 event_info->cb, event_info->user_data);
275 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_DETECTION_STARTED)) {
276 __uam_send_event(UAM_EVENT_DETECTION_STARTED, result, NULL,
277 event_info->cb, event_info->user_data);
278 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_DETECTION_STOPPED)) {
279 __uam_send_event(UAM_EVENT_DETECTION_STOPPED, result, NULL,
280 event_info->cb, event_info->user_data);
281 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_DEVICE_FOUND)) {
282 uam_device_info_s dev_info;
285 char *ipv4_addr = NULL;
286 char *device_id = NULL;
288 g_variant_get(parameters, "(iii&s&s&s)", &result,
289 &os, &type, &mac, &ipv4_addr, &device_id);
291 dev_info.operating_system = os;
292 dev_info.type = type;
293 g_strlcpy(dev_info.mac,
294 mac, UAM_MAC_ADDRESS_STRING_LEN);
295 g_strlcpy(dev_info.ipv4_addr,
296 ipv4_addr, UAM_IP_ADDRESS_MAX_STRING_LEN);
297 g_strlcpy(dev_info.device_id,
298 device_id, UAM_DEVICE_ID_MAX_STRING_LEN);
300 event = UAM_EVENT_DEVICE_FOUND;
301 __uam_send_event(event, result, &dev_info,
302 event_info->cb, event_info->user_data);
303 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_SCAN_COMPLETED)) {
305 event = UAM_EVENT_SCAN_COMPLETED;
306 __uam_send_event(event, result, NULL,
307 event_info->cb, event_info->user_data);
308 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_SERVICE_REGISTERED)) {
309 uam_service_info_s svc_info;
312 memset(&svc_info, 0, sizeof(uam_service_info_s));
313 g_variant_get(parameters, "(i&s)", &result, &name);
315 g_strlcpy(svc_info.name,
316 name, UAM_SERVICE_MAX_STRING_LEN);
318 event = UAM_EVENT_SERVICE_REGISTERED;
319 __uam_send_event(event, result, &svc_info,
320 event_info->cb, event_info->user_data);
321 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_SERVICE_UNREGISTERED)) {
322 uam_service_info_s svc_info;
325 memset(&svc_info, 0, sizeof(uam_service_info_s));
326 g_variant_get(parameters, "(i&s)", &result, &name);
328 g_strlcpy(svc_info.name,
329 name, UAM_SERVICE_MAX_STRING_LEN);
331 event = UAM_EVENT_SERVICE_UNREGISTERED;
332 __uam_send_event(event, result, &svc_info,
333 event_info->cb, event_info->user_data);
334 } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_SENSOR_STATUS_CHANGED)) {
335 uam_sensor_info_s sensor_info;
336 unsigned int sensor_bitmask;
337 unsigned long long timestamp;
338 int status, accuracy, count;
339 double values[UAM_SENSOR_MAX_VALUES];
341 g_variant_get(parameters, "(uutiidddd)", &status, &sensor_bitmask, ×tamp,
342 &accuracy, &count, &values[0], &values[1],&values[2], &values[3]);
344 __uam_copy_sensor_data(&sensor_info, status, sensor_bitmask, timestamp,
345 accuracy, count, values);
347 event = UAM_EVENT_SENSOR_STATUS_CHANGED;
349 __uam_send_event(event, result, &sensor_info,
350 event_info->cb, event_info->user_data);
352 UAM_WARN("Unknown signal received: %s", signal_name);
358 int _uam_register_event_handler(uam_event_cb event_cb, void *user_data)
361 GDBusConnection *conn;
362 const char *path = UAM_EVENT_PATH;
363 const char *interface = UAM_EVENT_INTERFACE;
364 GDBusSignalCallback event_func = __uam_event_handler;
366 retv_if(TRUE == is_registered, UAM_ERROR_ALREADY_REGISTERED);
368 conn = _uam_get_gdbuam_conn();
369 retv_if(NULL == conn, UAM_ERROR_INTERNAL);
371 event_handler_data = g_malloc0(sizeof(uam_event_handler_data_t));
372 if (event_handler_data) {
373 event_handler_data->cb = event_cb;
374 event_handler_data->user_data = user_data;
375 event_handler_data->id = g_dbus_connection_signal_subscribe(conn,
376 NULL, interface, NULL, path, NULL, 0,
377 event_func, event_handler_data, NULL);
379 UAM_ERR("Memory allocation error");
380 return UAM_ERROR_OUT_OF_MEMORY;
383 is_registered = TRUE;
386 return UAM_ERROR_NONE;
389 int _uam_unregister_event_handler(void)
392 GDBusConnection *conn;
394 retv_if(FALSE == is_registered, UAM_ERROR_NOT_REGISTERED);
395 is_registered = FALSE;
397 retv_if(NULL == event_handler_data, UAM_ERROR_INTERNAL);
399 conn = _uam_get_gdbuam_conn();
400 retv_if(NULL == conn, UAM_ERROR_INTERNAL);
402 g_dbus_connection_signal_unsubscribe(conn, event_handler_data->id);
403 memset(event_handler_data, 0, sizeof(uam_event_handler_data_t));
404 g_free(event_handler_data);
405 event_handler_data = NULL;
408 return UAM_ERROR_NONE;