Attempt to fix #147 - long song lists hang soundbridge... need grommet to test

This commit is contained in:
Ron Pedde 2006-06-15 04:26:01 +00:00
parent a533430540
commit 603ce10fae
3 changed files with 21 additions and 9 deletions

View File

@ -364,6 +364,7 @@ void rsp_playlist(WS_CONNINFO *pwsc, PRIVINFO *ppi) {
int type; int type;
int transcode; int transcode;
unsigned int samplerate; unsigned int samplerate;
int done = 0;
ppi->dq.filter = _ppi->ws_getvar(pwsc,"query"); ppi->dq.filter = _ppi->ws_getvar(pwsc,"query");
ppi->dq.filter_type = FILTER_TYPE_FIREFLY; ppi->dq.filter_type = FILTER_TYPE_FIREFLY;
@ -418,7 +419,8 @@ void rsp_playlist(WS_CONNINFO *pwsc, PRIVINFO *ppi) {
xml_push(pxml,"items"); xml_push(pxml,"items");
while((_ppi->db_enum_fetch_row(NULL,&row,&ppi->dq) == 0) && (row)) { while((!done) && (_ppi->db_enum_fetch_row(NULL,&row,&ppi->dq) == 0) &&
(row)) {
xml_push(pxml,"item"); xml_push(pxml,"item");
rowindex=0; rowindex=0;
transcode = 0; transcode = 0;
@ -459,8 +461,10 @@ void rsp_playlist(WS_CONNINFO *pwsc, PRIVINFO *ppi) {
break; break;
} }
} else { } else {
xml_output(pxml,rsp_fields[rowindex].name,"%s", /* check for pushing against closed socket */
row[rowindex]); if(xml_output(pxml,rsp_fields[rowindex].name,"%s",
row[rowindex]) == -1)
done=1;
} }
} }

View File

@ -53,19 +53,24 @@ XML_STREAMBUFFER *xml_stream_open(void);
int xml_stream_write(XMLSTRUCT *pxml, char *out); int xml_stream_write(XMLSTRUCT *pxml, char *out);
int xml_stream_close(XMLSTRUCT *pxml); int xml_stream_close(XMLSTRUCT *pxml);
void xml_write(XMLSTRUCT *pxml, char *fmt, ...) { int xml_write(XMLSTRUCT *pxml, char *fmt, ...) {
char buffer[1024]; char buffer[1024];
va_list ap; va_list ap;
int result=0;
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buffer, 1024, fmt, ap); vsnprintf(buffer, 1024, fmt, ap);
va_end(ap); va_end(ap);
if(pxml->psb) { if(pxml->psb) {
xml_stream_write(pxml, buffer); result=xml_stream_write(pxml, buffer);
if(!result)
result = -1;
} else { } else {
_ppi->ws_writefd(pxml->pwsc,"%s",buffer); result=_ppi->ws_writefd(pxml->pwsc,"%s",buffer);
} }
return result;
} }
void xml_return_error(WS_CONNINFO *pwsc, int errno, char *errstr) { void xml_return_error(WS_CONNINFO *pwsc, int errno, char *errstr) {
@ -283,10 +288,11 @@ void xml_pop(XMLSTRUCT *pxml) {
/** /**
* output a string * output a string
*/ */
void xml_output(XMLSTRUCT *pxml, char *section, char *fmt, ...) { int xml_output(XMLSTRUCT *pxml, char *section, char *fmt, ...) {
va_list ap; va_list ap;
char buf[256]; char buf[256];
char *output; char *output;
int result=0;
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap); vsnprintf(buf, sizeof(buf), fmt, ap);
@ -297,11 +303,13 @@ void xml_output(XMLSTRUCT *pxml, char *section, char *fmt, ...) {
xml_push(pxml,section); xml_push(pxml,section);
} }
xml_write(pxml,"%s",output); result = xml_write(pxml,"%s",output);
free(output); free(output);
if(section) { if(section) {
xml_pop(pxml); xml_pop(pxml);
} }
return result;
} }
/** /**

View File

@ -14,7 +14,7 @@ typedef struct tag_ws_conninfo WS_CONNINFO;
extern XMLSTRUCT *xml_init(WS_CONNINFO *pwsc, int emit_header); extern XMLSTRUCT *xml_init(WS_CONNINFO *pwsc, int emit_header);
extern void xml_push(XMLSTRUCT *pxml, char *term); extern void xml_push(XMLSTRUCT *pxml, char *term);
extern void xml_pop(XMLSTRUCT *pxml); extern void xml_pop(XMLSTRUCT *pxml);
extern void xml_output(XMLSTRUCT *pxml, char *section, char *fmt, ...); extern int xml_output(XMLSTRUCT *pxml, char *section, char *fmt, ...);
extern void xml_deinit(XMLSTRUCT *pxml); extern void xml_deinit(XMLSTRUCT *pxml);