/* * Copyright 2012-2013 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://floralicense.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. * See the License for the specific language governing permissions and * limitations under the License. */ #include "smartsearch.h" #include #include #include #include #include #include #include #include #include #include #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; bool search_ret; }; struct media_cb_data { bool is_sdcard; char *dirname; }; int search_sql_stmt_init(sqlite3_stmt * sql_stmt) { SEARCH_FUNC_START; int rc = 0; rc = sqlite3_clear_bindings(sql_stmt); if (rc != SQLITE_OK) { SEARCH_DEBUG_ERROR("sqlite3_clear_bindings error"); return SEARCH_RET_FAIL; } rc = sqlite3_reset(sql_stmt); if (rc != SQLITE_OK) { SEARCH_DEBUG_ERROR("sqlite3_reset error"); return SEARCH_RET_FAIL; } SEARCH_FUNC_END; return SEARCH_RET_SUCCESS; } int search_sql_stmt_finalize(sqlite3_stmt * stmt) { SEARCH_FUNC_START; int ret; ret = sqlite3_finalize(stmt); if (ret != SQLITE_OK) { SEARCH_DEBUG_ERROR("sqlite3_finalize error : %d ", ret); return -1; } SEARCH_FUNC_END; return 0; } int search_sql_prepare_stmt(sqlite3 *db_handle, const char *query, sqlite3_stmt ** stmt_out) { SEARCH_FUNC_START; int rc = 0; int ret = 0; rc = sqlite3_prepare(db_handle, query, strlen(query), stmt_out, NULL); if (rc != SQLITE_OK) { SEARCH_DEBUG_ERROR("sql preapre error : %d / %s", rc, query); ret = SEARCH_RET_FAIL; } else { ret = SEARCH_RET_SUCCESS; } SEARCH_FUNC_END; 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; } 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; int ret = 0; contacts_query_h query; contacts_filter_h filter; contacts_list_h list; unsigned int count = 0; int total_cnt = -1; int loop_cnt = 0; SEARCH_RETV_IF(ad == NULL, SEARCH_RET_SEARCH_FAIL); ret = contacts_connect2(); SEARCH_RETV_IF_WITH_ERRORV(ret != CONTACTS_ERROR_NONE, SEARCH_RET_SEARCH_FAIL, ret); contacts_query_create(_contacts_person_number._uri, &query); contacts_filter_create(_contacts_person_number._uri, &filter); contacts_filter_add_str(filter, _contacts_person_number.display_name, CONTACTS_MATCH_CONTAINS, keyword); contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_OR); contacts_filter_add_str(filter, _contacts_person_number.number, CONTACTS_MATCH_CONTAINS, keyword); contacts_query_set_filter(query, filter); contacts_query_set_sort(query, _contacts_person_number.display_name, true); contacts_db_get_count_with_query(query, &total_cnt); ret = contacts_db_get_records_with_query(query, offset, limit, &list); contacts_filter_destroy(filter); contacts_query_destroy(query); SEARCH_RETV_IF_WITH_ERRORV(ret != CONTACTS_ERROR_NONE, SEARCH_RET_SEARCH_FAIL, ret); contacts_list_get_count(list, &count); SEARCH_DEBUG_LOG("CONTACT COUNT: %d", count); SEARCH_DEBUG_LOG("TOTAL COUNT: %d", total_cnt); if (count > 0) { /* Set group title */ if (offset == 0) { result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, obj, ad->itc_grouptitle, obj, NULL); } do { struct search_item_sel *sel_mem_info = NULL; struct search_genlist_item_info *gen_item = NULL; Elm_Genlist_Item_Class *itc_style = NULL; int contact_id = -1; char *contact_img_path = NULL; char *str_display = NULL; char *num_display = NULL; const char *text_1line = NULL; const char *text_2line = NULL; bool is_word_in_str = false; char contact_id_str[MAX_LENGTH_PER_ID] = {0,}; sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", loop_cnt); continue; } sel_mem_info->type = obj->contents_type; contacts_record_h record; contacts_list_get_current_record_p(list, &record); contacts_record_get_str_p(record, _contacts_person.image_thumbnail_path, &contact_img_path); if (contact_img_path != NULL) { sel_mem_info->icon1 = strdup(contact_img_path); } else if (obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } contacts_record_get_str_p(record, _contacts_person.display_name, &str_display); contacts_record_get_str_p(record, _contacts_number.number, &num_display); if (str_display != NULL) { text_1line = str_display; } if (num_display != NULL) { text_2line = num_display; } if (text_1line != NULL && text_2line != NULL) { sel_mem_info->text1 = strdup(search_markup_keyword(str_display, keyword, &is_word_in_str)); sel_mem_info->text2 = strdup(search_markup_keyword(num_display, keyword, &is_word_in_str)); itc_style = ad->itc_pslist_2line_1icon; } else { if (text_1line) { sel_mem_info->text1 = strdup(search_markup_keyword(str_display, keyword, &is_word_in_str)); } else { sel_mem_info->text2 = strdup(search_markup_keyword(num_display, keyword, &is_word_in_str)); } itc_style = ad->itc_pslist_1line_1icon; } contacts_record_get_int(record, _contacts_person.id, &contact_id); snprintf(contact_id_str, MAX_LENGTH_PER_ID - 1, "%d", contact_id); sel_mem_info->launch_param= strdup(contact_id_str); 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); loop_cnt++; if (loop_cnt == limit) { break; } }while (contacts_list_next(list) == CONTACTS_ERROR_NONE); } else { SEARCH_DEBUG_WARNING("No matched contacts data", ret); return SEARCH_RET_SEARCH_NONE; } contacts_list_destroy(list, true); /* Set more title to genlist (under 'search all') */ int curr_cnt = offset + loop_cnt; if (total_cnt > curr_cnt) { struct search_item_more_sel *sel_mem_more = NULL; obj->mr_info.next_point = offset + limit; 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); } ret = contacts_disconnect2(); SEARCH_FUNC_END; return SEARCH_RET_SEARCH_SUCCESS; } 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; struct appdata *ad = (struct appdata *)data; 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; int count = -1; int total_cnt = -1; int ret = 0; int search_ret = SEARCH_RET_SEARCH_NONE; int curr_cnt = 0; SEARCH_RETV_IF(ad == NULL, SEARCH_RET_SEARCH_FAIL); ret = calendar_connect(); SEARCH_RETV_IF_WITH_ERRORV(ret != CALENDAR_ERROR_NONE, SEARCH_RET_SEARCH_FAIL, ret); calendar_query_h query = NULL; calendar_filter_h visibility_filter = NULL; calendar_list_h list = NULL; calendar_query_create(_calendar_event._uri, &query); ret = calendar_filter_create(_calendar_event._uri, &visibility_filter); if (ret != CALENDAR_ERROR_NONE) { SEARCH_DEBUG_WARNING("calendar_filter_create : %d", ret); goto out_func; } ret = calendar_filter_add_str(visibility_filter, _calendar_event.summary, CALENDAR_MATCH_CONTAINS, keyword); if (ret != CALENDAR_ERROR_NONE) { SEARCH_DEBUG_WARNING("calendar_filter_add_str : %d", ret); goto out_func; } ret = calendar_filter_add_operator(visibility_filter, CALENDAR_FILTER_OPERATOR_AND); if (ret != CALENDAR_ERROR_NONE) { SEARCH_DEBUG_WARNING("calendar_filter_add_operator : %d", ret); goto out_func; } ret = calendar_query_set_filter(query, visibility_filter); if (ret != CALENDAR_ERROR_NONE) { SEARCH_DEBUG_WARNING("calendar_query_set_filter : %d", ret); goto out_func; } ret = calendar_query_set_sort(query, _calendar_event.summary, true); if (ret != CALENDAR_ERROR_NONE) { SEARCH_DEBUG_WARNING("calendar_query_set_sort : %d", ret); goto out_func; } ret = calendar_db_get_count_with_query(query, &total_cnt); if (ret != CALENDAR_ERROR_NONE) { SEARCH_DEBUG_WARNING("calendar_db_get_count_with_query : %d", ret); goto out_func; } ret = calendar_db_get_records_with_query(query, offset, limit, &list); if (ret != CALENDAR_ERROR_NONE) { SEARCH_DEBUG_WARNING("calendar_db_get_records_with_query : %d", ret); goto out_func; } calendar_list_get_count(list, &count); SEARCH_DEBUG_LOG("CALENDAR COUNT : %d", count); SEARCH_DEBUG_LOG("TOTAL COUNT : %d", total_cnt); if (count > 0) { /* Set group title */ if (offset == 0) { result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, obj, ad->itc_grouptitle, obj, NULL); } do { int main_id = -1; char *summary = NULL; bool is_word_in_str = false; char format_val[MAX_LENGTH_PER_LINE] = {0,}; char calendar_id_str[MAX_LENGTH_PER_ID] = {0,}; calendar_record_h record; calendar_time_s cal; calendar_list_get_current_record_p(list, &record); sel_mem_info = (struct search_item_sel *)calloc(1,sizeof(struct search_item_sel)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", loop_cnt); continue; } sel_mem_info->type = obj->contents_type; /* Set Thumbnail Image */ if (obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } /* Set text 1line - Summary */ calendar_record_get_str_p(record, _calendar_event.summary, &summary); if ((summary) && (strlen(summary) > 0)) { sel_mem_info->text1 = strdup(search_markup_keyword(summary, keyword, &is_word_in_str)); } /* Set text 2line - Date */ calendar_record_get_caltime(record, _calendar_event.start_time, &cal); if (cal.type == CALENDAR_TIME_UTIME) { search_util_date_time_format_get_val(cal.time.utime, format_val, SEARCH_DATE_TYPE_YYMMDD); } else { search_util_date_time_format_get_val(cal.time.utime, format_val, SEARCH_DATE_TYPE_YYMM); } sel_mem_info->text2 = strdup(format_val); /* Set id for launching caledar contents */ calendar_record_get_int (record, _calendar_event.id, &main_id); snprintf(calendar_id_str, MAX_LENGTH_PER_ID - 1, "%d", main_id); sel_mem_info->launch_param = strdup(calendar_id_str); gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, obj, ad->itc_pslist_2line_1icon, sel_mem_info, obj->gl_result_grp); result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); loop_cnt++; if (loop_cnt == limit) { break; } } while (calendar_list_next(list) == CALENDAR_ERROR_NONE); } else { SEARCH_DEBUG_WARNING("No Matched calendar data: %d", count); search_ret = SEARCH_RET_SEARCH_NONE; goto out_func; } curr_cnt = offset + loop_cnt; /* Set more title to genlist (under 'search all') */ if (total_cnt > curr_cnt) { obj->mr_info.next_point = offset + limit; 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_ret = SEARCH_RET_SEARCH_SUCCESS; out_func: ret = calendar_disconnect(); if (visibility_filter) { calendar_filter_destroy(visibility_filter); } if (query) { calendar_query_destroy(query); } SEARCH_FUNC_END; return search_ret; } static void __search_sql_memo_search_result_cb(memo_data_t * value, void *user_data) { SEARCH_FUNC_START; struct search_cb_data *scd = (struct search_cb_data *)user_data; struct appdata *ad = NULL; struct search_content_object *obj = NULL; struct search_genlist_info *result_info = NULL; 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 = false; char memo_id_str[MAX_LENGTH_PER_ID] = {0,}; char format_val[MAX_LENGTH_PER_LINE] = {0,}; SEARCH_RET_IF(scd == NULL); ad = scd->ad; obj = scd->obj; result_info = scd->result_info; SEARCH_RET_IF(ad == NULL); SEARCH_RET_IF(value == 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 (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)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", obj->mr_info.next_point); return; } sel_mem_info->type = obj->contents_type; /********** START : set search result to sel_mem_info buf ************/ if (obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } /* 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)) { sel_mem_info->text1 = strdup(search_markup_keyword(value->comment, keyword, &is_word_in_str)); } else if ((value->content) && (strlen(value->content) > 0)) { sel_mem_info->text1 = strdup(search_markup_keyword(value->content, keyword, &is_word_in_str)); } search_util_date_time_format_get_val(value->modi_time, format_val, SEARCH_DATE_TYPE_YYMM); sel_mem_info->text2 = strdup(format_val); snprintf(memo_id_str, MAX_LENGTH_PER_ID - 1, "%d", value->id); sel_mem_info->launch_param = strdup(memo_id_str); /********** END : set search result to sel_mem_info buf *************/ gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, obj, ad->itc_pslist_2line_1icon, sel_mem_info, 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_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 { SEARCH_DEBUG_WARNING ("__search_sql_memo_search_result_cb wrong index : %d", obj->mr_info.next_point); } SEARCH_FUNC_END; return; } 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}; SEARCH_RETV_IF(ad == NULL, SEARCH_RET_SEARCH_FAIL); memo_search_data(keyword, limit, offset, MEMO_SORT_TITLE_ASC, __search_sql_memo_search_result_cb, &scd); if (obj->mr_info.next_point == 0) { SEARCH_DEBUG_WARNING("no memo search result"); return SEARCH_RET_SEARCH_NONE; } SEARCH_FUNC_END; return SEARCH_RET_SEARCH_SUCCESS; } 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 ret = EMAIL_ERROR_NONE; int i = 0; email_mail_list_item_t *mail_list = NULL; email_list_filter_t *filter_list = NULL; email_list_sorting_rule_t *sorting_rule_list = NULL; int filter_list_count = 5; int sorting_rule_list_count = 1; int mail_count = 0; int total_mail_cnt = -1; int unseen_mail_cnt = -1; 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 = false; SEARCH_RETV_IF(ad == NULL, SEARCH_RET_SEARCH_FAIL); int search_ret = SEARCH_RET_SEARCH_FAIL; 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; 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_count_mail(filter_list, filter_list_count, &total_mail_cnt, &unseen_mail_cnt); if (ret != EMAIL_ERROR_NONE) { SEARCH_DEBUG_WARNING("Fail to call email_count_mail"); goto out_func; } 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("Fail to call email_get_mail_list_ex"); goto out_func; } SEARCH_DEBUG_LOG("EMAIL TOTAL COUNT : %d UNSEEN : %d", total_mail_cnt, unseen_mail_cnt); SEARCH_DEBUG_LOG("EMAIL COUNT : %d", mail_count); if(mail_list == NULL) { SEARCH_DEBUG_WARNING("mail_list is null"); search_ret = SEARCH_RET_SEARCH_NONE; goto out_func; } if (mail_count == 0) { SEARCH_DEBUG_WARNING("no email search result"); search_ret = SEARCH_RET_SEARCH_NONE; goto out_func; } /* Set group title */ if (offset == 0) { 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 < mail_count ; i++) { char email_id_str[MAX_LENGTH_PER_ID] = {0,}; char email_path_str[MAX_LENGTH_PER_PATH] = {0,}; sel_mem_info = (struct search_item_sel*)calloc(1, sizeof(struct search_item_sel)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", i); continue; } sel_mem_info->type = obj->contents_type; if (obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } snprintf(email_id_str, MAX_LENGTH_PER_ID - 1, "%d", mail_list[i].mail_id); sel_mem_info->launch_param = strdup(email_id_str); snprintf(email_path_str, MAX_LENGTH_PER_PATH - 1, "%d %d %d", mail_list[i].account_id, mail_list[i].mail_id, mail_list[i].mailbox_id); sel_mem_info->launch_path = strdup(email_path_str); if(strlen(mail_list[i].subject) > 0) { sel_mem_info->text1 = strdup(search_markup_keyword(mail_list[i].subject, ad->search_word, &is_word_in_str)); } if(strlen(mail_list[i].full_address_from) > 0) { sel_mem_info->text2 = strdup(search_markup_keyword(mail_list[i].full_address_from, ad->search_word, &is_word_in_str)); } if(is_word_in_str == false && (strlen(mail_list[i].email_address_recipient) > 0)) { sel_mem_info->text2 = strdup(search_markup_keyword(mail_list[i].email_address_recipient, ad->search_word, &is_word_in_str)); } gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, obj, ad->itc_pslist_2line_1icon, sel_mem_info, obj->gl_result_grp); result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); } /* Set more title to genlist (under 'search all') */ if (i < total_mail_cnt) { obj->mr_info.next_point = offset + i; 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_ret = SEARCH_RET_SEARCH_SUCCESS; out_func: SEARCH_FREE(filter_list); SEARCH_FREE(sorting_rule_list); SEARCH_FREE(mail_list); SEARCH_FUNC_END; return search_ret; } static bool __search_media_info_cb(media_info_h media, void *user_data) { char *media_id = NULL; char *media_name = NULL; char *media_path = NULL; char *media_thumbnail = NULL; 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 = NULL; struct search_content_object *obj = NULL; struct search_genlist_info *result_info = NULL; char *keyword = NULL; struct search_genlist_item_info *gen_item = NULL; char media_id_str[MAX_LENGTH_PER_PATH] = {0,}; SEARCH_RETV_IF(scd == NULL, true); ad = scd->ad; obj = scd->obj; result_info = scd->result_info; keyword = scd->keyword; SEARCH_RETV_IF(ad == NULL, true); 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); sel_mem_info = (struct search_item_sel*)calloc(1, sizeof(struct search_item_sel)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", media_id); return true; } sel_mem_info->type = obj->contents_type; if ((media_thumbnail) && ecore_file_exists(media_thumbnail) == EINA_TRUE) { sel_mem_info->icon1 = strdup(media_thumbnail); } else if (obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } if (media_name && strlen(media_name)) { sel_mem_info->text1 = strdup(search_markup_keyword(media_name, keyword, &is_word_in_str)); } if (media_id) { snprintf(media_id_str, MAX_LENGTH_PER_ID, "%s", media_id); sel_mem_info->launch_param = strdup(media_id_str); } if (media_path) { sel_mem_info->launch_path = strdup(media_path); } itc_style = ad->itc_pslist_1line_1icon; /* 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); SEARCH_FREE(media_id); SEARCH_FREE(media_name); SEARCH_FREE(media_thumbnail); SEARCH_FREE(media_path); return true; } 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; int ret = 0; audio_meta_h a_handle; media_content_storage_e storage_type = MEDIA_CONTENT_STORAGE_INTERNAL; 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 = NULL; struct search_content_object *obj = NULL; struct search_genlist_info *result_info = NULL; char *keyword = NULL; struct search_genlist_item_info *gen_item = NULL; char music_id_str[MAX_LENGTH_PER_PATH] = {0,}; SEARCH_RETV_IF(scd == NULL, true); ad = scd->ad; obj = scd->obj; result_info = scd->result_info; keyword = scd->keyword; SEARCH_RETV_IF(ad == NULL, true); 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); ret = media_info_get_audio(media, &a_handle); if(ret != 0) { SEARCH_DEBUG_WARNING("Fail to get audio info!"); } else { audio_meta_get_title(a_handle, &title); audio_meta_get_album(a_handle, &album); audio_meta_get_artist(a_handle, &artist); } audio_meta_destroy(a_handle); sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", media_id); return true; } sel_mem_info->type = obj->contents_type;; if ((media_thumbnail) && ecore_file_exists(media_thumbnail) == EINA_TRUE) { sel_mem_info->icon1 = strdup(media_thumbnail); } else if(obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } if ((title) && (strlen(title) > 0)) { sel_mem_info->text1 = strdup(search_markup_keyword(title, keyword, &is_word_in_str)); } if (is_word_in_str) { if ((artist) && (strlen(artist) > 0)) { sel_mem_info->text2 = strdup(search_markup_keyword(artist, keyword, &is_word_in_str)); } } else { if ((artist) && (strlen(artist) > 0)) { sel_mem_info->text2 = strdup(search_markup_keyword(artist, keyword, &is_word_in_str)); } if (is_word_in_str == false && (album) && (strlen(album) > 0)) { sel_mem_info->text2 = strdup(search_markup_keyword(album, keyword, &is_word_in_str)); } if (is_word_in_str == false) { SEARCH_DEBUG_LOG("search_result is 0. No match keyword in title,album,artist string"); } } if (storage_type == MEDIA_CONTENT_STORAGE_EXTERNAL) { itc_style = ad->itc_pslist_2line_2icon; sel_mem_info->icon2 = strdup(SEARCH_SDCARD_ICON); } else { itc_style = ad->itc_pslist_2line_1icon; } if (media_id) { snprintf(music_id_str, MAX_LENGTH_PER_ID - 1, "%s", media_id); sel_mem_info->launch_param = strdup(music_id_str); } if (media_path) { sel_mem_info->launch_path = strdup(media_path); } /* Add Information 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); SEARCH_FREE(media_id); SEARCH_FREE(media_path); SEARCH_FREE(media_thumbnail); SEARCH_FREE(title); SEARCH_FREE(artist); SEARCH_FREE(album); return true; } 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, int total_cnt) { 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; int curr_cnt = 0; struct search_item_more_sel *sel_mem_more = NULL; SEARCH_RETV_IF(ad == NULL, SEARCH_RET_SEARCH_FAIL); 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); } 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; } curr_cnt = offset + result_cnt; /* Set more title to genlist (under 'search all') */ if (total_cnt > curr_cnt) { obj->mr_info.next_point = offset + result_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); } } else { func_ret = SEARCH_RET_SEARCH_NONE; } out_func: SEARCH_FUNC_END; return func_ret; } 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 = SEARCH_RET_SEARCH_SUCCESS; int len = 0; int total_cnt = -1; char *search_query = NULL; char *escape_added_keyword = NULL; const char *image_query = "(MEDIA_TYPE=0 and (MEDIA_DISPLAY_NAME like \"%%%s%%\" ESCAPE (\"%s\")))"; 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); 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, "%"); 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_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; } 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; } media_info_get_media_count_from_db(filter, &total_cnt); SEARCH_DEBUG_LOG("Matched Image Total Cnt : %d", total_cnt); 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 = __search_sql_media_search_result_by_api(obj, offset, limit, keyword, filter, __search_media_info_cb, data, result_info, total_cnt); out_func: SEARCH_FREE(search_query); SEARCH_FREE(escape_added_keyword); media_filter_destroy(filter); SEARCH_FUNC_END; return ret; } 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; int ret = SEARCH_RET_SEARCH_SUCCESS; int len = 0; char *search_query = NULL; char *escape_added_keyword = NULL; int total_cnt = -1; const char *video_query = "(MEDIA_TYPE=1 and (MEDIA_DISPLAY_NAME LIKE \"%%%s%%\" ESCAPE (\"%s\")))"; 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); len = strlen(escape_added_keyword) + strlen(DB_ESCAPE_CHAR) + strlen(video_query) + 1; search_query = (char*)calloc(1, len); snprintf(search_query, len, video_query, 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; } 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; } 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; } media_info_get_media_count_from_db(filter, &total_cnt); SEARCH_DEBUG_LOG("Matched Video Total cnt : %d", total_cnt); 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 = __search_sql_media_search_result_by_api(obj, offset, limit, keyword, filter, __search_media_info_cb, data, result_info, total_cnt); 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(struct search_content_object *obj, int offset, int limit, char *keyword, void *data, struct search_genlist_info *result_info) { SEARCH_FUNC_START; int ret = SEARCH_RET_SEARCH_SUCCESS; int len = 0; char *search_query = NULL; char *escape_added_keyword = NULL; int total_cnt = -1; const char *music_query = "(MEDIA_TYPE=3 and (MEDIA_TITLE LIKE \"%%%s%%\" or MEDIA_ALBUM LIKE \"%%%s%%\" or MEDIA_ARTIST LIKE \"%%%s%%\" ESCAPE (\"%s\")))"; 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); len = strlen(escape_added_keyword) + strlen(DB_ESCAPE_CHAR) + strlen(music_query) + 1; search_query = (char*)calloc(1, len); 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; } 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; } 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; } media_info_get_media_count_from_db(filter, &total_cnt); SEARCH_DEBUG_LOG("Matched Music Total cnt : %d", total_cnt); 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 = __search_sql_media_search_result_by_api(obj, offset, limit, keyword, filter, __search_sql_music_info_cb, data, result_info, total_cnt); out_func: SEARCH_FREE(search_query); SEARCH_FREE(escape_added_keyword); media_filter_destroy(filter); SEARCH_FUNC_END; return ret; } ail_cb_ret_e __search_sql_menu_search_result_cb( const ail_appinfo_h appinfo, void *data) { SEARCH_FUNC_START; 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; 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 (obj->mr_info.loop_cnt < obj->mr_info.next_point) { obj->mr_info.loop_cnt++; return AIL_CB_RET_CONTINUE; } 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)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", obj->mr_info.loop_cnt); return AIL_CB_RET_CONTINUE; } 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) { sel_mem_info->icon1 = strdup(icon); } ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package); if ((package) && (strlen(package) > 0)) { if(strcmp(package, "org.tizen.smartsearch") == 0) { SEARCH_DEBUG_LOG("'smartsearch' does not appended"); obj->mr_info.loop_cnt++; obj->mr_info.next_point++; SEARCH_FREE(sel_mem_info); return AIL_CB_RET_CONTINUE; } sel_mem_info->launch_path = strdup(package); } else { SEARCH_DEBUG_WARNING("package : null"); } ail_appinfo_get_str(appinfo, AIL_PROP_NAME_STR, &name); if ((name) && (strlen(name) > 0)) { sel_mem_info->text1 = strdup(search_markup_keyword(name, keyword, &is_word_in_str)); } else { SEARCH_DEBUG_WARNING("name : 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); } /********** END : set search result to sel_mem_info buf *************/ 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); obj->mr_info.next_point++; obj->mr_info.loop_cnt++; ret = AIL_CB_RET_CONTINUE; } 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(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, "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_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); ret = AIL_CB_RET_CANCEL; } else { SEARCH_DEBUG_WARNING ("__search_sql_menu_search_result_cb wrong index : %d", obj->mr_info.next_point); ret = AIL_CB_RET_CANCEL; } SEARCH_FUNC_END; return ret; } 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; ail_filter_h filter = NULL; 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); ret = SEARCH_RET_SEARCH_FAIL; goto out_func; } 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; goto out_func; } rc = ail_filter_add_bool(filter, AIL_PROP_NODISPLAY_BOOL, false); if (rc != AIL_ERROR_OK) { SEARCH_DEBUG_WARNING("menu search - ail_filter_add_bool error : %d", rc); ret = SEARCH_RET_SEARCH_FAIL; goto out_func; } rc = ail_filter_count_appinfo(filter, &cnt); if( rc != AIL_ERROR_OK) { SEARCH_DEBUG_WARNING("menu search - ail_filter_count_appinfo error : %d", rc); ret = SEARCH_RET_SEARCH_FAIL; goto out_func; } SEARCH_DEBUG_LOG("ail search result : %d", cnt); obj->mr_info.result_cnt = cnt; if(cnt > 0) { 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 (obj->mr_info.next_point == 0) { ret = SEARCH_RET_SEARCH_NONE; } else { ret = SEARCH_RET_SEARCH_SUCCESS; } } else { ret = SEARCH_RET_SEARCH_NONE; } out_func: if (filter) { 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; char* match_str_title = NULL; char* match_str_addr = 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) { char bookmark_id_str[MAX_LENGTH_PER_PATH] = {0,}; /********** START : set search result to sel_mem_info buf ************/ if (item != NULL && item->title) { match_str_title = strdup(search_markup_keyword(item->title, keyword, &is_word_in_str_main)); } if (item != NULL && item->address) { match_str_addr = strdup(search_markup_keyword(item->address, keyword, &is_word_in_str_sub)); } if (is_word_in_str_main == true || is_word_in_str_sub == true) { if (obj->gl_result_grp == NULL && result_info->group == NULL) { /* Set group title */ result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, obj, ad->itc_grouptitle, obj, NULL); } sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", info->loop_cnt); return true; } sel_mem_info->type = obj->contents_type; snprintf(bookmark_id_str, MAX_LENGTH_PER_ID - 1, "%d", item->id); sel_mem_info->launch_param = strdup(bookmark_id_str); if (match_str_title) { sel_mem_info->text1 = strdup(match_str_title); } if (match_str_addr) { sel_mem_info->text2 = strdup(match_str_addr); sel_mem_info->launch_path= strdup(item->address); } if (obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } sel_mem_info->icon2 = strdup(SEARCH_FAVORITE_ICON); gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, obj, ad->itc_pslist_2line_2icon_browser_bookmark, sel_mem_info, obj->gl_result_grp); result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); scd->search_ret = true; } SEARCH_FREE(match_str_title); SEARCH_FREE(match_str_addr); /********** 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) { char history_id_str[MAX_LENGTH_PER_PATH] = {0,}; /********** START : set search result to sel_mem_info buf ************/ if (item != NULL && item->address) { 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 && result_info->group == NULL ) { /* Set group title */ result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, obj, ad->itc_grouptitle, obj, NULL); } sel_mem_info = (struct search_item_sel *)calloc(1, sizeof(struct search_item_sel)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", info->loop_cnt); return true; } sel_mem_info->type = obj->contents_type; snprintf(history_id_str, MAX_LENGTH_PER_ID - 1, "%d", item->id); sel_mem_info->launch_param = strdup(history_id_str); if (obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } if (item->address) { sel_mem_info->launch_path = strdup(item->address); } sel_mem_info->text1 = strdup(match_str); gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, obj, ad->itc_pslist_1line_1icon_browser_history, sel_mem_info, obj->gl_result_grp); result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); scd->search_ret = true; } 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_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, false}; struct search_cb_data_browser scd_history = {obj, ad, keyword, result_info, NULL, false}; static struct search_more_result browser_result[2]; struct search_item_more_sel *sel_mem_more = NULL; 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]; /* 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 && g_list_length(result_info->itemlist) < SEARCH_CATEGORY_LIST_MORE_CNT) 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 (scd_browser.search_ret == false && scd_history.search_ret == false){ /* 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; } SEARCH_FUNC_END; return ret; } 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 = SEARCH_RET_SEARCH_FAIL; struct search_item_sel *sel_mem_info = NULL; struct search_item_more_sel *sel_mem_more = NULL; struct appdata *ad = (struct appdata *)data; struct search_genlist_item_info *gen_item = NULL; bool is_word_in_str; int i = 0; int j = 0; bool is_more_btn = false; bool is_word_in_title = false; msg_error_t err = MSG_SUCCESS; msg_struct_list_s total_msgList; 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); 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"); goto out_func; }; 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"); goto out_func; } 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"); goto out_func; } err = msg_search_message(ad->msg_handle, search_s, 0, 0, &total_msgList); if (err != MSG_SUCCESS && err != MSG_ERR_DB_NORECORD) { SEARCH_DEBUG_WARNING("msg_search_message is failed : %d", err); goto out_func; } 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); goto out_func; } SEARCH_DEBUG_LOG("Matched Total Message : %d", total_msgList.nCount); SEARCH_DEBUG_LOG("Message Count : %d", msgList.nCount); if (msgList.nCount <= 0) { SEARCH_DEBUG_WARNING("no msg search result"); ret = SEARCH_RET_SEARCH_NONE; } else { /* Set group title */ if (offset == 0) { /* Set group title */ result_info->group = search_add_genlist_item(SEARCH_GENLIST_GROUP, obj, ad->itc_grouptitle, obj, NULL); } /********** START : set search result to sel_mem_info buf ************/ for (i = 0; i < msgList.nCount; i++) { const char *text_1line = NULL; const char *markup_keyword = NULL; 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,}; char msg_id_str[MAX_LENGTH_PER_PATH] = {0,}; 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); sel_mem_info = (struct search_item_sel *)calloc(1,sizeof(struct search_item_sel)); if (!sel_mem_info) { SEARCH_DEBUG_WARNING("[%d] Fail to make a genlist select info item!", i); return true; } 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(msg_id_str, MAX_LENGTH_PER_ID - 1, "%d", message_id); sel_mem_info->launch_param= strdup(msg_id_str); /* Set 1st line string */ if (msg_type == MSG_TYPE_MMS || msg_type == MSG_TYPE_MMS_JAVA || msg_type == MSG_TYPE_MMS_NOTI) { /* 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) { 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); } if ((text_1line) && (strlen(text_1line) > 0 )) { sel_mem_info->text1 = strdup(markup_keyword); } else { sel_mem_info->text1 = strdup("Unknown"); } } else if(msg_type == MSG_TYPE_SMS) { /* SMS Case */ 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)) { sel_mem_info->text1 = strdup(markup_keyword); } } err = msg_get_list_handle(msgList.msg_struct_info[i], MSG_MESSAGE_ADDR_LIST_STRUCT, (void **)&addr_list); if (err != MSG_SUCCESS) { SEARCH_DEBUG_WARNING("Fail to get address list handle! %d", err); goto out_func; } /* Set 2nd line string */ 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; } err = msg_get_str_value(addr_list->msg_struct_info[j], MSG_ADDRESS_INFO_DISPLAYNAME_STR, str_name, MAX_DISPLAY_NAME_LEN); if (err != MSG_SUCCESS) { SEARCH_DEBUG_WARNING("Fail to get data! : MSG_ADDRESS_INFO_ADDRESS_VALUE_STR %d", err); goto out_func; } err = msg_get_int_value(addr_list->msg_struct_info[j], MSG_ADDRESS_INFO_CONTACT_ID_INT, &contact_id); 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 (strlen(str_name) > 0) { sel_mem_info->text2 = strdup(str_name); } else if(strlen(str_number) > 0) { sel_mem_info->text2 = strdup(markup_keyword); } else { sel_mem_info->text2 = strdup("Unknown"); } /* Check Whether Thumbnail Image exist or not */ if (contact_id > -1) { contacts_query_h query; contacts_filter_h filter; contacts_list_h list; unsigned int count = 0; ret = contacts_connect2(); if (ret != CONTACTS_ERROR_NONE) { SEARCH_DEBUG_WARNING("Fail to connect contact service!"); if (obj->obj_icon_path != NULL) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } continue; } else { contacts_query_create(_contacts_person_number._uri, &query); contacts_filter_create(_contacts_person_number._uri, &filter); contacts_filter_add_int(filter, _contacts_person.id, CONTACTS_MATCH_EQUAL, contact_id); contacts_query_set_filter(query, filter); contacts_db_get_records_with_query(query, 0, 0, &list); contacts_list_get_count(list, &count); if (count > 0) { contacts_record_h record; contacts_list_get_current_record_p(list, &record); contacts_record_get_str_p(record, _contacts_person.image_thumbnail_path, &img_path); } if (img_path != NULL) { sel_mem_info->icon1 = strdup(img_path); } else if (obj->obj_icon_path != NULL) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } contacts_list_destroy(list, true); ret = contacts_disconnect2(); } } else { if (obj->obj_icon_path) { sel_mem_info->icon1 = strdup(obj->obj_icon_path); } } if ((is_word_in_title) || (is_word_in_str)) { break; } } gen_item = search_add_genlist_item(SEARCH_GENLIST_ITEM, obj, ad->itc_pslist_2line_1icon, sel_mem_info, obj->gl_result_grp); result_info->itemlist = g_list_append(result_info->itemlist, (void*)gen_item); } msg_release_list_struct(&msgList); msg_release_list_struct(&total_msgList); /* Set more title to genlist (under 'search all') */ if (total_msgList.nCount > offset + i) { obj->mr_info.next_point = offset + i; 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); } ret = SEARCH_RET_SEARCH_SUCCESS; } out_func: if (search_s != NULL) { msg_release_struct(&search_s); } 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; }