diff options
-rw-r--r-- | include/user-awareness-private.h | 4 | ||||
-rw-r--r-- | include/user-awareness.h | 85 | ||||
-rw-r--r-- | src/user-awareness-device.c | 11 | ||||
-rw-r--r-- | src/user-awareness-service.c | 28 | ||||
-rw-r--r-- | src/user-awareness-users.c | 184 | ||||
-rw-r--r-- | test/uat-service.c | 96 |
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 |