X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_search.c;h=85f817964008ebe0b7f93050c4d3c6c31d42bee3;hb=ae8123c1752301ffbf45be66befa9d9166df3add;hp=43f6ea9e23b1daa22e9b889cc1a856c13255bfed;hpb=3b68d63a1f1dc53e642bc269bbdd1148ede52a10;p=ncmpc.git diff --git a/src/screen_search.c b/src/screen_search.c index 43f6ea9..85f8179 100644 --- a/src/screen_search.c +++ b/src/screen_search.c @@ -17,20 +17,20 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "screen_search.h" #include "screen_interface.h" +#include "screen_message.h" +#include "screen.h" #include "i18n.h" #include "options.h" #include "charset.h" #include "mpdclient.h" #include "strfsong.h" -#include "command.h" #include "utils.h" #include "screen_utils.h" #include "screen_browser.h" #include "filelist.h" -#include -#include #include #include @@ -161,30 +161,43 @@ search_clear(bool clear_pattern) } static struct filelist * -filelist_search(struct mpdclient *c, G_GNUC_UNUSED int exact_match, int table, - gchar *local_pattern) +search_simple_query(struct mpd_connection *connection, bool exact_match, + int table, gchar *local_pattern) { - struct filelist *list, *list2; + struct filelist *list; gchar *filter_utf8 = locale_to_utf8(local_pattern); if (table == SEARCH_ARTIST_TITLE) { - list = mpdclient_filelist_search(c, FALSE, MPD_TAG_ARTIST, - filter_utf8); - if (list == NULL) - list = filelist_new(); - - list2 = mpdclient_filelist_search(c, FALSE, MPD_TAG_TITLE, - filter_utf8); - if (list2 != NULL) { - filelist_move(list, list2); - filelist_free(list2); - } + mpd_command_list_begin(connection, false); + + mpd_search_db_songs(connection, exact_match); + mpd_search_add_tag_constraint(connection, MPD_OPERATOR_DEFAULT, + MPD_TAG_ARTIST, filter_utf8); + mpd_search_commit(connection); + + mpd_search_db_songs(connection, exact_match); + mpd_search_add_tag_constraint(connection, MPD_OPERATOR_DEFAULT, + MPD_TAG_TITLE, filter_utf8); + mpd_search_commit(connection); - filelist_sort_all(list, compare_filelistentry_format); + mpd_command_list_end(connection); + + list = filelist_new_recv(connection); + filelist_no_duplicates(list); + } else if (table == SEARCH_URI) { + mpd_search_db_songs(connection, exact_match); + mpd_search_add_uri_constraint(connection, MPD_OPERATOR_DEFAULT, + filter_utf8); + mpd_search_commit(connection); + + list = filelist_new_recv(connection); } else { - list = mpdclient_filelist_search(c, FALSE, table, filter_utf8); - if (list == NULL) - list = filelist_new(); + mpd_search_db_songs(connection, exact_match); + mpd_search_add_tag_constraint(connection, MPD_OPERATOR_DEFAULT, + table, filter_utf8); + mpd_search_commit(connection); + + list = filelist_new_recv(connection); } g_free(filter_utf8); @@ -197,7 +210,7 @@ filelist_search(struct mpdclient *c, G_GNUC_UNUSED int exact_match, int table, *----------------------------------------------------------------------- */ static struct filelist * -search_advanced_query(char *query, struct mpdclient *c) +search_advanced_query(struct mpd_connection *connection, char *query) { int i,j; char **strv; @@ -206,16 +219,11 @@ search_advanced_query(char *query, struct mpdclient *c) struct filelist *fl = NULL; advanced_search_mode = FALSE; - if( g_strrstr(query, ":") == NULL ) + if (strchr(query, ':') == NULL) return NULL; strv = g_strsplit_set(query, ": ", 0); - i=0; - while (strv[i]) { - i++; - } - memset(table, 0, 10*sizeof(int)); memset(arg, 0, 10*sizeof(char *)); @@ -250,57 +258,91 @@ search_advanced_query(char *query, struct mpdclient *c) g_strfreev(strv); + if (!advanced_search_mode || j == 0) { + for (i = 0; arg[i] != NULL; ++i) + g_free(arg[i]); + return NULL; + } - if (advanced_search_mode && j > 0) { - int iter; - struct mpd_entity *entity; - - /*----------------------------------------------------------------------- - * NOTE (again): This code exists to test a new search ui, - * Its ugly and MUST be redesigned before the next release! - * + the code below should live in mpdclient.c - *----------------------------------------------------------------------- - */ - /** stupid - but this is just a test...... (fulhack) */ - mpd_search_db_songs(c->connection, false); - - for(iter = 0; iter < 10 && arg[iter] != NULL; iter++) { - if (table[iter] == SEARCH_URI) - mpd_search_add_uri_constraint(c->connection, - MPD_OPERATOR_DEFAULT, - arg[iter]); - else - mpd_search_add_tag_constraint(c->connection, - MPD_OPERATOR_DEFAULT, - table[iter], arg[iter]); - } + /*----------------------------------------------------------------------- + * NOTE (again): This code exists to test a new search ui, + * Its ugly and MUST be redesigned before the next release! + * + the code below should live in mpdclient.c + *----------------------------------------------------------------------- + */ + /** stupid - but this is just a test...... (fulhack) */ + mpd_search_db_songs(connection, false); + + for (i = 0; i < 10 && arg[i] != NULL; i++) { + if (table[i] == SEARCH_URI) + mpd_search_add_uri_constraint(connection, + MPD_OPERATOR_DEFAULT, + arg[i]); + else + mpd_search_add_tag_constraint(connection, + MPD_OPERATOR_DEFAULT, + table[i], arg[i]); + } + + mpd_search_commit(connection); + fl = filelist_new_recv(connection); + if (!mpd_response_finish(connection)) { + filelist_free(fl); + fl = NULL; + } - mpd_search_commit(c->connection); + for (i = 0; arg[i] != NULL; ++i) + g_free(arg[i]); - fl = filelist_new(); + return fl; +} - while ((entity = mpd_recv_entity(c->connection)) != NULL) - filelist_append(fl, entity); +static struct filelist * +do_search(struct mpdclient *c, char *query) +{ + struct filelist *fl; - if (!mpd_response_finish(c->connection)) { - filelist_free(fl); - fl = NULL; + fl = search_advanced_query(c->connection, query); + if (fl != NULL) + return fl; - mpdclient_handle_error(c); - } + if (mpd_connection_get_error(c->connection) != MPD_ERROR_SUCCESS) { + mpdclient_handle_error(c); + return NULL; } - i=0; - while( arg[i] ) - g_free(arg[i++]); - + fl = search_simple_query(c->connection, FALSE, + mode[options.search_mode].table, + query); + if (fl == NULL) + mpdclient_handle_error(c); return fl; } +static void +screen_search_reload(struct mpdclient *c) +{ + if (pattern == NULL) + return; + + if (browser.filelist != NULL) { + filelist_free(browser.filelist); + browser.filelist = NULL; + } + + browser.filelist = do_search(c, pattern); + if (browser.filelist == NULL) + browser.filelist = filelist_new(); + + screen_browser_sync_highlights(browser.filelist, &c->playlist); + list_window_check_selected(browser.lw, + filelist_length(browser.filelist)); +} + static void search_new(struct mpdclient *c) { - if (c->connection == NULL) + if (!mpdclient_is_connected(c)) return; search_clear(true); @@ -316,24 +358,7 @@ search_new(struct mpdclient *c) return; } - if (browser.filelist != NULL) { - filelist_free(browser.filelist); - browser.filelist = NULL; - } - - if (mpd_connection_cmp_server_version(c->connection, 0, 12, 0) >= 0) - browser.filelist = search_advanced_query(pattern, c); - - if (!advanced_search_mode && browser.filelist == NULL) - browser.filelist = filelist_search(c, FALSE, - mode[options.search_mode].table, - pattern); - - if (browser.filelist == NULL) - browser.filelist = filelist_new(); - - sync_highlights(c, browser.filelist); - list_window_check_selected(browser.lw, filelist_length(browser.filelist)); + screen_search_reload(c); } static void @@ -409,7 +434,7 @@ static void screen_search_update(struct mpdclient *c) { if (browser.filelist != NULL && c->events & MPD_IDLE_PLAYLIST) { - sync_highlights(c, browser.filelist); + screen_browser_sync_highlights(browser.filelist, &c->playlist); search_repaint(); } } @@ -426,14 +451,7 @@ screen_search_cmd(struct mpdclient *c, command_t cmd) _(mode[options.search_mode].label)); /* continue and update... */ case CMD_SCREEN_UPDATE: - if (pattern) { - search_clear(false); - browser.filelist = filelist_search(c, - FALSE, - mode[options.search_mode].table, - pattern); - sync_highlights(c, browser.filelist); - } + screen_search_reload(c); search_repaint(); return true;