diff options
author | Junghyun Kim <jh1114.kim@samsung.com> | 2012-08-21 20:20:51 +0900 |
---|---|---|
committer | Junghyun Kim <jh1114.kim@samsung.com> | 2012-08-21 20:20:51 +0900 |
commit | 705b925c45567f2fc5a002fd3fd89d94e66bc2f6 (patch) | |
tree | 2074280b0ea934170b6eef3dbe445bf9bccddd73 /src | |
parent | bf8879b3c9c9a58111b20ea76263a5845a2f56fb (diff) | |
download | smartsearch-705b925c45567f2fc5a002fd3fd89d94e66bc2f6.tar.gz smartsearch-705b925c45567f2fc5a002fd3fd89d94e66bc2f6.tar.bz2 smartsearch-705b925c45567f2fc5a002fd3fd89d94e66bc2f6.zip |
Update changed code
Diffstat (limited to 'src')
-rwxr-xr-x | src/common_util.cpp | 30 | ||||
-rwxr-xr-x | src/ps_app_interface.cpp | 377 | ||||
-rwxr-xr-x | src/ps_makeupviews.cpp | 1085 | ||||
-rwxr-xr-x | src/ps_searcher.cpp | 2015 | ||||
-rwxr-xr-x | src/search_bar.cpp | 89 | ||||
-rwxr-xr-x | src/smartsearch.cpp | 564 |
6 files changed, 2775 insertions, 1385 deletions
diff --git a/src/common_util.cpp b/src/common_util.cpp index 02b4f51..396c6ba 100755 --- a/src/common_util.cpp +++ b/src/common_util.cpp @@ -1,12 +1,12 @@ /* * Copyright 2012 Samsung Electronics Co., Ltd - * + * * Licensed under the Flora License, Version 1.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.tizenopensource.org/license - * + * * 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. @@ -39,7 +39,6 @@ int search_util_date_time_format_init(void *data) UErrorCode status = U_ZERO_ERROR; UChar customSkeleton[64] = { '\0' }; char skeleton[128] = { 0, }; - int hr = 0; int32_t bestPatternCapacity, bestPatternLength; UChar bestPattern[64] = { 0, }; const char *locale; @@ -108,8 +107,6 @@ void search_util_date_time_format_deinit() { SEARCH_FUNC_START; - UErrorCode status = U_ZERO_ERROR; - if (search_pattern_generator) { udatpg_close(search_pattern_generator); search_pattern_generator = NULL; @@ -163,7 +160,7 @@ void search_sql_make_keyword_bind_value(char *src, char *dest, int type) if(type == SEARCH_SQL_BIND_TYPE_DUPLEX) { *dest = '%'; ++dest; - } + } for (tmp = src; *tmp; ++tmp, ++dest) { if ((*tmp == '%') || (*tmp == '_') || (*tmp == *DB_ESCAPE_CHAR)) { @@ -195,17 +192,18 @@ void search_get_date_string(char *date_string) const char *search_markup_keyword(const char *string, char *searchword, bool *result) { - SEARCH_FUNC_START; - char pstr[DEF_BUF_LEN + 1] = {0,}; char result_str[DEF_BUF_LEN + 1] = {0,}; - char start_str[DEF_BUF_LEN + 1] = {0,}; + char start_str[DEF_BUF_LEN + 1] = {0,}; static char return_string[DEF_BUF_LEN + 1] = { 0, }; int word_len = 0; int search_len = 0; int i = 0; bool found = false; + SEARCH_RET_IF_STR_INVALID(string, return_string); + SEARCH_RET_IF_STR_INVALID(searchword, return_string); + strncpy(pstr, string, DEF_BUF_LEN); word_len = strlen(pstr); @@ -240,8 +238,6 @@ const char *search_markup_keyword(const char *string, char *searchword, snprintf(return_string, 128, "%s", pstr); } - SEARCH_FUNC_END; - return return_string; } @@ -280,12 +276,12 @@ const char *search_markup_keyword(const char *string, char *searchword, *result = found; memset(return_string, 0x00, DEF_BUF_LEN); - if (found) { + if (found) { if (i == 0) { markup_text = g_markup_escape_text(&pstr[0], search_len); markup_text_end = g_markup_escape_text(&pstr[search_len], word_len-search_len); - snprintf(return_string, - DEF_BUF_LEN, + snprintf(return_string, + DEF_BUF_LEN, "<match>%s</match>%s", markup_text, (char*)markup_text_end); @@ -295,8 +291,8 @@ const char *search_markup_keyword(const char *string, char *searchword, markup_text_start = g_markup_escape_text(&pstr[0], i); markup_text = g_markup_escape_text(&pstr[i], search_len); markup_text_end = g_markup_escape_text(&pstr[i+search_len], word_len-(i+search_len)); - snprintf(return_string, - DEF_BUF_LEN, + snprintf(return_string, + DEF_BUF_LEN, "%s<match>%s</match>%s", (char*)markup_text_start, markup_text, diff --git a/src/ps_app_interface.cpp b/src/ps_app_interface.cpp index 56968f6..b4c277f 100755 --- a/src/ps_app_interface.cpp +++ b/src/ps_app_interface.cpp @@ -1,12 +1,12 @@ /* * Copyright 2012 Samsung Electronics Co., Ltd - * + * * Licensed under the Flora License, Version 1.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.tizenopensource.org/license - * + * * 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. @@ -25,7 +25,8 @@ #include <ui-gadget.h> #include <contacts-ug.h> #include <aul_service.h> -#include <appsvc.h> +#include <app.h> +#include <app_manager.h> #include <bundle.h> #define UG_NAME_LEN 50 @@ -82,13 +83,11 @@ static void __search_effect_layout_render_flush_post_cb(void *data, Evas * e, SEARCH_FUNC_END; } -static void __search_ug_layout_cb(struct ui_gadget *ug, enum ug_mode mode, +static void __search_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) { SEARCH_FUNC_START; - struct appdata *ad = (struct appdata *)priv; - Evas_Object *base = (Evas_Object *) ug_get_layout(ug); if (!base) @@ -100,7 +99,7 @@ static void __search_ug_layout_cb(struct ui_gadget *ug, enum ug_mode mode, elm_object_part_content_set(ad->effect_layout, "elm.swallow.content", base); //B. Add the callback event for the EVAS_RENDER_FLUSH_POST - //B. This is one method to not skip the total effect time in creating the ug object. + //B. This is one method to not skip the total effect time in creating the ug object. evas_event_callback_add(evas_object_evas_get(ad->effect_layout), EVAS_CALLBACK_RENDER_FLUSH_POST, __search_effect_layout_render_flush_post_cb, @@ -112,12 +111,10 @@ static void __search_ug_layout_cb(struct ui_gadget *ug, enum ug_mode mode, SEARCH_FUNC_END; } -static void __search_ug_closed_cb(struct ui_gadget *ug, void *priv) +static void __search_ug_closed_cb(ui_gadget_h ug, void *priv) { SEARCH_FUNC_START; - struct appdata *ad = (struct appdata *)priv; - #ifdef ENABLE_UG_EFFECT edje_object_signal_emit(elm_layout_edje_get(ad->effect_layout), "elm,state,hide", ""); @@ -171,27 +168,46 @@ void search_launch_contact_view(void *data, void *record_info) struct search_item_sel *cur_category_mem = (struct search_item_sel *)record_info; - bundle *kb; + service_h service = NULL; + int ret = 0; + bool err_popup_show = true; - struct ui_gadget *ug; + ui_gadget_h ug = NULL; struct ug_cbs cbs = { 0, }; char buf[10] = { 0, }; + if (!cur_category_mem || strlen(cur_category_mem->main_id) < 0 ) { + SEARCH_DEBUG_ERROR("Selected item does not have data!"); + goto out_func; + } else { if (ad->detail_ug) { - SEARCH_DEBUG_WARNING("prev ug is exist. destroy prev ug"); + SEARCH_DEBUG_WARNING("\n prev ug is exist. destroy prev ug"); __search_layout_ug_destroy(ad); - } + } - kb = bundle_create(); - if (!kb) { - SEARCH_DEBUG_ERROR("contact bundle_create"); - return; + ret = service_create(&service); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to create service handle!"); + goto out_func; } snprintf(buf, sizeof(buf), "%d", CT_UG_REQUEST_DETAIL); - bundle_add(kb, CT_UG_BUNDLE_TYPE, buf); - bundle_add(kb, CT_UG_BUNDLE_ID, cur_category_mem->main_id); + ret = service_add_extra_data(service, CT_UG_BUNDLE_TYPE, buf); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to add service extra data : parameter 1!"); + goto out_func; + } + + ret = service_add_extra_data(service, CT_UG_BUNDLE_ID, + cur_category_mem->main_id); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to add service extra data : parameter 2!"); + goto out_func; + } #ifdef ENABLE_UG_EFFECT __search_create_effect_layout(ad->win_main, ad); @@ -200,17 +216,25 @@ void search_launch_contact_view(void *data, void *record_info) cbs.layout_cb = __search_ug_layout_cb; cbs.result_cb = NULL; cbs.destroy_cb = __search_ug_closed_cb; - cbs.priv = ad; + cbs.priv = ad; + + ug = ug_create(NULL, UG_CONTACTS_DETAILS, UG_MODE_FULLVIEW, service, &cbs); - ug = ug_create(NULL, UG_CONTACTS_DETAILS, UG_MODE_FULLVIEW, kb, &cbs); if (!ug) { SEARCH_DEBUG_ERROR(" ... ug_create: failed !!!"); - search_launch_popup_error(LAUNCH_ERROR_AUL_LAUNCH, ad); + goto out_func; } else { ad->detail_ug = ug; - } + err_popup_show = false; + } + } + +out_func: + if (err_popup_show == true) + search_launch_popup_error(LAUNCH_ERROR_AUL_LAUNCH, ad); - bundle_free(kb); + if (service != NULL) + service_destroy(service); SEARCH_FUNC_END; } @@ -231,16 +255,16 @@ void search_launch_msg_view(void *data, void *record_info) SEARCH_DEBUG_ERROR("search_launch_msg_view : bundle_create failed"); return; } - + bundle_add(b, "type", "msg_id"); bundle_add(b, "msgId", cur_category_mem->main_id); ret = aul_launch_app("org.tizen.message", b); - if( (ret <= 0) && (ret != AUL_R_ETIMEOUT) ){ + if( (ret <= 0) && (ret != AUL_R_ETIMEOUT) ){ SEARCH_DEBUG_ERROR("msg aul launch app error(%d)", ret); search_launch_popup_error(LAUNCH_ERROR_AUL_LAUNCH, ad); } - bundle_free(b); + bundle_free(b); SEARCH_FUNC_END; } @@ -320,20 +344,21 @@ void search_launch_image_view(void *data, void *record_info) SEARCH_DEBUG_LOG("cur_category_mem->path : %s", cur_category_mem->path); - bundle* bd = NULL; - bd = bundle_create(); + service_h service; + ret = service_create(&service); - if (bd != NULL) { - appsvc_set_operation(bd, APPSVC_OPERATION_VIEW); - appsvc_set_uri(bd, cur_category_mem->path); - ret = appsvc_run_service(bd, 0, NULL, NULL); + if (ret == 0) { + service_set_operation(service, SERVICE_OPERATION_VIEW); + service_set_uri(service, cur_category_mem->path); + ret = service_send_launch_request(service, NULL, NULL); - if (ret < 0 ) + if (ret != 0) { + SEARCH_DEBUG_ERROR("image app service launching error(%d)", ret); search_launch_popup_error(LAUNCH_ERROR_APPSVC, - ad); - bundle_free(bd); + ad); } - + service_destroy(service); + } } SEARCH_FUNC_END; @@ -353,20 +378,24 @@ void search_launch_video_view(void *data, void *record_info) cur_category_mem->path); search_launch_popup_error(LAUNCH_ERROR_FILE_NOT_FOUND, ad); } else { - bundle* bd = NULL; - bd = bundle_create(); - - appsvc_set_operation(bd, APPSVC_OPERATION_VIEW); - appsvc_set_uri(bd, cur_category_mem->path); - ret = appsvc_run_service(bd, 0, NULL, NULL); - - if (ret < 0) { - SEARCH_DEBUG_ERROR("video app service error(%d) : %s", - ret, cur_category_mem->path); - search_launch_popup_error(LAUNCH_ERROR_APPSVC, ad); - } + SEARCH_DEBUG_LOG("cur_category_mem->path : %s", + cur_category_mem->path); + + service_h service; + ret = service_create(&service); - bundle_free(bd); + if (ret == 0) { + service_set_operation(service, SERVICE_OPERATION_VIEW); + service_set_uri(service, cur_category_mem->path); + ret = service_send_launch_request(service, NULL, NULL); + + if (ret != 0) { + SEARCH_DEBUG_ERROR("video app service launching error(%d)", ret); + search_launch_popup_error(LAUNCH_ERROR_APPSVC, + ad); + } + service_destroy(service); + } } SEARCH_FUNC_END; @@ -388,22 +417,21 @@ void search_launch_music_view(void *data, void *record_info) } else { SEARCH_DEBUG_LOG("cur_category_mem->path : %s", cur_category_mem->path); - - bundle* bd = NULL; - bd = bundle_create(); - - if (bd != NULL) { - appsvc_set_operation(bd, APPSVC_OPERATION_VIEW); - appsvc_set_uri(bd, cur_category_mem->path); - ret = appsvc_run_service(bd, 0, NULL, NULL); - - if (ret < 0) { - SEARCH_DEBUG_ERROR("music app service error(%d) : %s", - ret, cur_category_mem->path); + + service_h service; + ret = service_create(&service); + + if (ret == 0) { + service_set_operation(service, SERVICE_OPERATION_VIEW); + service_set_uri(service, cur_category_mem->path); + ret = service_send_launch_request(service, NULL, NULL); + + if (ret != 0) { + SEARCH_DEBUG_ERROR("music app service launching error(%d)", ret); search_launch_popup_error(LAUNCH_ERROR_APPSVC, ad); } - bundle_free(bd); + service_destroy(service); } } @@ -417,35 +445,56 @@ void search_launch_calendar_view(void *data, void *record_info) struct appdata *ad = (struct appdata *)data; struct search_item_sel *cur_category_mem = (struct search_item_sel *)record_info; - struct ui_gadget *ug; + ui_gadget_h ug = NULL; struct ug_cbs cbs = { 0, }; + int ret = 0; + bool err_popup_show = true; + service_h service = NULL; - bundle *b; - int ret; + if (!cur_category_mem && strlen(cur_category_mem->main_id) < 0) { + SEARCH_DEBUG_ERROR("Selected item does not have data!"); + goto out_func; + } else { + ret = service_create(&service); - if (ad->detail_ug) { - SEARCH_DEBUG_WARNING("prev ug is exist. destroy prev ug"); + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to create service handle!"); + goto out_func; + } - __search_layout_ug_destroy(ad); + ret = service_add_extra_data(service, "index", cur_category_mem->main_id); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to add service extra data : parameter 1!"); + goto out_func; } - b = bundle_create(); - if (!b) - return; +#ifdef ENABLE_UG_EFFECT + __search_create_effect_layout(ad->win_main, ad); +#endif + cbs.destroy_cb = __search_ug_closed_cb; + cbs.layout_cb = __search_ug_layout_cb; + cbs.result_cb = NULL; + cbs.priv = ad; + + ug = ug_create(NULL, "calendar-detail-efl", UG_MODE_FULLVIEW, service, &cbs); - bundle_add(b, AUL_K_SERVICE_NAME, "view_event"); - bundle_add(b, "index", cur_category_mem->main_id); + if (!ug) { + SEARCH_DEBUG_ERROR("... create_ug_calendar : failed !!!"); + goto out_func; + } - SEARCH_DEBUG_LOG("index : %s", cur_category_mem->main_id); + ad->detail_ug = ug; + err_popup_show = false; + } - ret = aul_launch_app("org.tizen.efl-calendar", b); - if( (ret <= 0) && (ret != AUL_R_ETIMEOUT) ){ - SEARCH_DEBUG_ERROR("calendar aul launch app error(%d)", ret); +out_func: + if (err_popup_show == true) search_launch_popup_error(LAUNCH_ERROR_AUL_LAUNCH, ad); - } - bundle_free(b); - + if (service != NULL) + service_destroy(service); + SEARCH_FUNC_END; } @@ -456,39 +505,62 @@ void search_launch_memo_view(void *data, void *record_info) struct appdata *ad = (struct appdata *)data; struct search_item_sel *cur_category_mem = (struct search_item_sel *)record_info; - struct ui_gadget *ug; + ui_gadget_h ug = NULL; struct ug_cbs cbs = { 0, }; - bundle *b; + int ret = 0; + bool err_popup_show = true; + + service_h service = NULL; + if (!cur_category_mem && strlen(cur_category_mem->main_id) < 0) { + SEARCH_DEBUG_ERROR("Selected item does not have data!"); + goto out_func; + } else { if (ad->detail_ug) { SEARCH_DEBUG_WARNING("prev ug is exist. destroy prev ug"); + __search_layout_ug_destroy(ad); + } - __search_layout_ug_destroy(ad); + ret = service_create(&service); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to create service handle!"); + goto out_func; } - b = bundle_create(); - if (!b) - return; + ret = service_add_extra_data(service, "index", cur_category_mem->main_id); - bundle_add(b, "index", cur_category_mem->main_id); + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to add service extra data : parameter 1!"); + goto out_func; + } +#ifdef ENABLE_UG_EFFECT __search_create_effect_layout(ad->win_main, ad); - +#endif cbs.layout_cb = __search_ug_layout_cb; cbs.result_cb = NULL; cbs.destroy_cb = __search_ug_closed_cb; cbs.priv = ad; - ug = ug_create(NULL, "memo-efl", UG_MODE_FULLVIEW, b, &cbs); + ug = ug_create(NULL, "memo-efl", UG_MODE_FULLVIEW, service, &cbs); + if (!ug) { SEARCH_DEBUG_ERROR("... create_ug_email : failed !!!"); - search_launch_popup_error(LAUNCH_ERROR_AUL_LAUNCH, ad); + goto out_func; } ad->detail_ug = ug; + err_popup_show = false; + } - bundle_free(b); +out_func: + if (err_popup_show == true) + search_launch_popup_error(LAUNCH_ERROR_AUL_LAUNCH, ad); + + if (service != NULL) + service_destroy(service); SEARCH_FUNC_END; } @@ -500,21 +572,114 @@ void search_launch_menu_view(void *data, void *record_info) struct appdata *ad = (struct appdata *)data; struct search_item_sel *cur_category_mem = (struct search_item_sel *)record_info; + char *pkg_name = cur_category_mem->path; + bool is_running = false; + app_context_h app_h; + + bool err_popup_show = true; int ret; + service_h service = NULL; - ret = aul_launch_app(cur_category_mem->path, NULL); + if (pkg_name != NULL && strlen(pkg_name)) { + ret = app_manager_is_running(pkg_name, &is_running); - SEARCH_DEBUG_WARNING("path : %s, ret : %d", cur_category_mem->path, ret); - - if( (ret <= 0) && (ret != AUL_R_ETIMEOUT) ){ - SEARCH_DEBUG_ERROR("menu aul launch app error(%d) : %s", ret, - cur_category_mem->path); - search_launch_popup_error(LAUNCH_ERROR_AUL_LAUNCH, ad); + if (ret != APP_MANAGER_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to get info : app_manager_is_running [%d]", ret); + goto out_func; + } + + if (is_running == true) { + ret = app_manager_get_app_context(pkg_name, &app_h); + if (ret != APP_MANAGER_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to get info : app_manager_get_app_context [%d]", ret); + goto out_func; + } + + ret = app_manager_resume_app(app_h); + + if (ret != APP_MANAGER_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to get info : app_manager_resume_app [%d]", ret); + goto out_func; + } + err_popup_show = false; + } else { + ret = service_create(&service); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to create service header : [%d]", ret); + goto out_func; + } + + ret = service_set_operation(service, SERVICE_OPERATION_DEFAULT); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to set operation : [%d]", ret); + goto out_func; + } + + ret = service_set_package(service, pkg_name); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to set package : [%d]", ret); + goto out_func; + } + + ret = service_send_launch_request(service, NULL, NULL); + + if (ret != SERVICE_ERROR_NONE) { + SEARCH_DEBUG_ERROR("Fail to send launch request : [%d]", ret); + goto out_func; + } + err_popup_show = false; + } + } else { + SEARCH_DEBUG_ERROR("Pkg name is NULL!"); + } + +out_func: + if (err_popup_show == true) + search_launch_popup_error(LAUNCH_ERROR_APPSVC, ad); + + if (service != NULL) { + ret = service_destroy(service); + + if (ret != SERVICE_ERROR_NONE) + SEARCH_DEBUG_ERROR("Fail to destroy service header : [%d]", ret); } SEARCH_FUNC_END; } +void search_launch_browser_view(void *data, void *record_info) +{ + SEARCH_FUNC_START; + + struct appdata *ad = (struct appdata *)data; + struct search_item_sel *cur_category_mem = + (struct search_item_sel *)record_info; + int ret; + + SEARCH_DEBUG_LOG("cur_category_mem->path : %s", + cur_category_mem->path); + + service_h service; + ret = service_create(&service); + + if (ret == 0 && strlen(cur_category_mem->path) > 0 ) { + service_set_operation(service, SERVICE_OPERATION_VIEW); + service_set_uri(service, cur_category_mem->path); + ret = service_send_launch_request(service, NULL, NULL); + + if (ret != 0) { + SEARCH_DEBUG_ERROR("browser app service launching error(%d)", ret); + search_launch_popup_error(LAUNCH_ERROR_APPSVC, + ad); + } + service_destroy(service); + } + +} + static void __search_launch_popup_error_response_cb(void *data, Evas_Object * obj, void *event_info) @@ -558,19 +723,19 @@ void search_launch_popup_error(int error_type, void *data) case LAUNCH_ERROR_AUL_LAUNCH: /* This Message String enable to be another string in the future */ elm_object_text_set(popup, - dgettext("sys_string", - "IDS_COM_POP_SERVICE_UNAVAILABLE")); + gettext("IDS_SSEARCH_POP_SELECTED_DATA_DOES_NOT_EXIST")); break; case LAUNCH_ERROR_APPSVC: elm_object_text_set(popup, - dgettext("sys_string", - "IDS_COM_POP_SERVICE_UNAVAILABLE")); + gettext("IDS_SSEARCH_POP_SELECTED_DATA_DOES_NOT_EXIST")); break; } btn1 = elm_button_add(popup); + elm_object_style_set(btn1, "popup_button/default"); + elm_object_text_set(btn1, - dgettext("sys_string","IDS_COM_SK_OK")); + dgettext("sys_string","IDS_COM_POP_CLOSE")); evas_object_smart_callback_add(btn1, "clicked", __search_launch_popup_error_response_cb, ad); diff --git a/src/ps_makeupviews.cpp b/src/ps_makeupviews.cpp index a46413d..26eee50 100755 --- a/src/ps_makeupviews.cpp +++ b/src/ps_makeupviews.cpp @@ -1,12 +1,12 @@ /* * Copyright 2012 Samsung Electronics Co., Ltd - * + * * Licensed under the Flora License, Version 1.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.tizenopensource.org/license - * + * * 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. @@ -15,72 +15,155 @@ */ - - - - #include "smartsearch.h" #include "ps_searcher.h" #include "ps_app_interface.h" +#include <contacts-svc.h> +#include <calendar-svc-provider.h> +#include <memo-db.h> +#include <media_content.h> +#include <msg_types.h> +#include <msg_storage.h> +#include <msg.h> + +struct search_thread_data { + struct appdata *ad; + char *keyword; + int is_search_result; +}; + +struct search_genlist_item_info* search_add_genlist_item(int type, + struct search_content_object *obj, Elm_Genlist_Item_Class *itc_style, void *data, + Elm_Object_Item *parent) +{ + struct search_genlist_item_info *item = (struct search_genlist_item_info *) + calloc(1, + sizeof(struct search_genlist_item_info)); + + if (item) { + item->type = type; + item->obj = obj; + item->itc_style = itc_style; + item->data = data; + item->parent = parent; + } -static char *__search_get_phone_category_name(int type) + return item; +} + +static void +ecore_exe_pipe_cb(void *data, void *buf, unsigned int size) { SEARCH_FUNC_START; - char* name = NULL; - switch(type) { - - case SEARCH_TYPE_PHONE_CONTACTS: - { - name = dgettext("sys_string", "IDS_COM_BODY_CONTACTS"); - } - break; - case SEARCH_TYPE_PHONE_MSG: - { - name = dgettext("sys_string", "IDS_COM_BODY_MESSAGES"); - } + struct appdata *ad = (struct appdata *)data; + struct search_pipe_data *pipe_data = *((struct search_pipe_data**)buf); + + struct search_content_object *obj = NULL; + struct search_genlist_item_info *item = NULL; + struct search_genlist_info *result_info = pipe_data->result_list; + + int cmd = pipe_data->cmd; + + SEARCH_DEBUG_LOG("Pipe Command : %d ret : %d", cmd, pipe_data->search_ret); + + switch (cmd) { + case SEARCH_PIPE_CMD_CLEAR_GENLIST: + elm_genlist_clear(ad->search_gl); break; - case SEARCH_TYPE_PHONE_EMAIL: - { - name = dgettext("sys_string", "IDS_COM_BODY_EMAIL"); - } + case SEARCH_PIPE_CMD_SET_LAYOUT: + if (pipe_data->search_ret == SEARCH_RET_SEARCH_SUCCESS) + search_layout_set_search_list(ad); + else + search_layout_set_search_no_result(ad); break; - case SEARCH_TYPE_PHONE_IMAGES: - { - name = dgettext("sys_string", "IDS_COM_BODY_IMAGES"); + case SEARCH_PIPE_CMD_ADD_GENLIST_PHONE: + if (result_info) { + if (result_info->group) { + item = result_info->group; + obj = item->obj; + + obj->gl_result_grp = elm_genlist_item_append(ad->search_gl, + item->itc_style, + item->data, + NULL, + ELM_GENLIST_ITEM_GROUP, + NULL, + NULL); + SEARCH_FREE(item); + } + + if (result_info->itemlist) { + GList *node = g_list_first(result_info->itemlist); + + while (node != NULL) { + item = (struct search_genlist_item_info *)node->data; + obj = item->obj; + if (item) { + elm_genlist_item_append(ad->search_gl, + item->itc_style, + item->data, + obj->gl_result_grp, + ELM_GENLIST_ITEM_NONE, + search_gl_phone_result_sel, + ad); + SEARCH_FREE(item); + } + node = g_list_next(node); + } + g_list_free(result_info->itemlist); + result_info->itemlist = NULL; + } + + if (result_info->more) { + item = result_info->more; + obj = item->obj; + elm_genlist_item_append(ad->search_gl, + item->itc_style, + item->data, + obj->gl_result_grp, + ELM_GENLIST_ITEM_NONE, + search_gl_result_more_item_append_cb, + ad); + SEARCH_FREE(item); + } + + SEARCH_FREE(result_info); } break; - case SEARCH_TYPE_PHONE_MUSIC: - { - name = dgettext("sys_string", "IDS_COM_BODY_MUSIC"); } - break; - case SEARCH_TYPE_PHONE_VIDEO: + + SEARCH_FREE(pipe_data); + SEARCH_FUNC_END; +} + +static Evas_Object *__search_gl_content_get_search_item_type(void *data, Evas_Object *obj, const char *part) { - name = dgettext("sys_string", "IDS_COM_BODY_VIDEOS"); + Evas_Object *icon = NULL; + int icon_size = 0; + + struct search_item_sel *sel_mem_info = (struct search_item_sel *)data; + + if (!SEARCH_STRCMP(part, "elm.icon") || !SEARCH_STRCMP(part, "elm.icon.1")) { + if (strlen(sel_mem_info->icon1_path) > 0 ) { + icon = elm_icon_add(obj); + icon_size = (int)(SEARCH_THUMBNAIL_SIZE * elm_scale_get()); + elm_icon_prescale_set(icon, icon_size); + elm_icon_file_set(icon, sel_mem_info->icon1_path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); } - break; - case SEARCH_TYPE_PHONE_CALENDAR: - { - name = dgettext("sys_string", "IDS_COM_BODY_CALENDAR"); + } else if(!strcmp(part, "elm.icon.2")) { + if (strlen(sel_mem_info->icon2_path) > 0 ) { + icon = elm_icon_add(obj); + icon_size = (int)(SEARCH_ICON_SIZE * elm_scale_get()); + elm_icon_prescale_set(icon, icon_size); + elm_icon_file_set(icon, sel_mem_info->icon2_path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); } - break; - case SEARCH_TYPE_PHONE_MEMO: - { - name = dgettext("sys_string", "IDS_COM_BODY_MEMO"); } - break; - case SEARCH_TYPE_PHONE_MENU: - { - name = dgettext("sys_string", "IDS_COM_BODY_APPLICATIONS"); + return icon; } - break; - } - - return name; -} - static Eina_Bool __search_gl_state_get(void *data, Evas_Object * obj, const char *part) @@ -88,7 +171,7 @@ static Eina_Bool __search_gl_state_get(void *data, Evas_Object * obj, return EINA_FALSE; } -static char *__search_gl_label_get(void *data, Evas_Object * obj, +static char *__search_gl_label_get_search_item_type(void *data, Evas_Object * obj, const char *part) { if (data == NULL) { @@ -97,7 +180,7 @@ static char *__search_gl_label_get(void *data, Evas_Object * obj, char *buf; struct search_item_sel *sel_mem_info = (struct search_item_sel *)data; - + if (!SEARCH_STRCMP(part, "elm.text") || !SEARCH_STRCMP(part, "elm.text.1")) { buf = g_strdup(sel_mem_info->main_buf); } else if (!SEARCH_STRCMP(part, "elm.text.sub") || !SEARCH_STRCMP(part, "elm.text.2")) { @@ -105,24 +188,32 @@ static char *__search_gl_label_get(void *data, Evas_Object * obj, } else { buf = NULL; } - + return buf; } -static char *__search_gl_label_get_title(void *data, Evas_Object * obj, +static char *__search_gl_label_get_normal_type(void *data, Evas_Object * obj, const char *part) { - SEARCH_FUNC_START; - - char* category_name = NULL; - - struct search_item_sel *sel_mem = (struct search_item_sel *)data; + char *title_string = (char*)data; + if(title_string) + return strdup(dgettext("sys_string", title_string)); + else + return strdup(""); +} - category_name = __search_get_phone_category_name(sel_mem->type); +static char *__search_gl_label_get_group(void *data, Evas_Object * obj, + const char *part) +{ + struct search_content_object *object = (struct search_content_object*)data; + SEARCH_DEBUG_WARNING("%s %d", object->name, object->string_type); + if (object) { + if (object->string_type == SEARCH_STR_TYPE_APP_STRING) + return strdup(gettext(object->name)); + else + return strdup(dgettext("sys_string", object->name)); + } - if(category_name) - return strdup(category_name); - else return strdup(""); } @@ -132,10 +223,16 @@ static char *__search_gl_label_get_more(void *data, Evas_Object * obj, return strdup(gettext("IDS_SSEARCH_BODY_MORE_RESULTS")); } -static void __search_gl_del(void *data, Evas_Object * obj) +static void __search_gl_del_grouptitle(void *data, Evas_Object * obj) { SEARCH_FUNC_START; + SEARCH_FUNC_END; + return; +} + +static void __search_gl_del(void *data, Evas_Object * obj) +{ struct search_item_sel *sel_mem_info = (struct search_item_sel *)data; SEARCH_FREE(sel_mem_info); @@ -143,6 +240,217 @@ static void __search_gl_del(void *data, Evas_Object * obj) return; } +static void __search_gl_del_more_button(void *data, Evas_Object * obj) +{ + struct search_item_more_sel *sel_mem_more = (struct search_item_more_sel *)data; + + SEARCH_FREE(sel_mem_more); + + return; +} + +int search_app_connect(void *data) +{ + SEARCH_FUNC_START; + + struct appdata *ad = (struct appdata *)data; + + int rc = 0, conn_ret = 0; + int ret = SEARCH_RET_SUCCESS; + int i = 0; + + for (i = 0; i < SEARCH_CONT_MAX ; ++i) { + switch (ad->result_obj[i].contents_type) { + case SEARCH_CONT_PHONE_CONTACTS: + { + if (ad->result_obj[i].visible == EINA_TRUE) { + rc = contacts_svc_connect(); + if (rc != CTS_SUCCESS) { + SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc); + } + } else { + rc = contacts_svc_disconnect(); + if (rc != CTS_SUCCESS) { + SEARCH_DEBUG_WARNING("contacts svc disconnect fail : %d",rc); + } + } + } + break; + + /* Contact-service should be conneted for display Message result. + Because We should display message with contact photo + if user have contact photo which have matched to tel-number of sender or receiver */ + case SEARCH_CONT_PHONE_MSG: + { + msg_error_t err = MSG_SUCCESS; + + if (ad->result_obj[i].visible == EINA_TRUE) { + + /* Connect Contact-service if contact category status is invisible */ + if (ad->result_obj[SEARCH_CONT_PHONE_CONTACTS].visible == EINA_FALSE) { + rc = contacts_svc_connect(); + if (rc != CTS_SUCCESS) { + /* If we fail to connect contact-service, display message-app icon */ + SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc); + } + } + + /* Connect Message-Service */ + err = msg_open_msg_handle(&ad->msg_handle); + + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("msg_open_msg_handle error : %d", err); + ad->msg_handle = NULL; + } + } else { + /* Disconnect Contact-service if contact category status is invisible */ + if (ad->result_obj[SEARCH_CONT_PHONE_CONTACTS].visible == EINA_FALSE) { + rc = contacts_svc_disconnect(); + if (rc != CTS_SUCCESS) + SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc); + } + + /* Disconnect Message-Service */ + if (ad->msg_handle != NULL ) { + err = msg_close_msg_handle(&ad->msg_handle); + + if (err != MSG_SUCCESS) + SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err); + ad->msg_handle = NULL; + } + } + } + break; + case SEARCH_CONT_PHONE_EMAIL: + break; + /* IMAGE, MUSIC, VIDEO use common handle */ + case SEARCH_CONT_PHONE_IMAGES: + case SEARCH_CONT_PHONE_MUSIC: + case SEARCH_CONT_PHONE_VIDEO: + { + if (ad->result_obj[SEARCH_CONT_PHONE_IMAGES].visible == EINA_TRUE + || ad->result_obj[SEARCH_CONT_PHONE_MUSIC].visible == EINA_TRUE + || ad->result_obj[SEARCH_CONT_PHONE_VIDEO].visible == EINA_TRUE ) { + conn_ret = media_content_connect(); + + if (conn_ret != 0) + SEARCH_DEBUG_WARNING("media_content_connect failed : %d\n", conn_ret); + } else { + conn_ret = media_content_disconnect(); + + if(conn_ret < 0) + SEARCH_DEBUG_WARNING("media_content_disconnect failed : %d\n", conn_ret); + } + } + break; + case SEARCH_CONT_PHONE_CALENDAR: + { + if (ad->result_obj[i].visible == EINA_TRUE) { + rc = calendar_svc_connect(); + if (rc != CAL_SUCCESS) { + SEARCH_DEBUG_WARNING + ("calendar svc connect fail : %d", + rc); + } + } else { + rc = calendar_svc_close(); + if (rc != CAL_SUCCESS) { + SEARCH_DEBUG_WARNING + ("calendar svc disconnect fail : %d", + rc); + } + } + } + break; + case SEARCH_CONT_PHONE_MEMO: + { + if (ad->result_obj[i].visible == EINA_TRUE) { + rc = memo_init(NULL); + if (rc == -1) { + SEARCH_DEBUG_WARNING + ("memo svc connect fail : %d", rc); + } + } else + memo_fini(); + } + break; + } + } + + SEARCH_FUNC_END; + + return ret; +} + +int search_app_disconnect(void *data) +{ + SEARCH_FUNC_START; + + struct appdata *ad = (struct appdata *)data; + + int rc = 0, conn_ret = 0; + int i = 0; + + for (i = 0; i < SEARCH_CONT_MAX ; ++i) { + switch (ad->result_obj[i].contents_type) { + case SEARCH_CONT_PHONE_CONTACTS: + { + rc = contacts_svc_disconnect(); + if (rc != CTS_SUCCESS) { + SEARCH_DEBUG_WARNING + ("contacts svc disconnect fail : %d", + rc); + } + } + break; + case SEARCH_CONT_PHONE_MSG: + { + if (ad->msg_handle != NULL ) { + msg_error_t err = MSG_SUCCESS; + err = msg_close_msg_handle(&ad->msg_handle); + + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err); + } + + ad->msg_handle = NULL; + } + } + break; + case SEARCH_CONT_PHONE_EMAIL: + break; + case SEARCH_CONT_PHONE_IMAGES: + case SEARCH_CONT_PHONE_MUSIC: + case SEARCH_CONT_PHONE_VIDEO: + { + conn_ret = media_content_disconnect(); + if(conn_ret != 0) + SEARCH_DEBUG_WARNING("media_content_disconnect failed : %d\n", conn_ret); + } + break; + case SEARCH_CONT_PHONE_CALENDAR: + { + rc = calendar_svc_close(); + if (rc != CAL_SUCCESS) { + SEARCH_DEBUG_WARNING + ("calendar svc disconnect fail : %d", + rc); + } + } + break; + case SEARCH_CONT_PHONE_MEMO: + { + memo_fini(); + } + break; + } + } + + SEARCH_FUNC_END; + + return 0; +} + void search_gl_phone_result_sel(void *data, Evas_Object * obj, void *event_info) { SEARCH_FUNC_START; @@ -150,7 +458,6 @@ void search_gl_phone_result_sel(void *data, Evas_Object * obj, void *event_info) struct appdata *ad = (struct appdata *)data; struct search_item_sel *cur_category_mem; Elm_Object_Item *it = (Elm_Object_Item *) event_info; - int ret = 0; cur_category_mem = (struct search_item_sel *)elm_object_item_data_get(it); @@ -158,44 +465,48 @@ void search_gl_phone_result_sel(void *data, Evas_Object * obj, void *event_info) return; } - switch (cur_category_mem->type) { + SEARCH_DEBUG_LOG("cur_category_mem->type : %d", cur_category_mem->type); - case SEARCH_TYPE_PHONE_CONTACTS: + switch (cur_category_mem->type) { + case SEARCH_CONT_PHONE_CONTACTS: search_launch_contact_view(ad, cur_category_mem); break; - case SEARCH_TYPE_PHONE_MSG: + case SEARCH_CONT_PHONE_MSG: search_launch_msg_view(ad, cur_category_mem); break; - case SEARCH_TYPE_PHONE_EMAIL: + case SEARCH_CONT_PHONE_EMAIL: search_launch_email_view(ad, cur_category_mem); break; - case SEARCH_TYPE_PHONE_IMAGES: + case SEARCH_CONT_PHONE_IMAGES: search_launch_image_view(ad, cur_category_mem); break; - case SEARCH_TYPE_PHONE_VIDEO: + case SEARCH_CONT_PHONE_VIDEO: search_launch_video_view(ad, cur_category_mem); break; - case SEARCH_TYPE_PHONE_MUSIC: + case SEARCH_CONT_PHONE_MUSIC: search_launch_music_view(ad, cur_category_mem); break; - - case SEARCH_TYPE_PHONE_CALENDAR: + + case SEARCH_CONT_PHONE_CALENDAR: search_launch_calendar_view(ad, cur_category_mem); break; - case SEARCH_TYPE_PHONE_MEMO: + case SEARCH_CONT_PHONE_MEMO: search_launch_memo_view(ad, cur_category_mem); break; - case SEARCH_TYPE_PHONE_MENU: + case SEARCH_CONT_PHONE_MENU: search_launch_menu_view(ad, cur_category_mem); break; + case SEARCH_CONT_PHONE_BROWSER: + search_launch_browser_view(ad, cur_category_mem); + default: break; } @@ -205,326 +516,521 @@ void search_gl_phone_result_sel(void *data, Evas_Object * obj, void *event_info) SEARCH_FUNC_END; } -void search_result_gl_init(void *data) -{ - SEARCH_FUNC_START; - - struct appdata *ad = (struct appdata *)data; - Evas_Object *genlist; - - - if (ad->itc_pslist_1line == NULL) { - ad->itc_pslist_1line = elm_genlist_item_class_new(); - ad->itc_pslist_1line->item_style = "1text.2"; - ad->itc_pslist_1line->func.text_get = __search_gl_label_get; - ad->itc_pslist_1line->func.content_get = NULL; - ad->itc_pslist_1line->func.state_get = __search_gl_state_get; - ad->itc_pslist_1line->func.del = __search_gl_del; - } - - - if (ad->itc_pslist_2line == NULL) { - ad->itc_pslist_2line = elm_genlist_item_class_new(); - ad->itc_pslist_2line->item_style = "2text.8"; - ad->itc_pslist_2line->func.text_get = __search_gl_label_get; - ad->itc_pslist_2line->func.content_get = NULL; - ad->itc_pslist_2line->func.state_get = __search_gl_state_get; - ad->itc_pslist_2line->func.del = __search_gl_del; - } - - if (ad->itc_grouptitle == NULL) { - ad->itc_grouptitle = elm_genlist_item_class_new(); - ad->itc_grouptitle->item_style = "grouptitle"; - ad->itc_grouptitle->func.text_get = __search_gl_label_get_title; - ad->itc_grouptitle->func.state_get = __search_gl_state_get; - ad->itc_grouptitle->func.del = __search_gl_del; - } - - if (ad->itc_listmore == NULL) { - ad->itc_listmore = elm_genlist_item_class_new(); - ad->itc_listmore->item_style = "1text.2"; - ad->itc_listmore->func.text_get = __search_gl_label_get_more; - ad->itc_listmore->func.state_get = __search_gl_state_get; - ad->itc_listmore->func.del = __search_gl_del; - } - - ad->search_gl = NULL; - - genlist = elm_genlist_add(ad->navi_bar); - - // To use multiline textblock/entry/editfield in genlist, set height_for_width mode - // then the item's height is calculated while the item's width fits to genlist width. - elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); - elm_genlist_tree_effect_enabled_set(genlist, EINA_TRUE); - - ad->search_gl = genlist; - - evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, - EVAS_HINT_FILL); - SEARCH_FUNC_END; -} - -void search_result_gl_deinit(void *data) +static int __search_gl_set_phone_search_result(struct search_content_object *obj, + int offset, + char *keyword, + void *data, + struct search_genlist_info *result_info) { SEARCH_FUNC_START; - struct appdata *ad = (struct appdata *)data; - - if (ad->itc_pslist_1line != NULL) - elm_genlist_item_class_free(ad->itc_pslist_1line); - - if (ad->itc_pslist_2line != NULL) - elm_genlist_item_class_free(ad->itc_pslist_2line); - - if (ad->itc_grouptitle != NULL) - elm_genlist_item_class_free(ad->itc_grouptitle); - - if (ad->itc_listmore != NULL) - elm_genlist_item_class_free(ad->itc_listmore); - - SEARCH_FUNC_END; -} - -static int __search_gl_set_phone_search_result(int type, int offset, char *keyword, - void *data) -{ - SEARCH_FUNC_START; - - int rc = 0; - int category = 0; - int loop_cnt = 0; - - int ret = 0; - int sel_cnt = SEARCH_CATEGORY_LIST_MORE_CNT + 1; int func_ret = 1; struct appdata *ad = (struct appdata *)data; - Evas_Object *glist; - ad->cate_info[type].offset = offset; + obj->mr_info.offset = offset; - if (offset == 0) { - ad->cate_info[type].next_point = 0; + if (obj->mr_info.offset == 0) { + obj->mr_info.next_point = 0; } - switch (type) { - - case SEARCH_TYPE_PHONE_CONTACTS: + SEARCH_DEBUG_LOG("offset : %d, limit : %d keyword : %s", offset, sel_cnt, keyword); + + if (obj->visible == EINA_TRUE ) { + switch (obj->contents_type) { + case SEARCH_CONT_PHONE_CONTACTS: { func_ret = - search_sql_contact_search_result_by_api(type, + search_sql_contact_search_result_by_api(obj, offset, sel_cnt, - data); + keyword, + ad, + result_info); } break; - case SEARCH_TYPE_PHONE_MSG: + case SEARCH_CONT_PHONE_MSG: { if (ad->msg_handle != NULL) { func_ret = - search_sql_msg_search_result_by_api(type, + search_sql_msg_search_result_by_api(obj, offset, - sel_cnt, - data); + sel_cnt, + keyword, + ad, + result_info); } } break; - case SEARCH_TYPE_PHONE_EMAIL: + case SEARCH_CONT_PHONE_EMAIL: { func_ret = - search_sql_email_search_result_by_api(type, + search_sql_email_search_result_by_api(obj, offset, - sel_cnt, - data); + sel_cnt, + keyword, + ad, + result_info); } - break; - case SEARCH_TYPE_PHONE_IMAGES: + break; + case SEARCH_CONT_PHONE_IMAGES: { - if (ad->media_handle != NULL ) { func_ret = - search_sql_image_search_result_by_api(type, + search_sql_image_search_result_by_api(obj, offset, - sel_cnt, - data); + sel_cnt, + keyword, + ad, + result_info); } + break; + case SEARCH_CONT_PHONE_MUSIC: + { + func_ret = + search_sql_music_search_result_by_api(obj, + offset, + sel_cnt, + keyword, + ad, + result_info); } - break; - case SEARCH_TYPE_PHONE_MUSIC: + break; + case SEARCH_CONT_PHONE_VIDEO: { - if (ad->media_handle != NULL ) { func_ret = - search_sql_music_search_result_by_api(type, + search_sql_video_search_result_by_api(obj, offset, - sel_cnt, - data); - } + sel_cnt, + keyword, + ad, + result_info); } break; - case SEARCH_TYPE_PHONE_VIDEO: + case SEARCH_CONT_PHONE_CALENDAR: { - if (ad->media_handle != NULL ) { func_ret = - search_sql_video_search_result_by_api(type, + search_sql_calendar_search_result_by_api(obj, offset, - sel_cnt, - data); + sel_cnt, + keyword, + ad, + result_info); } - } - break; - - case SEARCH_TYPE_PHONE_CALENDAR: + break; + case SEARCH_CONT_PHONE_MEMO: { func_ret = - search_sql_calendar_search_result_by_api(type, + search_sql_memo_search_result_by_api(obj, offset, sel_cnt, - data); + keyword, + ad, + result_info); } break; - - case SEARCH_TYPE_PHONE_MEMO: + case SEARCH_CONT_PHONE_MENU: { func_ret = - search_sql_memo_search_result_by_api(type, + search_sql_menu_search_result_by_api(obj, offset, - sel_cnt, - data); + sel_cnt, + keyword, + ad, + result_info); } break; - - case SEARCH_TYPE_PHONE_MENU: + case SEARCH_CONT_PHONE_BROWSER: { func_ret = - search_sql_menu_search_result_by_api(type, + search_sql_browser_search_result_by_api(obj, offset, sel_cnt, keyword, - data); + ad, + result_info); } - break; + } } SEARCH_FUNC_END; - return func_ret; } -void search_gl_result_more_item_append_cb(void *data, Evas_Object * obj, - void *event_info) +static void __search_thread_heavy_cb(void *data, Ecore_Thread *th) { SEARCH_FUNC_START; - struct appdata *ad = (struct appdata *)data; - Elm_Object_Item *it = (Elm_Object_Item *) event_info; + struct search_thread_data *thread_data = (struct search_thread_data*)data; + struct appdata *ad = thread_data->ad; + struct search_content_object *obj = NULL; + struct search_genlist_info *result_info = NULL; int ret = 0; - struct search_item_sel *sel_mem = - (search_item_sel *) elm_object_item_data_get(it); - struct search_item_sel *sel_mem_info = NULL; - struct search_item_sel *sel_mem_more = NULL; + int i = SEARCH_CONT_PHONE_MIN; + int category_type = 0; - char* escape_added_keyword = NULL; - SEARCH_MALLOC(escape_added_keyword, strlen(ad->search_word)*2+5, char); - memset(escape_added_keyword, 0x0, strlen(ad->search_word)*2+5); + SEARCH_DEBUG_LOG("Thread ID : %p Keyword : %s", th, thread_data->keyword); - int rc = 0, i = 0; - int type = sel_mem->type; - int offset = ad->cate_info[type].next_point; + thread_data->ad = ad; + thread_data->is_search_result = SEARCH_RET_SEARCH_NONE; - search_sql_make_keyword_bind_value(ad->search_word, escape_added_keyword, SEARCH_SQL_BIND_TYPE_DUPLEX); + while (i <= SEARCH_CONT_PHONE_MAX) { + int offset = 0; + obj = &ad->result_obj[i]; + category_type = obj->category_type; - elm_object_item_del(it); + if (category_type == SEARCH_OBJ_PHONE_CONTENTS) { + if (ecore_thread_check(th) != EINA_TRUE) { + result_info = (struct search_genlist_info *)calloc(1, sizeof(struct search_genlist_info)); + ret = __search_gl_set_phone_search_result(obj, + offset, + thread_data->keyword, + ad, + result_info); + + if (ret == SEARCH_RET_SEARCH_SUCCESS) { + SEARCH_DEBUG_LOG("Succes to Matched result : %s %d", obj->name, ret); + thread_data->is_search_result = SEARCH_RET_SEARCH_SUCCESS; + ecore_thread_feedback(th, result_info); + } else { + SEARCH_FREE(result_info); + } + } + } + i++; + } + SEARCH_FUNC_END; +} - __search_gl_set_phone_search_result(type, offset, escape_added_keyword, ad); + +static void __search_thread_feedback_cb(void *data, Ecore_Thread *th, void *msg_data) +{ + SEARCH_FUNC_START; + + struct search_thread_data *thread_data = (struct search_thread_data *)data; + struct appdata *ad = thread_data->ad; + struct search_genlist_info *result_list = (struct search_genlist_info *)msg_data; + struct search_pipe_data *pdata = NULL; + + pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data)); + pdata->cmd = SEARCH_PIPE_CMD_ADD_GENLIST_PHONE; + pdata->obj = NULL; + pdata->result_list = result_list; + pdata->search_ret = thread_data->is_search_result; + + if (ecore_thread_check(th) == EINA_TRUE) + return; + + ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data)); SEARCH_FUNC_END; } -static int __search_set_phone_result_list(struct appdata *ad, bool is_input_keyword, const char* search_keyword) +static void __search_thread_end_cb(void *data, Ecore_Thread *th) { SEARCH_FUNC_START; - int i = 0, is_search_result = 0, ret = 0; + struct search_thread_data *thread_data = (struct search_thread_data *)data; + struct appdata *ad = thread_data->ad; + struct search_pipe_data *pdata = NULL; - if (is_input_keyword == false) { - return SEARCH_RET_SEARCH_NONE; - } else { + pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data)); + pdata->cmd = SEARCH_PIPE_CMD_SET_LAYOUT; + pdata->search_ret = thread_data->is_search_result; - int offset = 0; + if (ecore_thread_check(th) == EINA_TRUE) + return; - while (i < PHONE_CATEGORY_LIST_CNT) { - ret = __search_gl_set_phone_search_result(i, - offset, - (char*)search_keyword, - ad); - if (ret == SEARCH_RET_SEARCH_SUCCESS) { - is_search_result = 1; - } + ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data)); - i++; - } + SEARCH_FREE(thread_data->keyword); + SEARCH_FREE(thread_data); - if(is_search_result == 0) { - return SEARCH_RET_SEARCH_NONE; - } else { - return SEARCH_RET_SEARCH_SUCCESS; - } - } + SEARCH_FUNC_END; } -Eina_Bool search_set_result_list(void *data) +static void __search_thread_cancel_cb(void *data, Ecore_Thread *th) +{ + SEARCH_FUNC_START; + + struct search_thread_data *thread_data = (struct search_thread_data *)data; + + SEARCH_FREE(thread_data->keyword); + SEARCH_FREE(thread_data); + + SEARCH_FUNC_END; +} + +void search_stop_search(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; - char *text; + + if (ad->search_thread) { + ecore_thread_cancel(ad->search_thread); + ad->search_thread = NULL; + } + + if (ad->search_timer) { + ecore_timer_del(ad->search_timer); + ad->search_timer = NULL; + } + + SEARCH_FUNC_END; +} + +Ecore_Thread* search_make_result_thread(void *data) +{ + SEARCH_FUNC_START; + int ret = 0; + Ecore_Thread *th = NULL; + struct appdata *ad = (struct appdata *)data; + struct search_thread_data *thread_data = NULL; + + /* set keyword to vconf for save last search histroy */ + ret = vconf_set_str(SMARTSEARCH_KEY_KEYWORD, ad->not_markup_search_word); + + if (ret < 0) + SEARCH_DEBUG_WARNING("Error : set keyword to vconf"); + + /* Create Thread for Phone Search */ + thread_data = (struct search_thread_data *)calloc(1, sizeof(struct search_thread_data)); + thread_data->ad = ad; + thread_data->is_search_result = SEARCH_RET_SEARCH_NONE; + thread_data->keyword = strdup(ad->search_word); + + th = ecore_thread_feedback_run(__search_thread_heavy_cb, + __search_thread_feedback_cb, + __search_thread_end_cb, + __search_thread_cancel_cb, + thread_data, + EINA_TRUE); + + SEARCH_FUNC_END; + return th; +} + + +void search_result_gl_init(void *data) +{ + SEARCH_FUNC_START; + + struct appdata *ad = (struct appdata *)data; + + ad->pipe = ecore_pipe_add(ecore_exe_pipe_cb, ad); + eina_lock_new(&ad->mutex); + eina_condition_new(&ad->condition, &ad->mutex); + + Evas_Object *genlist; + + if (ad->itc_pslist_1line == NULL) { + ad->itc_pslist_1line = elm_genlist_item_class_new(); + ad->itc_pslist_1line->item_style = "1text.2"; + ad->itc_pslist_1line->func.text_get = __search_gl_label_get_search_item_type; + ad->itc_pslist_1line->func.content_get = __search_gl_content_get_search_item_type; + ad->itc_pslist_1line->func.state_get = __search_gl_state_get; + ad->itc_pslist_1line->func.del = __search_gl_del; + } + + if (ad->itc_pslist_1line_1icon == NULL) { + ad->itc_pslist_1line_1icon = elm_genlist_item_class_new(); + ad->itc_pslist_1line_1icon->item_style = "1text.1icon.2.tb"; + ad->itc_pslist_1line_1icon->func.text_get = __search_gl_label_get_search_item_type; + ad->itc_pslist_1line_1icon->func.content_get = __search_gl_content_get_search_item_type; + ad->itc_pslist_1line_1icon->func.state_get = __search_gl_state_get; + ad->itc_pslist_1line_1icon->func.del = __search_gl_del; + } + + if (ad->itc_pslist_1line_2icon == NULL) { + ad->itc_pslist_1line_2icon = elm_genlist_item_class_new(); + ad->itc_pslist_1line_2icon->item_style = "1text.2icon.6.tb"; + ad->itc_pslist_1line_2icon->func.text_get = __search_gl_label_get_search_item_type; + ad->itc_pslist_1line_2icon->func.content_get = __search_gl_content_get_search_item_type; + ad->itc_pslist_1line_2icon->func.state_get = __search_gl_state_get; + ad->itc_pslist_1line_2icon->func.del = __search_gl_del; + } + + if (ad->itc_pslist_2line_1icon == NULL) { + ad->itc_pslist_2line_1icon = elm_genlist_item_class_new(); + ad->itc_pslist_2line_1icon->item_style = "2text.1icon.4.tb"; + ad->itc_pslist_2line_1icon->func.text_get = __search_gl_label_get_search_item_type; + ad->itc_pslist_2line_1icon->func.content_get = __search_gl_content_get_search_item_type; + ad->itc_pslist_2line_1icon->func.state_get = __search_gl_state_get; + ad->itc_pslist_2line_1icon->func.del = __search_gl_del; + } + + if (ad->itc_pslist_2line_2icon == NULL) { + ad->itc_pslist_2line_2icon = elm_genlist_item_class_new(); + ad->itc_pslist_2line_2icon->item_style = "2text.2icon.4.tb"; + ad->itc_pslist_2line_2icon->func.text_get = __search_gl_label_get_search_item_type; + ad->itc_pslist_2line_2icon->func.content_get = __search_gl_content_get_search_item_type; + ad->itc_pslist_2line_2icon->func.state_get = __search_gl_state_get; + ad->itc_pslist_2line_2icon->func.del = __search_gl_del; + } + + if (ad->itc_grouptitle == NULL) { + ad->itc_grouptitle = elm_genlist_item_class_new(); + ad->itc_grouptitle->item_style = "grouptitle"; + ad->itc_grouptitle->func.text_get = __search_gl_label_get_group; + ad->itc_grouptitle->func.state_get = __search_gl_state_get; + ad->itc_grouptitle->func.del = __search_gl_del_grouptitle; + } + + if (ad->itc_label == NULL) { + ad->itc_label = elm_genlist_item_class_new(); + ad->itc_label->item_style = "grouptitle"; + ad->itc_label->func.text_get = __search_gl_label_get_normal_type; + ad->itc_label->func.state_get = __search_gl_state_get; + ad->itc_label->func.del = __search_gl_del_grouptitle; + } + + if (ad->itc_listmore == NULL) { + ad->itc_listmore = elm_genlist_item_class_new(); + ad->itc_listmore->item_style = "1text.2"; + ad->itc_listmore->func.text_get = __search_gl_label_get_more; + ad->itc_listmore->func.state_get = __search_gl_state_get; + ad->itc_listmore->func.del = __search_gl_del_more_button; + } + + ad->search_gl = NULL; + + genlist = elm_genlist_add(ad->navi_bar); + + // To use multiline textblock/entry/editfield in genlist, set height_for_width mode + // then the item's height is calculated while the item's width fits to genlist width. + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + elm_genlist_tree_effect_enabled_set(genlist, EINA_TRUE); + + ad->search_gl = genlist; + + evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, + EVAS_HINT_FILL); + SEARCH_FUNC_END; +} + +void search_result_gl_deinit(void *data) +{ + SEARCH_FUNC_START; + + struct appdata *ad = (struct appdata *)data; + + ecore_pipe_del(ad->pipe); + eina_condition_free(&ad->condition); + eina_lock_free(&ad->mutex); + + if (ad->itc_pslist_1line != NULL) + elm_genlist_item_class_free(ad->itc_pslist_1line); + + if (ad->itc_pslist_1line_1icon != NULL) + elm_genlist_item_class_free(ad->itc_pslist_1line_1icon); + + if (ad->itc_pslist_1line_2icon != NULL) + elm_genlist_item_class_free(ad->itc_pslist_2line_1icon); + + if (ad->itc_pslist_2line_1icon != NULL) + elm_genlist_item_class_free(ad->itc_pslist_2line_1icon); + + if (ad->itc_pslist_2line_2icon != NULL) + elm_genlist_item_class_free(ad->itc_pslist_2line_2icon); + + if (ad->itc_grouptitle != NULL) + elm_genlist_item_class_free(ad->itc_grouptitle); + + if (ad->itc_label != NULL) + elm_genlist_item_class_free(ad->itc_label); + + if (ad->itc_listmore != NULL) + elm_genlist_item_class_free(ad->itc_listmore); + + SEARCH_FUNC_END; +} + + +void search_gl_result_more_item_append_cb(void *data, Evas_Object * obj, + void *event_info) +{ + SEARCH_FUNC_START; + + struct appdata *ad = (struct appdata *)data; + Elm_Object_Item *it = (Elm_Object_Item *) event_info; + struct search_pipe_data *pdata = NULL; + struct search_genlist_info *result_info = NULL; + struct search_item_more_sel *sel_more = + (search_item_more_sel *)elm_object_item_data_get(it); + + struct search_content_object *content_obj = sel_more->obj; + int offset = content_obj->mr_info.next_point; + int ret = SEARCH_RET_SEARCH_NONE; + + elm_object_item_del(it); + + result_info = (struct search_genlist_info *)calloc(1, sizeof(struct search_genlist_info)); + ret = __search_gl_set_phone_search_result(content_obj, + offset, + ad->search_word, + ad, + result_info); + + pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data)); + pdata->cmd = SEARCH_PIPE_CMD_ADD_GENLIST_PHONE; + pdata->obj = NULL; + pdata->result_list = result_info; + pdata->search_ret = ret; + ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data)); + + pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data)); + pdata->cmd = SEARCH_PIPE_CMD_SET_LAYOUT; + pdata->search_ret = ret; + ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data)); + + SEARCH_FUNC_END; +} + +void search_set_result_list(void *data) +{ + struct appdata *ad = (struct appdata *)data; + int category = ad->search_category; + bool is_input_keyword = false; - char* escape_added_keyword = NULL; - int bind_type = 0; - int search_ret = SEARCH_RET_SEARCH_NONE; + struct search_pipe_data *pipe_data = NULL; + char *text = NULL; - SEARCH_ASSERT_IF(!ad); + search_stop_search(ad); text = elm_entry_markup_to_utf8(elm_object_text_get(ad->search_entry)); - SEARCH_FREE(ad->not_markup_search_word); SEARCH_FREE(ad->search_word); if((text) && (strlen(text) > 0)) { ad->not_markup_search_word = strdup(elm_object_text_get(ad->search_entry)); ad->search_word = text; - - SEARCH_MALLOC(escape_added_keyword, strlen(ad->search_word)*2+5, char); - memset(escape_added_keyword, 0x0, strlen(ad->search_word)*2+5); - - bind_type = SEARCH_SQL_BIND_TYPE_DUPLEX; - - search_sql_make_keyword_bind_value(ad->search_word, escape_added_keyword, bind_type); is_input_keyword = true; - - elm_genlist_clear(ad->search_gl); - - search_ret = __search_set_phone_result_list(ad, is_input_keyword, ad->search_word); + } else if ( category == SEARCH_CATE_PHONE) { + pipe_data = (struct search_pipe_data *)calloc(1, sizeof(struct search_pipe_data)); + pipe_data->cmd = SEARCH_PIPE_CMD_SET_LAYOUT; + pipe_data->search_ret = SEARCH_RET_SEARCH_NONE; + ecore_pipe_write(ad->pipe, &pipe_data, sizeof(struct search_pipe_data)); + return; } - if(search_ret == SEARCH_RET_SEARCH_SUCCESS) { - search_layout_set_search_list(ad); - } else { - search_layout_set_search_no_result(ad); - } - - SEARCH_FREE(escape_added_keyword); - - SEARCH_FUNC_END; + /* If category is Phone, make a thread for search */ + pipe_data = (struct search_pipe_data *)calloc(1, sizeof(struct search_pipe_data)); + pipe_data->cmd = SEARCH_PIPE_CMD_CLEAR_GENLIST; + ecore_pipe_write(ad->pipe, &pipe_data, sizeof(struct search_pipe_data)); - return EINA_FALSE; + switch(category) { + case SEARCH_CATE_PHONE: + ad->search_thread = search_make_result_thread(ad); + break; + } } void search_layout_set_search_list(void* data) @@ -537,10 +1043,13 @@ void search_layout_set_search_list(void* data) elm_object_part_content_unset(ad->sb_layout,"list_noresult"); evas_object_hide(ad->noresult_view); + if (ad->search_gl) { elm_object_part_content_set(ad->sb_layout, "list", ad->search_gl); evas_object_show(ad->search_gl); } + } + if (ad->search_gl) elm_genlist_item_show(elm_genlist_first_item_get(ad->search_gl), ELM_GENLIST_ITEM_SCROLLTO_TOP); SEARCH_FUNC_END; @@ -555,6 +1064,8 @@ void search_layout_set_search_no_result(void* data) if (elm_object_part_content_get(ad->sb_layout,"list")) { elm_object_part_content_unset(ad->sb_layout, "list"); + + if (ad->search_gl) evas_object_hide(ad->search_gl); elm_object_part_content_set(ad->sb_layout,"list_noresult", ad->noresult_view); @@ -583,5 +1094,5 @@ int search_layout_get_content_list_set_status(void* data) return ret; } - + diff --git a/src/ps_searcher.cpp b/src/ps_searcher.cpp index 58414c6..ff74b42 100755 --- a/src/ps_searcher.cpp +++ b/src/ps_searcher.cpp @@ -1,12 +1,12 @@ /* * Copyright 2012 Samsung Electronics Co., Ltd - * + * * Licensed under the Flora License, Version 1.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.tizenopensource.org/license - * + * * 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. @@ -27,21 +27,43 @@ #include <calendar-svc-provider.h> #include <memo-db.h> -#include <email-types.h> -#include <email-api.h> +#include <email-api-mail.h> -#include <visual-svc.h> -#include <visual-svc-types.h> -#include <audio-svc.h> -#include <audio-svc-types.h> -#include <audio-svc-error.h> +#include <favorites.h> +#include <media_content.h> -#include <ail.h> +#include <msg_storage.h> +#include <msg_storage_types.h> +#include <msg.h> -static GList *g_history_list; +#include <ail.h> +#include <unicode/ucal.h> +#include <unicode/ustring.h> +#include <unicode/ustdio.h> +#include <unicode/udat.h> char* g_keyword = NULL; +struct search_cb_data { + struct search_content_object *obj; + struct appdata *ad; + char *keyword; + struct search_genlist_info *result_info; +}; + +struct search_cb_data_browser { + struct search_content_object *obj; + struct appdata *ad; + char *keyword; + struct search_genlist_info *result_info; + struct search_more_result *info; +}; + +struct media_cb_data { + bool is_sdcard; + char *dirname; +}; + int search_sql_stmt_init(sqlite3_stmt * sql_stmt) { SEARCH_FUNC_START; @@ -61,6 +83,8 @@ int search_sql_stmt_init(sqlite3_stmt * sql_stmt) } SEARCH_FUNC_END; + + return SEARCH_RET_SUCCESS; } int search_sql_stmt_finalize(sqlite3_stmt * stmt) @@ -101,45 +125,88 @@ int search_sql_prepare_stmt(sqlite3 *db_handle, const char *query, return ret; } +int search_sql_bind_text(sqlite3* db_handle, sqlite3_stmt *sql_stmt, int col, char *data) +{ + int rc = 0; + int ret = SEARCH_RET_SEARCH_NONE; + + rc = sqlite3_bind_text(sql_stmt, col, data, strlen(data), SQLITE_STATIC); + if (rc != SQLITE_OK) { + SEARCH_DEBUG_ERROR("SQL BIND TEXT ERROR : %s(%d) / %s\n", + sqlite3_errmsg(db_handle), + rc, + data); + ret = SEARCH_RET_SEARCH_FAIL; + } + + return ret; +} + +int search_sql_bind_int(sqlite3* db_handle, sqlite3_stmt *sql_stmt, int col, int data) +{ + int rc = 0; + int ret = SEARCH_RET_SEARCH_NONE; + + rc = sqlite3_bind_int(sql_stmt, col, data); + if (rc != SQLITE_OK) { + SEARCH_DEBUG_ERROR("SQL BIND INT ERROR : %s(%d) / %d\n", + sqlite3_errmsg(db_handle), + rc, + data); + ret = SEARCH_RET_SEARCH_FAIL; + } + return ret; +} + static int __search_sql_contact_search_result_cb(CTSvalue * value, void *user_data) { SEARCH_FUNC_START; - struct appdata *ad = (struct appdata *)user_data; + struct search_cb_data *scd = (struct search_cb_data*)user_data; - struct search_item_sel *sel_mem = NULL; - int type = SEARCH_TYPE_PHONE_CONTACTS; + struct appdata *ad = scd->ad; + struct search_content_object* obj = scd->obj; + struct search_genlist_info *result_info = scd->result_info; + char *keyword = scd->keyword; struct search_item_sel *sel_mem_info = NULL; + struct search_item_more_sel *sel_mem_more = NULL; + struct search_genlist_item_info *gen_item = NULL; + + const char* contact_img_path = NULL; char display_name[128] = { 0, }; const char *first, *last, *display, *number; bool is_word_in_str; - if (ad->cate_info[type].next_point == 0) { - //### Set group title - - sel_mem = - (struct search_item_sel *)calloc(1, - sizeof(struct - search_item_sel)); - sel_mem->type = type; - - ad->gl_result_group_item[type] = - elm_genlist_item_append(ad->search_gl, - (ad->itc_grouptitle), sel_mem, - (Elm_Object_Item *) NULL, - ELM_GENLIST_ITEM_GROUP, NULL, NULL); + if (obj->mr_info.next_point == 0) { + //### Set group title + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, + NULL); } - if (ad->cate_info[type].next_point < - ad->cate_info[type].offset + SEARCH_CATEGORY_LIST_MORE_CNT) { + if (obj->mr_info.next_point < + obj->mr_info.offset + SEARCH_CATEGORY_LIST_MORE_CNT) { sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); - sel_mem_info->type = type; + sel_mem_info->type = obj->contents_type; + + contact_img_path = contacts_svc_value_get_str(value, + CTS_LIST_NUM_CONTACT_IMG_PATH_STR); + + if (contact_img_path != NULL) { + strncpy(sel_mem_info->icon1_path, contact_img_path, + MAX_LENGTH_PER_PATH - 1); + } + else if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); /************ START : set search result to sel_mem_info buf ************/ @@ -202,64 +269,58 @@ static int __search_sql_contact_search_result_cb(CTSvalue * value, } } - if((display_name) && strlen(display_name) > 0) { - char* markup_text_1line = elm_entry_utf8_to_markup(display_name); - + SEARCH_DEBUG_LOG("display_name : %s", display_name); + + if(strlen(display_name) > 0) { strncpy(sel_mem_info->main_buf, - search_markup_keyword(markup_text_1line, ad->not_markup_search_word, &is_word_in_str), + search_markup_keyword(display_name, keyword, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - - SEARCH_FREE(markup_text_1line); - } + } /***********************************************************************/ number = contacts_svc_value_get_str(value, CTS_LIST_NUM_NUMBER_STR); if((number) && strlen(number) > 0) { - char* markup_text_2line = elm_entry_utf8_to_markup(number); - strncpy(sel_mem_info->sub_buf, - search_markup_keyword(markup_text_2line, ad->not_markup_search_word, &is_word_in_str), + search_markup_keyword(number, keyword, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_2line); } - + /***********************************************************************/ snprintf(sel_mem_info->main_id, MAX_LENGTH_PER_ID - 1, "%d", contacts_svc_value_get_int(value, CTS_LIST_NUM_CONTACT_ID_INT)); - + SEARCH_DEBUG_LOG("Search CT_ID: %d", sel_mem_info->main_id); /***********************************************************************/ /************ END : set search result to sel_mem_info buf **************/ - - elm_genlist_item_append(ad->search_gl, (ad->itc_pslist_2line), + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + ad->itc_pslist_2line_1icon, sel_mem_info, - ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_phone_result_sel, ad); - - ad->cate_info[type].next_point++; - } else if (ad->cate_info[type].next_point == - ad->cate_info[type].offset + + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); + obj->mr_info.next_point++; + } else if (obj->mr_info.next_point == + obj->mr_info.offset + SEARCH_CATEGORY_LIST_MORE_CNT) { /* Set more title to genlist (under 'search all') */ - sel_mem = - (struct search_item_sel *)calloc(1, + sel_mem_more = + (struct search_item_more_sel *)calloc(1, sizeof(struct - search_item_sel)); - sel_mem->type = type; - - elm_genlist_item_append(ad->search_gl, (ad->itc_listmore), - sel_mem, ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_result_more_item_append_cb, - ad); + search_item_more_sel)); + sel_mem_more->obj = obj; + + result_info->more = search_add_genlist_item(SEARCH_GENLIST_MORE, + obj, + ad->itc_listmore, + sel_mem_more, + obj->gl_result_grp); } else { SEARCH_DEBUG_WARNING ("__search_sql_contact_search_result_cb wrong index : %d", - ad->cate_info[type].next_point); + obj->mr_info.next_point); } SEARCH_FUNC_END; @@ -267,26 +328,28 @@ static int __search_sql_contact_search_result_cb(CTSvalue * value, return 0; } -int search_sql_contact_search_result_by_api(int type, int offset, int limit, - void *data) +int search_sql_contact_search_result_by_api(struct search_content_object *obj, + int offset, int limit, char *keyword, void *data, struct search_genlist_info *result_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; + struct search_cb_data scd = {obj, ad, keyword, result_info}; + int ret = 0; /* Check whether search result is exist or not */ ret = - contacts_svc_smartsearch_excl(ad->search_word, limit, offset, + contacts_svc_smartsearch_excl(keyword, limit, offset, __search_sql_contact_search_result_cb, - data); + &scd); if (ret != CTS_SUCCESS) { SEARCH_DEBUG_WARNING("contacts svc search return error : %d", ret); return SEARCH_RET_SEARCH_FAIL; } - if (ad->cate_info[type].next_point == 0) { + if (obj->mr_info.next_point == 0) { SEARCH_DEBUG_WARNING("contacts svc search no result"); return SEARCH_RET_SEARCH_NONE; } @@ -296,8 +359,8 @@ int search_sql_contact_search_result_by_api(int type, int offset, int limit, return SEARCH_RET_SEARCH_SUCCESS; } -int search_sql_calendar_search_result_by_api(int type, int offset, int limit, - void *data) +int search_sql_calendar_search_result_by_api(struct search_content_object *obj, + int offset, int limit, char *keyword, void *data, struct search_genlist_info *result_info) { SEARCH_FUNC_START; @@ -307,22 +370,23 @@ int search_sql_calendar_search_result_by_api(int type, int offset, int limit, cal_struct *event = NULL; cal_iter *iter = NULL; - struct search_item_sel *sel_mem = NULL; - Elm_Object_Item *git = NULL; - Evas_Object *glist; - struct search_item_sel *sel_mem_info = NULL; + struct search_item_more_sel *sel_mem_more = NULL; + struct search_genlist_item_info *gen_item = NULL; + int loop_cnt = 0; char *summary = NULL; bool is_word_in_str; - time_t start_time = 0; + int time_type = 0; - ret = - calendar_svc_search_list(0, 0, CAL_STRUCT_SCHEDULE, - CAL_VALUE_TXT_SUMMARY, ad->search_word, - offset, limit, &iter); + long long int start_time = 0; + UErrorCode status = U_ZERO_ERROR; + UCalendar *cal; + int y = 0, m = 0, d = 0; + + ret = calendar_svc_smartsearch_excl(keyword, offset, limit, &iter); if (ret == CAL_SUCCESS) { ret = calendar_svc_iter_next(iter); @@ -332,24 +396,12 @@ int search_sql_calendar_search_result_by_api(int type, int offset, int limit, return SEARCH_RET_SEARCH_NONE; } /* Set group title */ - glist = ad->search_gl; - if (offset == 0) { - sel_mem = - (struct search_item_sel *)calloc(1, - sizeof(struct - search_item_sel)); - sel_mem->type = type; - - git = - elm_genlist_item_append(glist, - (ad->itc_grouptitle), - sel_mem, - (Elm_Object_Item *) NULL, - ELM_GENLIST_ITEM_GROUP, - NULL, NULL); - - ad->gl_result_group_item[type] = git; + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, + NULL); } /* Set search result to genlist */ do { @@ -368,48 +420,60 @@ int search_sql_calendar_search_result_by_api(int type, int offset, int limit, sizeof (struct search_item_sel)); - sel_mem_info->type = type; + sel_mem_info->type = obj->contents_type; + + if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); summary = calendar_svc_struct_get_str(event, CAL_VALUE_TXT_SUMMARY); - if ((summary) && (strlen(summary) > 0)) { - char* markup_text_1line = elm_entry_utf8_to_markup(summary); - + if ((summary) && (strlen(summary) > 0)) { strncpy(sel_mem_info->main_buf, - search_markup_keyword(markup_text_1line, - ad->not_markup_search_word, + search_markup_keyword(summary, + keyword, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - - SEARCH_FREE(markup_text_1line); - } + } snprintf(sel_mem_info->main_id, MAX_LENGTH_PER_ID - 1, "%d", calendar_svc_struct_get_int(event, CAL_VALUE_INT_INDEX)); - start_time = - calendar_svc_struct_get_time(event, - CAL_VALUE_GMT_START_DATE_TIME, - CAL_TZ_FLAG_GMT); - search_util_date_time_format_get_val(localtime - (&start_time), - sel_mem_info->sub_buf); + time_type = calendar_svc_struct_get_int(event, CALS_VALUE_INT_DTSTART_TYPE); + + if (time_type == CALS_TIME_LOCALTIME) { + y = calendar_svc_struct_get_int(event, CALS_VALUE_INT_DTSTART_YEAR); + m = calendar_svc_struct_get_int(event, CALS_VALUE_INT_DTSTART_MONTH); + d = calendar_svc_struct_get_int(event, CALS_VALUE_INT_DTSTART_MDAY); + } else if (time_type == CALS_TIME_UTIME) { + start_time = calendar_svc_struct_get_lli(event, + CALS_VALUE_LLI_DTEND_UTIME); + UChar *_tzid; + _tzid = (UChar *)malloc(sizeof(UChar) * (strlen("Europe/Berlin") + 1)); + if (_tzid) u_uastrcpy(_tzid, "Europe/Berlin"); + + cal = ucal_open(_tzid, u_strlen(_tzid), "en_US", UCAL_TRADITIONAL, &status); + ucal_setMillis(cal, (double)(start_time * 1000.0), &status); + y = ucal_get(cal, UCAL_YEAR, &status); + m = ucal_get(cal, UCAL_MONTH, &status); + d = ucal_get(cal, UCAL_DATE, &status); + ucal_close(cal); + } + snprintf(sel_mem_info->sub_buf, MAX_LENGTH_PER_LINE, "%d.%d.%d", y,m,d); calendar_svc_struct_free(&event); summary = NULL; - elm_genlist_item_append(glist, - (ad->itc_pslist_1line), + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + ad->itc_pslist_2line_1icon, sel_mem_info, - ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_phone_result_sel, - ad); - sel_mem_info = NULL; + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); } else { SEARCH_DEBUG_WARNING ("calendar_svc_iter_get_info fail : %d", @@ -426,19 +490,19 @@ int search_sql_calendar_search_result_by_api(int type, int offset, int limit, /* Set more title to genlist (under 'search all') */ if (loop_cnt == limit) { - ad->cate_info[type].next_point = offset + limit - 1; + obj->mr_info.next_point = offset + limit - 1; - sel_mem = - (struct search_item_sel *)calloc(1, + sel_mem_more = + (struct search_item_more_sel *)calloc(1, sizeof(struct - search_item_sel)); - sel_mem->type = type; - - elm_genlist_item_append(ad->search_gl, (ad->itc_listmore), - sel_mem, ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_result_more_item_append_cb, - ad); + search_item_more_sel)); + sel_mem_more->obj = obj; + + result_info->more = search_add_genlist_item(SEARCH_GENLIST_MORE, + obj, + ad->itc_listmore, + sel_mem_more, + obj->gl_result_grp); } SEARCH_FUNC_END; @@ -450,12 +514,16 @@ static void __search_sql_memo_search_result_cb(memo_data_t * value, { SEARCH_FUNC_START; - struct appdata *ad = (struct appdata *)user_data; - - struct search_item_sel *sel_mem = NULL; - int type = SEARCH_TYPE_PHONE_MEMO; + struct search_cb_data *scd = (struct search_cb_data *)user_data; + struct appdata *ad = scd->ad; + struct search_content_object *obj = scd->obj; + struct search_genlist_info *result_info = scd->result_info; + struct search_genlist_item_info *gen_item = NULL; struct search_item_sel *sel_mem_info = NULL; + struct search_item_more_sel *sel_mem_more = NULL; + + char *keyword = scd->keyword; bool is_word_in_str; @@ -464,51 +532,41 @@ static void __search_sql_memo_search_result_cb(memo_data_t * value, return; } - if (ad->cate_info[type].next_point == 0) { + if (obj->mr_info.next_point == 0) { /* Set group title */ - - sel_mem = - (struct search_item_sel *)calloc(1, - sizeof(struct - search_item_sel)); - sel_mem->type = type; - - ad->gl_result_group_item[type] = - elm_genlist_item_append(ad->search_gl, - (ad->itc_grouptitle), sel_mem, - (Elm_Object_Item *) NULL, - ELM_GENLIST_ITEM_GROUP, NULL, NULL); + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, + NULL); } - if (ad->cate_info[type].next_point < - ad->cate_info[type].offset + SEARCH_CATEGORY_LIST_MORE_CNT) { + if (obj->mr_info.next_point < + obj->mr_info.offset + SEARCH_CATEGORY_LIST_MORE_CNT) { sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); - sel_mem_info->type = type; + sel_mem_info->type = obj->contents_type; /********** START : set search result to sel_mem_info buf ************/ + + if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); + /* First, We should check comment field. It means drawing memo * If comment field is NULL, then we check content field */ if ((value->comment) && (strlen(value->comment) > 0)) { - char* markup_text_1line = elm_entry_utf8_to_markup(value->comment); - strncpy(sel_mem_info->main_buf, - search_markup_keyword(markup_text_1line, ad->not_markup_search_word, + search_markup_keyword(value->comment, keyword, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - - SEARCH_FREE(markup_text_1line); } else if ((value->content) && (strlen(value->content) > 0)) { - char* markup_text_1line = elm_entry_utf8_to_markup(value->content); - strncpy(sel_mem_info->main_buf, - search_markup_keyword(markup_text_1line, ad->not_markup_search_word, + search_markup_keyword(value->content, keyword, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - - SEARCH_FREE(markup_text_1line); } snprintf(sel_mem_info->main_id, MAX_LENGTH_PER_ID - 1, "%d", value->id); @@ -518,32 +576,32 @@ static void __search_sql_memo_search_result_cb(memo_data_t * value, /********** END : set search result to sel_mem_info buf *************/ - elm_genlist_item_append(ad->search_gl, (ad->itc_pslist_1line), + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + ad->itc_pslist_2line_1icon, sel_mem_info, - ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_phone_result_sel, ad); + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); - ad->cate_info[type].next_point++; - } else if (ad->cate_info[type].next_point == - ad->cate_info[type].offset + - SEARCH_CATEGORY_LIST_MORE_CNT) { + obj->mr_info.next_point++; + } else if (obj->mr_info.next_point == + obj->mr_info.offset + SEARCH_CATEGORY_LIST_MORE_CNT) { /* Set more title to genlist (under 'search all') */ - sel_mem = - (struct search_item_sel *)calloc(1, + sel_mem_more = + (struct search_item_more_sel *)calloc(1, sizeof(struct - search_item_sel)); - sel_mem->type = type; - - elm_genlist_item_append(ad->search_gl, (ad->itc_listmore), - sel_mem, ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_result_more_item_append_cb, - ad); + search_item_more_sel)); + sel_mem_more->obj = obj; + + result_info->more = search_add_genlist_item(SEARCH_GENLIST_MORE, + obj, + ad->itc_listmore, + sel_mem_more, + obj->gl_result_grp); } else { SEARCH_DEBUG_WARNING ("__search_sql_memo_search_result_cb wrong index : %d", - ad->cate_info[type].next_point); + obj->mr_info.next_point); } SEARCH_FUNC_END; @@ -551,20 +609,21 @@ static void __search_sql_memo_search_result_cb(memo_data_t * value, return; } -int search_sql_memo_search_result_by_api(int type, int offset, int limit, - void *data) +int search_sql_memo_search_result_by_api(struct search_content_object *obj, + int offset, int limit, char *keyword, void *data, struct search_genlist_info *result_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; + struct search_cb_data scd = {obj, ad, keyword, result_info}; - memo_search_data(ad->search_word, - limit, offset, + memo_search_data(keyword, + limit, offset, MEMO_SORT_TITLE_ASC, - __search_sql_memo_search_result_cb, - data); + __search_sql_memo_search_result_cb, + &scd); - if (ad->cate_info[type].next_point == 0) { + if (obj->mr_info.next_point == 0) { SEARCH_DEBUG_WARNING("no memo search result"); return SEARCH_RET_SEARCH_NONE; } @@ -573,35 +632,71 @@ int search_sql_memo_search_result_by_api(int type, int offset, int limit, return SEARCH_RET_SEARCH_SUCCESS; } -int search_sql_email_search_result_by_api(int type, int offset, int limit, - void *data) +int search_sql_email_search_result_by_api(struct search_content_object *obj, + int offset, int limit, char *keyword, void *data, struct search_genlist_info *result_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; - int result_cnt = 0; - int ret = 0; + int ret = EMAIL_ERROR_NONE; int i = 0; - emf_mail_list_item_t *mail_list = NULL; + email_mail_list_item_t *mail_list = NULL; + email_list_filter_t *filter_list = NULL; + email_list_sorting_rule_t *sorting_rule_list = NULL; - struct search_item_sel *sel_mem = NULL; - Elm_Object_Item *git = NULL; - Evas_Object *glist; + int filter_list_count = 5; + int sorting_rule_list_count = 1; + int mail_count = 0; + struct search_genlist_item_info *gen_item = NULL; struct search_item_sel *sel_mem_info = NULL; + struct search_item_more_sel *sel_mem_more = NULL; bool is_word_in_str; - ret = email_find_mail(0, NULL, 0, EMF_SEARCH_FILTER_ALL , - ad->search_word, offset, limit, EMF_SORT_DATETIME_HIGH, - &mail_list, &result_cnt); + filter_list = (email_list_filter_t *)malloc(sizeof(email_list_filter_t) * filter_list_count); + memset(filter_list, 0 , sizeof(email_list_filter_t) * filter_list_count); + + filter_list[0].list_filter_item_type = EMAIL_LIST_FILTER_ITEM_RULE; + filter_list[0].list_filter_item.rule.target_attribute = EMAIL_MAIL_ATTRIBUTE_SUBJECT; + filter_list[0].list_filter_item.rule.rule_type = EMAIL_LIST_FILTER_RULE_INCLUDE; + filter_list[0].list_filter_item.rule.key_value.string_type_value = keyword; + filter_list[0].list_filter_item.rule.case_sensitivity = EMAIL_CASE_INSENSITIVE; + + filter_list[1].list_filter_item_type = EMAIL_LIST_FILTER_ITEM_OPERATOR; + filter_list[1].list_filter_item.operator_type = EMAIL_LIST_FILTER_OPERATOR_OR; + + filter_list[2].list_filter_item_type = EMAIL_LIST_FILTER_ITEM_RULE; + filter_list[2].list_filter_item.rule.target_attribute = EMAIL_MAIL_ATTRIBUTE_TO; + filter_list[2].list_filter_item.rule.rule_type = EMAIL_LIST_FILTER_RULE_INCLUDE; + filter_list[2].list_filter_item.rule.key_value.string_type_value = keyword; + filter_list[2].list_filter_item.rule.case_sensitivity = EMAIL_CASE_INSENSITIVE; - if(ret < 1) { - SEARCH_DEBUG_WARNING("no email search result"); + filter_list[3].list_filter_item_type = EMAIL_LIST_FILTER_ITEM_OPERATOR; + filter_list[3].list_filter_item.operator_type = EMAIL_LIST_FILTER_OPERATOR_OR; + + filter_list[4].list_filter_item_type = EMAIL_LIST_FILTER_ITEM_RULE; + filter_list[4].list_filter_item.rule.target_attribute = EMAIL_MAIL_ATTRIBUTE_FROM; + filter_list[4].list_filter_item.rule.rule_type = EMAIL_LIST_FILTER_RULE_INCLUDE; + filter_list[4].list_filter_item.rule.key_value.string_type_value = keyword; + filter_list[4].list_filter_item.rule.case_sensitivity = EMAIL_CASE_INSENSITIVE; + + sorting_rule_list = (email_list_sorting_rule_t *)malloc(sizeof(email_list_sorting_rule_t) * sorting_rule_list_count); + memset(sorting_rule_list, 0, sizeof(email_list_sorting_rule_t) * sorting_rule_list_count); + + sorting_rule_list[0].target_attribute = EMAIL_MAIL_ATTRIBUTE_SUBJECT; + sorting_rule_list[0].sort_order = EMAIL_SORT_ORDER_ASCEND; + + ret = email_get_mail_list_ex(filter_list, filter_list_count, sorting_rule_list, sorting_rule_list_count, + offset, limit, &mail_list, &mail_count); + + + if (ret != EMAIL_ERROR_NONE) { + SEARCH_DEBUG_WARNING("no email search result"); return SEARCH_RET_SEARCH_FAIL; } - if(result_cnt == 0) { + if (mail_count == 0) { SEARCH_DEBUG_WARNING("no email search result"); return SEARCH_RET_SEARCH_NONE; } @@ -612,497 +707,561 @@ int search_sql_email_search_result_by_api(int type, int offset, int limit, } /* Set group title */ - glist = ad->search_gl; - if (offset == 0) { - sel_mem = (struct search_item_sel *)calloc(1, - sizeof(struct search_item_sel)); - - sel_mem->type = type; - - git = elm_genlist_item_append(glist, - (ad->itc_grouptitle), - sel_mem, - (Elm_Object_Item *) NULL, - ELM_GENLIST_ITEM_GROUP, - NULL, NULL); - - ad->gl_result_group_item[type] = git; + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, + NULL); } /* Set search result to genlist */ - for(i=0;i<result_cnt;i++) { + for(i = 0 ; i < mail_count ; i++) { if(i == limit -1) break; - + sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); - sel_mem_info->type = type; + sel_mem_info->type = obj->contents_type; + + if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); snprintf(sel_mem_info->main_id, MAX_LENGTH_PER_ID - 1, "%d", mail_list[i].mail_id); - snprintf(sel_mem_info->path, MAX_LENGTH_PER_PATH - 1, "%d %d %s", - mail_list[i].account_id, mail_list[i].mail_id, mail_list[i].mailbox_name); + snprintf(sel_mem_info->path, MAX_LENGTH_PER_PATH - 1, "%d %d %d", + mail_list[i].account_id, mail_list[i].mail_id, mail_list[i].mailbox_id); SEARCH_DEBUG_LOG("subject : %s", mail_list[i].subject); if((mail_list[i].subject) && (strlen(mail_list[i].subject) > 0)) { - char* markup_text_1line = elm_entry_utf8_to_markup(mail_list[i].subject); - strncpy(sel_mem_info->main_buf, - search_markup_keyword(markup_text_1line, ad->not_markup_search_word, &is_word_in_str), + search_markup_keyword(mail_list[i].subject, ad->search_word, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_1line); - } + } if((mail_list[i].from) && (strlen(mail_list[i].from) > 0)) { - char* markup_text_2line = elm_entry_utf8_to_markup(mail_list[i].from); - strncpy(sel_mem_info->sub_buf, - search_markup_keyword(markup_text_2line, ad->not_markup_search_word, &is_word_in_str), + search_markup_keyword(mail_list[i].from, ad->search_word, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_2line); - } + } if(is_word_in_str == false && (mail_list[i].recipients) && (strlen(mail_list[i].recipients) > 0)) { - char* markup_text_2line = elm_entry_utf8_to_markup(mail_list[i].recipients); - strncpy(sel_mem_info->sub_buf, - search_markup_keyword(markup_text_2line, ad->not_markup_search_word, &is_word_in_str), + search_markup_keyword(mail_list[i].recipients, ad->search_word, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_2line); } - elm_genlist_item_append(glist, - (ad->itc_pslist_2line), + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + ad->itc_pslist_2line_1icon, sel_mem_info, - ad->gl_result_group_item - [type], - ELM_GENLIST_ITEM_NONE, - search_gl_phone_result_sel, - ad); - sel_mem_info = NULL; + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); } SEARCH_FREE(mail_list); - - /* Set more title to genlist (under 'search all') */ - if (result_cnt == limit) { - ad->cate_info[type].next_point = offset + result_cnt - 1; - - sel_mem = - (struct search_item_sel *)calloc(1, - sizeof(struct search_item_sel)); - sel_mem->type = type; - elm_genlist_item_append(ad->search_gl, (ad->itc_listmore), - sel_mem, ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_result_more_item_append_cb, - ad); + /* Set more title to genlist (under 'search all') */ + if (mail_count == limit) { + obj->mr_info.next_point = offset + mail_count - 1; + + sel_mem_more = + (struct search_item_more_sel *)calloc(1, + sizeof(struct search_item_more_sel)); + sel_mem_more->obj = obj; + + result_info->more = search_add_genlist_item(SEARCH_GENLIST_MORE, + obj, + ad->itc_listmore, + sel_mem_more, + obj->gl_result_grp); } + SEARCH_FREE(filter_list); + SEARCH_FREE(sorting_rule_list); + SEARCH_FUNC_END; return SEARCH_RET_SEARCH_SUCCESS; } -static int __search_sql_media_search_item_list_search_cb( Mitem* item, void* user_data) +static bool __search_media_info_cb(media_info_h media, void *user_data) { - GList** list = (GList**) user_data; - *list = g_list_append( *list, item ); + char *media_id = NULL; + char *media_name = NULL; + char *media_path = NULL; + char *media_thumbnail = NULL; - return 0; -} - -static int __search_sql_media_search_result_by_api(int type, int offset, int limit, - minfo_file_type media_type, void *data) -{ - SEARCH_FUNC_START; + struct search_item_sel *sel_mem_info = NULL; + Elm_Genlist_Item_Class *itc_style = NULL; + bool is_word_in_str = false; - struct appdata *ad = (struct appdata *)data; + struct search_cb_data *scd = (struct search_cb_data*)user_data; + struct appdata *ad = scd->ad; + struct search_content_object *obj = scd->obj; + struct search_genlist_info *result_info = scd->result_info; + char *keyword = scd->keyword; - int result_cnt = 0; - int ret = 0; - int i = 0; - int func_ret = SEARCH_RET_SEARCH_SUCCESS; + struct search_genlist_item_info *gen_item = NULL; - struct search_item_sel *sel_mem = NULL; - Elm_Object_Item *git = NULL; - Evas_Object *glist; + media_info_get_media_id(media, &media_id); + media_info_get_display_name(media, &media_name); + media_info_get_file_path(media, &media_path); + media_info_get_thumbnail_path(media, &media_thumbnail); - struct search_item_sel *sel_mem_info = NULL; - bool is_word_in_str; - - GList *p_media_list = NULL; - Mitem* item = NULL; - minfo_item_filter item_filter; - - memset(&item_filter, 0x00, sizeof(minfo_item_filter)); - - minfo_search_field_t search_field = MINFO_SEARCH_BY_NAME; - minfo_folder_type folder_type = MINFO_CLUSTER_TYPE_ALL; - - item_filter.file_type = media_type; - - /* MINFO_MEDIA_SORT_BY_NAME_DESC, MINFO_MEDIA_SORT_BY_DATE_DESC, MINFO_MEDIA_SORT_BY_DATE_ASC ... */ - item_filter.sort_type = MINFO_MEDIA_SORT_BY_NAME_ASC; - - item_filter.start_pos = offset; - item_filter.end_pos = offset+limit-1; - - item_filter.with_meta = 0; - item_filter.favorite = MINFO_MEDIA_FAV_ALL; - - /* get a set of items */ - ret = minfo_get_item_list_search(ad->media_handle, - search_field, - ad->search_word, - folder_type, - item_filter, - __search_sql_media_search_item_list_search_cb, - &p_media_list); - if (ret < 0) { - SEARCH_DEBUG_WARNING("minfo_get_item_list_search failed : %d\n", ret); - func_ret = SEARCH_RET_SEARCH_FAIL; - goto out_func; - } + sel_mem_info = (struct search_item_sel *)calloc(1, + sizeof(struct search_item_sel)); - if (p_media_list == NULL) { - SEARCH_DEBUG_WARNING("minfo_get_item_list_search media list null\n"); - func_ret = SEARCH_RET_SEARCH_FAIL; - goto out_func; + sel_mem_info->type = obj->contents_type; + + if ((media_thumbnail) && (strlen(media_thumbnail) > 0) + && ecore_file_exists(media_thumbnail) == EINA_TRUE) { + strncpy(sel_mem_info->icon1_path, media_thumbnail, + MAX_LENGTH_PER_PATH - 1); + } else if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); + + if (media_name && strlen(media_name)) { + strncpy(sel_mem_info->main_buf, + search_markup_keyword(media_name, + keyword, + &is_word_in_str), + MAX_LENGTH_PER_LINE - 1); } - result_cnt = g_list_length(p_media_list); - if (result_cnt == 0) { - SEARCH_DEBUG_WARNING("minfo_item_list length 0\n"); - func_ret = SEARCH_RET_SEARCH_FAIL; - goto out_func; - } + if (media_id) + snprintf(sel_mem_info->main_id, MAX_LENGTH_PER_ID, "%s", + media_id); - /* Set group title */ - glist = ad->search_gl; + if (media_path) + snprintf(sel_mem_info->path, MAX_LENGTH_PER_PATH - 1, "%s", + media_path); - if (offset == 0) { - sel_mem = (struct search_item_sel *)calloc(1, - sizeof(struct search_item_sel)); + itc_style = ad->itc_pslist_1line_1icon; - sel_mem->type = type; + /* Add Info to genlist */ + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + itc_style, + sel_mem_info, + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); - git = elm_genlist_item_append(glist, - (ad->itc_grouptitle), - sel_mem, - (Elm_Object_Item *) NULL, - ELM_GENLIST_ITEM_GROUP, - NULL, NULL); + SEARCH_FREE(media_id); + SEARCH_FREE(media_name); + SEARCH_FREE(media_thumbnail); + SEARCH_FREE(media_path); - ad->gl_result_group_item[type] = git; + return true; } - /* Set search result to genlist */ - for (i = 0; i < result_cnt; i++) { +static bool __search_sql_music_info_cb(media_info_h media, void *user_data) +{ + char *media_id = NULL; + char *media_path = NULL; + char *media_thumbnail = NULL; + char *title = NULL; + char *artist = NULL; + char *album = NULL; - if(i == limit -1) - break; + audio_meta_h a_handle; - item = NULL; - item = (Mitem*)g_list_nth_data(p_media_list, i); + media_content_storage_e storage_type = MEDIA_CONTENT_STORAGE_INTERNAL; - if(item == NULL) { - break; + struct search_item_sel *sel_mem_info = NULL; + Elm_Genlist_Item_Class *itc_style = NULL; + bool is_word_in_str = false; + + struct search_cb_data *scd = (struct search_cb_data*)user_data; + struct appdata *ad = scd->ad; + struct search_content_object* obj = scd->obj; + struct search_genlist_info *result_info = scd->result_info; + char *keyword = scd->keyword; + + struct search_genlist_item_info *gen_item = NULL; + + media_info_get_media_id(media, &media_id); + media_info_get_file_path(media, &media_path); + media_info_get_storage_type(media, &storage_type); + media_info_get_thumbnail_path(media, &media_thumbnail); + + media_info_get_audio(media, &a_handle); + audio_meta_get_title(a_handle, &title); + audio_meta_get_album(a_handle, &album); + audio_meta_get_artist(a_handle, &artist); + + sel_mem_info = (struct search_item_sel *)calloc(1, + sizeof(struct search_item_sel)); + + sel_mem_info->type = obj->contents_type;; + + if ((media_thumbnail) && (strlen(media_thumbnail) > 0) + && ecore_file_exists(media_thumbnail) == EINA_TRUE) { + strncpy(sel_mem_info->icon1_path , media_thumbnail, + MAX_LENGTH_PER_PATH -1 ); + } else if(obj->obj_icon_path) { + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); } - - sel_mem_info = (struct search_item_sel *)calloc(1, - sizeof(struct search_item_sel)); - sel_mem_info->type = type; + if ((title) && (strlen(title) > 0)) { + strncpy(sel_mem_info->main_buf, + search_markup_keyword(title, keyword, &is_word_in_str), + MAX_LENGTH_PER_LINE - 1); + } + + if (is_word_in_str) { + if ((artist) && (strlen(artist) > 0)) { + strncpy(sel_mem_info->sub_buf, + search_markup_keyword(artist, + keyword, + &is_word_in_str), + MAX_LENGTH_PER_LINE - 1); + } + } else { + memset(sel_mem_info->sub_buf, '\0', MAX_LENGTH_PER_LINE); - if ((item->display_name) && (strlen(item->display_name) > 0)) { - char* markup_text_1line = elm_entry_utf8_to_markup(item->display_name); - - strncpy(sel_mem_info->main_buf, - search_markup_keyword(markup_text_1line, - ad->not_markup_search_word, + if ((artist) && (strlen(artist) > 0)) { + strncpy(sel_mem_info->sub_buf, + search_markup_keyword(artist, + keyword, + &is_word_in_str), + MAX_LENGTH_PER_LINE - 1); + } + + if (is_word_in_str == false && (album) && (strlen(album) > 0)) { + strncpy(sel_mem_info->sub_buf, + search_markup_keyword(album, + keyword, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_1line); - } + } + + if (is_word_in_str == false) { + SEARCH_DEBUG_LOG("search_result is 0. No match keyword in title,album,artist string"); + } + } - snprintf(sel_mem_info->main_id, MAX_LENGTH_PER_ID, "%d", - item->type); + if (storage_type == MEDIA_CONTENT_STORAGE_EXTERNAL) { + itc_style = ad->itc_pslist_2line_2icon; + strncpy(sel_mem_info->icon2_path, SEARCH_SDCARD_ICON, + MAX_LENGTH_PER_PATH - 1); + } + else { + itc_style = ad->itc_pslist_2line_1icon; + } - snprintf(sel_mem_info->path, MAX_LENGTH_PER_PATH - 1, "%s", - item->file_url); + if (media_id) + snprintf(sel_mem_info->main_id, + MAX_LENGTH_PER_ID - 1, "%s", media_id); - elm_genlist_item_append(glist, - (ad->itc_pslist_1line), + if (media_path) + strncpy(sel_mem_info->path, media_path, MAX_LENGTH_PER_PATH); + + /* Add Information to genlist */ + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + itc_style, sel_mem_info, - ad->gl_result_group_item - [type], - ELM_GENLIST_ITEM_NONE, - search_gl_phone_result_sel, - ad); - sel_mem_info = NULL; + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); + + SEARCH_FREE(media_id); + SEARCH_FREE(media_path); + SEARCH_FREE(media_thumbnail); + SEARCH_FREE(title); + SEARCH_FREE(artist); + SEARCH_FREE(album); + + return true; } - /* delete list to avoid memory leak */ - for (i = 0; i < result_cnt; i++) { - item = (Mitem*)g_list_nth_data(p_media_list, i); - minfo_destroy_mtype_item(item); +static int __search_sql_media_search_result_by_api(struct search_content_object *obj, + int offset, int limit, + char *keyword, + filter_h filter, + media_info_cb func_cb, + void *data, + struct search_genlist_info *result_info) +{ + SEARCH_FUNC_START; + + struct appdata *ad = (struct appdata *)data; + struct search_cb_data scd = {obj, ad, keyword, result_info}; + + int result_cnt = 0; + int ret = 0; + int func_ret = SEARCH_RET_SEARCH_SUCCESS; + + struct search_item_more_sel *sel_mem_more = NULL; + + media_info_get_media_count_from_db(filter, &result_cnt); + + if (result_cnt != 0) { + /* Set group title */ + if (obj->mr_info.offset== 0) { + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, + NULL); } - g_list_free(p_media_list); - p_media_list = NULL; + ret = media_info_foreach_media_from_db(filter, func_cb, &scd); + + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_info_foreach_media_from_db failed : %d\n", ret); + func_ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } /* Set more title to genlist (under 'search all') */ if (result_cnt == limit) { - ad->cate_info[type].next_point = offset + result_cnt - 1; - - sel_mem = - (struct search_item_sel *)calloc(1, - sizeof(struct search_item_sel)); - sel_mem->type = type; - - elm_genlist_item_append(ad->search_gl, (ad->itc_listmore), - sel_mem, ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_result_more_item_append_cb, - ad); + obj->mr_info.next_point = offset + result_cnt - 1; + + sel_mem_more = + (struct search_item_more_sel *)calloc(1, + sizeof(struct search_item_more_sel)); + sel_mem_more->obj = obj; + + result_info->more = search_add_genlist_item(SEARCH_GENLIST_MORE, + obj, + ad->itc_listmore, + sel_mem_more, + obj->gl_result_grp); + } + } else { + func_ret = SEARCH_RET_SEARCH_NONE; } out_func: SEARCH_FUNC_END; - return SEARCH_RET_SEARCH_SUCCESS; + + return func_ret; } -int search_sql_image_search_result_by_api(int type, int offset, int limit, - void *data) +int search_sql_image_search_result_by_api(struct search_content_object *obj, + int offset, int limit, + char *keyword, + void *data, + struct search_genlist_info *result_info) { SEARCH_FUNC_START; - int ret; + int ret = SEARCH_RET_SEARCH_SUCCESS; + int len = 0; + char *search_query = NULL; + char *escape_added_keyword = NULL; - ret = __search_sql_media_search_result_by_api(type, - offset, - limit, - MINFO_ITEM_IMAGE, - data); + const char *image_query = "(MEDIA_TYPE=0 and MEDIA_DISPLAY_NAME like \"%%%s%%\" ESCAPE (\"%s\"))"; - SEARCH_FUNC_END; + SEARCH_MALLOC(escape_added_keyword, strlen(keyword)*2+5, char); + memset(escape_added_keyword, 0x0, strlen(keyword)*2+5); + search_sql_make_keyword_bind_value(keyword, escape_added_keyword, SEARCH_SQL_BIND_TYPE_DUPLEX); - return ret; + len = strlen(escape_added_keyword) + strlen(DB_ESCAPE_CHAR) + strlen(image_query) + 1; + search_query = (char*)calloc(1, len); + + snprintf(search_query, len, image_query, escape_added_keyword, "%"); + + SEARCH_DEBUG_WARNING("keyword :%s", keyword); + SEARCH_DEBUG_WARNING("search_query :%s", escape_added_keyword); + + filter_h filter; + + ret = media_filter_create(&filter); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_create failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } + + ret = media_filter_set_offset(filter, offset, limit); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_offset failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } + + ret = media_filter_set_condition(filter, search_query, MEDIA_CONTENT_COLLATE_DEFAULT); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_condition failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; } -int search_sql_video_search_result_by_api(int type, int offset, int limit, - void *data) -{ - SEARCH_FUNC_START; + ret = media_filter_set_order(filter, MEDIA_CONTENT_ORDER_ASC, MEDIA_DISPLAY_NAME, MEDIA_CONTENT_COLLATE_DEFAULT); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_order failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } - int ret; - ret = __search_sql_media_search_result_by_api(type, - offset, - limit, - MINFO_ITEM_VIDEO, - data); + ret = __search_sql_media_search_result_by_api(obj, + offset, + limit, + keyword, + filter, + __search_media_info_cb, + data, + result_info); + +out_func: + SEARCH_FREE(search_query); + SEARCH_FREE(escape_added_keyword); + media_filter_destroy(filter); SEARCH_FUNC_END; return ret; } -int search_sql_music_search_result_by_api(int type, int offset, int limit, - void *data) +int search_sql_video_search_result_by_api(struct search_content_object *obj, + int offset, int limit, char *keyword, void *data, struct search_genlist_info *result_info) { SEARCH_FUNC_START; - struct appdata *ad = (struct appdata *)data; + int ret = SEARCH_RET_SEARCH_SUCCESS; + int len = 0; + char *search_query = NULL; + char *escape_added_keyword = NULL; - int loop_cnt = 0; - int ret = SEARCH_RET_SEARCH_NONE; - int i = 0; - int rc = 0; + const char *video_query = "(MEDIA_TYPE=1 and MEDIA_DISPLAY_NAME LIKE \"%%%s%%\" ESCAPE (\"%s\"))"; - struct search_item_sel *sel_mem = NULL; - Elm_Object_Item *git = NULL; + SEARCH_MALLOC(escape_added_keyword, strlen(keyword)*2+5, char); + memset(escape_added_keyword, 0x0, strlen(keyword)*2+5); + search_sql_make_keyword_bind_value(keyword, escape_added_keyword, SEARCH_SQL_BIND_TYPE_DUPLEX); - struct search_item_sel *sel_mem_info = NULL; - bool is_word_in_str; - - AudioHandleType *handle = NULL; + len = strlen(escape_added_keyword) + strlen(DB_ESCAPE_CHAR) + strlen(video_query) + 1; + search_query = (char*)calloc(1, len); - rc = audio_svc_search_item_new(&handle, limit); - if (rc < 0) { - SEARCH_DEBUG_WARNING("audio_svc_search_item_new failed:%d\n", - rc); - return -1; - } + snprintf(search_query, len, video_query, escape_added_keyword, DB_ESCAPE_CHAR); - rc = audio_svc_list_by_search(ad->media_handle, - handle, - AUDIO_SVC_ORDER_BY_TITLE_ASC, - offset, - limit, - AUDIO_SVC_SEARCH_TITLE, - ad->search_word, - strlen(ad->search_word), - AUDIO_SVC_SEARCH_ALBUM, - ad->search_word, - strlen(ad->search_word), - AUDIO_SVC_SEARCH_ARTIST, - ad->search_word, - strlen(ad->search_word), - -1); - - if (rc != AUDIO_SVC_ERROR_NONE) { - SEARCH_DEBUG_WARNING("audio_svc_list_by_search error : %d", - rc); + filter_h filter; + ret = media_filter_create(&filter); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_create failed : %d\n", ret); ret = SEARCH_RET_SEARCH_FAIL; goto out_func; } - for (loop_cnt = 0; loop_cnt < limit; loop_cnt++) { - AudioHandleType *item = NULL; - char *title = NULL; - char *artist = NULL; - char *pathname = NULL; - char *album = NULL; - int size = 0; - char* audio_id = NULL; - - rc = audio_svc_search_item_get(handle, loop_cnt, &item); - if (rc < 0) { - break; - } else { - if (loop_cnt == limit -1) - break; + ret = media_filter_set_offset(filter, offset, limit); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_offset failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } - audio_svc_item_get_val(item, - AUDIO_SVC_TRACK_DATA_AUDIO_ID, &audio_id, &size, - AUDIO_SVC_TRACK_DATA_PATHNAME, &pathname, &size, - AUDIO_SVC_TRACK_DATA_TITLE, &title, &size, - AUDIO_SVC_TRACK_DATA_ARTIST, &artist, &size, - AUDIO_SVC_TRACK_DATA_ALBUM, &album, &size, - -1); + ret = media_filter_set_condition(filter, search_query, MEDIA_CONTENT_COLLATE_DEFAULT); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_condition failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } - if( audio_id == NULL) { - SEARCH_DEBUG_WARNING("audio_id value error. loop break"); - break; - } + ret = media_filter_set_order(filter, MEDIA_CONTENT_ORDER_ASC, MEDIA_DISPLAY_NAME, MEDIA_CONTENT_COLLATE_DEFAULT); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_order failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } - ret = SEARCH_RET_SEARCH_SUCCESS; + ret = __search_sql_media_search_result_by_api(obj, + offset, + limit, + keyword, + filter, + __search_media_info_cb, + data, + result_info); - if ((loop_cnt == 0) && (offset == 0)) { - /* Set group title */ - sel_mem = (struct search_item_sel *)calloc(1, - sizeof(struct search_item_sel)); +out_func: - sel_mem->type = type; + SEARCH_FREE(search_query); + SEARCH_FREE(escape_added_keyword); + media_filter_destroy(filter); - git = elm_genlist_item_append(ad->search_gl, - (ad->itc_grouptitle), - sel_mem, - (Elm_Object_Item *) NULL, - ELM_GENLIST_ITEM_GROUP, - NULL, NULL); + SEARCH_FUNC_END; - ad->gl_result_group_item[type] = git; + return ret; } - sel_mem_info = (struct search_item_sel *)calloc(1, - sizeof(struct search_item_sel)); +int search_sql_music_search_result_by_api(struct search_content_object *obj, + int offset, int limit, + char *keyword, + void *data, + struct search_genlist_info *result_info) +{ + SEARCH_FUNC_START; - sel_mem_info->type = type; + int ret = SEARCH_RET_SEARCH_SUCCESS; + int len = 0; + char *search_query = NULL; + char *escape_added_keyword = NULL; - if ((title) && (strlen(title) > 0)) { - char* markup_text_1line = elm_entry_utf8_to_markup(title); + const char *music_query = "(MEDIA_TYPE=3 and MEDIA_TITLE LIKE \"%%%s%%\" or MEDIA_ALBUM LIKE \"%%%s%%\" or MEDIA_ARTIST LIKE \"%%%s%%\" ESCAPE (\"%s\"))"; - strncpy(sel_mem_info->main_buf, - search_markup_keyword(markup_text_1line, ad->not_markup_search_word, &is_word_in_str), - MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_1line); - } + SEARCH_MALLOC(escape_added_keyword, strlen(keyword)*2+5, char); + memset(escape_added_keyword, 0x0, strlen(keyword)*2+5); + search_sql_make_keyword_bind_value(keyword, escape_added_keyword, SEARCH_SQL_BIND_TYPE_DUPLEX); - if (is_word_in_str) { - if ((artist) && (strlen(artist) > 0)) { - char* markup_text_2line = elm_entry_utf8_to_markup(artist); - - strncpy(sel_mem_info->sub_buf, - search_markup_keyword(markup_text_2line, - ad->not_markup_search_word, - &is_word_in_str), - MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_2line); - } - } else { - memset(sel_mem_info->sub_buf, '\0', MAX_LENGTH_PER_LINE); - - if ((artist) && (strlen(artist) > 0)) { - char* markup_text_2line = elm_entry_utf8_to_markup(artist); - - strncpy(sel_mem_info->sub_buf, - search_markup_keyword(markup_text_2line, - ad->not_markup_search_word, - &is_word_in_str), - MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_2line); - } - - if (is_word_in_str == false && (album) && (strlen(album) > 0)) { - char* markup_text_2line = elm_entry_utf8_to_markup(album); - - strncpy(sel_mem_info->sub_buf, - search_markup_keyword(markup_text_2line, - ad->not_markup_search_word, - &is_word_in_str), - MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_2line); - } + len = strlen(escape_added_keyword) + strlen(DB_ESCAPE_CHAR) + strlen(music_query) + 1; + search_query = (char*)calloc(1, len); - if (is_word_in_str == false) { - SEARCH_DEBUG_LOG("search_result is 0. No match keyword in title,album,artist string"); + snprintf(search_query, len, music_query, escape_added_keyword, + escape_added_keyword, escape_added_keyword, DB_ESCAPE_CHAR); + + filter_h filter; + + ret = media_filter_create(&filter); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_create failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; } - } - snprintf(sel_mem_info->main_id, - MAX_LENGTH_PER_ID - 1, "%s", audio_id); + ret = media_filter_set_offset(filter, offset, limit); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_offset failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } - strncpy(sel_mem_info->path, pathname, MAX_LENGTH_PER_PATH); + ret = media_filter_set_condition(filter, search_query, MEDIA_CONTENT_COLLATE_DEFAULT); + if(ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_condition failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; + } - elm_genlist_item_append(ad->search_gl, - (ad->itc_pslist_2line), - sel_mem_info, - ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_phone_result_sel, - ad); - sel_mem_info = NULL; - } + ret = media_filter_set_order(filter, MEDIA_CONTENT_ORDER_ASC, MEDIA_TITLE, MEDIA_CONTENT_COLLATE_DEFAULT); + if (ret != MEDIA_CONTENT_ERROR_NONE) { + SEARCH_DEBUG_WARNING("media_filter_set_order failed : %d\n", ret); + ret = SEARCH_RET_SEARCH_FAIL; + goto out_func; } - /* Set more title to genlist (under 'search all') */ - if (loop_cnt == limit) { - ad->cate_info[type].next_point = offset + loop_cnt - 1; + ret = __search_sql_media_search_result_by_api(obj, + offset, + limit, + keyword, + filter, + __search_sql_music_info_cb, + data, + result_info); - sel_mem = - (struct search_item_sel *)calloc(1, - sizeof(struct search_item_sel)); - sel_mem->type = type; - - elm_genlist_item_append(ad->search_gl, (ad->itc_listmore), - sel_mem, ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_result_more_item_append_cb, - ad); - } - -out_func: +out_func: - audio_svc_search_item_free(handle); + SEARCH_FREE(search_query); + SEARCH_FREE(escape_added_keyword); + media_filter_destroy(filter); SEARCH_FUNC_END; @@ -1110,120 +1269,127 @@ out_func: } ail_cb_ret_e __search_sql_menu_search_result_cb( - const ail_appinfo_h appinfo, + const ail_appinfo_h appinfo, void *data) { SEARCH_FUNC_START; - - struct appdata *ad = (struct appdata *)data; - struct search_item_sel *sel_mem = NULL; - struct search_item_sel *sel_mem_info = NULL; + struct search_cb_data *scd = (struct search_cb_data*)data; + struct appdata *ad = scd->ad; + struct search_content_object* obj = scd->obj; + struct search_genlist_info *result_info = scd->result_info; + char *keyword = scd->keyword; - int type = SEARCH_TYPE_PHONE_MENU; + struct search_genlist_item_info *gen_item = NULL; + struct search_item_sel *sel_mem_info = NULL; + struct search_item_more_sel *sel_mem_more = NULL; bool is_word_in_str; ail_cb_ret_e ret; - if(ad->cate_info[type].loop_cnt < ad->cate_info[type].next_point) { - ad->cate_info[type].loop_cnt++; + if (obj->mr_info.loop_cnt < obj->mr_info.next_point) { + obj->mr_info.loop_cnt++; return AIL_CB_RET_CONTINUE; } - if(ad->cate_info[type].next_point < - ad->cate_info[type].offset + SEARCH_CATEGORY_LIST_MORE_CNT) { - + if(obj->mr_info.next_point < + obj->mr_info.offset + SEARCH_CATEGORY_LIST_MORE_CNT) { + sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); - sel_mem_info->type = type; + sel_mem_info->type = obj->contents_type;; /********** START : set search result to sel_mem_info buf ************/ char *name = NULL; char *package = NULL; + char *icon = NULL; + + ail_appinfo_get_str(appinfo, AIL_PROP_ICON_STR, &icon); + + if (icon) + strncpy(sel_mem_info->icon1_path, icon, + MAX_LENGTH_PER_PATH - 1); ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package); if ((package) && (strlen(package) > 0)) { - if(strcmp(package, SEARCHPKG) == 0) { - ad->cate_info[type].loop_cnt++; + if(strcmp(package, "org.tizen.smartsearch") == 0) { + SEARCH_DEBUG_LOG("'smartsearch' does not appended"); + obj->mr_info.loop_cnt++; SEARCH_FREE(sel_mem_info); return AIL_CB_RET_CONTINUE; } strncpy(sel_mem_info->path, package, MAX_LENGTH_PER_PATH - 1); + + SEARCH_DEBUG_LOG("package : %s", package); + } else { + SEARCH_DEBUG_LOG("package : null"); } ail_appinfo_get_str(appinfo, AIL_PROP_NAME_STR, &name); if ((name) && (strlen(name) > 0)) { - char* markup_text_1line = elm_entry_utf8_to_markup(name); - strncpy(sel_mem_info->main_buf, - search_markup_keyword(markup_text_1line, ad->not_markup_search_word,&is_word_in_str), + search_markup_keyword(name, keyword, &is_word_in_str), MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_1line); - + SEARCH_DEBUG_LOG("name : %s", name); } else { SEARCH_DEBUG_LOG("name : null"); } -if(ad->cate_info[type].next_point == 0) { + + if(obj->mr_info.next_point == 0) { /* Set group title */ - sel_mem = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); - sel_mem->type = type; - ad->gl_result_group_item[type] = elm_genlist_item_append( - ad->search_gl, - (ad->itc_grouptitle), - sel_mem, - (Elm_Object_Item *) NULL, - ELM_GENLIST_ITEM_GROUP, - NULL, + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, NULL); } /********** END : set search result to sel_mem_info buf *************/ - elm_genlist_item_append(ad->search_gl, - (ad->itc_pslist_1line), + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + ad->itc_pslist_1line_1icon, sel_mem_info, - ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_phone_result_sel, - ad); - - ad->cate_info[type].next_point++; - ad->cate_info[type].loop_cnt++; + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); + obj->mr_info.next_point++; + obj->mr_info.loop_cnt++; ret = AIL_CB_RET_CONTINUE; - - } else if (ad->cate_info[type].next_point == - ad->cate_info[type].offset + SEARCH_CATEGORY_LIST_MORE_CNT) { + + } else if (obj->mr_info.next_point == + obj->mr_info.offset + SEARCH_CATEGORY_LIST_MORE_CNT) { /* Check that only "SMARTSEARCH" is left in more result */ - if(ad->cate_info[type].next_point == ad->cate_info[type].result_cnt-1) { + if(obj->mr_info.next_point == obj->mr_info.result_cnt-1) { char *package = NULL; ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package); - if ((package) && (strlen(package) > 0) && (strcmp(package, SEARCHPKG) == 0)) { + if ((package) && (strlen(package) > 0) && (strcmp(package, "org.tizen.smartsearch") == 0)) { + SEARCH_DEBUG_LOG("Only 'SMARTSEARCH' is left in more result"); return AIL_CB_RET_CANCEL; } } /* Set more title to genlist (under 'search all') */ - sel_mem = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); - sel_mem->type = type; + sel_mem_more = (struct search_item_more_sel *)calloc(1, sizeof(struct search_item_more_sel)); + sel_mem_more->obj = obj; - elm_genlist_item_append(ad->search_gl, (ad->itc_listmore), - sel_mem, ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_result_more_item_append_cb, - ad); + result_info->more = search_add_genlist_item(SEARCH_GENLIST_MORE, + obj, + ad->itc_listmore, + sel_mem_more, + obj->gl_result_grp); ret = AIL_CB_RET_CANCEL; } else { SEARCH_DEBUG_WARNING ("__search_sql_memo_search_result_cb wrong index : %d", - ad->cate_info[type].next_point); + obj->mr_info.next_point); ret = AIL_CB_RET_CANCEL; } @@ -1233,12 +1399,16 @@ if(ad->cate_info[type].next_point == 0) { return ret; } -int search_sql_menu_search_result_by_api(int type, int offset, int limit, - char *keyword, void *data) +int search_sql_menu_search_result_by_api(struct search_content_object *obj, + int offset, int limit, + char *keyword, + void *data, + struct search_genlist_info *result_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; + struct search_cb_data scd = {obj, ad, keyword, result_info}; int cnt = 0; int ret = 0; @@ -1246,13 +1416,18 @@ int search_sql_menu_search_result_by_api(int type, int offset, int limit, ail_filter_h filter; ail_error_e rc; + char *escape_added_keyword = NULL; + SEARCH_MALLOC(escape_added_keyword, strlen(keyword)*2+5, char); + memset(escape_added_keyword, 0x0, strlen(keyword)*2+5); + search_sql_make_keyword_bind_value(keyword, escape_added_keyword, SEARCH_SQL_BIND_TYPE_DUPLEX); + rc = ail_filter_new(&filter); if (rc != AIL_ERROR_OK) { SEARCH_DEBUG_WARNING("menu search - ail_filter_new error : %d", rc); return SEARCH_RET_SEARCH_FAIL; } - rc = ail_filter_add_str(filter, AIL_PROP_NAME_STR, keyword); + rc = ail_filter_add_str(filter, AIL_PROP_NAME_STR, escape_added_keyword); if (rc != AIL_ERROR_OK) { SEARCH_DEBUG_WARNING("menu search - ail_filter_add_str error : %d", rc); ret = SEARCH_RET_SEARCH_FAIL; @@ -1273,18 +1448,19 @@ int search_sql_menu_search_result_by_api(int type, int offset, int limit, goto out_func; } - ad->cate_info[type].result_cnt = cnt; + SEARCH_DEBUG_LOG("ail search result : %d", cnt); + obj->mr_info.result_cnt = cnt; if(cnt > 0) { - ad->cate_info[type].loop_cnt = 0; - rc = ail_filter_list_appinfo_foreach(filter, __search_sql_menu_search_result_cb, data); + obj->mr_info.loop_cnt = 0; + rc = ail_filter_list_appinfo_foreach(filter, __search_sql_menu_search_result_cb, &scd); if( rc != AIL_ERROR_OK) { SEARCH_DEBUG_WARNING("menu search - ail_filter_list_appinfo_foreach error : %d", rc); ret = SEARCH_RET_SEARCH_FAIL; goto out_func; } - if(ad->cate_info[type].next_point == 0) { + if (obj->mr_info.next_point == 0) { ret = SEARCH_RET_SEARCH_NONE; } else { ret = SEARCH_RET_SEARCH_SUCCESS; @@ -1295,47 +1471,334 @@ int search_sql_menu_search_result_by_api(int type, int offset, int limit, out_func: ail_filter_destroy(filter); + SEARCH_FREE(escape_added_keyword); + SEARCH_FUNC_END; + + return ret; +} +bool __search_sql_browser_bookmark_result_cb(favorites_bookmark_entry_s *item, void *user_data) +{ + SEARCH_FUNC_START; + struct search_item_sel *sel_mem_info = NULL; + + bool ret = false; + bool is_word_in_str_main = false; + bool is_word_in_str_sub = false; + + const char* match_str = NULL; + + struct search_cb_data_browser *scd = (struct search_cb_data_browser*)user_data; + struct appdata *ad = scd->ad; + struct search_content_object *obj = scd->obj; + struct search_genlist_info *result_info = scd->result_info; + char *keyword = scd->keyword; + + struct search_genlist_item_info *gen_item = NULL; + struct search_more_result *info = scd->info; + + if (info->loop_cnt < info->next_point) { + info->loop_cnt++; + return true; + } + + if (info->next_point < + info->offset + SEARCH_CATEGORY_LIST_MORE_CNT) { + + sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); + sel_mem_info->type = obj->contents_type;; + + /********** START : set search result to sel_mem_info buf ************/ + + if (item != NULL && item->title) { + match_str = search_markup_keyword(item->title, keyword, &is_word_in_str_main); + strncpy(sel_mem_info->main_buf, + match_str, + MAX_LENGTH_PER_LINE - 1); + } + + if (item != NULL && item->address) { + match_str = search_markup_keyword(item->address, keyword, &is_word_in_str_sub); + strncpy(sel_mem_info->sub_buf, + match_str, + MAX_LENGTH_PER_LINE - 1); + strncpy(sel_mem_info->path, + item->address, + MAX_LENGTH_PER_PATH - 1); + } + + if (is_word_in_str_main == true || is_word_in_str_sub == true) { + if (obj->gl_result_grp == NULL ) { + /* Set group title */ + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, + NULL); + } + + if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); + + strncpy(sel_mem_info->icon2_path, + SEARCH_FAVORITE_ICON, + MAX_LENGTH_PER_PATH - 1); + + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + ad->itc_pslist_2line_2icon, + sel_mem_info, + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); + } + + /********** END : set search result to sel_mem_info buf *************/ + info->next_point++; + info->loop_cnt++; + + ret = true; + } else if (info->next_point == + info->offset + SEARCH_CATEGORY_LIST_MORE_CNT) { + info->offset = info->next_point; + ret = false; + } else { + SEARCH_DEBUG_WARNING + ("__search_sql_browser_bookmark_result_cb wrong index : %d", + info->next_point); + + ret = false; + } SEARCH_FUNC_END; + return ret; + +} + +bool __search_sql_browser_history_result_cb(favorites_history_entry_s *item, void *user_data) +{ + SEARCH_FUNC_START; + struct search_item_sel *sel_mem_info = NULL; + + bool ret = false; + bool is_word_in_str_main = false; + + const char* match_str = NULL; + + struct search_cb_data_browser *scd = (struct search_cb_data_browser*)user_data; + struct appdata *ad = scd->ad; + struct search_content_object *obj = scd->obj; + struct search_genlist_info *result_info = scd->result_info; + char *keyword = scd->keyword; + + struct search_more_result *info = scd->info; + struct search_genlist_item_info *gen_item = NULL; + + if (info->loop_cnt < info->next_point) { + info->loop_cnt++; + return true; + } + + if (info->next_point < + info->offset + SEARCH_CATEGORY_LIST_MORE_CNT) { + + sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); + sel_mem_info->type = obj->contents_type;; + + /********** START : set search result to sel_mem_info buf ************/ + + if (item != NULL && item->address) { + SEARCH_DEBUG_WARNING("BROWSER : %s %s", item->address, keyword); + match_str = search_markup_keyword(item->address, keyword, &is_word_in_str_main); + } + + if (is_word_in_str_main != false ) { + if (obj->gl_result_grp == NULL ) { + /* Set group title */ + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, + NULL); + } + + if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); + + if (item->address) + strncpy(sel_mem_info->path, item->address, MAX_LENGTH_PER_PATH - 1); + strncpy(sel_mem_info->main_buf, + match_str, + MAX_LENGTH_PER_LINE - 1); + + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + ad->itc_pslist_1line_1icon, + sel_mem_info, + obj->gl_result_grp); + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); + } + + info->next_point++; + info->loop_cnt++; + + ret = true; + + } else if (info->next_point == + info->offset + SEARCH_CATEGORY_LIST_MORE_CNT) { + info->offset = info->next_point; + ret = false; + } else { + SEARCH_DEBUG_WARNING + ("__search_sql_browser_history_result_cb wrong index : %d", + info->next_point); + + ret = false; + } + + SEARCH_FUNC_END; return ret; } -int search_sql_msg_search_result_by_api(int type, int offset, int limit, - void *data) +int search_sql_browser_search_result_by_api(struct search_content_object *obj, + int offset, int limit, + char *keyword, + void *data, + struct search_genlist_info *result_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; + struct search_cb_data_browser scd_browser = {obj, ad, keyword, result_info, NULL}; + struct search_cb_data_browser scd_history = {obj, ad, keyword, result_info, NULL}; + + static struct search_more_result browser_result[2]; + struct search_item_more_sel *sel_mem_more = NULL; - int loop_cnt = 0; int ret = 0; + int bookmark_cnt = 0, history_cnt = 0; + int bookmark_ret = 0, history_ret = 0; + + if (offset == 0) { + /* offset 0 means first search result, so we initialize struct */ + memset(browser_result, 0x0, sizeof(browser_result)); + + favorites_bookmark_get_count(&browser_result[0].result_cnt); + favorites_history_get_count(&browser_result[1].result_cnt); + + bookmark_cnt = browser_result[0].result_cnt; + history_cnt = browser_result[1].result_cnt; + browser_result[0].ad = browser_result[1].ad = ad; + obj->gl_result_grp = NULL; + + if ( bookmark_cnt <= 0 && history_cnt <= 0 ) + return SEARCH_RET_SEARCH_NONE; + } else { + bookmark_cnt = browser_result[0].result_cnt; + history_cnt = browser_result[1].result_cnt; + browser_result[0].loop_cnt = 0; + browser_result[1].loop_cnt = 0; + } + + if (offset >= bookmark_cnt + history_cnt) { + /* We need not to search */ + return SEARCH_RET_SEARCH_NONE; + } + + scd_browser.info = &browser_result[0]; + scd_history.info = &browser_result[1]; - struct search_item_sel *sel_mem = NULL; - Elm_Object_Item *git = NULL; + /* offset check */ + if (bookmark_cnt > browser_result[0].next_point ) + bookmark_ret = favorites_bookmark_foreach(__search_sql_browser_bookmark_result_cb, + &scd_browser); + if (history_cnt > browser_result[1].next_point ) + history_ret = favorites_history_foreach(__search_sql_browser_history_result_cb, + &scd_history); + + if (bookmark_ret == FAVORITES_ERROR_DB_FAILED + && history_ret == FAVORITES_ERROR_DB_FAILED ) { + ret = SEARCH_RET_SEARCH_FAIL; + } + else if (obj->gl_result_grp == NULL) { + /* It means we can't get matched results */ + ret = SEARCH_RET_SEARCH_NONE; + } + else { + /* Make More button */ + if (browser_result[0].next_point < bookmark_cnt + || browser_result[1].next_point < history_cnt) { + sel_mem_more = (struct search_item_more_sel *)calloc(1, sizeof(struct search_item_more_sel)); + sel_mem_more->obj = obj; + + result_info->more = search_add_genlist_item(SEARCH_GENLIST_MORE, + obj, + ad->itc_listmore, + sel_mem_more, + obj->gl_result_grp); + } + + /* return check */ + obj->mr_info.next_point = browser_result[0].next_point + + browser_result[1].next_point; + ret = SEARCH_RET_SEARCH_SUCCESS; + } + + return ret; + + SEARCH_FUNC_END; +} + +int search_sql_msg_search_result_by_api(struct search_content_object *obj, + int offset, int limit, + char *keyword, + void *data, + struct search_genlist_info *result_info) +{ + SEARCH_FUNC_START; + + int loop_cnt = 0; + int ret = 0; struct search_item_sel *sel_mem_info = NULL; - bool is_word_in_str; + struct search_item_more_sel *sel_mem_more = NULL; + struct appdata *ad = (struct appdata *)data; + struct search_genlist_item_info *gen_item = NULL; - Evas_Object *glist; + bool is_word_in_str; - MSG_HANDLE_T msgHandle = NULL; - MSG_ERROR_T err = MSG_SUCCESS; - MSG_LIST_S msgList; int i = 0; int j = 0; bool is_more_btn = false; bool is_word_in_title = false; - int address_cnt = 0; + msg_error_t err = MSG_SUCCESS; + msg_struct_list_s msgList; + msg_struct_t search_s = NULL; + msg_struct_list_s *addr_list = NULL; + + search_s = msg_create_struct(MSG_STRUCT_SEARCH_CONDITION); - MSG_SEARCH_CONDITION_S searchCon = {0,}; + err = msg_set_int_value(search_s, MSG_SEARCH_CONDITION_FOLDERID_INT, MSG_ALLBOX_ID); + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to make search struct : MSG_SEARCH_CONDITION_FOLDERID_INT"); + return SEARCH_RET_SEARCH_FAIL; + }; + + err = msg_set_int_value(search_s, MSG_SEARCH_CONDITION_MSGTYPE_INT, MSG_TYPE_INVALID); + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to make search struct : MSG_SEARCH_CONDITION_MSGTYPE_INT"); + return SEARCH_RET_SEARCH_FAIL; + } - searchCon.msgType = MSG_TYPE_INVALID; - searchCon.folderId = MSG_ALLBOX_ID; - searchCon.pSearchVal = ad->search_word; + err = msg_set_str_value(search_s, MSG_SEARCH_CONDITION_SEARCH_VALUE_STR, keyword, strlen(keyword)); + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to make search struct : MSG_SEARCH_CONDITION_SEARCH_VALUE_STR"); + return SEARCH_RET_SEARCH_FAIL; + } - err = msg_search_message(ad->msg_handle, &searchCon, offset, limit, &msgList); + err = msg_search_message(ad->msg_handle, search_s, offset, limit, &msgList); if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) { SEARCH_DEBUG_WARNING("msg_search_message is failed : %d", err); @@ -1348,24 +1811,13 @@ int search_sql_msg_search_result_by_api(int type, int offset, int limit, } else { /* Set group title */ - glist = ad->search_gl; - if (offset == 0) { - sel_mem = - (struct search_item_sel *)calloc(1, - sizeof(struct - search_item_sel)); - sel_mem->type = type; - - git = - elm_genlist_item_append(glist, - (ad->itc_grouptitle), - sel_mem, - (Elm_Object_Item *) NULL, - ELM_GENLIST_ITEM_GROUP, - NULL, NULL); - - ad->gl_result_group_item[type] = git; + /* Set group title */ + result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, + obj, + ad->itc_grouptitle, + obj, + NULL); } /* Set search result to genlist */ @@ -1381,78 +1833,185 @@ int search_sql_msg_search_result_by_api(int type, int offset, int limit, /********** START : set search result to sel_mem_info buf ************/ for (i = 0; i < loop_cnt; i++) { + int ret = 0; const char *text_1line = NULL; - const char *text_2line = NULL; - const char *msg_address = NULL; const char *markup_keyword = NULL; + const char *img_path = NULL; + + int msg_type = 0; + int contact_id = -1; + int message_id = -1; + + char subject[MAX_SUBJECT_LEN] = {0}; + char str_number[MAX_ADDRESS_VAL_LEN] = {0,}; + char str_name[MAX_DISPLAY_NAME_LEN] = {0,}; + char msg_text[MAX_MSG_TEXT_LEN] = {0,}; + + CTSstruct *contact = NULL; sel_mem_info = (struct search_item_sel *) calloc(1,sizeof(struct search_item_sel)); - sel_mem_info->type = type; + sel_mem_info->type = obj->contents_type;; + + err = msg_get_int_value(msgList.msg_struct_info[i], MSG_MESSAGE_ID_INT, &message_id); + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to make search struct : MSG_MESSAGE_ID_INT %d", err); + goto out_func; + } + snprintf(sel_mem_info->main_id, MAX_LENGTH_PER_ID - 1, "%d", message_id); - snprintf(sel_mem_info->main_id, MAX_LENGTH_PER_ID - 1, "%d", msg_get_message_id(msgList.msgInfo[i])); + err = msg_get_int_value(msgList.msg_struct_info[i], MSG_MESSAGE_TYPE_INT, &msg_type); + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to make search struct : MSG_MESSAGE_TYPE_INT %d", err); + goto out_func; + } + + SEARCH_DEBUG_LOG("mms : %d", msg_type); /* Set 1st line string */ - if(msg_is_mms(msgList.msgInfo[i])) { - /* MMS case */ - char* markup_text_1line = NULL; - - text_1line = msg_get_subject(msgList.msgInfo[i]); - markup_text_1line = elm_entry_utf8_to_markup(text_1line); - - markup_keyword = search_markup_keyword(markup_text_1line, - ad->not_markup_search_word, + if (msg_type == MSG_TYPE_MMS) { + /* MMS case */ + err = msg_get_str_value(msgList.msg_struct_info[i], MSG_MESSAGE_SUBJECT_STR, + subject, MAX_SUBJECT_LEN); + + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to get sms context %d", err); + goto out_func; + } + + text_1line = subject; + markup_keyword = search_markup_keyword(text_1line, + keyword, &is_word_in_title); if (!is_word_in_title) { - text_1line = msg_mms_get_text_contents(msgList.msgInfo[i]); - markup_text_1line = elm_entry_utf8_to_markup(text_1line); - markup_keyword = search_markup_keyword(markup_text_1line, - ad->not_markup_search_word, + memset(msg_text, 0x00, sizeof(msg_text)); + err = msg_get_str_value(msgList.msg_struct_info[i], + MSG_MESSAGE_MMS_TEXT_STR, + msg_text, + sizeof(msg_text)); + + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to get mms context %d", err); + goto out_func; + } + + text_1line = msg_text; + + markup_keyword = search_markup_keyword(text_1line, + keyword, &is_word_in_title); - } + } + + SEARCH_DEBUG_LOG("1st string : %s", text_1line); if ((text_1line) && (strlen(text_1line) > 0 )) strncpy(sel_mem_info->main_buf, markup_keyword, MAX_LENGTH_PER_LINE - 1); - - SEARCH_FREE(markup_text_1line); } else { /* SMS Case */ - char* markup_text_1line = NULL; - - text_1line = msg_sms_get_message_body(msgList.msgInfo[i]); - markup_text_1line = elm_entry_utf8_to_markup(text_1line); - markup_keyword = search_markup_keyword(markup_text_1line, - ad->not_markup_search_word, + err = msg_get_str_value(msgList.msg_struct_info[i], + MSG_MESSAGE_SMS_DATA_STR, + msg_text, + sizeof(msg_text)); + + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to get sms context %d", err); + goto out_func; + } + + text_1line = msg_text; + + markup_keyword = search_markup_keyword(text_1line, + keyword, &is_word_in_title); + SEARCH_DEBUG_LOG("1st string : %s", text_1line); if ((text_1line) && (strlen(text_1line) > 0)) strncpy(sel_mem_info->main_buf, markup_keyword, MAX_LENGTH_PER_LINE - 1); + } + + err = msg_get_list_handle(msgList.msg_struct_info[i], + MSG_MESSAGE_ADDR_LIST_STRUCT, + (void **)&addr_list); - SEARCH_FREE(markup_text_1line); + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to get address list handle! %d", err); + goto out_func; } /* Set 2nd line string */ - address_cnt = msg_get_address_count(msgList.msgInfo[i]); + for ( j=0; j<addr_list->nCount; j++) { + memset(str_number, 0, sizeof(str_number)); + memset(str_name, 0, sizeof(str_name)); + contact_id = -1; + is_word_in_str = false; + + /* First We set text_2line to first address data */ + err = msg_get_str_value(addr_list->msg_struct_info[j], + MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, + str_number, + MAX_ADDRESS_VAL_LEN); + + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to get data! : MSG_ADDRESS_INFO_DISPLAYNAME_STR %d", err); + goto out_func; + } - for(j = 0; j < address_cnt; j++) { + err = msg_get_str_value(addr_list->msg_struct_info[j], + MSG_ADDRESS_INFO_DISPLAYNAME_STR, + str_name, + MAX_DISPLAY_NAME_LEN); - if(msg_get_ith_contact_id(msgList.msgInfo[i],j) > 0) { - text_2line = msg_get_ith_name(msgList.msgInfo[i],j); - } else { - text_2line = msg_get_ith_address(msgList.msgInfo[i],j); + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to get data! : MSG_ADDRESS_INFO_ADDRESS_VALUE_STR %d", err); + goto out_func; } - if ((text_2line) && (strlen(text_2line) > 0)) { - char* markup_text_2line = NULL; + err = msg_get_int_value(addr_list->msg_struct_info[j], + MSG_ADDRESS_INFO_CONTACT_ID_INT, + &contact_id); - markup_text_2line = elm_entry_utf8_to_markup(text_2line); - strncpy(sel_mem_info->sub_buf, - search_markup_keyword(markup_text_2line, - ad->not_markup_search_word, - &is_word_in_str), - MAX_LENGTH_PER_LINE - 1); - SEARCH_FREE(markup_text_2line); + if (err != MSG_SUCCESS) { + SEARCH_DEBUG_WARNING("Fail to get data! : MSG_ADDRESS_INFO_CONTACT_ID_INT %d", err); + goto out_func; + } + + /* Set text_2line */ + markup_keyword = search_markup_keyword(str_number, keyword, &is_word_in_str); + + if( 0 == j || true == is_word_in_str) { + if (strlen(str_name) > 0) { + strncpy(sel_mem_info->sub_buf, str_name, MAX_LENGTH_PER_LINE - 1); + } else { + strncpy(sel_mem_info->sub_buf, markup_keyword, MAX_LENGTH_PER_LINE - 1); + } + + /* Set Thumbnail Image */ + if (contact_id == -1) { + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); + } + else { + ret = contacts_svc_get_contact(contact_id, &contact); + + if (ret == CTS_SUCCESS) { + CTSvalue* value = NULL; + ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value); + + if (ret == CTS_SUCCESS) + img_path = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR); + + if (img_path != NULL) + strncpy(sel_mem_info->icon1_path , img_path, + MAX_LENGTH_PER_PATH -1 ); + else if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); + } + else if (obj->obj_icon_path) + strncpy(sel_mem_info->icon1_path, obj->obj_icon_path, + MAX_LENGTH_PER_PATH - 1); + } } if ((is_word_in_title) || (is_word_in_str)) { @@ -1460,37 +2019,67 @@ int search_sql_msg_search_result_by_api(int type, int offset, int limit, } } - elm_genlist_item_append(glist, - (ad->itc_pslist_2line), + SEARCH_DEBUG_LOG("sel_mem_info->sub_buf : %s", sel_mem_info->sub_buf); + + gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, + obj, + ad->itc_pslist_2line_1icon, sel_mem_info, - ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_phone_result_sel, - ad); - sel_mem_info = NULL; + obj->gl_result_grp); + + result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); } - msg_release_message_list(&msgList); - + msg_release_list_struct(&msgList); + /* Set more title to genlist (under 'search all') */ if (is_more_btn) { - ad->cate_info[type].next_point = offset + limit - 1; + obj->mr_info.next_point = offset + limit - 1; - sel_mem = (struct search_item_sel *) - calloc(1,sizeof(struct search_item_sel)); - sel_mem->type = type; + sel_mem_more = (struct search_item_more_sel *) + calloc(1,sizeof(struct search_item_more_sel)); + sel_mem_more->obj = obj; - elm_genlist_item_append(ad->search_gl, (ad->itc_listmore), - sel_mem, ad->gl_result_group_item[type], - ELM_GENLIST_ITEM_NONE, - search_gl_result_more_item_append_cb, - ad); + result_info->more = search_add_genlist_item(SEARCH_GENLIST_MORE, + obj, + ad->itc_listmore, + sel_mem_more, + obj->gl_result_grp); } ret = SEARCH_RET_SEARCH_SUCCESS; } +out_func: SEARCH_FUNC_END; return ret; -} - +} + +void search_sql_update_result_object(struct search_content_object* result_obj, sqlite3* db_handle, sqlite3_stmt** db_sql) +{ + SEARCH_FUNC_START; + + int rc = 0; + + sqlite3_stmt *sql_stmt = db_sql[SEARCH_STMT_UPDATE_OBJECT_INFO]; + SEARCH_RET_IF(sql_stmt==NULL); + + search_sql_bind_text(db_handle, sql_stmt, 1, result_obj->name); + search_sql_bind_int(db_handle, sql_stmt, 2, result_obj->string_type); + search_sql_bind_int(db_handle, sql_stmt, 3, result_obj->visible); + search_sql_bind_int(db_handle, sql_stmt, 4, result_obj->order); + search_sql_bind_int(db_handle, sql_stmt, 5, result_obj->contents_type); + search_sql_bind_int(db_handle, sql_stmt, 6, result_obj->category_type); + search_sql_bind_text(db_handle, sql_stmt, 7, result_obj->def_pkg_name); + search_sql_bind_int(db_handle, sql_stmt, 8, result_obj->contents_type); + + rc = sqlite3_step(sql_stmt); + + if (rc == SQLITE_OK) + SEARCH_DEBUG_LOG("INSERT STEP SUCCESS"); + + search_sql_stmt_init(sql_stmt); + + SEARCH_FUNC_END; + +} diff --git a/src/search_bar.cpp b/src/search_bar.cpp index 9403621..bcb3978 100755 --- a/src/search_bar.cpp +++ b/src/search_bar.cpp @@ -1,12 +1,12 @@ /* * Copyright 2012 Samsung Electronics Co., Ltd - * + * * Licensed under the Flora License, Version 1.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.tizenopensource.org/license - * + * * 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. @@ -23,11 +23,17 @@ #include "smartsearch.h" #include "Elementary.h" -static const char* g_search_category_icon[SEARCH_CATE_BTN_IMG_TYPE_MAX] = +Eina_Bool __search_entry_timer_cb(void *data) { - "B10_Phone.png", - "B10_Phone_press.png", -}; + SEARCH_FUNC_START; + struct appdata *ad = (struct appdata *)data; + + search_set_result_list(ad); + ad->search_timer = NULL; + + SEARCH_FUNC_END; + return ECORE_CALLBACK_CANCEL; +} void __search_searchbar_entry_changed_cb(void *data, Evas_Object * obj, void *event_info) @@ -46,7 +52,7 @@ void __search_searchbar_entry_changed_cb(void *data, Evas_Object * obj, else elm_object_signal_emit(ad->search_bar, "elm,state,eraser,show", "elm"); } else { - if (elm_entry_is_empty(ad->search_entry)) + if (elm_entry_is_empty(ad->search_entry)) elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,show", "elm"); else elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,hide", "elm"); @@ -56,11 +62,11 @@ void __search_searchbar_entry_changed_cb(void *data, Evas_Object * obj, && (SEARCH_STRCMP(text, ad->search_word) == 0)) { SEARCH_DEBUG_LOG("text is same as prev text"); } else { - if(ad->idler_search) - ecore_idler_del(ad->idler_search); - - ad->idler_search = ecore_idler_add(search_set_result_list, ad); - } + /* Make timer for check user's input */ + search_stop_search(ad); + + ad->search_timer = ecore_timer_add(0.4, __search_entry_timer_cb, ad); + } SEARCH_FUNC_END; return; @@ -185,21 +191,21 @@ __search_searchbar_state_event_cb(void *data, Ecore_IMF_Context *imf_context, in { case ECORE_IMF_INPUT_PANEL_STATE_SHOW: evas_object_smart_callback_add( - ad->search_gl, - "scroll,drag,start", - __search_searchbar_gl_drag_scroll_start_cb, - data); + ad->search_gl, + "scroll,drag,start", + __search_searchbar_gl_drag_scroll_start_cb, + data); break; case ECORE_IMF_INPUT_PANEL_STATE_HIDE: - // ISE state has changed to ISE_STATE_HIDE status + /* ISE state has changed to ISE_STATE_HIDE status */ evas_object_smart_callback_del( - ad->search_gl, - "scroll,drag,start", + ad->search_gl, + "scroll,drag,start", __search_searchbar_gl_drag_scroll_start_cb); break; } - SEARCH_FUNC_END; + SEARCH_FUNC_END; } static void __search_searchbar_create(void *data) @@ -264,7 +270,7 @@ static void __search_searchbar_create(void *data) elm_object_part_content_set(ad->search_bar, "button_cancel", ad->search_cancel_btn); elm_object_style_set(ad->search_cancel_btn, "searchbar/default"); elm_object_text_set(ad->search_cancel_btn, dgettext("sys_string", "IDS_COM_SK_CANCEL")); - + ad->search_entry = elm_entry_add(ad->search_bar); elm_entry_scrollable_set(ad->search_entry, EINA_TRUE); elm_entry_single_line_set(ad->search_entry, EINA_TRUE); @@ -295,7 +301,7 @@ static void __search_searchbar_create(void *data) "elm", __search_searchbar_eraser_clicked_cb, ad); - + /* Set Search-Entry Callback */ evas_object_smart_callback_add( ad->search_entry, @@ -320,7 +326,7 @@ static void __search_searchbar_create(void *data) ad); evas_object_event_callback_add( ad->search_entry, - EVAS_CALLBACK_KEY_DOWN, + EVAS_CALLBACK_KEY_DOWN, __search_searchbar_key_down_cb, ad); @@ -353,21 +359,25 @@ static Evas_Object *__search_init_noresult_view(void *data) return noc; } -Evas_Object *search_searchbar_category_icon_add(int cate_type, int press_type, Evas_Object *parent) +Evas_Object *search_searchbar_category_icon_add(char* img, Evas_Object *parent) { SEARCH_FUNC_START; - Evas_Object* cate_icon; - char buf[128] = { 0, }; + char buf[MAX_LENGTH_PER_PATH] = { 0, }; + Evas_Object* cate_icon = NULL; + if( img != NULL ) { cate_icon = elm_icon_add(parent); - - snprintf(buf, sizeof(buf), SEARCH_ICON_PATH "%s", g_search_category_icon[press_type]); + + snprintf(buf, sizeof(buf), SEARCH_ICON_PATH "%s", img); + + SEARCH_DEBUG_LOG("buf : %s", buf); elm_icon_file_set(cate_icon, buf, NULL); evas_object_size_hint_aspect_set(cate_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); - elm_icon_resizable_set(cate_icon, EINA_TRUE, EINA_TRUE); + elm_icon_resizable_set(cate_icon, EINA_FALSE, EINA_FALSE); + } SEARCH_FUNC_END; @@ -379,11 +389,11 @@ void search_searchbar_cb(void *data, Evas_Object * obj, void *event_info) SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; - + Evas_Object *cate_btn; Evas_Object *cate_icon; int category = 0; - int err = 0; + char *imgpath = NULL; /* create layout */ @@ -392,20 +402,19 @@ void search_searchbar_cb(void *data, Evas_Object * obj, void *event_info) SEARCH_EDJ, "smartsearch/search_result"); - category = SEARCH_TYPE_PHONE; + category = SEARCH_CATE_PHONE; - cate_icon = search_searchbar_category_icon_add(category, - SEARCH_CATE_BTN_IMG_TYPE_UNPRESSED, - ad->sb_layout); + imgpath = ad->category_info[ad->search_category].btn_icon_path; + cate_icon = search_searchbar_category_icon_add(imgpath, ad->sb_layout); cate_btn = elm_button_add(ad->sb_layout); elm_object_content_set(ad->cate_btn, cate_icon); - + evas_object_show(cate_btn); ad->cate_btn = cate_btn; elm_object_part_content_set(ad->sb_layout, "searchbar_area_category", cate_btn); - + /* set search bar area */ __search_searchbar_create(ad); elm_object_part_content_set(ad->sb_layout, "searchbar_area_entry", ad->search_bar); @@ -413,12 +422,12 @@ void search_searchbar_cb(void *data, Evas_Object * obj, void *event_info) /* set search result area */ ad->noresult_view = __search_init_noresult_view(ad); - elm_object_part_content_set(ad->sb_layout, + elm_object_part_content_set(ad->sb_layout, "list_noresult", ad->noresult_view); evas_object_size_hint_weight_set( - ad->sb_layout, + ad->sb_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); diff --git a/src/smartsearch.cpp b/src/smartsearch.cpp index f37725e..b751625 100755 --- a/src/smartsearch.cpp +++ b/src/smartsearch.cpp @@ -1,12 +1,12 @@ /* * Copyright 2012 Samsung Electronics Co., Ltd - * + * * Licensed under the Flora License, Version 1.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.tizenopensource.org/license - * + * * 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. @@ -28,13 +28,50 @@ #include "ps_makeupviews.h" #include "ps_searcher.h" -#include <contacts-svc.h> -#include <calendar-svc-provider.h> -#include <memo-db.h> -#include <appsvc.h> -#include <aul_service.h> - -static int __search_app_terminate(void *data); +#include <app.h> +#include <ail.h> + +struct search_content_object_default { + int order; + int visible; + char name[DEF_BUF_LEN]; + int string_type; + int contents_type; + int category_type; + char def_pkg_name[DEF_BUF_LEN]; +}; + +struct search_category_info_default { + char btn_icon_path[MAX_LENGTH_PER_PATH]; + char btn_icon_press_path[MAX_LENGTH_PER_PATH]; +}; + +static struct search_content_object_default def_obj[SEARCH_CONT_MAX] = { + { 0, EINA_TRUE, "IDS_COM_BODY_CONTACTS", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_CONTACTS, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.contacts" }, + { 1, EINA_TRUE, "IDS_COM_BODY_MESSAGES", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_MSG, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.message" }, + { 2, EINA_TRUE, "IDS_COM_BODY_EMAIL", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_EMAIL, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.email" }, + { 3, EINA_TRUE, "IDS_COM_BODY_IMAGES", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_IMAGES, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.image-viewer"}, + { 4, EINA_TRUE, "IDS_COM_BODY_MUSIC", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_MUSIC, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.music-player"}, + { 5, EINA_TRUE, "IDS_COM_BODY_VIDEOS", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_VIDEO, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.video-player"}, + { 6, EINA_TRUE, "IDS_COM_BODY_CALENDAR", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_CALENDAR, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.efl-calendar"}, + { 7, EINA_TRUE, "IDS_COM_BODY_MEMO", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_MEMO, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.memo"}, + { 8, EINA_TRUE, "IDS_COM_BODY_APPLICATIONS", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_MENU, SEARCH_OBJ_PHONE_CONTENTS, {0} }, + { 9, EINA_TRUE, "IDS_COM_BODY_INTERNET", SEARCH_STR_TYPE_SYSTEM_STRING, + SEARCH_CONT_PHONE_BROWSER, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.browser"}, +}; + +static struct search_category_info_default def_category[SEARCH_CATE_MAX] = { + { "B10_btn_icon_Phone.png", "B10_btn_icon_Phone_press.png" }, +}; static void __search_win_delete_cb(void *data, Evas_Object * obj, void *event_info) @@ -65,7 +102,7 @@ static Eina_Bool __search_keydown_event(void *data, int type, void *event) Ecore_Event_Key *ev = (Ecore_Event_Key *) event; - if (!SEARCH_STRCMP(ev->keyname, KEY_END)) { + if (!SEARCH_STRCMP(ev->keyname, KEY_END)) { //end key concept is close. elm_exit(); } @@ -99,9 +136,9 @@ static Evas_Object *__search_create_layout_main(Evas_Object * parent) evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(parent, bg); elm_object_part_content_set(layout, "elm.swallow.bg", bg); - + evas_object_show(bg); - + edje_object_signal_emit(_EDJ(layout), "elm,state,show,indicator","elm"); edje_object_signal_emit(_EDJ(layout), "elm,state,show,content", "elm"); evas_object_show(layout); @@ -133,9 +170,9 @@ static Evas_Object *__search_create_navigation_layout(Evas_Object * parent) static void __search_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) { SEARCH_FUNC_START; - + struct appdata *ad = (struct appdata *)data; - + elm_win_lower(ad->win_main); if(ad->back_btn_type == BACK_BTN_TYPE_CLOSE) @@ -148,22 +185,20 @@ static void __search_add_back_btn(struct appdata *ad) { SEARCH_FUNC_START; - Elm_Object_Item *navi_it; - /* add back key */ Evas_Object *btn = elm_button_add(ad->navi_bar); elm_object_style_set(btn, "naviframe/end_btn/default"); evas_object_smart_callback_add(btn, "clicked", __search_back_btn_clicked_cb, ad); #ifdef __ENABLE_TOP_BACK_BTN - navi_it = elm_naviframe_item_push(ad->navi_bar, + ad->navi_it = elm_naviframe_item_push(ad->navi_bar, dgettext("sys_string", "IDS_COM_BODY_SEARCH"), NULL, NULL, ad->sb_layout, NULL); elm_object_item_part_content_set(navi_it, "title_right_btn", btn); elm_object_item_signal_emit(navi_it, "elm,state,controlbar,close", ""); #else - elm_naviframe_item_push(ad->navi_bar, + ad->navi_it = elm_naviframe_item_push(ad->navi_bar, dgettext("sys_string", "IDS_COM_BODY_SEARCH"), btn, NULL, ad->sb_layout, NULL); #endif @@ -171,7 +206,7 @@ static void __search_add_back_btn(struct appdata *ad) ad->back_btn = btn; SEARCH_FUNC_END; -} +} static int __search_init_smartsearch(struct appdata *ad) { @@ -189,8 +224,7 @@ static int __search_init_smartsearch(struct appdata *ad) // Navigation Bar ad->navi_bar = __search_create_navigation_layout(ad->layout_main); - search_result_gl_init(ad); - + ad->search_category = SEARCH_CATE_PHONE; search_searchbar_cb(ad, NULL, NULL); __search_add_back_btn(ad); @@ -199,35 +233,133 @@ static int __search_init_smartsearch(struct appdata *ad) return 0; } -static int __search_deinit_smartsearch(struct appdata *ad) +static void __search_init_result_object(struct appdata *ad) { SEARCH_FUNC_START; - SEARCH_RETV_IF(ad == NULL, -1); + int i = 0; + int rc = 0; + int ret = SEARCH_RET_SEARCH_NONE; - search_result_gl_deinit(ad); + ail_appinfo_h handle = NULL; + ail_error_e ail_ret = AIL_ERROR_OK; + char *str = NULL; - SEARCH_FUNC_END; + sqlite3_stmt *sql_load = NULL; + sqlite3_stmt *sql_insert = NULL; - return 0; + /* Load DB data */ + sql_load = ad->search_db_sql[SEARCH_STMT_GET_CATEGORY_LIST_ALL]; + + rc = sqlite3_step(sql_load); + if (rc != SQLITE_ROW) { + if (rc == SQLITE_DONE) { + SEARCH_DEBUG_WARNING("SELECT STEP : SQLITE_DONE. No result"); + ret = SEARCH_RET_SEARCH_NONE; + } else { + SEARCH_DEBUG_ERROR("SELECT STEP FAIL : (%d)", rc); + ret = SEARCH_RET_SEARCH_FAIL; + } + } else { + SEARCH_DEBUG_LOG("SELECT STEP SUCCESS"); + ret = SEARCH_RET_SEARCH_SUCCESS; +} + + /* Initialize Category */ + for( i = 0 ; i < SEARCH_CATE_MAX; ++i ) { + ad->category_info[i].btn_icon_path = strdup(def_category[i].btn_icon_path); + ad->category_info[i].btn_icon_press_path = strdup(def_category[i].btn_icon_press_path); + } + + if( ret != SEARCH_RET_SEARCH_SUCCESS ) { + /* If db result is NULL, initialize to default setting and insert this data to DB */ + for( i = 0; i < SEARCH_CONT_MAX ; ++i ) { + sql_insert = ad->search_db_sql[SEARCH_STMT_INSERT_OBJECT_INFO]; + ad->result_obj[i].order = def_obj[i].order; + ad->result_obj[i].visible = def_obj[i].visible; + ad->result_obj[i].contents_type = def_obj[i].contents_type; + ad->result_obj[i].category_type = def_obj[i].category_type; + ad->result_obj[i].name = strdup(def_obj[i].name); + ad->result_obj[i].string_type = def_obj[i].string_type; + ad->result_obj[i].def_pkg_name = strdup(def_obj[i].def_pkg_name); + + ail_ret = ail_package_get_appinfo(def_obj[i].def_pkg_name, &handle); + + if (ail_ret == AIL_ERROR_OK) { + ret = ail_appinfo_get_str(handle, AIL_PROP_ICON_STR, &str); + + if (ail_ret == AIL_ERROR_OK) + ad->result_obj[i].obj_icon_path = strdup(str); } + /* Insert DB */ + search_sql_bind_text(ad->search_db_hd, sql_insert, 1, ad->result_obj[i].name); + search_sql_bind_int(ad->search_db_hd, sql_insert, 2, ad->result_obj[i].string_type); + search_sql_bind_int(ad->search_db_hd, sql_insert, 3, ad->result_obj[i].visible); + search_sql_bind_int(ad->search_db_hd, sql_insert, 4, ad->result_obj[i].order); + search_sql_bind_int(ad->search_db_hd, sql_insert, 5, ad->result_obj[i].contents_type); + search_sql_bind_int(ad->search_db_hd, sql_insert, 6, ad->result_obj[i].category_type); + search_sql_bind_text(ad->search_db_hd, sql_insert, 7, ad->result_obj[i].def_pkg_name); + + rc = sqlite3_step(sql_insert); + + if( sql_insert != NULL ) + search_sql_stmt_init(sql_insert); + } + } else { + /* Copy db data to structure */ + for(i = 0; i < SEARCH_CONT_MAX && rc == SQLITE_ROW; ++i) { + char *name = (char *)sqlite3_column_text(sql_load, 0); + int string_type = sqlite3_column_int(sql_load, 1); + int visible = sqlite3_column_int(sql_load, 2); + int order = sqlite3_column_int(sql_load, 3); + int contents_type = sqlite3_column_int(sql_load, 4); + int category_type = sqlite3_column_int(sql_load, 5); + char *def_pkg_name = (char *)sqlite3_column_text(sql_load, 6); + + ad->result_obj[i].order = order; + ad->result_obj[i].contents_type = contents_type; + ad->result_obj[i].string_type = string_type; + ad->result_obj[i].category_type = category_type; + ad->result_obj[i].name = ( name != NULL ) ? strdup(name): NULL; + ad->result_obj[i].visible = ( visible > 0 ) ? EINA_TRUE : EINA_FALSE; + ad->result_obj[i].def_pkg_name = ( def_pkg_name != NULL) ? + strdup(def_pkg_name) : NULL; + + if (def_pkg_name) { + ail_ret = ail_package_get_appinfo(def_pkg_name, &handle); + + if (ail_ret == AIL_ERROR_OK) { + ret = ail_appinfo_get_str(handle, AIL_PROP_ICON_STR, &str); + + if (ail_ret == AIL_ERROR_OK) + ad->result_obj[i].obj_icon_path = strdup(str); + } + } + + rc = sqlite3_step(sql_load); + } + } + + if( sql_load != NULL ) + search_sql_stmt_init(sql_load); + if( sql_insert != NULL ) + search_sql_stmt_init(sql_insert); + + SEARCH_FUNC_END; + } + static Evas_Object *__search_create_win(const char *name) -{ + { SEARCH_FUNC_START; Evas_Object *eo; - int w, h; eo = elm_win_add(NULL, name, ELM_WIN_BASIC); if (eo) { elm_win_title_set(eo, name); - elm_win_borderless_set(eo, EINA_TRUE); evas_object_smart_callback_add(eo, "delete,request", __search_win_delete_cb, NULL); - ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, - &h); - evas_object_resize(eo, w, h); } SEARCH_FUNC_END; @@ -235,149 +367,69 @@ static Evas_Object *__search_create_win(const char *name) return eo; } -static int __search_init_app_connect(struct appdata *ad) +static int __search_init_db_connect(struct appdata *ad) { SEARCH_FUNC_START; - int rc = 0, conn_ret = 0, type = 0; - char sql_query[DB_QUERY_LEN] = { 0, }; - int ret = SEARCH_RET_SUCCESS; - - for (type = 0; type < PHONE_CATEGORY_LIST_CNT; type++) { + int rc = 0; + int ret = SEARCH_RET_FAIL; + + rc = db_util_open(SEARCH_DB_PATH, + &(ad->search_db_hd), + 0); + if (rc != SQLITE_OK) { + SEARCH_DEBUG_ERROR + ("db_util_open error : %d (%s)\n", + rc, SEARCH_DB_PATH); + ret = SEARCH_RET_FAIL; + } else { + int i = 0; + const char *query_list[SEARCH_STMT_MAX] = { SEARCH_DB_SQL_GET_CATEGORY_LIST_ALL, + SEARCH_DB_SQL_INSERT_OBJECT_IFNO, + SEARCH_DB_SQL_UPDATE_OBJECT_INFO + }; - switch(type) { + for (i = SEARCH_STMT_GET_CATEGORY_LIST_ALL; i < SEARCH_STMT_MAX ; ++i ) { + SEARCH_DEBUG_LOG("query : %s\n", query_list[i]); - case SEARCH_TYPE_PHONE_CONTACTS: - { - rc = contacts_svc_connect(); - if (rc != CTS_SUCCESS) { - SEARCH_DEBUG_WARNING - ("contacts svc connect fail : %d", - rc); + ret = search_sql_prepare_stmt(ad->search_db_hd, query_list[i], + &(ad->search_db_sql[i])); } } - break; - case SEARCH_TYPE_PHONE_MSG: - { - MSG_ERROR_T err = MSG_SUCCESS; - err = msg_open_msg_handle(&ad->msg_handle); - - if (err != MSG_SUCCESS) { - SEARCH_DEBUG_WARNING("msg_open_msg_handle error : %d", err); - ad->msg_handle = NULL; - } - } - break; - case SEARCH_TYPE_PHONE_EMAIL: - break; - - /* IMAGE, MUSIC, VIDEO use common handle */ - case SEARCH_TYPE_PHONE_IMAGES: - case SEARCH_TYPE_PHONE_MUSIC: - case SEARCH_TYPE_PHONE_VIDEO: - if( ad->media_handle == NULL ) { - conn_ret = media_svc_connect(&ad->media_handle); - if(conn_ret < 0) { - SEARCH_DEBUG_WARNING("media_svc_connect failed : %d\n", conn_ret); - ad->media_handle = NULL; - } - } - break; - case SEARCH_TYPE_PHONE_CALENDAR: - { - rc = calendar_svc_connect(); - if (rc != CAL_SUCCESS) { - SEARCH_DEBUG_WARNING - ("calendar svc connect fail : %d", - rc); - } - } - break; - case SEARCH_TYPE_PHONE_MEMO: - { - rc = memo_init(NULL); - if (rc == -1) { - SEARCH_DEBUG_WARNING - ("memo svc connect fail : %d", rc); - } - } - break; - } - } + return ret; SEARCH_FUNC_END; + } - return ret; -} - -static int __search_deinit_app_disconnect(void *data) -{ +static void __search_deinit_db_connect(struct appdata *ad) + { SEARCH_FUNC_START; - struct appdata *ad = (struct appdata *)data; - - int rc = 0, conn_ret = 0, type = 0; + int i = 0, rc = 0; - for (type = 0; type < PHONE_CATEGORY_LIST_CNT; type++) { - switch (type) { - - case SEARCH_TYPE_PHONE_CONTACTS: - { - rc = contacts_svc_disconnect(); - if (rc != CTS_SUCCESS) { - SEARCH_DEBUG_WARNING - ("contacts svc disconnect fail : %d", - rc); + for (i = SEARCH_STMT_GET_CATEGORY_LIST_ALL; i < SEARCH_STMT_MAX ; ++i ) { + if (ad->search_db_sql[i]) { + search_sql_stmt_finalize(ad->search_db_sql[i]); + ad->search_db_sql[i] = NULL; } } - break; - case SEARCH_TYPE_PHONE_MSG: - { - MSG_ERROR_T err = MSG_SUCCESS; - err = msg_close_msg_handle(&ad->msg_handle); - - if (err != MSG_SUCCESS) { - SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err); - } - ad->msg_handle = NULL; - } - break; - case SEARCH_TYPE_PHONE_EMAIL: - break; - case SEARCH_TYPE_PHONE_IMAGES: - case SEARCH_TYPE_PHONE_MUSIC: - case SEARCH_TYPE_PHONE_VIDEO: - { - conn_ret = media_svc_disconnect(ad->media_handle); - if(conn_ret < 0) { - SEARCH_DEBUG_WARNING("media_svc_disconnect failed : %d\n", conn_ret); - } - ad->media_handle = NULL; - } - break; - case SEARCH_TYPE_PHONE_CALENDAR: - { - rc = calendar_svc_close(); - if (rc != CAL_SUCCESS) { + if (ad->search_db_hd) { + rc = db_util_close(ad->search_db_hd); + if (rc != SQLITE_OK) { SEARCH_DEBUG_WARNING - ("calendar svc disconnect fail : %d", - rc); - } - } - break; - case SEARCH_TYPE_PHONE_MEMO: - { - memo_fini(); - } - break; + ("db_util_close error : %d / %s", + rc, SEARCH_DB_PATH); + } else { + SEARCH_DEBUG_LOG("db_util_close success"); } + ad->search_db_hd = NULL; + } else { + SEARCH_DEBUG_WARNING("db_handle(%s) is null", SEARCH_DB_PATH); } SEARCH_FUNC_END; - - return 0; } static Eina_Bool __search_init_after_ui_create(gpointer data) @@ -386,17 +438,17 @@ static Eina_Bool __search_init_after_ui_create(gpointer data) struct appdata *ad = (struct appdata *)data; - ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, + ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __search_keydown_event, ad); - ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, + ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __search_mousedown_event, ad); /* add system event callback */ appcore_set_event_callback(APPCORE_EVENT_REGION_CHANGE, - search_util_date_time_format_init, + search_util_date_time_format_init, NULL); UG_INIT_EFL(ad->win_main, UG_OPT_INDICATOR_ENABLE); @@ -406,7 +458,44 @@ static Eina_Bool __search_init_after_ui_create(gpointer data) return ECORE_CALLBACK_CANCEL; } -static int __search_app_create(void *data) + +static void __search_update_lang(void *data) +{ + SEARCH_FUNC_START; + struct appdata *ad = (struct appdata *)data; + int i = 0; + + /* Update Text for match to current language */ + if (ad->navi_it) + elm_object_item_text_set(ad->navi_it, + dgettext("sys_string", "IDS_COM_BODY_SEARCH")); + + if (ad->search_bar) + elm_object_part_text_set(ad->search_bar, + "elm.guidetext", + dgettext("sys_string", "IDS_COM_BODY_SEARCH")); + if (ad->noresult_view) + elm_object_part_text_set(ad->noresult_view, + "elm.text", + dgettext("sys_string", "IDS_COM_BODY_NO_SEARCH_RESULTS")); + + if (ad->search_cancel_btn) + elm_object_text_set(ad->search_cancel_btn, + dgettext("sys_string", + "IDS_COM_SK_CANCEL")); + + for (i = 0; i < SEARCH_CONT_MAX; i++) { + Elm_Object_Item *it = ad->result_obj[i].gl_result_grp; + const char *item_name = ad->result_obj[i].name; + + if (it && item_name) + elm_genlist_item_fields_update(it, "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT); + } + + SEARCH_FUNC_END; +} + +static bool __search_app_create(void *data) { SEARCH_FUNC_START; @@ -423,23 +512,26 @@ static int __search_app_create(void *data) ad->scale_factor = elm_config_scale_get(); __search_init_smartsearch(ad); - + search_result_gl_init(ad); search_util_date_time_format_init(NULL); - __search_init_app_connect(ad); + __search_init_db_connect(ad); + __search_init_result_object(ad); + search_app_connect(ad); ad->idler_create_ui = ecore_idler_add(__search_init_after_ui_create, ad); SEARCH_FUNC_END; - return 0; + return true; } -static int __search_app_terminate(void *data) +static void __search_app_terminate(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; + int i = 0; if (ad->layout_main) { evas_object_del(ad->layout_main); @@ -453,34 +545,42 @@ static int __search_app_terminate(void *data) if(ad->idler_create_ui) ecore_idler_del(ad->idler_create_ui); - + if(ad->idler_search) ecore_idler_del(ad->idler_search); - - __search_deinit_smartsearch(ad); - __search_deinit_app_disconnect(ad); + search_result_gl_deinit(ad); + + search_app_disconnect(ad); + __search_deinit_db_connect(ad); search_util_date_time_format_deinit(); + for ( i = 0 ; i < SEARCH_CONT_MAX ; ++i ) { + SEARCH_FREE(ad->result_obj[i].name); + SEARCH_FREE(ad->result_obj[i].obj_icon_path); + SEARCH_FREE(ad->result_obj[i].def_pkg_name); + } + + for ( i = 0 ; i < SEARCH_CATE_MAX ; ++i ) { + SEARCH_FREE(ad->category_info[i].btn_icon_path); + SEARCH_FREE(ad->category_info[i].btn_icon_press_path); + } + SEARCH_FREE(ad->search_word); SEARCH_FREE(ad->not_markup_search_word); - - SEARCH_FUNC_END; - return 0; + SEARCH_FUNC_END; } -static int __search_app_pause(void *data) +static void __search_app_pause(void *data) { SEARCH_FUNC_START; SEARCH_FUNC_END; - - return 0; } -static int __search_app_resume(void *data) +static void __search_app_resume(void *data) { SEARCH_FUNC_START; @@ -490,69 +590,76 @@ static int __search_app_resume(void *data) elm_object_focus_set(ad->back_btn, EINA_FALSE); } SEARCH_FUNC_END; - - return 0; } -static int __search_app_reset(bundle * b, void *data) +static void __search_app_service(service_h service, void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; - const char *query = NULL; - const char *svcname = NULL; - const char *category = NULL; - char* keyword = NULL; + + char *query = NULL; + char *keyword = NULL; + char *operation = NULL; Evas_Object *cate_icon; - int ret; + int ret = 0; ad->back_btn_type = BACK_BTN_TYPE_LOWER; + ret = service_get_operation(service, &operation); - if (b == NULL) { - keyword = vconf_get_str(SMARTSEARCH_KEY_KEYWORD); - } else { - svcname = appsvc_get_operation(b); - if(svcname) { - if(SEARCH_STRCMP(svcname, APPSVC_OPERATION_SEARCH) == 0) { - query = appsvc_get_data(b, APPSVC_DATA_KEYWORD); - } else { - SEARCH_DEBUG_WARNING("wrong app service name : %s", svcname); + if (ret != 0) { + SEARCH_DEBUG_WARNING("Cannot get operation!"); + return; + } + + if(operation == NULL ) { + SEARCH_DEBUG_WARNING("Operation is NULL!"); + return; } - ad->back_btn_type = BACK_BTN_TYPE_CLOSE; - } else { - svcname = bundle_get_val(b, AUL_K_SERVICE_NAME); + SEARCH_DEBUG_LOG("SERVICE OPERATION TYPE : %s", operation); + if (SEARCH_STRCMP(operation, SERVICE_OPERATION_SEARCH) == 0) { + ret = service_get_extra_data(service, "http://tizen.org/appsvc/data/keyword", &query); - if(svcname) { - if(SEARCH_STRCMP(svcname, SEARCH_SVC) == 0) { - query = bundle_get_val(b, "query"); - } else { - SEARCH_DEBUG_WARNING("wrong aul service name : %s", svcname); - } + if(ret != 0) { + SEARCH_DEBUG_WARNING("Fail to Get Keyword data!"); + query = NULL; } - } - - cate_icon = search_searchbar_category_icon_add(SEARCH_TYPE_PHONE, SEARCH_CATE_BTN_IMG_TYPE_UNPRESSED, ad->sb_layout); - elm_object_content_set(ad->cate_btn, cate_icon); - - /* - * keyword input param is only enabled for phone search - * if there is no keyword input param, set latest search keyword for phone search - */ + if( (query) && (strlen(query) > 0) ) { keyword = (char*)malloc(strlen(query)+1); memset(keyword, 0x00, strlen(query)+1); strncpy(keyword, query, strlen(query)); - } else { - keyword = vconf_get_str(SMARTSEARCH_KEY_KEYWORD); } + ad->search_category = SEARCH_CATE_PHONE; + ad->back_btn_type = BACK_BTN_TYPE_CLOSE; + + } else { + /* If Operation type is not SEARCH, Initializae valute to default */ + keyword = vconf_get_str(SMARTSEARCH_KEY_KEYWORD); + + if (keyword == NULL) + SEARCH_DEBUG_WARNING("Error(%d) : get current key from vconf", ret); + + ad->search_category = SEARCH_CATE_PHONE; } + SEARCH_DEBUG_LOG("current category : %d", ad->search_category); + + cate_icon = search_searchbar_category_icon_add(ad->category_info[ad->search_category].btn_icon_path, + ad->sb_layout); + elm_object_content_set(ad->cate_btn, cate_icon); + + /* set current category to vconf */ + ad->search_category = SEARCH_CATE_PHONE; + if ((keyword) && (strlen(keyword) > 0)) { elm_object_text_set(ad->search_entry, keyword); } else { + SEARCH_DEBUG_LOG("keyword is NULL"); + elm_object_text_set(ad->search_entry, ""); elm_object_signal_emit(ad->search_bar, "cancel,hide", ""); @@ -565,6 +672,8 @@ static int __search_app_reset(bundle * b, void *data) } SEARCH_FREE(keyword); + SEARCH_FREE(operation); + SEARCH_FREE(query); elm_entry_cursor_end_set(ad->search_entry); @@ -572,8 +681,16 @@ static int __search_app_reset(bundle * b, void *data) elm_win_activate(ad->win_main); SEARCH_FUNC_END; +} - return 0; +static void __search_app_lang_change(void *data) +{ + SEARCH_FUNC_START; + struct appdata *ad = (struct appdata *)data; + + __search_update_lang(ad); + + SEARCH_FUNC_END; } int main(int argc, char *argv[]) @@ -581,25 +698,28 @@ int main(int argc, char *argv[]) SEARCH_FUNC_START; struct appdata ad; - struct appcore_ops ops; - int ret = 0; + int i = 0; - ops.create = &__search_app_create; - ops.terminate = &__search_app_terminate; - ops.pause = &__search_app_pause; - ops.resume = &__search_app_resume; - ops.reset = &__search_app_reset; + app_event_callback_s event_callback; + + event_callback.create = __search_app_create; + event_callback.terminate = __search_app_terminate; + event_callback.pause = __search_app_pause; + event_callback.resume = __search_app_resume; + event_callback.service = __search_app_service; + event_callback.low_memory = NULL; + event_callback.low_battery = NULL; + event_callback.device_orientation = NULL; + event_callback.language_changed = __search_app_lang_change; + event_callback.region_format_changed = NULL; memset(&ad, 0x0, sizeof(struct appdata)); - ops.data = &ad; for (i = 0; i < argc; i++) SEARCH_DEBUG_LOG("argv[%d] = [%s]\n", i, argv[i]); - ret = appcore_efl_main(SEARCH_PACKAGE, &argc, &argv, &ops); - SEARCH_FUNC_END; - return ret; + return app_efl_main(&argc, &argv, &event_callback, &ad); } |