From: Priya Kohli Date: Tue, 14 May 2019 12:38:22 +0000 (+0530) Subject: [TBT][Autofill][NonACR][TIZEN-710, Added new TBT TC for Autofill Framework] X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=463f27f2d377a4959044d58f2acf7e6629666227;p=test%2Ftct%2Fnative%2Fbehavior.git [TBT][Autofill][NonACR][TIZEN-710, Added new TBT TC for Autofill Framework] Change-Id: I024f0e903997b99ca6133a4fe4b5f2b5e20395a3 Signed-off-by: Priya Kohli --- diff --git a/release/binary-armv7l/org.tizen.autofill-service-0.1.5-1.armv7l.rpm b/release/binary-armv7l/org.tizen.autofill-service-0.1.5-1.armv7l.rpm new file mode 100755 index 0000000..0f76c4a Binary files /dev/null and b/release/binary-armv7l/org.tizen.autofill-service-0.1.5-1.armv7l.rpm differ diff --git a/release/binary-armv7l/org.tizen.tbtcoreapp-1.0.0-arm.tpk b/release/binary-armv7l/org.tizen.tbtcoreapp-1.0.0-arm.tpk index 7313411..b111b0a 100755 Binary files a/release/binary-armv7l/org.tizen.tbtcoreapp-1.0.0-arm.tpk and b/release/binary-armv7l/org.tizen.tbtcoreapp-1.0.0-arm.tpk differ diff --git a/release/binary-x86/org.tizen.autofill-service-0.1.5-1.armv7l.rpm b/release/binary-x86/org.tizen.autofill-service-0.1.5-1.armv7l.rpm new file mode 100755 index 0000000..0f76c4a Binary files /dev/null and b/release/binary-x86/org.tizen.autofill-service-0.1.5-1.armv7l.rpm differ diff --git a/release/binary-x86/org.tizen.tbtcoreapp-1.0.0-x86.tpk b/release/binary-x86/org.tizen.tbtcoreapp-1.0.0-x86.tpk index 770a06d..84e6e91 100755 Binary files a/release/binary-x86/org.tizen.tbtcoreapp-1.0.0-x86.tpk and b/release/binary-x86/org.tizen.tbtcoreapp-1.0.0-x86.tpk differ diff --git a/scripts_tpk/tpkbuild.sh b/scripts_tpk/tpkbuild.sh index 93b464e..e4333f3 100755 --- a/scripts_tpk/tpkbuild.sh +++ b/scripts_tpk/tpkbuild.sh @@ -214,6 +214,12 @@ modulearray=(org.tizen.coretbt_dataprovider org.tizen.coretbt_serviceapp org.tiz sdb push $PWD/release/binary-$ARCH/iotcon-test-svr-db-client.dat /home/$EXECUTION_USER/apps_rw/org.tizen.$MOD_NAME/data/ sdb push $PWD/release/binary-$ARCH/iotcon-test-svr-db-server.dat /home/$EXECUTION_USER/apps_rw/org.tizen.$MOD_NAME/data/ + echo $yellow"Installing Autofill service rpm" + sdb shell "mount -o remount,rw /" + sdb push $PWD/release/binary-$ARCH/org.tizen.autofill-service-0.1.5-1.armv7l.rpm /home/$EXECUTION_USER/apps_rw + sdb shell su -c "rpm -Uvh /home/$EXECUTION_USER/apps_rw/org.tizen.autofill-service-0.1.5-1.armv7l.rpm --nodeps --force" + sdb shell su -c "tpk-backend -y org.tizen.autofill-service --preload" + sdb shell chown $EXECUTION_USER:5000 /home/$EXECUTION_USER/apps_rw/org.tizen.$MOD_NAME/data/iotcon-test-svr-db-client.dat sdb shell chown $EXECUTION_USER:5000 /home/$EXECUTION_USER/apps_rw/org.tizen.$MOD_NAME/data/iotcon-test-svr-db-server.dat sdb shell chmod 777 /home/$EXECUTION_USER/apps_rw/org.tizen.$MOD_NAME/data/iotcon-test-svr-db-client.dat diff --git a/tbtcoreapp/inc/model/tbt-info.h b/tbtcoreapp/inc/model/tbt-info.h index 19d0337..4d245cf 100755 --- a/tbtcoreapp/inc/model/tbt-info.h +++ b/tbtcoreapp/inc/model/tbt-info.h @@ -311,8 +311,8 @@ typedef enum { TBT_APP_CBHM_TYPE_GET, TBT_APP_CBHM_SELECTION_GET, TBT_APP_CBHM_COUNT_GET, - TBT_APP_CBHM_STATE_GET - //TBT_APP_DALI_SCROLL_BAR + TBT_APP_CBHM_STATE_GET, + TBT_APP_AUTOFILL } tbt_app_type_e; diff --git a/tbtcoreapp/inc/utils/app_module_config.h b/tbtcoreapp/inc/utils/app_module_config.h index 85ec874..b11b694 100755 --- a/tbtcoreapp/inc/utils/app_module_config.h +++ b/tbtcoreapp/inc/utils/app_module_config.h @@ -307,4 +307,6 @@ #define TBT_MODULE_APP_CBHM_SELECTION_GET #define TBT_MODULE_APP_CBHM_COUNT_GET #define TBT_MODULE_APP_CBHM_STATE_GET +#define TBT_MODULE_AUTOFILL +#define TBT_MODULE_APP_AUTOFILL #endif diff --git a/tbtcoreapp/inc/utils/config.h b/tbtcoreapp/inc/utils/config.h index f08e053..1620f03 100644 --- a/tbtcoreapp/inc/utils/config.h +++ b/tbtcoreapp/inc/utils/config.h @@ -112,6 +112,7 @@ extern bool __is_efl_test_running; #define WIDGET_VIEW_APPID "org.tizen.coretbtwidgetapp"; #define VIEWER_VIEW_APP_PACKAGE_NAME "org.tizen.widget_viewer_sdk"; +#define AUTOFILL_VIEW_APP_PACKAGE_NAME "org.tizen.autofill-test"; #define DATA_CONTROL_PROVIDER_MAP_ID "MapRepository"; #define DATA_CONTROL_PROVIDER_DATA_ID "provider"; diff --git a/tbtcoreapp/inc/view/tbt-autofill-view.h b/tbtcoreapp/inc/view/tbt-autofill-view.h new file mode 100755 index 0000000..8864177 --- /dev/null +++ b/tbtcoreapp/inc/view/tbt-autofill-view.h @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +/** + * @file tbt-autofill-view.h + * @brief This view provide the Apps tested the autofill functionality. + * @since_tizen 5.5 + * @author Priya Kohli (priya.kohli@samsung.com) + * @date May, 2019 + * @bug No known bug. + * @credit Tizen Application framework Example + * + */ + +#ifndef __TBT_AUTOFILL_VIEW_H__ +#define __TBT_AUTOFILL_VIEW_H__ + +#include "utils/app_module_config.h" +#ifdef TBT_MODULE_AUTOFILL + +#include +#include "model/tbt-list.h" + +/** + * @typedef _autofill_view + * @since_tizen 5.5 + * @brief A autofill viewer view handle. + */ +typedef struct _autofill_view autofill_view; + +/** + * @brief Create autofill_view_add + * @since_tizen 5.5 + * @param[in] navi Parent naviframe + * @param[in] tbt_info Custom struct contains all the necessary information of the modules + * @param[in] item Is the selected item of the Application home genlist + * @return Pointer of autofill_view on success, otherwise NULL + */ +autofill_view *autofill_view_add(Evas_Object *navi, tbt_info *tbt_info, Elm_Object_Item *item); + +#endif +#endif // __TBT_AUTOFILL_VIEW_H__ diff --git a/tbtcoreapp/res/edje/3.0/mobile/autofill_viewer.edc b/tbtcoreapp/res/edje/3.0/mobile/autofill_viewer.edc new file mode 100755 index 0000000..81268b4 --- /dev/null +++ b/tbtcoreapp/res/edje/3.0/mobile/autofill_viewer.edc @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +collections +{ + base_scale: 1.8; + group + { + name: "autofill_viewer"; + parts{ + part { name: "controller_part"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.9; + } + rel2 { + relative: 1.0 1.0; + } + visible: 1; + } + } + part { name: "textbox_part"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { + relative: 0.05 0.05; + } + rel2 { + relative: 0.95 0.15; + } + visible: 1; + } + } + } + } +} diff --git a/tbtcoreapp/src/model/tbt-list.c b/tbtcoreapp/src/model/tbt-list.c index 71fefa3..9fa2469 100755 --- a/tbtcoreapp/src/model/tbt-list.c +++ b/tbtcoreapp/src/model/tbt-list.c @@ -2924,7 +2924,22 @@ static tbt_info tbtapps[] = .icon_name = "dummy", .info = "1.Click on Show/Hide ClipBoard
2.Click on Show State the current state(Show/Hide) of ClipBoard should appear in label", .result = 0 - } + }, + #endif +#endif + +#ifdef TBT_MODULE_AUTOFILL + #ifdef TBT_MODULE_APP_AUTOFILL + + //AUTO FILL Test + { + .name = "Autofill", + .parent = "Autofill", + .apptype = TBT_APP_AUTOFILL, + .icon_name = "dummy", + .info = "1. In 'Settings' select 'Language and input'.
2.Select 'Autofill service' menu and then 'Tizen autofill service sample'.
3.Launch Autofill TC, enter any string in each field, exit by pressing back key.
4.Lauch Autofill TC again, click on 'Login with Autofill' button.
5.The data entered before will be filled in the entry boxes", + .result = 0 + }, #endif #endif }; diff --git a/tbtcoreapp/src/view/tbt-autofill-view.c b/tbtcoreapp/src/view/tbt-autofill-view.c new file mode 100755 index 0000000..13be90f --- /dev/null +++ b/tbtcoreapp/src/view/tbt-autofill-view.c @@ -0,0 +1,410 @@ +/******************************************************************************* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +/** + * @file tbt-autofill-view.c + * @brief This view provide the Apps tested the autofill functionality. + * @author Priya Kohli (priya.kohli@samsung.com) + * @date May, 2019 + * @bug No known bug. + * @credit Tizen Autofill framework Example + * + */ + +#include "utils/app_module_config.h" +#ifdef TBT_MODULE_AUTOFILL + +#include "utils/logger.h" +#include "utils/config.h" +#include "utils/ui-utils.h" +#include "view/tbt-autofill-view.h" +#include "view/tbt-common-view.h" + +#include + +struct _autofill_view +{ + common_view* view; + Evas_Object* btn_autofill; +}; + +struct _Entry +{ + Evas_Object *entry_bg; + Evas_Object *entry_obj; + autofill_item_h ai_h; + autofill_save_item_h si_h; +}; +typedef struct _Entry Entry; +static Entry en[2]; + +static autofill_h g_ah = NULL; + +static void _app_destroy_cb(void* this); +static void save_autofill_view_info(autofill_h ah); + +static void connection_status_changed_cb(autofill_h ah, autofill_connection_status_e status, void *user_data) +{ + switch (status) { + case AUTOFILL_CONNECTION_STATUS_CONNECTED: + DBG("connected"); + break; + case AUTOFILL_CONNECTION_STATUS_DISCONNECTED: + DBG("disconnected"); + break; + case AUTOFILL_CONNECTION_STATUS_REJECTED: + DBG("rejected"); + break; + default: + break; + } +} + +static bool fill_response_item_cb(autofill_fill_response_item_h item, void *user_data) +{ + char *id = NULL; + char *value = NULL; + char *presentation_text = NULL; + + char *id1 = NULL, *id2 = NULL; + + autofill_item_get_id(en[0].ai_h, &id1); + autofill_item_get_id(en[1].ai_h, &id2); + + autofill_fill_response_item_get_id(item, &id); + autofill_fill_response_item_get_presentation_text(item, &presentation_text); + autofill_fill_response_item_get_value(item, &value); + + DBG("id : %s, value : %s, presentation text : %s", id, value, presentation_text); + + if (id1 && strcmp(id, id1) == 0) + elm_object_text_set(en[0].entry_obj, value);/* show last group item */ + else if (id2 && strcmp(id, id2) == 0) + elm_object_text_set(en[1].entry_obj, value); + + if (id) + free(id); + + if (value) + free(value); + + if (presentation_text) + free(presentation_text); + + return true; +} + +static bool fill_response_multi_item_cb(autofill_fill_response_item_h item, void *user_data) +{ + char *id = NULL; + char *value = NULL; + char *presentation_text = NULL; + char *id1 = NULL, *id2 = NULL; + + autofill_fill_response_group_h group_h = (autofill_fill_response_group_h)user_data; + + autofill_item_get_id(en[0].ai_h, &id1); + autofill_item_get_id(en[1].ai_h, &id2); + + autofill_fill_response_item_get_id(item, &id); + autofill_fill_response_item_get_presentation_text(item, &presentation_text); + autofill_fill_response_item_get_value(item, &value); + + DBG("id : %s, value : %s, presentation text : %s", id, value, presentation_text); + + if (id) + free(id); + + if (value) + free(value); + + if (presentation_text) + free(presentation_text); + + return true; +} + +static bool fill_response_group_cb(autofill_fill_response_group_h group_h, void *user_data) +{ + int count = *(int *)user_data; + + if (count == 1) + autofill_fill_response_group_foreach_item(group_h, fill_response_item_cb, NULL); + else if (count > 1) + autofill_fill_response_group_foreach_item(group_h, fill_response_multi_item_cb, group_h); + + return true; +} + +static void fill_response_received_cb(autofill_h ah, autofill_fill_response_h fill_response, void *data) +{ + if (!fill_response) + return; + + /* get fill response group count */ + int count; + autofill_fill_response_get_group_count(fill_response, &count); + DBG("group count : %d", count); + + autofill_fill_response_foreach_group(fill_response, fill_response_group_cb, &count); +} + +static autofill_view_info_h create_autofill_view_info() +{ + autofill_view_info_h vi_h; + char *app_id = NULL; + app_get_id(&app_id); + + /* create autofill view info */ + autofill_view_info_create(&vi_h); + autofill_view_info_set_app_id(vi_h, app_id); + autofill_view_info_set_view_id(vi_h, "login"); + + /* append autofill item in autofill view */ + autofill_view_info_add_item(vi_h, en[0].ai_h); + autofill_view_info_add_item(vi_h, en[1].ai_h); + + if (app_id) + free(app_id); + + return vi_h; +} + +static void send_fill_request(autofill_h ah) +{ + autofill_view_info_h vi_h = create_autofill_view_info(); + + /* Set callback function for receiving autofill fill response */ + autofill_fill_response_set_received_cb(ah, fill_response_received_cb, NULL); + + /* Send request to get autofill fill response */ + int ret = autofill_fill_request(ah, vi_h); + if (ret == AUTOFILL_ERROR_NONE) + DBG("Succeeded to request fill"); + else + DBG("Failed to request fill : %d", ret); + + autofill_view_info_destroy(vi_h); +} + +static void delete_input_field(Entry *en) +{ + if (!en) return; + + if (en->ai_h) { + autofill_item_destroy(en->ai_h); + en->ai_h = NULL; + } + + if (en->si_h) { + autofill_save_item_destroy(en->si_h); + en->si_h = NULL; + } + + if (en->entry_bg) { + evas_object_del(en->entry_bg); + en->entry_bg = NULL; + } + + if (en->entry_obj) { + evas_object_del(en->entry_obj); + en->entry_obj = NULL; + } +} + +static void entry_del_cb(void *data, Evas *e, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Entry *en = data; + save_autofill_view_info(g_ah); + delete_input_field(en); +} + +static void +create_input_field(Evas_Object *win, Entry *en, const char *id, const char *label, bool sensitive, autofill_hint_e autofill_hint, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + if (!en) return; + + // create the background for text input field + en->entry_bg = elm_bg_add(win); + elm_bg_color_set(en->entry_bg, 200, 200, 200); + elm_object_focus_allow_set(en->entry_bg, EINA_TRUE); + evas_object_move(en->entry_bg, x, y); + evas_object_resize(en->entry_bg, w, h); + evas_object_show(en->entry_bg); + evas_object_data_set(en->entry_bg, "Entry", en); + + en->entry_obj = elm_entry_add(win); + evas_object_move(en->entry_obj, x, y); + evas_object_resize(en->entry_obj, w, h); + evas_object_show(en->entry_obj); + + // create autofill item + autofill_item_create(&en->ai_h); + autofill_item_set_autofill_hint(en->ai_h, autofill_hint); + autofill_item_set_id(en->ai_h, id); + autofill_item_set_label(en->ai_h, label); + autofill_item_set_sensitive_data(en->ai_h, sensitive); + DBG("en : %p, ai_h : %p\n", &en, en->ai_h); + + // create autofill item for save + autofill_save_item_create(&en->si_h); + autofill_save_item_set_autofill_hint(en->si_h, autofill_hint); + autofill_save_item_set_id(en->si_h, id); + autofill_save_item_set_label(en->si_h, label); + autofill_save_item_set_sensitive_data(en->si_h, sensitive); + DBG("en : %p, si_h : %p\n", &en, en->si_h); + + // register callback + evas_object_event_callback_add(en->entry_obj, EVAS_CALLBACK_DEL, entry_del_cb, en); +} + +static void save_autofill_item(Entry *en) +{ + const char *str; + char *plain_str; + + str = elm_object_text_get(en->entry_obj); + DBG("str = %s\n", str); + plain_str = elm_entry_markup_to_utf8(str); + DBG("plain_str = %s\n", plain_str); + autofill_save_item_set_value(en->si_h, plain_str ? plain_str : ""); + + if (plain_str) + free(plain_str); +} + +static void save_autofill_view_info(autofill_h ah) +{ + int ret; + char *app_id; + autofill_save_view_info_h svi_h = NULL; + + app_get_id(&app_id); + + /* create autofill item for saving */ + save_autofill_item(&en[0]); + save_autofill_item(&en[1]); + + /* create autofill save view info */ + autofill_save_view_info_create(&svi_h); + autofill_save_view_info_set_app_id(svi_h, app_id); + autofill_save_view_info_set_view_id(svi_h, "login"); + + /* append autofill save item in autofill save view */ + autofill_save_view_info_add_item(svi_h, en[0].si_h); + autofill_save_view_info_add_item(svi_h, en[1].si_h); + + if (app_id) + free(app_id); + + /* Send request to save autofill data */ + ret = autofill_commit(ah, svi_h); + if (ret == AUTOFILL_ERROR_NONE) + DBG("Succeeded to commit"); + else + DBG("Failed to commit. error code: 0x%X, error message: '%s'", ret, get_error_message(ret)); + + autofill_save_view_info_destroy(svi_h); +} + +static void win_focus_out_cb(void *data, Evas_Object *obj, void *event_info) +{ + RETM_IF(NULL == g_ah, "g_ah is NULL"); + save_autofill_view_info(g_ah); +} + +static void autofill_app_launch_button_pressed_cb(void *data, Evas_Object *obj, void *event_info) +{ + send_fill_request(g_ah); +} + +static void add_control_layout(autofill_view *this, Evas_Object *parent) +{ + RETM_IF(NULL == this, "view is NULL"); + + this->btn_autofill = ui_utils_push_button_add(this, parent, "Login with Autofill", autofill_app_launch_button_pressed_cb); + elm_object_part_content_set(this->view->layout, "controller_part", this->btn_autofill); + + memset(&en[0], 0, sizeof(en[0])); + memset(&en[1], 0, sizeof(en[1])); + create_input_field(this->view->layout, &en[0], "id", "ID", false, AUTOFILL_HINT_ID, 40, 150, 640, 60); + create_input_field(this->view->layout, &en[1], "password", "Password", true, AUTOFILL_HINT_PASSWORD, 40, 230, 640, 60); + + evas_object_smart_callback_add(parent, "unfocused", win_focus_out_cb, NULL); +} + +autofill_view *autofill_view_add(Evas_Object *navi, tbt_info *tbt_info, Elm_Object_Item *item) +{ + RETVM_IF(NULL == navi, NULL, "navi is null"); + + autofill_view *this = NULL; + this = calloc(1, sizeof(autofill_view)); + RETVM_IF(!this, NULL, "calloc failed"); + + this->view = calloc(1, sizeof(common_view)); + RETVM_IF(!this->view, NULL, "calloc failed"); + + + tbt_info->layout_group = "autofill_viewer"; + tbt_info->layout_file = get_edje_path("autofill_viewer.edj"); + + common_view_add(navi, tbt_info, item, this->view, _app_destroy_cb, this); + RETVM_IF(NULL == this->view, NULL, "navi is null"); + + add_control_layout(this, this->view->layout); + + int ret; + ret = autofill_create(&g_ah); + if (ret == AUTOFILL_ERROR_NONE) + DBG("Succeeded to create autofill"); + else + { + DBG("Failed to create autofill. error code: 0x%X, error message: '%s'", ret, get_error_message(ret)); + return this; + } + + ret = autofill_connect(g_ah, connection_status_changed_cb, NULL); + if (ret == AUTOFILL_ERROR_NONE) + DBG("Succeeded to connect"); + else + DBG("Failed to connect. error code: 0x%X, error message: '%s'", ret, get_error_message(ret)); + + return this; +} + +static void _app_destroy_cb(void* this) +{ + RETM_IF(NULL == this, "data is NULL"); + + autofill_view *view = NULL; + view = (autofill_view*)this; + RETM_IF(NULL == view, "view is NULL"); + + RETM_IF(NULL == g_ah, "g_ah is NULL"); + if (g_ah) + save_autofill_view_info(g_ah); + + SAFE_DELETE(view->view); + SAFE_DELETE(view); +} + +static void app_terminate(void *data) +{ + RETM_IF(NULL == g_ah, "g_ah is NULL"); + save_autofill_view_info(g_ah); + autofill_destroy(g_ah); + g_ah = NULL; +} +#endif diff --git a/tbtcoreapp/src/view/tbt-genlist-view.c b/tbtcoreapp/src/view/tbt-genlist-view.c index d20bd8f..76f4ce4 100755 --- a/tbtcoreapp/src/view/tbt-genlist-view.c +++ b/tbtcoreapp/src/view/tbt-genlist-view.c @@ -104,6 +104,7 @@ #include "view/tbt-motion-detection-view.h" #include "view/tbt-cbhm-view.h" #include "view/tbt-dali-custom-view.h" +#include "view/tbt-autofill-view.h" typedef struct { Evas_Object *win; @@ -1285,6 +1286,11 @@ static void _gl_item_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void cbhm_view_add(view->navi, info, it); break; #endif + #ifdef TBT_MODULE_AUTOFILL + case TBT_APP_AUTOFILL: + autofill_view_add(view->navi, info, it); + break; + #endif default: assert(false); break;