diff --git a/src/screen_search.c b/src/screen_search.c
index d7e49aadea5960de2b88afe0e4322a95fe435790..2dd911d09b3a8cc3c9cccb5518c62176889845a8 100644 (file)
--- a/src/screen_search.c
+++ b/src/screen_search.c
#include "screen_search.h"
#include "screen_interface.h"
+#include "screen_message.h"
+#include "screen.h"
#include "i18n.h"
#include "options.h"
#include "charset.h"
}
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);
+
+ mpd_command_list_end(connection);
- filelist_sort_all(list, compare_filelistentry_format);
+ list = filelist_new_recv(connection);
+
+ if (list != NULL)
+ filelist_sort_all(list, compare_filelistentry_format);
+ } 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);
*-----------------------------------------------------------------------
*/
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;
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 *));
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(c->connection);
+ mpd_search_commit(connection);
+ fl = filelist_new_recv(connection);
+ if (!mpd_response_finish(connection)) {
+ filelist_free(fl);
+ fl = NULL;
+ }
- fl = filelist_new();
+ for (i = 0; arg[i] != NULL; ++i)
+ g_free(arg[i]);
- while ((entity = mpd_recv_entity(c->connection)) != NULL)
- filelist_append(fl, entity);
+ return fl;
+}
- if (!mpd_response_finish(c->connection)) {
- filelist_free(fl);
- fl = NULL;
+static struct filelist *
+do_search(struct mpdclient *c, char *query)
+{
+ struct filelist *fl;
- mpdclient_handle_error(c);
- }
- }
+ fl = search_advanced_query(c->connection, query);
+ if (fl != NULL)
+ return fl;
- i=0;
- while( arg[i] )
- g_free(arg[i++]);
+ if (mpd_connection_get_error(c->connection) != MPD_ERROR_SUCCESS) {
+ mpdclient_handle_error(c);
+ return NULL;
+ }
+ fl = search_simple_query(c->connection, FALSE,
+ mode[options.search_mode].table,
+ query);
+ if (fl == NULL)
+ mpdclient_handle_error(c);
return fl;
}
static void
search_new(struct mpdclient *c)
{
- if (c->connection == NULL)
+ if (!mpdclient_is_connected(c))
return;
search_clear(true);
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);
-
+ browser.filelist = do_search(c, pattern);
if (browser.filelist == NULL)
browser.filelist = filelist_new();
case CMD_SCREEN_UPDATE:
if (pattern) {
search_clear(false);
- browser.filelist = filelist_search(c,
- FALSE,
- mode[options.search_mode].table,
- pattern);
+ browser.filelist = do_search(c, pattern);
screen_browser_sync_highlights(browser.filelist,
&c->playlist);
}