summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/user-awareness-private.h4
-rw-r--r--include/user-awareness.h85
-rw-r--r--src/user-awareness-device.c11
-rw-r--r--src/user-awareness-service.c28
-rw-r--r--src/user-awareness-users.c184
-rw-r--r--test/uat-service.c96
6 files changed, 308 insertions, 100 deletions
diff --git a/include/user-awareness-private.h b/include/user-awareness-private.h
index 3276f0b..4e173f6 100644
--- a/include/user-awareness-private.h
+++ b/include/user-awareness-private.h
@@ -743,9 +743,9 @@ int _ua_intr_foreach_registered_services(_ua_intr_registered_service_cb foreach_
* @pre
* @post
*
- * @see ua_service_added_service_cb()
+ * @see ua_service_added_cb()
*/
-int _ua_foreach_registered_services(ua_service_added_service_cb foreach_cb,
+int _ua_foreach_registered_services(ua_service_added_cb foreach_cb,
void *user_data);
/**
diff --git a/include/user-awareness.h b/include/user-awareness.h
index a35b31f..7b779cd 100644
--- a/include/user-awareness.h
+++ b/include/user-awareness.h
@@ -575,15 +575,15 @@ typedef bool (*ua_registered_user_cb)(
* @remarks The @a service_handle can be used only in the callback.
*
* @param[in] service_handle The service handle.
- * @param[in] user_data User data passed in ua_service_foreach_added_services().
+ * @param[in] user_data User data passed in ua_service_foreach_added().
*
* @exception
* @pre
* @post
*
- * @see ua_service_foreach_added_services()
+ * @see ua_service_foreach_added()
*/
-typedef bool (*ua_service_added_service_cb)(
+typedef bool (*ua_service_added_cb)(
ua_service_h service_handle,
void *user_data);
@@ -1295,6 +1295,33 @@ int ua_user_create(
/**
* @ingroup CAPI_NETWORK_UA_MODULE
+ * @brief Clones user handle if application wants to store it after foreach user
+ * handles. It should be call before foreach callback return.
+ * @since_tizen 5.5
+ *
+ * @remarks The @a cloned should be released using #ua_user_destroy().
+ *
+ * @param[out] cloned The cloned device handle.
+ * @param[in] origin The input device handle
+ *
+ * @return 0 on success, otherwise a negative error value
+ * @retval #UA_ERROR_NONE Successful
+ * @retval #UA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #UA_ERROR_OUT_OF_MEMORY Out of memory
+ *
+ * @exception
+ * @pre
+ * @post
+ *
+ * @see ua_user_foreach_added()
+ * @see ua_service_foreach_added_user()
+ * @see ua_user_destroy()
+ */
+int ua_user_clone(
+ ua_user_h *cloned, ua_user_h origin);
+
+/**
+ * @ingroup CAPI_NETWORK_UA_MODULE
* @brief Destroys the user handle.
* @since_tizen 5.5
*
@@ -1515,6 +1542,28 @@ int ua_user_get_handle_by_account(const char* account, ua_user_h *user_handle);
/**
* @ingroup CAPI_NETWORK_UA_MODULE
+ * @brief Gets user handle by account.
+ * @since_tizen 5.5
+ *
+ * @remarks The @a user_handle should not be released.
+ * @remarks The @a user_handle can be used only in the fuction.
+ *
+ * @param[in] account The user account information
+ * @param[out] user_handle The user handle
+ *
+ * @return 0 on success, otherwise a negative error value
+ * @retval #UA_ERROR_NONE Successful
+ * @retval #UA_ERROR_INVALID_PARAMETER Invalid parameter
+ *
+ * @exception
+ * @pre
+ * @post
+ *
+ */
+int ua_user_get_by_account(const char* account, ua_user_h *user_handle);
+
+/**
+ * @ingroup CAPI_NETWORK_UA_MODULE
* @brief Callback to be invoked if a new device added to UA.
* @since_tizen 5.5
*
@@ -1609,6 +1658,30 @@ int ua_user_foreach_added(
ua_registered_user_cb foreach_cb,
void *user_data);
+/**
+ * @ingroup CAPI_NETWORK_UA_MODULE
+ * @brief Retrieves the device handle of all the registered devices for a specific user.
+ * @since_tizen 5.5
+ *
+ * @param[in] user_handle The user handle.
+ * @param[in] foreach_cb Callback function to be invoked with user device handle.
+ * @param[in] user_data The user data to be passed when callback is called.
+ *
+ * @return 0 on success, otherwise a negative error value
+ * @retval #UA_ERROR_NONE Successful
+ * @retval #UA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #UA_ERROR_OUT_OF_MEMORY Out of memory
+ *
+ * @exception
+ * @pre
+ * @post
+ *
+ * @see ua_registered_dev_cb()
+ */
+int ua_user_foreach_added_devices(
+ ua_user_h user_handle,
+ ua_registered_dev_cb foreach_cb,
+ void *user_data);
/**
* @ingroup CAPI_NETWORK_UA_MODULE
@@ -2021,10 +2094,10 @@ int ua_service_get_device_discriminant(
* @pre
* @post
*
- * @see ua_service_added_service_cb()
+ * @see ua_service_added_cb()
*/
-int ua_service_foreach_added_services(
- ua_service_added_service_cb foreach_cb,
+int ua_service_foreach_added(
+ ua_service_added_cb foreach_cb,
void *user_data);
/**
diff --git a/src/user-awareness-device.c b/src/user-awareness-device.c
index 2bc9308..77b8c06 100644
--- a/src/user-awareness-device.c
+++ b/src/user-awareness-device.c
@@ -1303,16 +1303,6 @@ int ua_device_clone(ua_device_h *cloned,
/* LCOV_EXCL_START */
UA_VALIDATE_INPUT_PARAMETER(cloned);
UA_VALIDATE_INPUT_PARAMETER(origin);
- UA_VALIDATE_HANDLE(origin, ua_devices_db_list);
- UA_EXIST_HANDLE(origin, ua_devices_list);
-
- device = __ua_get_device_from_list(org_device->device_id,
- org_device->mac, org_device->type);
- if (device) {
-//TODO lk, in this case cloned will be destroyed as per description of API, which will then delete device from list. ???
- *cloned = (ua_device_h)device;
- return UA_ERROR_NONE;
- }
device = g_malloc0(sizeof(ua_dev_info_s));
if (!device) {
@@ -1391,7 +1381,6 @@ int ua_device_clone(ua_device_h *cloned,
*cloned = (ua_device_h)device;
device->handle = (ua_device_h)device;
device->create_by_app = true;
- ua_devices_list = g_slist_append(ua_devices_list, device);
FUNC_EXIT;
/* LCOV_EXCL_STOP */
diff --git a/src/user-awareness-service.c b/src/user-awareness-service.c
index 1cd9428..95a33b0 100644
--- a/src/user-awareness-service.c
+++ b/src/user-awareness-service.c
@@ -218,7 +218,7 @@ int _ua_service_remove_info_from_list(uam_service_info_s *uam_info)
return ret;
}
-int _ua_foreach_registered_services(ua_service_added_service_cb foreach_cb,
+int _ua_foreach_registered_services(ua_service_added_cb foreach_cb,
void *user_data)
{
FUNC_ENTRY;
@@ -605,34 +605,13 @@ int ua_service_add_user(ua_service_h service_handle, ua_user_h user_handle)
ua_service_info_s* service_info = (ua_service_info_s*)service_handle;
ua_user_info_s* user_info = (ua_user_info_s*)user_handle;
- GSList *user_list = _ua_user_get_users();
ua_service_info_s *tmp = NULL;
UA_VALIDATE_INPUT_PARAMETER(service_handle);
UA_VALIDATE_INPUT_PARAMETER(user_handle);
- UA_VALIDATE_HANDLE(user_handle, user_list);
- UA_VALIDATE_HANDLE(service_handle, ua_services_list);
retv_if(user_info->isadded == FALSE, UA_ERROR_INVALID_PARAMETER);
-#if 0
-//TODO lk, ideally the handle should be in the ua_services_list.
- tmp = __ua_get_service_from_list(service_info->name);
- if (!tmp) {
- ua_service_info_s *tmp = g_malloc0(sizeof(ua_service_info_s));
- if (!tmp) {
- UA_ERR("Memory allocation failed");
- return UA_ERROR_OUT_OF_MEMORY;
- }
- tmp->name = g_strdup(service_info->name);
- tmp->create_by_app = true;
- tmp->default_service = false;
- tmp->isadded = true;
- tmp->service_handle = tmp;
- ua_services_list = g_slist_append(ua_services_list, tmp);
- }
-#else
tmp = service_info;
-#endif
ret = _ua_get_error_code(_uam_service_add_user(tmp->name, user_info->account));
if (UA_ERROR_NONE != ret) {
@@ -652,12 +631,9 @@ int ua_service_remove_user(ua_service_h service_handle, ua_user_h user_handle)
ua_service_info_s* service_info = (ua_service_info_s*)service_handle;
ua_user_info_s* user_info = (ua_user_info_s*)user_handle;
- GSList *user_list = _ua_user_get_users();
UA_VALIDATE_INPUT_PARAMETER(service_info);
UA_VALIDATE_INPUT_PARAMETER(user_handle);
- UA_VALIDATE_HANDLE(service_handle, ua_services_list);
- UA_VALIDATE_HANDLE(user_handle, user_list);
ret = _ua_get_error_code(_uam_service_remove_user(service_info->name, user_info->account));
if (UA_ERROR_NONE != ret) {
@@ -800,7 +776,7 @@ int ua_service_get_device_discriminant(ua_service_h service_handle,
return UA_ERROR_NONE;
}
-int ua_service_foreach_added_services(ua_service_added_service_cb foreach_cb,
+int ua_service_foreach_added(ua_service_added_cb foreach_cb,
void *user_data)
{
FUNC_ENTRY;
diff --git a/src/user-awareness-users.c b/src/user-awareness-users.c
index 3db665a..3404f3b 100644
--- a/src/user-awareness-users.c
+++ b/src/user-awareness-users.c
@@ -25,6 +25,7 @@
GSList *ua_users_list;
extern GSList *ua_devices_list;
+extern GSList *ua_devices_db_list;
extern ua_callback_s user_callbacks[UA_USER_EVENT_MAX];
static ua_user_info_s *__ua_get_user_from_list(const char *account)
@@ -479,6 +480,52 @@ int ua_user_create(ua_user_h *user_handle)
return UA_ERROR_NONE;
}
+int ua_user_clone(ua_user_h *dst, ua_user_h src)
+{
+ FUNC_ENTRY;
+ ua_user_info_s *user_dst = NULL;
+ ua_user_info_s *user_src = src;
+
+ UA_VALIDATE_INPUT_PARAMETER(dst);
+ UA_VALIDATE_INPUT_PARAMETER(src);
+
+ user_dst = g_malloc0(sizeof(ua_user_info_s));
+ if (!user_dst) {
+ /* LCOV_EXCL_START */
+ UA_ERR("g_malloc0 failed");
+ return UA_ERROR_OUT_OF_MEMORY;
+ /* LCOV_EXCL_STOP */
+ }
+ user_dst->state = user_src->state;
+ user_dst->sensor_bitmask = user_src->sensor_bitmask;
+ user_dst->isadded = user_src->isadded;
+ user_dst->default_user = user_src->default_user;
+ user_dst->create_by_app = user_src->create_by_app;
+ user_dst->last_presence_timestamp = user_src->last_presence_timestamp;
+
+ user_dst->name = g_strdup(user_src->name);
+ if (!user_dst->name) {
+ /* LCOV_EXCL_START */
+ UA_ERR("g_malloc0 failed");
+ return UA_ERROR_OUT_OF_MEMORY;
+ /* LCOV_EXCL_STOP */
+ }
+ user_dst->account = g_strdup(user_src->account);
+ if (!user_dst->account) {
+ /* LCOV_EXCL_START */
+ UA_ERR("g_malloc0 failed");
+ return UA_ERROR_OUT_OF_MEMORY;
+ /* LCOV_EXCL_STOP */
+ }
+
+ /* Add user to list of users*/
+ *dst = (ua_user_h)user_dst;
+ user_dst->user_handle = (ua_user_h)user_dst;
+
+ FUNC_EXIT;
+ return UA_ERROR_NONE;
+}
+
int ua_user_add(ua_user_h user_handle)
{
FUNC_ENTRY;
@@ -490,7 +537,7 @@ int ua_user_add(ua_user_h user_handle)
UA_VALIDATE_HANDLE(user_handle, ua_users_list);
retv_if(NULL == user->account, UA_ERROR_INVALID_PARAMETER);
-//TODO lk, check user->is_added before proceed
+ retv_if(TRUE == user->isadded, UA_ERROR_ALREADY_REGISTERED);
memset(&uam_user, 0, sizeof(uam_user_info_s));
g_strlcpy(uam_user.account, user->account, UAM_USER_ACCOUNT_MAX_STRING_LEN);
@@ -724,6 +771,23 @@ int ua_user_get_handle_by_account(const char* account, ua_user_h *user_handle)
return UA_ERROR_NONE;
}
+int ua_user_get_by_account(const char* account, ua_user_h *user_handle)
+{
+ FUNC_ENTRY;
+
+ UA_VALIDATE_INPUT_PARAMETER(account);
+ UA_VALIDATE_INPUT_PARAMETER(user_handle);
+
+ *user_handle = _ua_get_user_handle_by_account(account);
+ if (*user_handle == NULL) {
+ UA_ERR("Failed to get user_handle for given account %s)", account);
+ return UA_ERROR_INVALID_PARAMETER;
+ }
+
+ FUNC_EXIT;
+ return UA_ERROR_NONE;
+}
+
int ua_user_destroy(ua_user_h user_handle)
{
FUNC_ENTRY;
@@ -795,7 +859,7 @@ int ua_user_add_device(ua_user_h user_handle, ua_device_h device_handle,
uam_device_info_s uam_device;
UA_VALIDATE_INPUT_PARAMETER(device_handle);
- UA_VALIDATE_HANDLE(device_handle, ua_devices_list);
+
retv_if((((device->device_id == NULL) && (device->mac == NULL))), UA_ERROR_INVALID_PARAMETER);
retv_if((UA_MAC_TYPE_NONE >= device->type), UA_ERROR_INVALID_PARAMETER);
retv_if((UA_MAC_TYPE_INVALID <= device->type), UA_ERROR_INVALID_PARAMETER);
@@ -817,7 +881,6 @@ int ua_user_add_device(ua_user_h user_handle, ua_device_h device_handle,
device->user = (ua_user_h)handle;
/* LCOV_EXCL_STOP */
} else {
- UA_VALIDATE_HANDLE(user_handle, ua_users_list);
device->user = user_handle;
}
@@ -865,7 +928,7 @@ int ua_user_remove_device(ua_user_h user_handle, ua_device_h device_handle)
uam_device_info_s uam_device;
UA_VALIDATE_INPUT_PARAMETER(device_handle);
- UA_VALIDATE_HANDLE(device_handle, ua_devices_list);
+
retv_if((((device->device_id == NULL) && (device->mac == NULL))), UA_ERROR_INVALID_PARAMETER);
retv_if((UA_MAC_TYPE_NONE >= device->type), UA_ERROR_INVALID_PARAMETER);
retv_if((UA_MAC_TYPE_INVALID <= device->type), UA_ERROR_INVALID_PARAMETER);
@@ -957,4 +1020,117 @@ int ua_user_remove_device_by_device_id(const char *device_id, ua_mac_type_e mac_
return UA_ERROR_NONE;
}
+int ua_user_foreach_added_devices(
+ ua_user_h user_handle,
+ ua_registered_dev_cb foreach_cb,
+ void *user_data)
+{
+ FUNC_ENTRY;
+ int i;
+ int ret;
+ ua_user_info_s *user = (ua_user_info_s *)user_handle;
+ GPtrArray *devices_list = NULL;
+ uam_device_info_s *ptr;
+ GSList *l;
+
+ UA_VALIDATE_INPUT_PARAMETER(foreach_cb);
+ UA_VALIDATE_INPUT_PARAMETER(user_handle);
+ UA_VALIDATE_HANDLE(user_handle, ua_users_list);
+
+ devices_list = g_ptr_array_new();
+ retv_if(NULL == devices_list, UA_ERROR_OUT_OF_MEMORY);
+
+ ret = _ua_get_error_code(_uam_request_get_user_devices(user->account, &devices_list));
+ if (UA_ERROR_NONE != ret) {
+ UA_ERR("Failed with error: %s(0x%X)",
+ _ua_get_error_string(ret), ret);
+ g_ptr_array_free(devices_list, TRUE);
+ return ret;
+ }
+
+ for (i = 0; i < devices_list->len; i++) {
+ /* LCOV_EXCL_START */
+ ptr = g_ptr_array_index(devices_list, i);
+ if (ptr) {
+ ua_dev_info_s* device_info;
+ device_info = g_malloc0(sizeof(ua_dev_info_s));
+ if (!device_info) {
+ UA_ERR("g_malloc0 failed");
+ ret = UA_ERROR_OUT_OF_MEMORY;
+ goto done;
+ }
+
+ device_info->mac = g_strdup(ptr->mac);
+ if (device_info->mac == NULL) {
+ UA_ERR("g_malloc0 failed");
+ ret = UA_ERROR_OUT_OF_MEMORY;
+ _ua_free_ua_device_info_t((gpointer)device_info);
+ goto done;
+ }
+
+ device_info->ipv4 = g_strdup(ptr->ipv4_addr);
+ if (device_info->ipv4 == NULL) {
+ UA_ERR("g_malloc0 failed");
+ ret = UA_ERROR_OUT_OF_MEMORY;
+ _ua_free_ua_device_info_t((gpointer)device_info);
+ goto done;
+ }
+
+ device_info->device_id = g_strdup(ptr->device_id);
+ if (device_info->device_id == NULL) {
+ UA_ERR("g_malloc0 failed");
+ ret = UA_ERROR_OUT_OF_MEMORY;
+ _ua_free_ua_device_info_t((gpointer)device_info);
+ goto done;
+ }
+
+ device_info->payload = _ua_get_payload_from_uam(&ptr->payload);
+ if (device_info->payload == NULL) {
+ UA_ERR("_ua_get_payload_from_uam() failed");
+ ret = UA_ERROR_OUT_OF_MEMORY;
+ _ua_free_ua_device_info_t((gpointer)device_info);
+ goto done;
+ }
+
+ device_info->isadded = true;
+ device_info->handle = (ua_device_h)device_info;
+ device_info->type = _to_ua_mac_type(ptr->type);
+ device_info->os = ptr->operating_system;
+ device_info->last_presence_timestamp = ptr->last_seen;
+ device_info->discriminant = ptr->discriminant;
+ device_info->user = (ua_user_h)user;
+ ua_devices_db_list = g_slist_append(ua_devices_db_list, device_info);
+ } else {
+ UA_ERR("OPERATION_FAILED(0x%08x)",
+ UA_ERROR_OPERATION_FAILED);
+ ret = UA_ERROR_OPERATION_FAILED;
+ goto done;
+ }
+ /* LCOV_EXCL_STOP */
+ }
+
+ for (l = ua_devices_db_list; l; l = g_slist_next(l)) {
+ /* LCOV_EXCL_START */
+ ua_dev_info_s *u = l->data;
+
+ if (NULL == u)
+ continue;
+
+ if (!foreach_cb(u->handle, user_data))
+ break;
+ /* LCOV_EXCL_STOP */
+ }
+
+done:
+ g_slist_free_full(ua_devices_db_list, _ua_free_ua_device_info_t);
+ ua_devices_db_list = NULL;
+
+ g_ptr_array_foreach(devices_list, (GFunc)g_free, NULL);
+ g_ptr_array_free(devices_list, TRUE);
+
+ FUNC_EXIT;
+ return ret;
+}
+
+
/* LCOV_EXCL_STOP */
diff --git a/test/uat-service.c b/test/uat-service.c
index c748bc9..fe39bed 100644
--- a/test/uat-service.c
+++ b/test/uat-service.c
@@ -132,6 +132,37 @@ static int run_ua_service_get_default_service(MManager *mm, struct menu_data *me
return RET_SUCCESS;
}
+static int uat_select_service(MManager *mm, struct menu_data *menu)
+{
+ GSList *iter = g_service_list;
+
+ int id = 0;
+ int selected_id = 0;
+
+ if (strlen(g_selected_service_id))
+ selected_id = (unsigned char)strtol(g_selected_service_id, NULL, 10);
+
+ if (selected_id <= 0) {
+ msg("Please select service first");
+ return RET_SUCCESS;
+ }
+
+ while (NULL != iter) {
+ GSList *next = iter->next;
+ ua_service_h *handle = iter->data;
+ if (handle && ++id == selected_id) {
+ /* Make selected service as a current one */
+ g_service_h = handle;
+ __update_service_info();
+ msg("Select service done");
+ return RET_SUCCESS;
+ }
+ iter = next;
+ }
+
+ return RET_SUCCESS;
+}
+
static int run_ua_service_create(
MManager *mm, struct menu_data *menu)
{
@@ -280,17 +311,17 @@ static int run_ua_service_get_by_name(MManager *mm, struct menu_data *menu)
return RET_SUCCESS;
}
-static int run_ua_service_foreach_added_services(
+static int run_ua_service_foreach_added(
MManager *mm, struct menu_data *menu)
{
int ret = UA_ERROR_NONE;
- msg("ua_service_foreach_added_services");
+ msg("ua_service_foreach_added");
__clear_service_list();
- ret = ua_service_foreach_added_services(__foreach_added_service_cb, NULL);
+ ret = ua_service_foreach_added(__foreach_added_service_cb, NULL);
- msg(" - ua_service_foreach_added_services() ret: [0x%X] [%s]",
+ msg(" - ua_service_foreach_added() ret: [0x%X] [%s]",
ret, uat_get_error_str(ret));
return RET_SUCCESS;
@@ -322,6 +353,13 @@ static struct menu_data menu_ua_service_set_detection_threshold[] = {
{ NULL, NULL, },
};
+struct menu_data menu_sel_service[] = {
+ { "1", "Service list", NULL,
+ run_ua_service_foreach_added, g_selected_service_id},
+ { "2", "Apply", NULL, uat_select_service, NULL },
+ { NULL, NULL, },
+};
+
struct menu_data menu_ua_services[] = {
{ "1", "ua_service_get_default_service",
NULL, run_ua_service_get_default_service, NULL },
@@ -341,51 +379,7 @@ struct menu_data menu_ua_services[] = {
NULL, run_ua_service_destroy, NULL},
{ "9", "ua_service_get_by_name",
menu_ua_service_get_by_name, NULL, NULL },
- { "10", "ua_service_foreach_added_services",
- NULL, run_ua_service_foreach_added_services, NULL },
- { NULL, NULL, },
-};
-
-static int run_choose_service_list(MManager *mm, struct menu_data *menu)
-{
- __clear_service_list();
- ua_service_foreach_added_services(__foreach_added_service_cb, NULL);
- return RET_SUCCESS;
-}
-
-static int run_select_service(MManager *mm, struct menu_data *menu)
-{
- GSList *iter = g_service_list;
-
- int id = 0;
- int selected_id = 0;
-
- if (strlen(g_selected_service_id))
- selected_id = (unsigned char)strtol(g_selected_service_id, NULL, 10);
-
- if (selected_id <= 0) {
- msg("Please select service first");
- return RET_SUCCESS;
- }
-
- while (NULL != iter) {
- GSList *next = iter->next;
- ua_service_h *handle = iter->data;
- if (handle && ++id == selected_id) {
- /* Make selected service as a current one */
- g_service_h = handle;
- __update_service_info();
- msg("Select service done");
- return RET_SUCCESS;
- }
- iter = next;
- }
-
- return RET_SUCCESS;
-}
-
-struct menu_data menu_sel_service[] = {
- { "1", "Service list", NULL, run_choose_service_list, g_selected_service_id},
- { "2", "Apply", NULL, run_select_service, NULL },
+ { "10", ANSI_COLOR_LIGHTMAGENTA "ua_service_foreach_added" ANSI_COLOR_NORMAL,
+ menu_sel_service, NULL, NULL },
{ NULL, NULL, },
-};
+}; \ No newline at end of file