/** * /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); }
static int rsp_break_signal(struct tcp_pcb * tp, char * pkt) { // int state; DCC_LOG(LOG_TRACE, "break received, stopping..."); if (target_halt(0) < 0) { return rsp_error(tp, 1); } return 0; #if 0 if ((state = target_halt_wait(500)) == ERR_TIMEOUT) { DCC_LOG(LOG_TRACE, "timeout..."); } if (state == DBG_ST_HALTED) { DCC_LOG(LOG_TRACE, "halted"); return rsp_signal(tp, pkt, SIGTRAP); } return rsp_msg(tp, pkt, "YARD-ICE: target_halt failed!"); #endif }
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); }
/** * dispatch handler for web stuff */ void plugin_handler(WS_CONNINFO *pwsc) { char *string, *save, *token; PRIVINFO *ppi; int elements; int index, part; int found; pi_log(E_DBG,"Getting uri...\n"); string = pi_ws_uri(pwsc); string++; pi_log(E_DBG,"Mallocing privinfo...\n"); ppi = (PRIVINFO *)malloc(sizeof(PRIVINFO)); if(ppi) { memset(ppi,0,sizeof(PRIVINFO)); } if(!ppi) { pi_ws_returnerror(pwsc,500,"Malloc error in plugin_handler"); return; } memset((void*)&ppi->dq,0,sizeof(DB_QUERY)); pi_log(E_DBG,"Tokenizing url\n"); save = NULL; while((ppi->uri_count < 10) && (token=strtok_r(string,"/",&save))) { string=NULL; ppi->uri_sections[ppi->uri_count++] = token; } elements = sizeof(rsp_uri_map) / sizeof(PLUGIN_RESPONSE); pi_log(E_DBG,"Found %d elements\n",elements); index = 0; found = 0; while((!found) && (index < elements)) { /* test this set */ pi_log(E_DBG,"Checking reponse %d\n",index); part=0; while(part < 10) { if((rsp_uri_map[index].uri[part]) && (!ppi->uri_sections[part])) break; if((ppi->uri_sections[part]) && (!rsp_uri_map[index].uri[part])) break; if((rsp_uri_map[index].uri[part]) && (strcmp(rsp_uri_map[index].uri[part],"*") != 0)) { if(strcmp(rsp_uri_map[index].uri[part], ppi->uri_sections[part])!= 0) break; } part++; } if(part == 10) { found = 1; pi_log(E_DBG,"Found it! Index: %d\n",index); } else { index++; } } if(found) { rsp_uri_map[index].dispatch(pwsc, ppi); pi_ws_will_close(pwsc); free(ppi); return; } rsp_error(pwsc, ppi, 1, "Bad path"); pi_ws_will_close(pwsc); free(ppi); return; }
static int rsp_last_signal(struct gdb_rspd * gdb, struct tcp_pcb * tp, char * pkt, int len) { int state; state = target_status(); if (state < DBG_ST_CONNECTED) { DCC_LOG(LOG_WARNING, "target not connected!"); return rsp_error(tp, state); } if (state != DBG_ST_HALTED) { DCC_LOG(LOG_TRACE, "running"); if ((state = target_halt(0)) < 0) { DCC_LOG(LOG_WARNING, "target_halt() failed!"); rsp_msg(tp, pkt, "YARD-ICE: halt fail\n"); return rsp_error(tp, 1); } if ((state = target_halt_wait(500)) == ERR_TIMEOUT) { DCC_LOG(LOG_TRACE, "timeout..."); rsp_msg(tp, pkt, "YARD-ICE: target_halt failed!"); return rsp_error(tp, 1); } } if (state == DBG_ST_HALTED) { DCC_LOG(LOG_TRACE, "halted"); thinkos_flag_clr(gdb->run_flag); return rsp_signal(tp, pkt, SIGTRAP); } switch (state) { case DBG_ST_ERROR: rsp_msg(tp, pkt, "YARD-ICE: error state\n"); break; case DBG_ST_OUTOFSYNC: DCC_LOG(LOG_TRACE, "out of sync"); rsp_msg(tp, pkt, "YARD-ICE: Out of sync\n"); break; case DBG_ST_BUSY: DCC_LOG(LOG_TRACE, "busy..."); rsp_msg(tp, pkt, "YARD-ICE: busy ... \n"); break; case DBG_ST_UNDEF: rsp_msg(tp, pkt, "YARD-ICE: undefined state\n"); break; case DBG_ST_UNCONNECTED: DCC_LOG(LOG_TRACE, "unconnected"); rsp_msg(tp, pkt, "YARD-ICE: unconnected ?\n"); break; case DBG_ST_CONNECTED: DCC_LOG(LOG_TRACE, "connected"); rsp_msg(tp, pkt, "YARD-ICE: connected (busy)\n"); break; case DBG_ST_RUNNING: DCC_LOG(LOG_TRACE, "running"); rsp_msg(tp, pkt, "YARD-ICE: running\n"); thinkos_flag_set(gdb->run_flag); break; default: DCC_LOG1(LOG_WARNING, "unknown state: %d", state); rsp_msg(tp, pkt, "YARD-ICE: unknown state, bailing out!\n"); return -1; } return rsp_error(tp, 1); }