/** * get server info */ void rsp_info(WS_CONNINFO *pwsc, PRIVINFO *ppi) { XMLSTRUCT *pxml; char servername[256]; int size; pi_log(E_DBG,"Starting rsp_info\n"); pi_config_set_status(pwsc,0,"Getting server info"); pxml = xml_init(pwsc,1); xml_push(pxml,"response"); xml_push(pxml,"status"); xml_output(pxml,"errorcode","0"); xml_output(pxml,"errorstring",""); xml_output(pxml,"records","0"); xml_output(pxml,"totalrecords","0"); xml_pop(pxml); /* status */ /* info block */ xml_push(pxml,"info"); xml_output(pxml,"count","%d",pi_db_count_items(COUNT_SONGS)); xml_output(pxml,"rsp-version","%s",RSP_VERSION); xml_output(pxml,"server-version","%s",pi_server_ver()); size = sizeof(servername); pi_server_name(servername,&size); xml_output(pxml,"name","%s",servername); xml_pop(pxml); /* info */ xml_pop(pxml); /* response */ xml_deinit(pxml); pi_config_set_status(pwsc,0,NULL); }
/** * /rsp/db * * dump details about all playlists */ void rsp_db(WS_CONNINFO *pwsc, PRIVINFO *ppi) { XMLSTRUCT *pxml; char *pe; int err; char **row; int rowindex; ppi->dq.query_type = QUERY_TYPE_PLAYLISTS; if((err=pi_db_enum_start(&pe,&ppi->dq)) != 0) { rsp_error(pwsc, ppi, err | E_DB, pe); pi_db_enum_dispose(NULL,&ppi->dq); return; } pi_config_set_status(pwsc,0,"Fetching playlist info"); pxml = xml_init(pwsc,1); xml_push(pxml,"response"); xml_push(pxml,"status"); xml_output(pxml,"errorcode","0"); xml_output(pxml,"errorstring",""); xml_output(pxml,"records","%d",ppi->dq.totalcount); xml_output(pxml,"totalrecords","%d",ppi->dq.totalcount); xml_pop(pxml); /* status */ xml_push(pxml,"playlists"); while((pi_db_enum_fetch_row(NULL,&row,&ppi->dq) == 0) && (row)) { xml_push(pxml,"playlist"); rowindex=0; while(rsp_playlist_fields[rowindex].name) { if(rsp_playlist_fields[rowindex].flags & F_FULL) { xml_output(pxml,rsp_playlist_fields[rowindex].name,"%s", row[rowindex]); } rowindex++; } xml_pop(pxml); /* playlist */ } pi_db_enum_end(NULL); pi_db_enum_dispose(NULL,&ppi->dq); xml_pop(pxml); /* playlists */ xml_pop(pxml); /* response */ xml_deinit(pxml); pi_config_set_status(pwsc,0,NULL); }
void rsp_error(WS_CONNINFO *pwsc, PRIVINFO *ppi, int eno, char *estr) { XMLSTRUCT *pxml; pxml = xml_init(pwsc, 1); xml_push(pxml,"response"); xml_push(pxml,"status"); xml_output(pxml,"errorcode","%d",eno); xml_output(pxml,"errorstring","%s",estr); xml_output(pxml,"records","0"); xml_output(pxml,"totalrecords","0"); xml_pop(pxml); /* status */ xml_pop(pxml); /* response */ xml_deinit(pxml); pi_ws_will_close(pwsc); }
void indentedtag_pop(void) { xstartline(); xunindent(); xml_pop(); xnewline(); }
void nxml_doc(struct docstring *doc) { if (!doc->short_s) return; indentedtag_start("documentation"); xml_attr_loc(doc->loc); xml_tag_end(); xnewline(); xml_tag("short"); xqputs(doc->short_s); xml_pop(); xnewline(); if (doc->long_s) { xml_tag("long"); xqputs(doc->long_s); xml_pop(); xnewline(); } indentedtag_pop(); }
void rsp_browse(WS_CONNINFO *pwsc, PRIVINFO *ppi) { XMLSTRUCT *pxml; char *pe; int err; char **row; int returned; /* this might fail if an unsupported browse type */ ppi->dq.query_type = QUERY_TYPE_DISTINCT; ppi->dq.distinct_field = ppi->uri_sections[3]; ppi->dq.filter = pi_ws_getvar(pwsc,"query"); ppi->dq.filter_type = FILTER_TYPE_FIREFLY; if(pi_ws_getvar(pwsc,"offset")) { ppi->dq.offset = atoi(pi_ws_getvar(pwsc,"offset")); } if(pi_ws_getvar(pwsc,"limit")) { ppi->dq.limit = atoi(pi_ws_getvar(pwsc,"limit")); } ppi->dq.playlist_id = atoi(ppi->uri_sections[2]); if((err=pi_db_enum_start(&pe,&ppi->dq)) != 0) { rsp_error(pwsc, ppi, err | E_DB, pe); pi_db_enum_dispose(NULL,&ppi->dq); return; } pi_config_set_status(pwsc,0,"Browsing"); pxml = xml_init(pwsc,1); if(ppi->dq.offset > ppi->dq.totalcount) { returned = 0; } else { returned = ppi->dq.limit; if(returned > (ppi->dq.totalcount - ppi->dq.offset)) returned = ppi->dq.totalcount - ppi->dq.offset; } xml_push(pxml,"response"); xml_push(pxml,"status"); xml_output(pxml,"errorcode","0"); xml_output(pxml,"errorstring",""); xml_output(pxml,"records","%d",returned); xml_output(pxml,"totalrecords","%d",ppi->dq.totalcount); xml_pop(pxml); /* status */ xml_push(pxml,"items"); while((pi_db_enum_fetch_row(NULL,&row,&ppi->dq) == 0) && (row)) { xml_output(pxml,"item","%s",row[0]); } pi_db_enum_end(NULL); pi_db_enum_dispose(NULL,&ppi->dq); xml_pop(pxml); /* items */ xml_pop(pxml); /* response */ xml_deinit(pxml); pi_config_set_status(pwsc,0,NULL); }
/** * get all items under the playlist */ void rsp_playlist(WS_CONNINFO *pwsc, PRIVINFO *ppi) { XMLSTRUCT *pxml; char *pe; int err; char **row; int rowindex; int returned; char *browse_type; int type; int transcode; unsigned int samplerate; int done = 0; ppi->dq.filter = pi_ws_getvar(pwsc,"query"); ppi->dq.filter_type = FILTER_TYPE_FIREFLY; if(pi_ws_getvar(pwsc,"offset")) { ppi->dq.offset = atoi(pi_ws_getvar(pwsc,"offset")); } if(pi_ws_getvar(pwsc,"limit")) { ppi->dq.limit = atoi(pi_ws_getvar(pwsc,"limit")); } browse_type = pi_ws_getvar(pwsc,"type"); type = F_FULL; if(browse_type) { if(strcasecmp(browse_type,"browse") == 0) { type = F_BROWSE; } else if(strcasecmp(browse_type,"id") == 0) { type = F_ID; } else if(strcasecmp(browse_type,"detailed") ==0) { type = F_DETAILED; } } ppi->dq.query_type = QUERY_TYPE_ITEMS; ppi->dq.playlist_id = atoi(ppi->uri_sections[2]); if((err=pi_db_enum_start(&pe,&ppi->dq)) != 0) { rsp_error(pwsc, ppi, err | E_DB, pe); pi_db_enum_dispose(NULL,&ppi->dq); free(pe); return; } pi_config_set_status(pwsc,0,"Fetching playlist items"); pxml = xml_init(pwsc,1); if(ppi->dq.offset > ppi->dq.totalcount) { returned = 0; } else { returned = ppi->dq.limit; if(returned > (ppi->dq.totalcount - ppi->dq.offset)) returned = ppi->dq.totalcount - ppi->dq.offset; } xml_push(pxml,"response"); xml_push(pxml,"status"); xml_output(pxml,"errorcode","0"); xml_output(pxml,"errorstring",""); xml_output(pxml,"records","%d",returned); xml_output(pxml,"totalrecords","%d",ppi->dq.totalcount); xml_pop(pxml); /* status */ xml_push(pxml,"items"); while((!done) && (pi_db_enum_fetch_row(NULL,&row,&ppi->dq) == 0) && (row)) { xml_push(pxml,"item"); rowindex=0; transcode = 0; transcode = pi_should_transcode(pwsc,row[37]); pi_log(E_DBG,"Transcode: %d, %s: %s\n",transcode,row[37],row[2]); while(rsp_fields[rowindex].name) { if((rsp_fields[rowindex].flags & type) && (row[rowindex] && strlen(row[rowindex]))) { if(transcode) { switch(rowindex) { case 8: xml_output(pxml,rsp_fields[rowindex].name,"%s","wav"); break; case 29: xml_output(pxml,rsp_fields[rowindex].name,"%s", "wav audio file"); break; case 14: /* bitrate */ samplerate = atoi(row[15]); if(samplerate) { samplerate = (samplerate * 8) / 250; } else { samplerate = 1411; } xml_output(pxml,rsp_fields[rowindex].name,"%d", samplerate); break; case 37: xml_output(pxml,rsp_fields[rowindex].name,"%s","wav"); xml_output(pxml,"original_codec","%s",row[37]); break; default: xml_output(pxml,rsp_fields[rowindex].name,"%s", row[rowindex]); break; } } else { /* check for pushing against closed socket */ if(xml_output(pxml,rsp_fields[rowindex].name,"%s", row[rowindex]) == -1) done=1; } } rowindex++; } xml_pop(pxml); /* item */ } pi_db_enum_end(NULL); xml_pop(pxml); /* items */ xml_pop(pxml); /* response */ xml_deinit(pxml); pi_config_set_status(pwsc,0,NULL); }