Modify UA CAPI
authorsaerome.kim <saerome.kim@samsung.com>
Mon, 28 Oct 2019 12:03:05 +0000 (21:03 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Tue, 29 Oct 2019 00:48:39 +0000 (09:48 +0900)
1. Add new APIs
ua_user_clone()
ua_user_get_by_account()
ua_user_foreach_added_devices()

2. Change name
ua_service_added_service_cb() -> ua_service_added_cb()

3. Deprecated
ua_device_foreach_added_by_user()

Change-Id: Idf8e92eec507b35ac8126da7ca969bebc4555ac8
Signed-off-by: saerome.kim <saerome.kim@samsung.com>
include/user-awareness-private.h
include/user-awareness.h
src/user-awareness-device.c
src/user-awareness-service.c
src/user-awareness-users.c
test/uat-service.c

index 3276f0be4edbacd83937fd90a7306e1f55bc39b0..4e173f69211ecdcbf1a24f615d6abd7cf2dadb7e 100644 (file)
@@ -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);
 
 /**
index a35b31fc7d5775f7bfd59230b0b591b66932c303..7b779cdcfa98dec99e5a58e51b46d16e7345e2dd 100644 (file)
@@ -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);
 
@@ -1293,6 +1293,33 @@ int ua_monitor_stop_absence_detection(
 int ua_user_create(
                ua_user_h *user_handle);
 
+/**
+ * @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.
@@ -1513,6 +1540,28 @@ int ua_user_get_last_presence(ua_user_h user_handle, unsigned long long *timesta
  */
 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.
@@ -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);
 
 /**
index 2bc930833e7e2c865875714e43dafe6b0a0fcbf0..77b8c0619e95010ac24ad8f5cecfcb8d044b8862 100644 (file)
@@ -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 */
index 1cd942858df607e988432f8fda03968e7e68bdaf..95a33b0eb79594e85a997e32ae1bb09bfa137dc3 100644 (file)
@@ -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;
index 3db665a02202290baf329b28d0526e5bedbedf08..3404f3bb78a7c080286cdea1953779d4fb8575d5 100644 (file)
@@ -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 */
index c748bc952c1327d4d7069165b00f472b90f499c5..fe39beddf9cd269e2f4721c849c90329ea90e648 100644 (file)
@@ -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