From c90e2394c5f9a3d6da0c8e4a8e978469b5ebfcee Mon Sep 17 00:00:00 2001 From: Ron Pedde Date: Thu, 5 Oct 2006 03:58:24 +0000 Subject: [PATCH] Fix indexing, move updates back into core --- src/ff-plugins.h | 1 + src/plugin.c | 35 ++++++++++++++++++++++++++++++++ src/plugins/out-daap.c | 45 ++++++++++++++++-------------------------- 3 files changed, 53 insertions(+), 28 deletions(-) diff --git a/src/ff-plugins.h b/src/ff-plugins.h index bd099b18..95f461bf 100644 --- a/src/ff-plugins.h +++ b/src/ff-plugins.h @@ -151,6 +151,7 @@ typedef struct tag_plugin_input_fn { int (*db_delete_playlist_item)(char **pe, int playlistid, int songid); int (*db_revision)(void); int (*db_count_items)(int what); + int (*db_wait_update)(struct tag_ws_conninfo *); char *(*conf_alloc_string)(char *section, char *key, char *dflt); void (*conf_dispose_string)(char *str); diff --git a/src/plugin.c b/src/plugin.c index f34b8ee5..fb7ff126 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -94,6 +94,7 @@ int pi_db_enum_restart(char **pe, DB_QUERY *pinfo); void pi_db_enum_dispose(char **pe, DB_QUERY *pinfo); void pi_stream(WS_CONNINFO *pwsc, char *id); int pi_db_count_items(int what); +int pi_db_wait_update(WS_CONNINFO *pwsc); void pi_conf_dispose_string(char *str); PLUGIN_INPUT_FN pi = { @@ -128,6 +129,7 @@ PLUGIN_INPUT_FN pi = { db_delete_playlist_item, db_revision, pi_db_count_items, + pi_db_wait_update, conf_alloc_string, pi_conf_dispose_string, @@ -769,6 +771,39 @@ void pi_db_enum_dispose(char **pe, DB_QUERY *pinfo) { } } +int pi_db_wait_update(WS_CONNINFO *pwsc) { + int clientver=1; + fd_set rset; + struct timeval tv; + int result; + int lastver=0; + + if(ws_getvar(pwsc,"revision-number")) { + clientver=atoi(ws_getvar(pwsc,"revision-number")); + } + + /* wait for db_version to be stable for 30 seconds */ + while((clientver == db_revision()) || + (lastver && (db_revision() != lastver))) { + lastver = db_revision(); + + FD_ZERO(&rset); + FD_SET(pwsc->fd,&rset); + + tv.tv_sec=30; + tv.tv_usec=0; + + result=select(pwsc->fd+1,&rset,NULL,NULL,&tv); + if(FD_ISSET(pwsc->fd,&rset)) { + /* can't be ready for read, must be error */ + DPRINTF(E_DBG,L_DAAP,"Update session stopped\n"); + return FALSE; + } + } + + return TRUE; +} + void pi_stream(WS_CONNINFO *pwsc, char *id) { int session = 0; MP3FILE *pmp3; diff --git a/src/plugins/out-daap.c b/src/plugins/out-daap.c index f78aac56..ed0e3a56 100644 --- a/src/plugins/out-daap.c +++ b/src/plugins/out-daap.c @@ -125,7 +125,7 @@ PLUGIN_RESPONSE daap_uri_map[] = { out_daap_content_codes }, {{"login", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }, out_daap_login }, - {{"updates", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }, + {{"update", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }, out_daap_update }, {{"logout", NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL }, out_daap_logout }, @@ -354,6 +354,11 @@ void plugin_handler(WS_CONNINFO *pwsc) { _ppi->log(E_DBG,"Index %s: offset %d, limit %d\n",index_req, ppi->dq.offset,ppi->dq.limit); + if(_ppi->ws_getvar(pwsc,"query")) { + ppi->dq.filter_type = FILTER_TYPE_APPLE; + ppi->dq.filter = _ppi->ws_getvar(pwsc,"query"); + } + _ppi->log(E_DBG,"Tokenizing url\n"); while((ppi->uri_count < 10) && (token=strtok_r(string,"/",&save))) { string=NULL; @@ -1051,18 +1056,25 @@ void out_daap_browse(WS_CONNINFO *pwsc, PRIVINFO *ppi) { which_field = 3; } + _ppi->log(E_DBG,"Browsing by %s (field %d)\n", + ppi->uri_sections[which_field],which_field); + ppi->dq.query_type = QUERY_TYPE_DISTINCT; ppi->dq.distinct_field = ppi->uri_sections[which_field]; - which_field = 3; + // which_field = 3; if(!strcmp(ppi->uri_sections[which_field],"artists")) { response_type = "abar"; + ppi->dq.distinct_field = "artist"; } else if(!strcmp(ppi->uri_sections[which_field],"genres")) { response_type = "abgn"; + ppi->dq.distinct_field = "genre"; } else if(!strcmp(ppi->uri_sections[which_field],"albums")) { response_type = "abal"; + ppi->dq.distinct_field = "album"; } else if(!strcmp(ppi->uri_sections[which_field],"composers")) { response_type = "abcp"; + ppi->dq.distinct_field = "composer"; } else { _ppi->log(E_WARN,"Invalid browse request type %s\n",ppi->uri_sections[3]); out_daap_error(pwsc,ppi,"abro","Invalid browse type"); @@ -1251,36 +1263,13 @@ void out_daap_items(WS_CONNINFO *pwsc, PRIVINFO *ppi) { void out_daap_update(WS_CONNINFO *pwsc, PRIVINFO *ppi) { unsigned char update_response[32]; unsigned char *current=update_response; - int clientver=1; - fd_set rset; - struct timeval tv; - int result; - int lastver=0; _ppi->log(E_DBG,"Preparing to send update response\n"); _ppi->config_set_status(pwsc,ppi->session_id,"Waiting for DB update"); - if(_ppi->ws_getvar(pwsc,"revision-number")) { - clientver=atoi(_ppi->ws_getvar(pwsc,"revision-number")); - } - - /* wait for db_version to be stable for 30 seconds */ - while((clientver == _ppi->db_revision()) || - (lastver && (_ppi->db_revision() != lastver))) { - lastver = _ppi->db_revision(); - - FD_ZERO(&rset); - FD_SET(_ppi->ws_fd(pwsc),&rset); - - tv.tv_sec=30; - tv.tv_usec=0; - - result=select(_ppi->ws_fd(pwsc)+1,&rset,NULL,NULL,&tv); - if(FD_ISSET(_ppi->ws_fd(pwsc),&rset)) { - /* can't be ready for read, must be error */ - _ppi->log(E_DBG,"Update session stopped\n"); - return; - } + if(!_ppi->db_wait_update(pwsc)) { + _ppi->log(E_DBG,"Update session stopped\n"); + return; } /* otherwise, send the info about this version */