From d62bb0b2292c8f3ceca1692a0e69cbcbffc34c92 Mon Sep 17 00:00:00 2001 From: Nishant Chaprana Date: Wed, 10 Jul 2019 17:14:48 +0530 Subject: [PATCH 01/16] Store newly allcoated IP address in tech->addresses list When device was not having IP address and it is found that new IP address has been allocated to the device, then we need to store this IP address in tech->addresses list. Change-Id: I973db47a8655ea321063fd77947e88751156fd83 Signed-off-by: Nishant Chaprana --- packaging/ua-manager.spec | 2 +- ua-daemon/src/ua-manager-core.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packaging/ua-manager.spec b/packaging/ua-manager.spec index a5d85b2..ab3167e 100644 --- a/packaging/ua-manager.spec +++ b/packaging/ua-manager.spec @@ -1,6 +1,6 @@ Name: ua-manager Summary: User awareness manager -Version: 0.0.1 +Version: 0.0.2 Release: 1 License: Apache-2.0 Source0: %{name}-%{version}.tar.gz diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index 0e3ac36..2bf0a61 100644 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -2254,10 +2254,12 @@ void _uam_core_handle_presence_detected(unsigned int sensor, } if (is_updated) { - if (!addr_info) + if (!addr_info) { addr_info = g_new0(uam_db_address_info_t, 1); - else + g_slist_append(tech->addresses, addr_info); + } else { g_free(addr_info->address); + } addr_info->addr_type = UAM_ADDR_TYPE_IPv4; addr_info->address = g_strdup(dev_info->ipv4_addr); -- 2.7.4 From 82abd3e5ace20f2469162a8fbd90d80a01779c07 Mon Sep 17 00:00:00 2001 From: saerome kim Date: Wed, 10 Jul 2019 21:39:34 +0900 Subject: [PATCH 02/16] Fixed build error Change-Id: Ieecee53607c6bf3990f90255a145c8d8bf372eb5 Signed-off-by: saerome kim --- ua-daemon/src/ua-manager-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index 2bf0a61..e7f1a06 100644 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -2256,7 +2256,7 @@ void _uam_core_handle_presence_detected(unsigned int sensor, if (is_updated) { if (!addr_info) { addr_info = g_new0(uam_db_address_info_t, 1); - g_slist_append(tech->addresses, addr_info); + tech->addresses = g_slist_append(tech->addresses, addr_info); } else { g_free(addr_info->address); } -- 2.7.4 From 3d4e0d21c8faba69718234d05d7eeddbae97a1a9 Mon Sep 17 00:00:00 2001 From: Jung Jihoon Date: Wed, 10 Jul 2019 20:06:00 +0900 Subject: [PATCH 03/16] Fix Coverity issues - Resource leaks 1047595 1047599 1047606 1047610 1047613 1047618 1047621 1047628 1049995 1047614 1050025 1047600 - dereference before null check : 1074416 - Unreachable code : 1047594 Change-Id: Ia4f90384b26687c315926e7a8af77465bac17385 Signed-off-by: Jung Jihoon --- ua-api/src/ua-request-sender.c | 38 ++++++++++++++++++++---------- ua-daemon/src/pm/ua-cloud-plugin-handler.c | 7 +++++- ua-daemon/src/pm/ua-plugin-manager.c | 11 +++++---- ua-daemon/src/pm/ua-power-plugin-manager.c | 8 ++++++- ua-daemon/src/ua-manager-common.c | 8 +++++-- ua-daemon/src/ua-manager-core.c | 3 +-- 6 files changed, 51 insertions(+), 24 deletions(-) mode change 100644 => 100755 ua-daemon/src/pm/ua-plugin-manager.c mode change 100644 => 100755 ua-daemon/src/pm/ua-power-plugin-manager.c mode change 100644 => 100755 ua-daemon/src/ua-manager-common.c mode change 100644 => 100755 ua-daemon/src/ua-manager-core.c diff --git a/ua-api/src/ua-request-sender.c b/ua-api/src/ua-request-sender.c index 287ea97..146043c 100644 --- a/ua-api/src/ua-request-sender.c +++ b/ua-api/src/ua-request-sender.c @@ -177,6 +177,8 @@ int _uam_sync_request( GVariant *param2; GVariant *param3; GVariant *param4; + GVariant *input_param; + GVariant *result_param; GError *error = NULL; UAM_INFO_C("Request function : %s (0x%x)", @@ -203,11 +205,16 @@ int _uam_sync_request( else timeout = 10000; + input_param = g_variant_new("(i@ay@ay@ay@ay)", req_func, param1, + param2, param3, param4); + + g_variant_unref(param1); + g_variant_unref(param2); + g_variant_unref(param3); + g_variant_unref(param4); + ret = g_dbus_proxy_call_sync(proxy, "uam_request", - g_variant_new("(i@ay@ay@ay@ay)", - req_func, param1, - param2, param3, param4), - G_DBUS_CALL_FLAGS_NONE, timeout, + input_param, G_DBUS_CALL_FLAGS_NONE, timeout, NULL, &error); if (!ret) { UAM_ERR("dBUS-RPC failed"); @@ -220,14 +227,12 @@ int _uam_sync_request( return UAM_ERROR_INTERNAL; } - param1 = NULL; - - g_variant_get(ret, "(iv)", &result, ¶m1); + g_variant_get(ret, "(iv)", &result, &result_param); - if (param1) { + if (result_param) { *out_param = g_array_new(TRUE, TRUE, sizeof(gchar)); - __uam_fill_garray_from_variant(param1, *out_param); - g_variant_unref(param1); + __uam_fill_garray_from_variant(result_param, *out_param); + g_variant_unref(result_param); } g_variant_unref(ret); @@ -328,6 +333,7 @@ int _uam_async_request( GVariant *param2; GVariant *param3; GVariant *param4; + GVariant *input_param; UAM_INFO_C("Request function : %s (0x%x)", _uam_request_to_str(req_func), req_func); @@ -353,10 +359,16 @@ int _uam_async_request( in_param4->data, in_param4->len, TRUE, NULL, NULL); + input_param = g_variant_new("(i@ay@ay@ay@ay)", req_func, param1, + param2, param3, param4); + + g_variant_unref(param1); + g_variant_unref(param2); + g_variant_unref(param3); + g_variant_unref(param4); + g_dbus_proxy_call(proxy, "uam_request", - g_variant_new("(i@ay@ay@ay@ay)", - req_func, param1, - param2, param3, param4), + input_param, G_DBUS_CALL_FLAGS_NONE, timeout, NULL, __uam_async_request_cb, req_info); diff --git a/ua-daemon/src/pm/ua-cloud-plugin-handler.c b/ua-daemon/src/pm/ua-cloud-plugin-handler.c index f38b793..1aa292d 100644 --- a/ua-daemon/src/pm/ua-cloud-plugin-handler.c +++ b/ua-daemon/src/pm/ua-cloud-plugin-handler.c @@ -246,11 +246,16 @@ static gboolean __add_cloud_plugin(void *handle, uac_module_t *module) return FALSE; } - retv_if(NULL == module->init, FALSE); + if (NULL == module->init) { + UAM_ERR("module->init is NULL"); + g_free(plugin); + return FALSE; + } module->init(&api); if (NULL == api) { UAM_ERR("API returned is NULL"); + g_free(plugin); return FALSE; } diff --git a/ua-daemon/src/pm/ua-plugin-manager.c b/ua-daemon/src/pm/ua-plugin-manager.c old mode 100644 new mode 100755 index d478b11..ea2aa64 --- a/ua-daemon/src/pm/ua-plugin-manager.c +++ b/ua-daemon/src/pm/ua-plugin-manager.c @@ -75,12 +75,16 @@ static gboolean __add_plugin(void *handle, uas_module_t *module) UAM_ERR("Memory allocation failed"); return FALSE; } - - retv_if(NULL == module->init, FALSE); + if (NULL == module->init) { + UAM_ERR("module->init is NULL"); + g_free(plugin); + return FALSE; + } module->init(&api); if (NULL == api) { UAM_ERR("API returned is NULL"); + g_free(plugin); return FALSE; } @@ -230,9 +234,6 @@ static int __init_sensor_plugins(void) available_sensors |= UAM_SENSOR_BITMASK_MOTION; break; - default: - UAM_WARN("Unknown plugin %d", id); - break; } /* If atleast one sensor init is success, return success */ diff --git a/ua-daemon/src/pm/ua-power-plugin-manager.c b/ua-daemon/src/pm/ua-power-plugin-manager.c old mode 100644 new mode 100755 index 1855798..c1a7aff --- a/ua-daemon/src/pm/ua-power-plugin-manager.c +++ b/ua-daemon/src/pm/ua-power-plugin-manager.c @@ -79,10 +79,16 @@ static gboolean __add_power_plugin(void *handle, uap_module_t *module) return FALSE; } - retv_if(NULL == module->init, FALSE); + if (NULL == module->init) { + UAM_ERR("module->init is NULL"); + g_free(plugin); + return FALSE; + } + module->init(&api); if (NULL == api) { UAM_ERR("API returned is NULL"); + g_free(plugin); return FALSE; } diff --git a/ua-daemon/src/ua-manager-common.c b/ua-daemon/src/ua-manager-common.c old mode 100644 new mode 100755 index 373de98..9d3fe98 --- a/ua-daemon/src/ua-manager-common.c +++ b/ua-daemon/src/ua-manager-common.c @@ -142,11 +142,15 @@ void _uam_manager_method_return( { FUNC_ENTRY; GVariant *out_var; + GVariant *return_var; out_var = g_variant_new_from_data((const GVariantType *)"ay", out_param->data, out_param->len, TRUE, NULL, NULL); - g_dbus_method_invocation_return_value(invocation, - g_variant_new("(iv)", result, out_var)); + return_var = g_variant_new("(iv)", result, out_var); + g_variant_unref(out_var); + + g_dbus_method_invocation_return_value(invocation, return_var); + FUNC_EXIT; } diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c old mode 100644 new mode 100755 index e7f1a06..32e4e65 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -1622,11 +1622,10 @@ static gboolean __start_detection(gpointer data) for (l = services; NULL != l; l = g_slist_next(l)) { service = l->data; - - UAM_DBG("service: %p, monitors: %p", service, service->monitors); if (!service || !service->monitors) continue; + UAM_DBG("service: %p, monitors: %p", service, service->monitors); UAM_DBG("service->remaining_time: %d", service->remaining_time); service->remaining_time -= UAM_DETECTION_CYCLE_MIN; if (0 >= service->remaining_time) { -- 2.7.4 From aadd0c6f0ed6c5804226b3743aa0342ec039e6b1 Mon Sep 17 00:00:00 2001 From: "saerome.kim" Date: Thu, 11 Jul 2019 18:36:19 +0900 Subject: [PATCH 04/16] Fixed crash due to double free. g_dbus_proxy_call or g_dbus_method_invocation free the gvariant input parameter in the function. Change-Id: Id46bef23abb05c2658a20cfd33bb09f1536dd684 Signed-off-by: saerome.kim --- ua-api/src/ua-request-sender.c | 62 +++++++++++++++++++++++---------------- ua-daemon/src/ua-manager-common.c | 6 ++-- 2 files changed, 39 insertions(+), 29 deletions(-) mode change 100755 => 100644 ua-daemon/src/ua-manager-common.c diff --git a/ua-api/src/ua-request-sender.c b/ua-api/src/ua-request-sender.c index 146043c..a990eb6 100644 --- a/ua-api/src/ua-request-sender.c +++ b/ua-api/src/ua-request-sender.c @@ -171,14 +171,15 @@ int _uam_sync_request( FUNC_ENTRY; int result = UAM_ERROR_NONE; gint timeout; - GDBusProxy *proxy; - GVariant *ret; - GVariant *param1; - GVariant *param2; - GVariant *param3; - GVariant *param4; - GVariant *input_param; - GVariant *result_param; + GDBusProxy *proxy = NULL; + GVariant *ret = NULL; + GVariant *param1 = NULL; + GVariant *param2 = NULL; + GVariant *param3 = NULL; + GVariant *param4 = NULL; + + GVariant *input_param = NULL; + GVariant *result_param = NULL; GError *error = NULL; UAM_INFO_C("Request function : %s (0x%x)", @@ -208,14 +209,19 @@ int _uam_sync_request( input_param = g_variant_new("(i@ay@ay@ay@ay)", req_func, param1, param2, param3, param4); - g_variant_unref(param1); - g_variant_unref(param2); - g_variant_unref(param3); - g_variant_unref(param4); - ret = g_dbus_proxy_call_sync(proxy, "uam_request", input_param, G_DBUS_CALL_FLAGS_NONE, timeout, NULL, &error); + /* + * Note: params1~4 and in_params are unreferenced within the g_dbus_proxy_call_sync function. + * + * ------------------------------------------------------------------------------ + * Call flow: + * g_dbus_proxy_call_sync_internal -> g_dbus_connection_call_sync -> + * g_dbus_connection_call_sync_internal -> g_dbus_message_set_body -> + * g_variant_unref(message->body); + * ------------------------------------------------------------------------------ + */ if (!ret) { UAM_ERR("dBUS-RPC failed"); if (error != NULL) { @@ -280,6 +286,7 @@ static void __uam_async_request_cb( out_param = g_array_new(TRUE, TRUE, sizeof(gchar)); __uam_fill_garray_from_variant(param1, out_param); g_variant_unref(param1); + g_array_unref(out_param); } /* Callback should be invoked only in case of failure */ @@ -303,7 +310,7 @@ static void __uam_async_request_cb( done: if (out_param) - g_array_free(out_param, TRUE); + g_array_unref(out_param); if (req_info) { pending_requests = g_slist_remove( @@ -329,11 +336,11 @@ int _uam_async_request( uam_req_info_t *req_info; gint timeout = -1; GDBusProxy *proxy; - GVariant *param1; - GVariant *param2; - GVariant *param3; - GVariant *param4; - GVariant *input_param; + GVariant *param1 = NULL; + GVariant *param2 = NULL; + GVariant *param3 = NULL; + GVariant *param4 = NULL; + GVariant *input_param = NULL; UAM_INFO_C("Request function : %s (0x%x)", _uam_request_to_str(req_func), req_func); @@ -362,19 +369,24 @@ int _uam_async_request( input_param = g_variant_new("(i@ay@ay@ay@ay)", req_func, param1, param2, param3, param4); - g_variant_unref(param1); - g_variant_unref(param2); - g_variant_unref(param3); - g_variant_unref(param4); - g_dbus_proxy_call(proxy, "uam_request", input_param, G_DBUS_CALL_FLAGS_NONE, timeout, NULL, __uam_async_request_cb, req_info); + /* + * Note: In_params is unreferenced within the g_dbus_proxy_call_sync function. + * + * ------------------------------------------------------------------------------ + * Call flow: + * g_dbus_proxy_call_sync_internal -> g_dbus_connection_call_sync -> + * g_dbus_connection_call_sync_internal -> g_dbus_message_set_body -> + * g_variant_unref(message->body); + * ------------------------------------------------------------------------------ + */ pending_requests = g_slist_append(pending_requests, req_info); FUNC_EXIT; return result; -} +} \ No newline at end of file diff --git a/ua-daemon/src/ua-manager-common.c b/ua-daemon/src/ua-manager-common.c old mode 100755 new mode 100644 index 9d3fe98..b7a5136 --- a/ua-daemon/src/ua-manager-common.c +++ b/ua-daemon/src/ua-manager-common.c @@ -141,13 +141,12 @@ void _uam_manager_method_return( GDBusMethodInvocation *invocation, GArray *out_param, int result) { FUNC_ENTRY; - GVariant *out_var; - GVariant *return_var; + GVariant *out_var = NULL; + GVariant *return_var = NULL; out_var = g_variant_new_from_data((const GVariantType *)"ay", out_param->data, out_param->len, TRUE, NULL, NULL); return_var = g_variant_new("(iv)", result, out_var); - g_variant_unref(out_var); g_dbus_method_invocation_return_value(invocation, return_var); @@ -206,4 +205,3 @@ const char *_uam_get_sensor_str(uas_plugin_id_e ids) return "UNKNOWN SENSOR"; } } - -- 2.7.4 From 48a6c3b9094236ff7a1f96003b834805d5ecbd7e Mon Sep 17 00:00:00 2001 From: "saerome.kim" Date: Thu, 11 Jul 2019 21:19:20 +0900 Subject: [PATCH 05/16] chaged detection parameters - detection cycle 60sec - detection window 50sec Change-Id: Id929f8cc257774a292d8d05fd69fb2a862c61703 Signed-off-by: saerome.kim --- config/uam-config.json | 4 ++-- ua-daemon/include/ua-manager-core.h | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/config/uam-config.json b/config/uam-config.json index f4a4031..8773210 100644 --- a/config/uam-config.json +++ b/config/uam-config.json @@ -1,7 +1,7 @@ { "DetectionParams": { - "Cycle": 900, - "Period": 60, + "Cycle": 60, + "Period": 50, "Retries": 1 } } diff --git a/ua-daemon/include/ua-manager-core.h b/ua-daemon/include/ua-manager-core.h index 7bbc339..d740906 100644 --- a/ua-daemon/include/ua-manager-core.h +++ b/ua-daemon/include/ua-manager-core.h @@ -37,12 +37,13 @@ typedef enum { UAM_ADDR_TYPE_MAX } uam_addr_type_e; -#define UAM_DETECTION_WINDOW_DEFAULT 60 /* 60 seconds */ -#define UAM_DETECTION_WINDOW_MAX 290 /* 290 seconds */ +#define UAM_DETECTION_WINDOW_DEFAULT 30 /* 60 seconds */ +#define UAM_DETECTION_WINDOW_MAX 50 /* 50 seconds */ #define UAM_DETECTION_WINDOW_STEP 10 /* 10 seconds */ -#define UAM_DETECTION_CYCLE_DEFAULT 900 /* 900 seconds */ -#define UAM_DETECTION_CYCLE_MIN 300 /* 300 seconds */ +#define UAM_DETECTION_CYCLE_DEFAULT 60 /* 120 seconds */ +#define UAM_DETECTION_CYCLE_MIN 60 /* 60 seconds */ + typedef struct { char *name; unsigned int cycle; -- 2.7.4 From 6044921126a36a0a3f9129103d414be08cc9bfc8 Mon Sep 17 00:00:00 2001 From: saerome kim Date: Fri, 12 Jul 2019 17:35:02 +0900 Subject: [PATCH 06/16] Fixed OS type mismatching problem. Plugin devloper may intiailze OS type either UAM_OS_TYPE_UNDIFIEND or UAM_OS_TYPE_INVAILD. but ua-manager handles only UAM_OS_TYPE_INVAILD. This patch make ua-manager handles both UNDEFINED and INVALID cases. Change-Id: Ib3de0e12064046252763ae289671cb029e2732f0 Signed-off-by: saerome kim --- ua-daemon/src/ua-manager-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index 32e4e65..9af6997 100755 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -614,7 +614,7 @@ static void __uam_core_add_dev_to_list( UAM_INFO("device->os: %d, dev_info->operating_system: %d", device->os, dev_info->operating_system); /* Update device OS type */ - if (UAM_OS_TYPE_INVALID == device->os) + if (UAM_OS_TYPE_INVALID == device->os || UAM_OS_TYPE_UNDEFINED == device->os) device->os = dev_info->operating_system; else UAM_WARN("Strange - OS types did not match, need to check"); -- 2.7.4 From f311bdad167868cbd92fd742de01ec1e57127f86 Mon Sep 17 00:00:00 2001 From: Abhay agarwal Date: Fri, 12 Jul 2019 17:35:00 +0530 Subject: [PATCH 07/16] Added service category APIs Change-Id: I92c16e1cdef0b6bfd92b0d60d223e0aea6b50157 Signed-off-by: Abhay agarwal --- include/ua-api.h | 80 ++++++++ include/ua-internal.h | 8 + ua-api/src/ua-api.c | 198 ++++++++++++++++++++ ua-api/src/ua-common.c | 2 + ua-api/src/ua-event-handler.c | 26 +++ ua-daemon/include/ua-manager-core.h | 12 ++ ua-daemon/src/ua-manager-common.c | 2 + ua-daemon/src/ua-manager-core.c | 287 ++++++++++++++++++++++++++++- ua-daemon/src/ua-manager-event-sender.c | 8 + ua-daemon/src/ua-manager-request-handler.c | 90 +++++++++ 10 files changed, 708 insertions(+), 5 deletions(-) diff --git a/include/ua-api.h b/include/ua-api.h index 45c5319..ba60350 100644 --- a/include/ua-api.h +++ b/include/ua-api.h @@ -123,6 +123,8 @@ typedef enum { UAM_EVENT_DETECTION_STOPPED, /**< Detection stopped */ UAM_EVENT_DEVICE_FOUND, /**< Device found */ UAM_EVENT_SCAN_COMPLETED, /**< Scan completed */ + UAM_EVENT_SERVICE_REGISTERED, /**< Service registered */ + UAM_EVENT_SERVICE_UNREGISTERED, /**< Service registered */ UAM_EVENT_MAX, /**< Max. event number */ } uam_event_e; @@ -451,6 +453,14 @@ typedef struct { } uam_user_info_s; /** + * @brief Service info structure. + * @since_tizen 5.5 + */ +typedef struct { + char name[UAM_SERVICE_MAX_STRING_LEN]; /**< Service name */ +} uam_service_info_s; + +/** * @brief Detection event structure. * @since_tizen 5.5 */ @@ -906,6 +916,57 @@ int _uam_enable_low_power_mode(void); int _uam_disable_low_power_mode(void); /** + * @brief Gets default service info. + * @since_tizen 5.5 + * + * @param[in] uam_service Service information + * + * @return 0 on success, otherwise a negative error value + * @retval #UAM_ERROR_NONE Successful + * @retval #UAM_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #UAM_ERROR_INTERNAL Internal error + * + * @exception + * @pre + * @post +*/ +int _uam_get_default_service(uam_service_info_s *service); + +/** + * @brief Registers service info. + * @since_tizen 5.5 + * + * @param[in] service Service information. + * + * @return 0 on success, otherwise a negative error value + * @retval #UAM_ERROR_NONE Successful + * @retval #UAM_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #UAM_ERROR_INTERNAL Internal error + * + * @exception + * @pre + * @post + */ +int _uam_register_service(uam_service_info_s *service); + +/** + * @brief Registers service info. + * @since_tizen 5.5 + * + * @param[in] service Service information. + * + * @return 0 on success, otherwise a negative error value + * @retval #UAM_ERROR_NONE Successful + * @retval #UAM_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #UAM_ERROR_INTERNAL Internal error + * + * @exception + * @pre + * @post + */ +int _uam_unregister_service(uam_service_info_s *service); + +/** * @brief Gets detction window size. * @since_tizen 5.5 * @@ -923,6 +984,25 @@ int _uam_disable_low_power_mode(void); int _uam_get_detection_window(unsigned int *window); /** + * @brief Gets registered service list. + * @since_tizen 5.5 + * + * @remarks The @a service_list should be destroyed by using #g_free() and #g_ptr_array_free(). + * + * @param[out] service_list Service list array + * + * @return 0 on success, otherwise a negative error value + * @retval #UAM_ERROR_NONE Successful + * @retval #UAM_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #UAM_ERROR_INTERNAL Internal error + * + * @exception + * @pre + * @post + */ +int _uam_get_registered_services(GPtrArray **service_list); + +/** * @brief Sets detction window. * @since_tizen 5.5 * diff --git a/include/ua-internal.h b/include/ua-internal.h index baa897a..372258c 100644 --- a/include/ua-internal.h +++ b/include/ua-internal.h @@ -70,6 +70,12 @@ extern "C" { REQUEST(UAM_REQUEST_GET_DETECTION_WINDOW) \ REQUEST(UAM_REQUEST_SET_DETECTION_WINDOW) \ REQUEST(UAM_REQUEST_RESET_DB) \ + REQUEST(UAM_REQUEST_GET_DEFAULT_SERVICE) \ + REQUEST(UAM_REQUEST_REGISTER_SERVICE) \ + REQUEST(UAM_REQUEST_UNREGISTER_SERVICE) \ + REQUEST(UAM_REQUEST_GET_SERVICE_DEVICES) \ + REQUEST(UAM_REQUEST_GET_SERVICE_USERS) \ + REQUEST(UAM_REQUEST_GET_SERVICES) \ REQUEST(UAM_REQUEST_MAX) #define GENERATE_REQUEST_ENUM(ENUM) ENUM, @@ -93,6 +99,8 @@ typedef enum { #define UAM_SIGNAL_DETECTION_STOPPED "DetectionStopped" #define UAM_SIGNAL_DEVICE_FOUND "DeviceFound" #define UAM_SIGNAL_SCAN_COMPLETED "ScanCompleted" +#define UAM_SIGNAL_SERVICE_REGISTERED "ServiceRegistered" +#define UAM_SIGNAL_SERVICE_UNREGISTERED "ServiceUnregistered" #define CASE_TO_STR(x) case x: return #x; diff --git a/ua-api/src/ua-api.c b/ua-api/src/ua-api.c index 7d387a5..45583af 100644 --- a/ua-api/src/ua-api.c +++ b/ua-api/src/ua-api.c @@ -1054,3 +1054,201 @@ UAM_EXPORT_API int _uam_db_reset(void) FUNC_EXIT; return ret; } + +UAM_EXPORT_API int _uam_get_default_service(uam_service_info_s *service) +{ + FUNC_ENTRY; + int ret; + + + UAM_VALIDATE_INPUT_PARAMETER(service); + + UAM_INIT_PARAMS(); + UAM_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + ret = _uam_sync_request(UAM_REQUEST_GET_DEFAULT_SERVICE, + in_param1, in_param2, in_param3, in_param4, &out_param); + + if (UAM_ERROR_NONE == ret) { + if (out_param->len > 0) { + uam_service_info_s *info; + + info = &g_array_index(out_param, uam_service_info_s, 0); + memcpy(service, info, sizeof(uam_service_info_s)); + } else { + UAM_WARN("out_param length is 0"); + } + } + + UAM_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + FUNC_EXIT; + return ret; +} + +UAM_EXPORT_API int _uam_register_service(uam_service_info_s *service) +{ + FUNC_ENTRY; + int ret; + char str1[UAM_SERVICE_MAX_STRING_LEN]; + + UAM_VALIDATE_INPUT_PARAMETER(service); + UAM_VALIDATE_INPUT_PARAMETER(service->name); + + UAM_INIT_PARAMS(); + UAM_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_strlcpy(str1, service->name, UAM_SERVICE_MAX_STRING_LEN); + g_array_append_vals(in_param1, str1, sizeof(str1)); + ret = _uam_sync_request(UAM_REQUEST_REGISTER_SERVICE, + in_param1, in_param2, in_param3, in_param4, &out_param); + + UAM_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + FUNC_EXIT; + return ret; +} + +UAM_EXPORT_API int _uam_unregister_service(uam_service_info_s *service) +{ + FUNC_ENTRY; + int ret; + char str1[UAM_SERVICE_MAX_STRING_LEN]; + + UAM_VALIDATE_INPUT_PARAMETER(service); + UAM_VALIDATE_INPUT_PARAMETER(service->name); + + UAM_INIT_PARAMS(); + UAM_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_strlcpy(str1, service->name, UAM_SERVICE_MAX_STRING_LEN); + g_array_append_vals(in_param1, str1, sizeof(str1)); + ret = _uam_sync_request(UAM_REQUEST_UNREGISTER_SERVICE, + in_param1, in_param2, in_param3, in_param4, &out_param); + + UAM_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + FUNC_EXIT; + return ret; +} + +UAM_EXPORT_API int _uam_get_registered_services(GPtrArray **service_list) +{ + FUNC_ENTRY; + int ret; + + UAM_VALIDATE_INPUT_PARAMETER(service_list); + + UAM_INIT_PARAMS(); + UAM_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + ret = _uam_sync_request(UAM_REQUEST_GET_SERVICES, + in_param1, in_param2, in_param3, in_param4, &out_param); + if (UAM_ERROR_NONE == ret && NULL != out_param) { + int i; + int count; + + count = (out_param->len)/sizeof(uam_service_info_s); + if (0 == count) + UAM_INFO("No registered services"); + + for (i = 0; i < count; i++) { + uam_service_info_s *service_info = NULL; + uam_service_info_s *info; + + info = &g_array_index(out_param, uam_service_info_s, i); + service_info = g_memdup(info, sizeof(uam_service_info_s)); + if (service_info) + g_ptr_array_add(*service_list, (gpointer)service_info); + } + } + + UAM_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + FUNC_EXIT; + return ret; +} + +UAM_EXPORT_API int _uam_request_get_service_devices(char *svc_name, GPtrArray **devices_list) +{ + FUNC_ENTRY; + int ret; + char str[UAM_SERVICE_MAX_STRING_LEN]; + + UAM_VALIDATE_INPUT_PARAMETER(devices_list); + UAM_VALIDATE_INPUT_PARAMETER(svc_name); + + UAM_INIT_PARAMS(); + UAM_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_strlcpy(str, svc_name, UAM_SERVICE_MAX_STRING_LEN); + g_array_append_vals(in_param1, str, sizeof(str)); + + ret = _uam_sync_request(UAM_REQUEST_GET_SERVICE_DEVICES, + in_param1, in_param2, in_param3, in_param4, &out_param); + if (UAM_ERROR_NONE == ret && NULL != out_param) { + int i; + int count; + + count = (out_param->len)/sizeof(uam_device_info_s); + if (0 == count) + UAM_INFO("No registered device"); + + for (i = 0; i < count; i++) { + uam_device_info_s *device_info = NULL; + uam_device_info_s *info; + + info = &g_array_index(out_param, uam_device_info_s, i); + device_info = g_memdup(info, sizeof(uam_device_info_s)); + if (device_info) + g_ptr_array_add(*devices_list, (gpointer)device_info); + } + } + + UAM_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + FUNC_EXIT; + return ret; +} + +UAM_EXPORT_API int _uam_request_get_service_users(char *svc_name, GPtrArray **users_list) +{ + FUNC_ENTRY; + int ret; + char str[UAM_SERVICE_MAX_STRING_LEN]; + + UAM_VALIDATE_INPUT_PARAMETER(users_list); + UAM_VALIDATE_INPUT_PARAMETER(svc_name); + + UAM_INIT_PARAMS(); + UAM_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + g_strlcpy(str, svc_name, UAM_SERVICE_MAX_STRING_LEN); + g_array_append_vals(in_param1, str, sizeof(str)); + + ret = _uam_sync_request(UAM_REQUEST_GET_SERVICE_USERS, + in_param1, in_param2, in_param3, in_param4, &out_param); + if (UAM_ERROR_NONE == ret && NULL != out_param) { + int i; + int count; + + count = (out_param->len)/sizeof(uam_user_info_s); + if (0 == count) + UAM_INFO("No registered user for this service"); + + for (i = 0; i < count; i++) { + uam_user_info_s *user_info = NULL; + uam_user_info_s *info; + + info = &g_array_index(out_param, uam_user_info_s, i); + user_info = g_memdup(info, sizeof(uam_user_info_s)); + if (user_info) + g_ptr_array_add(*users_list, (gpointer)user_info); + } + } + + UAM_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param); + + FUNC_EXIT; + return ret; +} diff --git a/ua-api/src/ua-common.c b/ua-api/src/ua-common.c index a405942..a5ecb81 100644 --- a/ua-api/src/ua-common.c +++ b/ua-api/src/ua-common.c @@ -108,6 +108,8 @@ const char *_uam_event_to_str(unsigned int event) CASE_TO_STR(UAM_EVENT_DETECTION_STOPPED) CASE_TO_STR(UAM_EVENT_DEVICE_FOUND) CASE_TO_STR(UAM_EVENT_SCAN_COMPLETED) + CASE_TO_STR(UAM_EVENT_SERVICE_REGISTERED) + CASE_TO_STR(UAM_EVENT_SERVICE_UNREGISTERED) default: return "UNKNOWN ERROR"; } diff --git a/ua-api/src/ua-event-handler.c b/ua-api/src/ua-event-handler.c index 5b1214c..aa041c2 100644 --- a/ua-api/src/ua-event-handler.c +++ b/ua-api/src/ua-event-handler.c @@ -251,6 +251,32 @@ static void __uam_event_handler(GDBusConnection *connection, event = UAM_EVENT_SCAN_COMPLETED; __uam_send_event(event, result, NULL, event_info->cb, event_info->user_data); + } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_SERVICE_REGISTERED)) { + uam_service_info_s svc_info; + char *name = NULL; + + memset(&svc_info, 0, sizeof(uam_service_info_s)); + g_variant_get(parameters, "(i&s)", &result, &name); + + g_strlcpy(svc_info.name, + name, UAM_SERVICE_MAX_STRING_LEN); + + event = UAM_EVENT_SERVICE_REGISTERED; + __uam_send_event(event, result, &svc_info, + event_info->cb, event_info->user_data); + } else if (0 == strcasecmp(signal_name, UAM_SIGNAL_SERVICE_UNREGISTERED)) { + uam_service_info_s svc_info; + char *name = NULL; + + memset(&svc_info, 0, sizeof(uam_service_info_s)); + g_variant_get(parameters, "(i&s)", &result, &name); + + g_strlcpy(svc_info.name, + name, UAM_SERVICE_MAX_STRING_LEN); + + event = UAM_EVENT_SERVICE_UNREGISTERED; + __uam_send_event(event, result, &svc_info, + event_info->cb, event_info->user_data); } else { UAM_WARN("Unknown signal recieved: %s", signal_name); } diff --git a/ua-daemon/include/ua-manager-core.h b/ua-daemon/include/ua-manager-core.h index d740906..7a2b8ac 100644 --- a/ua-daemon/include/ua-manager-core.h +++ b/ua-daemon/include/ua-manager-core.h @@ -177,6 +177,18 @@ int _uam_core_stop_active_device_scan(char *sender, unsigned int sensors); void _uam_core_handle_active_device(uam_active_scan_event_e event, unsigned int sensor, const uam_device_info_s *dev_info); +int _uam_core_get_default_service(uam_service_info_s *service_info); + +int _uam_core_register_service(const char *svc_name); + +int _uam_core_unregister_service(const char *svc_name); + +int _uam_core_get_service_devices(const char *svc_name, int *count, uam_device_info_s **device_list); + +int _uam_core_get_service_users(const char *svc_name, int *count, uam_user_info_s **user_list); + +int _uam_core_get_services(int *count, uam_service_info_s **service_list); + int _uam_core_service_add_user(const char *service_name, const char *account); int _uam_core_service_remove_user(const char *service, const char *account); diff --git a/ua-daemon/src/ua-manager-common.c b/ua-daemon/src/ua-manager-common.c index b7a5136..46971f2 100644 --- a/ua-daemon/src/ua-manager-common.c +++ b/ua-daemon/src/ua-manager-common.c @@ -109,6 +109,8 @@ const char *_uam_manager_event_to_str(unsigned int event) CASE_TO_STR(UAM_EVENT_DETECTION_STOPPED) CASE_TO_STR(UAM_EVENT_DEVICE_FOUND) CASE_TO_STR(UAM_EVENT_SCAN_COMPLETED) + CASE_TO_STR(UAM_EVENT_SERVICE_REGISTERED) + CASE_TO_STR(UAM_EVENT_SERVICE_UNREGISTERED) default: return "UNKNOWN ERROR"; } diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index 9af6997..23ad4c3 100755 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -46,7 +46,7 @@ typedef struct { GSList *users; /* List of users - uam_db_user_info_t */ GSList *devices; /* List of devices - uam_db_device_info_t */ -GSList *services; /* List of scanning apps - uam_db_service_info_t */ +GSList *services; /* List of services - uam_db_service_info_t */ GSList *monitors; /* List of monitoring apps - uam_monitor_info_t */ GSList *scanners; /* List of scanning apps - uam_scanner_info_t */ @@ -2321,10 +2321,10 @@ static void __send_user_absence_event(uam_tech_type_e type, unsigned int sensor) present_users = g_slist_prepend(present_users, tech->device->user); } else { /* If user not in the present list then only add it to absent list */ - if ((NULL == l2) && (NULL == g_slist_find_custom( - absent_users, &(tech->device->user->user_id), - __compare_user_id))) - absent_users = g_slist_prepend(absent_users, tech->device->user); + if ((NULL == l2) && (NULL == g_slist_find_custom( + absent_users, &(tech->device->user->user_id), + __compare_user_id))) + absent_users = g_slist_prepend(absent_users, tech->device->user); } } @@ -2760,3 +2760,280 @@ void _uam_core_handle_active_device(uam_active_scan_event_e event, FUNC_EXIT; } + +int _uam_core_register_service(const char *svc_name) +{ + FUNC_ENTRY; + GSList *l; + uam_db_service_info_t *service; + int service_number = 0; + + retv_if(NULL == svc_name, UAM_ERROR_INVALID_PARAMETER); + retv_if(0 == g_strcmp0(svc_name, UAM_SERVICE_DEFAULT), UAM_ERROR_PERMISSION_DENIED); + + /* Retrieve service from list */ + l = g_slist_find_custom(services, svc_name, __compare_svc_name); + retv_if((NULL != l) && (l->data != NULL), UAM_ERROR_ALREADY_REGISTERED); + + service = g_new0(uam_db_service_info_t, 1); + service->name = g_strdup(svc_name); + service->cycle = UAM_DETECTION_CYCLE_DEFAULT; + + /* Add service to database */ + if (UAM_ERROR_NONE != _uam_db_insert_service_info(&service_number, service->name, service->cycle)) { + UAM_ERR("_ua_db_insert_service_info failed"); + g_free(service); + return UAM_ERROR_DB_FAILED; + } + + services = g_slist_append(services, service); + + /* Send service registered event to application */ + if (UAM_ERROR_NONE != _uam_manager_send_event(NULL, + UAM_EVENT_SERVICE_REGISTERED, g_variant_new("(iss)", + UAM_ERROR_NONE, service->name))) + UAM_ERR("Failed to send UAM_EVENT_SERVICE_REGISTERED"); + + FUNC_EXIT; + return UAM_ERROR_NONE; +} + +int _uam_core_get_default_service(uam_service_info_s *service_info) +{ + FUNC_ENTRY; + int ret; + GSList *l; + uam_db_service_info_t *service; + + retv_if(NULL == service_info, UAM_ERROR_INVALID_PARAMETER); + + ret = _uam_core_register_service(UAM_SERVICE_DEFAULT); + if ((UAM_ERROR_NONE != ret) && (UAM_ERROR_ALREADY_REGISTERED != ret)) { + UAM_ERR("_uam_core_register_service failed with %s", _uam_manager_error_to_str(ret)); + return ret; + } + + l = g_slist_find_custom(services, UAM_SERVICE_DEFAULT, __compare_svc_name); + retv_if(NULL == l, UAM_ERROR_INTERNAL); + service = l->data; + + memset(service_info, 0x00, sizeof(uam_service_info_s)); + g_strlcpy(service_info->name, service->name, UAM_SERVICE_MAX_STRING_LEN); + + FUNC_EXIT; + return UAM_ERROR_NONE; +} + +int _uam_core_unregister_service(const char *svc_name) +{ + FUNC_ENTRY; + GSList *l; + uam_db_service_info_t *service; + + retv_if(NULL == svc_name, UAM_ERROR_INVALID_PARAMETER); + + /* Retrieve service from list */ + l = g_slist_find_custom(services, svc_name, __compare_svc_name); + retv_if((NULL == l), UAM_ERROR_NOT_REGISTERED); + service = l->data; + + /* Check if service is being used*/ + if (service->monitors) { + UAM_ERR("service monitoring in progress"); + return UAM_ERROR_PERMISSION_DENIED; + } + + /* Remove service from database */ + if (UAM_ERROR_NONE != _uam_db_delete_service_info(service->name)) { + UAM_ERR("_ua_db_delete_service_info failed"); + return UAM_ERROR_DB_FAILED; + } + + /* Remove service mapping from devices*/ + for (l = service->dev_techs; NULL != l; l = g_slist_next(l)) { + uam_db_tech_info_t *tech = l->data; + if (!tech || !tech->addresses) + continue; + tech->svc_list = g_slist_remove(tech->svc_list, service); + } + services = g_slist_remove(services, service); + + /* Send service unregistered event to application */ + if (UAM_ERROR_NONE != _uam_manager_send_event(NULL, + UAM_EVENT_SERVICE_UNREGISTERED, g_variant_new("(is)", + UAM_ERROR_NONE, service->name))) + UAM_ERR("Failed to send UAM_EVENT_SERVICE_UNREGISTERED"); + + FUNC_EXIT; + return UAM_ERROR_NONE; +} + +static void __get_service_dev_list( + uam_db_service_info_t* service, uam_device_info_s **device_list, int *count) +{ + FUNC_ENTRY; + GSList *l1; + int indx = 0; + + *count = 0; + /* Calculate number of devices */ + for (l1 = service->dev_techs; NULL != l1; l1 = g_slist_next(l1)) { + uam_db_tech_info_t *tech = l1->data; + if (!tech || !tech->addresses) + continue; + + (*count)++; + } + + *device_list = g_new0(uam_device_info_s, *count); + + /* Copy devices */ + for (l1 = service->dev_techs; NULL != l1; l1 = g_slist_next(l1)) { + uam_db_tech_info_t *tech = l1->data; + GSList *l2; + + if (!tech || !tech->addresses) + continue; + + for (l2 = tech->addresses; NULL != l2; l2 = g_slist_next(l2)) { + uam_db_address_info_t *addr = l2->data; + + if (!addr) + continue; + + switch (addr->addr_type) { + case UAM_ADDR_TYPE_BLE: + case UAM_ADDR_TYPE_BT: + case UAM_ADDR_TYPE_P2P: + case UAM_ADDR_TYPE_WIFI: + g_strlcpy((*device_list)[indx].mac, + addr->address, + UAM_MAC_ADDRESS_STRING_LEN); + break; + case UAM_ADDR_TYPE_IPv4: + g_strlcpy((*device_list)[indx].ipv4_addr, + addr->address, + UAM_IP_ADDRESS_MAX_STRING_LEN); + break; + default: + UAM_WARN("Unknown address type %d", addr->addr_type); + } + } + + uam_db_device_info_t *db_info = tech->device; + (*device_list)[indx].operating_system = db_info->os; + g_strlcpy((*device_list)[indx].device_id, db_info->device_id, + UAM_DEVICE_ID_MAX_STRING_LEN); + (*device_list)[indx].last_seen = tech->timestamp; + (*device_list)[indx++].type = tech->tech_type; + } + + UAM_INFO("Count = %d, indx = %d", *count, indx); + FUNC_EXIT; +} + +int _uam_core_get_service_devices(const char *svc_name, + int *count, uam_device_info_s **device_list) +{ + FUNC_ENTRY; + uam_db_service_info_t *service; + GSList *l; + + l = g_slist_find_custom(services, svc_name, __compare_svc_name); + retv_if(NULL == l, UAM_ERROR_INVALID_PARAMETER); + service = l->data; + + __get_service_dev_list(service, device_list, count); + + FUNC_EXIT; + return UAM_ERROR_NONE; +} + +static void __get_service_user_list( + uam_db_service_info_t* service, uam_user_info_s **user_list, int *count) +{ + FUNC_ENTRY; + GSList *l; + int indx = 0; + GSList *svc_user_list = NULL; + + *count = 0; + /* Calculate number of users */ + for (l = service->dev_techs; NULL != l; l = g_slist_next(l)) { + uam_db_tech_info_t *tech = l->data; + if (!tech || !tech->addresses) + continue; + + GSList *l1; + uam_db_user_info_t *db_info = tech->device->user; + l1 = g_slist_find_custom(svc_user_list , db_info->account, __compare_user_account); + if (NULL == l1) + svc_user_list = g_slist_append(svc_user_list, db_info); + } + + *count = g_slist_length(users); + *user_list = g_new0(uam_user_info_s, *count); + + /* Copy users */ + for (l = svc_user_list; l; l = g_slist_next(l)) { + uam_db_user_info_t *db_info = l->data; + + if (!db_info || !db_info->account) + continue; + + g_strlcpy((*user_list)[indx].account, + db_info->account, UAM_USER_ACCOUNT_MAX_STRING_LEN); + if (db_info->name) + g_strlcpy((*user_list)[indx].name, + db_info->name, UAM_USER_NAME_MAX_STRING_LEN); + + indx += 1; + } + + UAM_INFO("Count = %d, indx = %d", *count, indx); + FUNC_EXIT; +} + +int _uam_core_get_service_users(const char *svc_name, + int *count, uam_user_info_s **user_list) +{ + FUNC_ENTRY; + uam_db_service_info_t *service; + GSList *l; + + l = g_slist_find_custom(services, svc_name, __compare_svc_name); + retv_if(NULL == l, UAM_ERROR_INVALID_PARAMETER); + service = l->data; + + __get_service_user_list(service, user_list, count); + + FUNC_EXIT; + return UAM_ERROR_NONE; +} + +int _uam_core_get_services(int *count, uam_service_info_s **service_list) +{ + FUNC_ENTRY; + guint size; + GSList *l; + + size = g_slist_length(services); + *service_list = g_new0(uam_service_info_s, size); + *count = 0; + + /* fetch services list from DB */ + for (l = services; l; l = g_slist_next(l)) { + uam_db_service_info_t *db_info = l->data; + + if (!db_info || !db_info->name) + continue; + + g_strlcpy((*service_list)[*count].name, + db_info->name, UAM_SERVICE_MAX_STRING_LEN); + *count += 1; + } + + UAM_INFO("Count: %d", *count); + FUNC_EXIT; + return UAM_ERROR_NONE; +} diff --git a/ua-daemon/src/ua-manager-event-sender.c b/ua-daemon/src/ua-manager-event-sender.c index a7bd8d1..ee1529d 100644 --- a/ua-daemon/src/ua-manager-event-sender.c +++ b/ua-daemon/src/ua-manager-event-sender.c @@ -47,6 +47,8 @@ const char* __uam_event_str(int event) CASE_TO_STR(UAM_EVENT_DETECTION_STOPPED) CASE_TO_STR(UAM_EVENT_DEVICE_FOUND) CASE_TO_STR(UAM_EVENT_SCAN_COMPLETED) + CASE_TO_STR(UAM_EVENT_SERVICE_REGISTERED) + CASE_TO_STR(UAM_EVENT_SERVICE_UNREGISTERED) default : return "Unknown Event"; } @@ -170,6 +172,12 @@ int _uam_manager_send_event( case UAM_EVENT_SCAN_COMPLETED: signal = UAM_SIGNAL_SCAN_COMPLETED; break; + case UAM_EVENT_SERVICE_REGISTERED: + signal = UAM_SIGNAL_SERVICE_REGISTERED; + break; + case UAM_EVENT_SERVICE_UNREGISTERED: + signal = UAM_SIGNAL_SERVICE_UNREGISTERED; + break; default: UAM_ERR("Unhandled event"); return UAM_ERROR_INTERNAL; diff --git a/ua-daemon/src/ua-manager-request-handler.c b/ua-daemon/src/ua-manager-request-handler.c index 6a3f155..bf0c99d 100644 --- a/ua-daemon/src/ua-manager-request-handler.c +++ b/ua-daemon/src/ua-manager-request-handler.c @@ -515,6 +515,90 @@ static int __uam_manager_sync_request_handler( result = UAM_ERROR_NONE; break; } + case UAM_REQUEST_GET_DEFAULT_SERVICE: { + uam_service_info_s service; + + result = _uam_core_get_default_service(&service); + g_array_append_vals(*out_param1, + &service, sizeof(uam_service_info_s)); + break; + } + case UAM_REQUEST_REGISTER_SERVICE: { + const char *svc_name; + + svc_name = (char *)g_variant_get_data(in_param1); + UAM_DBG("Name: [%s]", svc_name); + + result = _uam_core_register_service(svc_name); + break; + + } + case UAM_REQUEST_UNREGISTER_SERVICE: { + const char *svc_name; + + svc_name = (char *)g_variant_get_data(in_param1); + UAM_DBG("Name: [%s]", svc_name); + + result = _uam_core_unregister_service(svc_name); + break; + + } + case UAM_REQUEST_GET_SERVICE_DEVICES: { + const char *svc_name; + int count = 0; + uam_device_info_s *devices = NULL; + + svc_name = (char *)g_variant_get_data(in_param1); + UAM_DBG("Service: [%s]", svc_name); + + result = _uam_core_get_service_devices(svc_name, &count, &devices); + if (UAM_ERROR_NONE == result) { + int indx; + + for (indx = 0; indx < count; indx++) + g_array_append_vals(*out_param1, + &(devices[indx]), sizeof(uam_device_info_s)); + + g_free(devices); + } + break; + } + case UAM_REQUEST_GET_SERVICE_USERS: { + const char *svc_name; + int count = 0; + uam_user_info_s *users = NULL; + + svc_name = (char *)g_variant_get_data(in_param1); + UAM_DBG("Service: [%s]", svc_name); + + result = _uam_core_get_service_users(svc_name, &count, &users); + if (UAM_ERROR_NONE == result) { + int indx; + + for (indx = 0; indx < count; indx++) + g_array_append_vals(*out_param1, + &(users[indx]), sizeof(uam_user_info_s)); + + g_free(users); + } + break; + } + case UAM_REQUEST_GET_SERVICES: { + int count = 0; + uam_service_info_s *services = NULL; + + result = _uam_core_get_services(&count, &services); + if (UAM_ERROR_NONE == result) { + int indx; + + for (indx = 0; indx < count; indx++) + g_array_append_vals(*out_param1, + &(services[indx]), sizeof(uam_service_info_s)); + + g_free(services); + } + break; + } default: UAM_WARN("UnSupported function [%s(0x%4.4X)]", _uam_manager_request_to_str(function), function); @@ -657,6 +741,12 @@ static gboolean __uam_manager_is_sync_function(int function) case UAM_REQUEST_GET_DETECTION_WINDOW: case UAM_REQUEST_SET_DETECTION_WINDOW: case UAM_REQUEST_RESET_DB: + case UAM_REQUEST_GET_DEFAULT_SERVICE: + case UAM_REQUEST_REGISTER_SERVICE: + case UAM_REQUEST_UNREGISTER_SERVICE: + case UAM_REQUEST_GET_SERVICE_DEVICES: + case UAM_REQUEST_GET_SERVICE_USERS: + case UAM_REQUEST_GET_SERVICES: return TRUE; default: return FALSE; -- 2.7.4 From cbb01f4f54336e8989494437549087c9d7930d56 Mon Sep 17 00:00:00 2001 From: Nishant Chaprana Date: Mon, 15 Jul 2019 15:27:32 +0530 Subject: [PATCH 08/16] Fixed Tizen coding guidelines warnings Change-Id: Ic51b6b45398b3420073e190341c1a82ca0070b52 Signed-off-by: Nishant Chaprana --- ua-api/src/ua-request-sender.c | 2 +- ua-daemon/src/pm/ua-cloud-plugin-handler.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ua-api/src/ua-request-sender.c b/ua-api/src/ua-request-sender.c index a990eb6..458efa6 100644 --- a/ua-api/src/ua-request-sender.c +++ b/ua-api/src/ua-request-sender.c @@ -389,4 +389,4 @@ int _uam_async_request( FUNC_EXIT; return result; -} \ No newline at end of file +} diff --git a/ua-daemon/src/pm/ua-cloud-plugin-handler.c b/ua-daemon/src/pm/ua-cloud-plugin-handler.c index 1aa292d..28f64f5 100644 --- a/ua-daemon/src/pm/ua-cloud-plugin-handler.c +++ b/ua-daemon/src/pm/ua-cloud-plugin-handler.c @@ -250,7 +250,7 @@ static gboolean __add_cloud_plugin(void *handle, uac_module_t *module) UAM_ERR("module->init is NULL"); g_free(plugin); return FALSE; - } + } module->init(&api); if (NULL == api) { -- 2.7.4 From 0691fd950c7c3b32796f1af3379fe41c9624f243 Mon Sep 17 00:00:00 2001 From: Nishant Chaprana Date: Mon, 15 Jul 2019 15:35:01 +0530 Subject: [PATCH 09/16] Removed redundant check for list pointer in __uam_core_get_dev_tech_info() Change-Id: Ic7cb291b8927c4e0cd4604e1a4d5e32d2358c774 Signed-off-by: Nishant Chaprana --- ua-daemon/src/ua-manager-core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index 23ad4c3..6503ea1 100755 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -1443,8 +1443,7 @@ static uam_db_tech_info_t *__uam_core_get_dev_tech_info(const char *device_id, i } device = l->data; - if (!(device->supported_techs & tech_type)) - if (NULL == l) { + if (!device || !(device->supported_techs & tech_type)) { UAM_DBG("Device type [0x%2.2X] for deviceId [%s] not found", tech_type, device_id); return NULL; -- 2.7.4 From 62badbdc46f65099f0b2644cf633cd97a3a45ee3 Mon Sep 17 00:00:00 2001 From: Lokesh Date: Tue, 16 Jul 2019 14:01:29 +0530 Subject: [PATCH 10/16] Added two APIs(service category support) in header file 1/ _uam_request_get_service_users 2/ _uam_request_get_service_devices Change-Id: I97cfbe7967cf0945008982af2d7f999cdb2af4aa Signed-off-by: Lokesh --- include/ua-api.h | 40 ++++++++++++++++++++++++++++++++++++++++ ua-daemon/src/ua-manager-core.c | 2 ++ 2 files changed, 42 insertions(+) diff --git a/include/ua-api.h b/include/ua-api.h index ba60350..a26c026 100644 --- a/include/ua-api.h +++ b/include/ua-api.h @@ -1003,6 +1003,46 @@ int _uam_get_detection_window(unsigned int *window); int _uam_get_registered_services(GPtrArray **service_list); /** + * @brief Gets registered users list for a service. + * @since_tizen 5.5 + * + * @remarks The @a service_list should be destroyed by using #g_free() and #g_ptr_array_free(). + * + * @param[in] svc_name The service name + * @param[out] users_list Users list array + * + * @return 0 on success, otherwise a negative error value + * @retval #UAM_ERROR_NONE Successful + * @retval #UAM_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #UAM_ERROR_INTERNAL Internal error + * + * @exception + * @pre + * @post + */ +int _uam_request_get_service_users(char *svc_name, GPtrArray **users_list); + +/** + * @brief Gets registered devices list for a service. + * @since_tizen 5.5 + * + * @remarks The @a service_list should be destroyed by using #g_free() and #g_ptr_array_free(). + * + * @param[in] svc_name The service name + * @param[out] devices_list Devices list array + * + * @return 0 on success, otherwise a negative error value + * @retval #UAM_ERROR_NONE Successful + * @retval #UAM_ERROR_INVALID_PARAMETER Invalid parameters + * @retval #UAM_ERROR_INTERNAL Internal error + * + * @exception + * @pre + * @post + */ +int _uam_request_get_service_devices(char *svc_name, GPtrArray **devices_list); + +/** * @brief Sets detction window. * @since_tizen 5.5 * diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index 6503ea1..c23a2cc 100755 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -1330,6 +1330,8 @@ int _uam_core_service_add_user(const char *svc_name, const char *account) /* Retrieve service from list */ l = g_slist_find_custom(services, svc_name, __compare_svc_name); if (NULL == l) { +//TODO lk, earlier when service handle support was not there, services were added in below way. +//but now service should found in service list, else return invalid param. service = g_new0(uam_db_service_info_t, 1); service->name = g_strdup(svc_name); service->cycle = UAM_DETECTION_CYCLE_DEFAULT; -- 2.7.4 From 0847ff53d52888371b3e2aa0dc737401322f6bb3 Mon Sep 17 00:00:00 2001 From: "saerome.kim" Date: Fri, 19 Jul 2019 12:55:45 +0900 Subject: [PATCH 11/16] Modified so that motion/light sensors can be detected even if a user or a device is not added. Change-Id: I6722fdf204fdec72b26628205b29e9536e572fee Signed-off-by: saerome.kim --- ua-daemon/src/ua-manager-core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) mode change 100755 => 100644 ua-daemon/src/ua-manager-core.c diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c old mode 100755 new mode 100644 index c23a2cc..3c71d63 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -1680,7 +1680,13 @@ static int __uam_core_start_detection(int detection_type, retv_if(NULL == svc_name, UAM_ERROR_INVALID_PARAMETER); l = g_slist_find_custom(services, svc_name, __compare_svc_name); - retv_if(NULL == l, UAM_ERROR_INVALID_PARAMETER); + if (!l) { + uam_db_service_info_t *default_svc = g_new0(uam_db_service_info_t, 1); + default_svc->name = g_strdup(UAM_SERVICE_DEFAULT); + default_svc->cycle = UAM_DETECTION_CYCLE_DEFAULT; + services = g_slist_append(services, default_svc); + l = services; + } service = l->data; monitor = __uam_find_monitor(monitors, sender, svc_name, detection_type); -- 2.7.4 From b58628c0401c4b9bec622aa32dd3476e4a500141 Mon Sep 17 00:00:00 2001 From: Nishant Chaprana Date: Fri, 19 Jul 2019 17:09:32 +0530 Subject: [PATCH 12/16] Sending timestamp for Presence and Absence event of user. Change-Id: I1832053850e9afd8f84f05ee93093138bc1c0f72 Signed-off-by: Nishant Chaprana --- include/ua-api.h | 1 + ua-api/src/ua-event-handler.c | 10 ++++++++-- ua-daemon/include/ua-manager-core.h | 6 +++--- ua-daemon/include/ua-manager-database.h | 8 ++++---- ua-daemon/src/ua-manager-core.c | 24 ++++++++++++++++-------- ua-daemon/src/ua-manager-device-db.c | 14 +++++++------- 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/include/ua-api.h b/include/ua-api.h index a26c026..0b414ae 100644 --- a/include/ua-api.h +++ b/include/ua-api.h @@ -468,6 +468,7 @@ typedef struct { unsigned int sensor_bitmask; /**< Detecting sensor's bitmask */ char account[UAM_USER_ACCOUNT_MAX_STRING_LEN]; /**< User account */ char service[UAM_SERVICE_MAX_STRING_LEN]; /**< Service name */ + long timestamp; /**< Timestamp of detection */ } uam_detection_event_data_s; /** diff --git a/ua-api/src/ua-event-handler.c b/ua-api/src/ua-event-handler.c index aa041c2..74b5367 100644 --- a/ua-api/src/ua-event-handler.c +++ b/ua-api/src/ua-event-handler.c @@ -76,8 +76,10 @@ static void __uam_event_handler(GDBusConnection *connection, unsigned int sensor_bitmask; char *account = NULL; char *service = NULL; + long timestamp; - g_variant_get(parameters, "(u&s&s)", &sensor_bitmask, &account, &service); + g_variant_get(parameters, "(u&s&sx)", &sensor_bitmask, &account, + &service, ×tamp); UAM_DBG("Sensor: 0x%8.8X, User: %s", sensor_bitmask, account); event = UAM_EVENT_USER_PRESENCE_DETECTED; @@ -85,6 +87,7 @@ static void __uam_event_handler(GDBusConnection *connection, g_strlcpy(event_data.account, account, UAM_USER_ACCOUNT_MAX_STRING_LEN); g_strlcpy(event_data.service, service, UAM_SERVICE_MAX_STRING_LEN); + event_data.timestamp = timestamp; __uam_send_event(event, result, &event_data, event_info->cb, event_info->user_data); @@ -93,8 +96,10 @@ static void __uam_event_handler(GDBusConnection *connection, unsigned int sensor_bitmask; char *account = NULL; char *service = NULL; + long timestamp; - g_variant_get(parameters, "(u&s&s)", &sensor_bitmask, &account, &service); + g_variant_get(parameters, "(u&s&sx)", &sensor_bitmask, &account, + &service, ×tamp); UAM_DBG("Sensor: 0x%8.8X, User: %s", sensor_bitmask, account); event = UAM_EVENT_USER_ABSENCE_DETECTED; @@ -102,6 +107,7 @@ static void __uam_event_handler(GDBusConnection *connection, g_strlcpy(event_data.account, account, UAM_USER_ACCOUNT_MAX_STRING_LEN); g_strlcpy(event_data.service, service, UAM_SERVICE_MAX_STRING_LEN); + event_data.timestamp = timestamp; __uam_send_event(event, result, &event_data, event_info->cb, event_info->user_data); diff --git a/ua-daemon/include/ua-manager-core.h b/ua-daemon/include/ua-manager-core.h index 7a2b8ac..fdd2291 100644 --- a/ua-daemon/include/ua-manager-core.h +++ b/ua-daemon/include/ua-manager-core.h @@ -61,7 +61,7 @@ typedef struct { uam_tech_type_e tech_type; GSList *addresses; int presence_state; - long long int timestamp; + long timestamp; struct uam_db_device_info *device; GSList *svc_list; } uam_db_tech_info_t; @@ -72,7 +72,7 @@ typedef struct uam_db_device_info { GSList *tech_list; unsigned int supported_techs; // int presence_state; -// long long int timestamp; +// long timestamp; struct uam_db_user_info *user; } uam_db_device_info_t; @@ -82,7 +82,7 @@ typedef struct uam_db_user_info { char *account; GSList *devices; // int presence_state; -// long long int timestamp; + long timestamp; } uam_db_user_info_t; diff --git a/ua-daemon/include/ua-manager-database.h b/ua-daemon/include/ua-manager-database.h index 0fb8fb3..c86384e 100644 --- a/ua-daemon/include/ua-manager-database.h +++ b/ua-daemon/include/ua-manager-database.h @@ -54,7 +54,7 @@ typedef struct { int user_id; uam_device_info_s dev_info; int presence_state; - long long timestamp; + long timestamp; } db_device_info_t; /* db init/deinit */ @@ -73,11 +73,11 @@ int _ua_device_db_delete_device_info(const char *device_id, int tech_type, const /* insert */ int _ua_device_db_insert_device_info(int user_id, const uam_device_info_s *dev_info, - int presence_state, long long timestamp); + int presence_state, long timestamp); /* update */ -int _ua_device_db_update_device_timestamp(char *device_id, int tech_type, char *address, - unsigned long long timestamp); +int _ua_device_db_update_device_timestamp(char *device_id, int tech_type, + char *address, long timestamp); int _ua_device_db_update_device_presence(char *device_id, int tech_type, char *address, int presence_state); int _ua_device_db_update_device_ip_address(char *device_id, int tech_type, char *address, diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index 3c71d63..6aee071 100644 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -2171,13 +2171,17 @@ void __send_user_presence_event(uam_db_tech_info_t *tech, unsigned int sensor) if (UAM_DETECT_PRESENCE != mon->mode) continue; + user->timestamp = (long) time(NULL); _uam_manager_send_event(mon->name, UAM_EVENT_USER_PRESENCE_DETECTED, - g_variant_new("(uss)", sensor, - user->account, svc->name)); + g_variant_new("(ussx)", sensor, + user->account, svc->name, + user->timestamp)); UAM_DBG("Sent UAM_EVENT_USER_PRESENCE_DETECTED to %s" - " for 0x%8.8X, User: %s Service: %s", - mon->name, sensor, user->account, svc->name); + " for 0x%8.8X, User: %s Service: %s" + " timestamp [%ld]", + mon->name, sensor, user->account, + svc->name, user->timestamp); } } @@ -2357,13 +2361,17 @@ static void __send_user_absence_event(uam_tech_type_e type, unsigned int sensor) if (!user) continue; + user->timestamp = (long) time(NULL); _uam_manager_send_event(mon->name, UAM_EVENT_USER_ABSENCE_DETECTED, - g_variant_new("(uss)", sensor, - user->account, svc->name)); + g_variant_new("(ussx)", sensor, + user->account, svc->name, + user->timestamp)); UAM_DBG("Sent UAM_EVENT_USER_ABSENCE_DETECTED to %s" - " for 0x%8.8X, User: %s Service: %s", - mon->name, sensor, user->account, svc->name); + " for 0x%8.8X, User: %s Service: %s" + " timestamp [%ld]", + mon->name, sensor, user->account, + svc->name, user->timestamp); } } diff --git a/ua-daemon/src/ua-manager-device-db.c b/ua-daemon/src/ua-manager-device-db.c index c78db5d..108ea4c 100644 --- a/ua-daemon/src/ua-manager-device-db.c +++ b/ua-daemon/src/ua-manager-device-db.c @@ -484,8 +484,8 @@ handle_error: return error_code; } -int _ua_device_db_update_device_timestamp(char *device_id, int tech_type, char *address, - unsigned long long timestamp) +int _ua_device_db_update_device_timestamp(char *device_id, int tech_type, + char *address, long timestamp) { int error_code = UAM_ERROR_NONE; sqlite3_stmt *stmt = update_timestamp; @@ -506,7 +506,7 @@ int _ua_device_db_update_device_timestamp(char *device_id, int tech_type, char * goto handle_error; } - UAM_DBG("Device timestamp updated [%lld]", timestamp); + UAM_DBG("Device timestamp updated [%ld]", timestamp); handle_error: sqlite3_reset(stmt); @@ -514,7 +514,7 @@ handle_error: } int _ua_device_db_insert_device_info(int user_id, const uam_device_info_s *dev_info, - int presence_state, long long timestamp) + int presence_state, long timestamp) { FUNC_ENTRY; int error_code = UAM_ERROR_NONE; @@ -522,7 +522,7 @@ int _ua_device_db_insert_device_info(int user_id, const uam_device_info_s *dev_i retv_if(NULL == dev_info, UAM_ERROR_INVALID_PARAMETER); - UAM_INFO("%s-%d-%s-%s-%lld-%d-%d-%d", dev_info->device_id, + UAM_INFO("%s-%d-%s-%s-%ld-%d-%d-%d", dev_info->device_id, dev_info->type, dev_info->mac, dev_info->ipv4_addr, timestamp, presence_state, dev_info->operating_system, user_id); @@ -608,7 +608,7 @@ int _ua_device_db_get_device(char *device_id, int tech_type, char *address, info->dev_info.operating_system = sqlite3_column_int(stmt, 6); info->user_id = sqlite3_column_int(stmt, 7); - UAM_INFO("%s-%d-%s-%s-%lld-%d-%d-%d", info->dev_info.device_id, info->dev_info.type, info->dev_info.mac, + UAM_INFO("%s-%d-%s-%s-%ld-%d-%d-%d", info->dev_info.device_id, info->dev_info.type, info->dev_info.mac, info->dev_info.ipv4_addr, info->timestamp, info->presence_state, info->dev_info.operating_system, info->user_id); } @@ -684,7 +684,7 @@ GSList *_ua_device_db_get_all_devices(void) info->dev_info.operating_system = sqlite3_column_int(stmt, 6); info->user_id = sqlite3_column_int(stmt, 7); - UAM_INFO("%s-%d-%s-%s-%lld-%d-%d-%d", info->dev_info.device_id, info->dev_info.type, info->dev_info.mac, + UAM_INFO("%s-%d-%s-%s-%ld-%d-%d-%d", info->dev_info.device_id, info->dev_info.type, info->dev_info.mac, info->dev_info.ipv4_addr, info->timestamp, info->presence_state, info->dev_info.operating_system, info->user_id); -- 2.7.4 From caa9f31116a8607e8498b1d4165a96be465812a9 Mon Sep 17 00:00:00 2001 From: "saerome.kim" Date: Mon, 22 Jul 2019 12:48:49 +0900 Subject: [PATCH 13/16] Removed useless dbus configuration. Change-Id: Ie5433271c229e8fa995434bf32ae49dc902af21e Signed-off-by: saerome.kim --- packaging/ua-manager.conf | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packaging/ua-manager.conf b/packaging/ua-manager.conf index 41f294d..276020b 100644 --- a/packaging/ua-manager.conf +++ b/packaging/ua-manager.conf @@ -14,11 +14,7 @@ - - - - - + -- 2.7.4 From 12a3a68121b70b7195b78519d11e1195cbcbe09c Mon Sep 17 00:00:00 2001 From: Abhay agarwal Date: Mon, 22 Jul 2019 19:05:26 +0530 Subject: [PATCH 14/16] update service list in init Change-Id: I109b9ced98f5701fa72f0f27322f05e72dae5ac2 Signed-off-by: Abhay agarwal --- ua-daemon/src/ua-manager-core.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index 6aee071..d29918b 100644 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -1879,6 +1879,7 @@ int _uam_core_init(void) FUNC_ENTRY; GSList *db_users; GSList *db_devices; + GSList *db_svc_list; GSList *l; /* Init database */ @@ -1912,6 +1913,31 @@ int _uam_core_init(void) users = g_slist_prepend(users, user); } + /* Fetch service list */ + db_svc_list = _ua_service_db_get_all_services(); + if (!db_svc_list) { + UAM_INFO_C("No services in database"); + return UAM_ERROR_NONE; + } + + for (l = db_svc_list; NULL != l; l = g_slist_next(l)) { + db_service_info_t *db_svc = l->data; + uam_db_service_info_t *service; + GSList *l1; + + if (!db_svc) + continue; + + l1 = g_slist_find_custom(services, + db_svc->service_name, __compare_svc_name); + if (!l1) { + service = g_new0(uam_db_service_info_t, 1); + service->name = g_strdup(db_svc->service_name); + service->cycle = db_svc->cycle; + services = g_slist_append(services, service); + } + } + /* Fetch device list */ db_devices = _ua_device_db_get_all_devices(); if (!db_devices) { @@ -1949,6 +1975,7 @@ int _uam_core_init(void) g_slist_free_full(db_devices, g_free); g_slist_free_full(db_users, g_free); + g_slist_free_full(db_svc_list, g_free); /* Set/update registered device list to plugins */ if (UAM_ERROR_NONE != _uam_pm_set_registered_devices(devices)) @@ -2784,7 +2811,6 @@ int _uam_core_register_service(const char *svc_name) int service_number = 0; retv_if(NULL == svc_name, UAM_ERROR_INVALID_PARAMETER); - retv_if(0 == g_strcmp0(svc_name, UAM_SERVICE_DEFAULT), UAM_ERROR_PERMISSION_DENIED); /* Retrieve service from list */ l = g_slist_find_custom(services, svc_name, __compare_svc_name); @@ -2805,7 +2831,7 @@ int _uam_core_register_service(const char *svc_name) /* Send service registered event to application */ if (UAM_ERROR_NONE != _uam_manager_send_event(NULL, - UAM_EVENT_SERVICE_REGISTERED, g_variant_new("(iss)", + UAM_EVENT_SERVICE_REGISTERED, g_variant_new("(is)", UAM_ERROR_NONE, service->name))) UAM_ERR("Failed to send UAM_EVENT_SERVICE_REGISTERED"); @@ -2986,7 +3012,7 @@ static void __get_service_user_list( svc_user_list = g_slist_append(svc_user_list, db_info); } - *count = g_slist_length(users); + *count = g_slist_length(svc_user_list); *user_list = g_new0(uam_user_info_s, *count); /* Copy users */ -- 2.7.4 From 5b344ddcfa2f97f0c32527676f8a5cd157a97d41 Mon Sep 17 00:00:00 2001 From: Abhay agarwal Date: Tue, 23 Jul 2019 16:42:55 +0530 Subject: [PATCH 15/16] remove device from service when device being removed Change-Id: I6f484976fe27e8bc054f35e7773bb43b5c080c70 Signed-off-by: Abhay agarwal --- ua-daemon/src/ua-manager-core.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/ua-daemon/src/ua-manager-core.c b/ua-daemon/src/ua-manager-core.c index d29918b..835cf7f 100644 --- a/ua-daemon/src/ua-manager-core.c +++ b/ua-daemon/src/ua-manager-core.c @@ -903,6 +903,15 @@ int _uam_core_remove_device(const char *account, const uam_device_info_s *dev_in dev_info->device_id, dev_info->type, dev_info->mac)) UAM_ERR("_ua_device_db_delete_device_info failed"); + /* Remove device from service */ + for (l = tech->svc_list; l; l = g_slist_next(l)) { + uam_db_service_info_t *svc = l->data; + + if (!svc || !svc->name) + continue; + _uam_core_service_remove_device(svc->name, dev_info->device_id, dev_info->type); + } + /* Remove tech info from device's tech list */ device->tech_list = g_slist_remove(device->tech_list, tech); device->supported_techs &= ~(tech->tech_type); @@ -974,6 +983,15 @@ int _uam_core_remove_device_by_device_id(const char *device_id, int tech_type) dev_info.device_id, dev_info.type, dev_info.mac)) UAM_ERR("_ua_device_db_delete_device_info failed"); + /* Remove device from service */ + for (l = tech->svc_list; l; l = g_slist_next(l)) { + uam_db_service_info_t *svc = l->data; + + if (!svc || !svc->name) + continue; + _uam_core_service_remove_device(svc->name, dev_info.device_id, dev_info.type); + } + /* Remove tech info from device's tech list */ device->tech_list = g_slist_remove(device->tech_list, tech); device->supported_techs &= ~(tech->tech_type); @@ -1007,6 +1025,7 @@ int _uam_core_remove_device_by_mac(const char *mac) uam_db_tech_info_t *tech; uam_db_device_info_t *device; uam_device_info_s dev_info; + GSList *l; int ret; retv_if(NULL == mac, UAM_ERROR_INVALID_PARAMETER); @@ -1036,6 +1055,15 @@ int _uam_core_remove_device_by_mac(const char *mac) dev_info.device_id, dev_info.type, dev_info.mac)) UAM_ERR("_ua_device_db_delete_device_info failed"); + /* Remove device from service */ + for (l = tech->svc_list; l; l = g_slist_next(l)) { + uam_db_service_info_t *svc = l->data; + + if (!svc || !svc->name) + continue; + _uam_core_service_remove_device(svc->name, dev_info.device_id, dev_info.type); + } + /* Remove tech info from device's tech list */ device->tech_list = g_slist_remove(device->tech_list, tech); device->supported_techs &= ~(tech->tech_type); -- 2.7.4 From 9d463567494a7baaa381fc03889121c20d50b9dd Mon Sep 17 00:00:00 2001 From: Nishant Chaprana Date: Tue, 23 Jul 2019 21:07:38 +0530 Subject: [PATCH 16/16] Corrected type of last_seen variable from [long long int] to [long] Change-Id: Ic5405eb3cf92e40f65dca4334304406a6311e5aa Signed-off-by: Nishant Chaprana --- include/ua-api.h | 2 +- ua-plugins/include/ua-plugin-type.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/ua-api.h b/include/ua-api.h index 0b414ae..99262a4 100644 --- a/include/ua-api.h +++ b/include/ua-api.h @@ -440,7 +440,7 @@ typedef struct { char mac[UAM_MAC_ADDRESS_STRING_LEN]; /**< Device's MAC ADDRESS */ char ipv4_addr[UAM_IP_ADDRESS_MAX_STRING_LEN];/**< Device's IPv4 address optional */ char device_id[UAM_DEVICE_ID_MAX_STRING_LEN]; /**< Device's uniquie ID */ - long long int last_seen; /**< Latest timestamp when device was discoverd */ + long last_seen; /**< Latest timestamp when device was discoverd */ } uam_device_info_s; /** diff --git a/ua-plugins/include/ua-plugin-type.h b/ua-plugins/include/ua-plugin-type.h index cf46efa..73ed0cc 100644 --- a/ua-plugins/include/ua-plugin-type.h +++ b/ua-plugins/include/ua-plugin-type.h @@ -50,7 +50,7 @@ typedef struct { char mac[UAP_MAC_ADDRESS_STRING_LEN]; /* Device's MAC ADDRESS */ char ipv4_addr[UAP_IP_ADDRESS_MAX_STRING_LEN];/* Device's IPv4 address optional */ char device_id[UAP_DEVICE_ID_MAX_STRING_LEN]; /* Device's uniquie ID */ - long long int last_seen; + long last_seen; } uap_device_info_t; /* UA plugin return status */ -- 2.7.4