X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fps_searcher.cpp;h=ff74b422b40a2e15604e22e71fd8b6fc4b72b7bc;hb=c0ba7a1c167608d47661d632ddd9f208d8cb068d;hp=58414c6b3c501a0d6acdfd00824d065e8eadb4bc;hpb=bf8879b3c9c9a58111b20ea76263a5845a2f56fb;p=apps%2Fhome%2Fsmartsearch.git 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 #include -#include -#include +#include -#include -#include -#include -#include -#include +#include +#include -#include +#include +#include +#include -static GList *g_history_list; +#include +#include +#include +#include +#include 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;itype = 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; jnCount; 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; + +}