Commit 6c241805 authored by Warren Dukes's avatar Warren Dukes

inputStream updates from httpTest

git-svn-id: https://svn.musicpd.org/mpd/trunk@1059 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent d4c7d6df
...@@ -49,4 +49,8 @@ int closeInputStream(InputStream * inStream) { ...@@ -49,4 +49,8 @@ int closeInputStream(InputStream * inStream) {
int inputStreamAtEOF(InputStream * inStream) { int inputStreamAtEOF(InputStream * inStream) {
return inStream->atEOFFunc(inStream); return inStream->atEOFFunc(inStream);
} }
int bufferInputStream(InputStream * inStream) {
return inStream->bufferFunc(inStream);
}
/* vim:set shiftwidth=8 tabstop=8 expandtab: */ /* vim:set shiftwidth=8 tabstop=8 expandtab: */
...@@ -29,6 +29,7 @@ typedef size_t (* InputStreamReadFunc) (InputStream * inStream, void * ptr, size ...@@ -29,6 +29,7 @@ typedef size_t (* InputStreamReadFunc) (InputStream * inStream, void * ptr, size
size_t nmemb); size_t nmemb);
typedef int (* InputStreamCloseFunc) (InputStream * inStream); typedef int (* InputStreamCloseFunc) (InputStream * inStream);
typedef int (* InputStreamAtEOFFunc) (InputStream * inStream); typedef int (* InputStreamAtEOFFunc) (InputStream * inStream);
typedef int (* InputStreamBufferFunc) (InputStream * inStream);
struct _InputStream { struct _InputStream {
int error; int error;
...@@ -42,6 +43,7 @@ struct _InputStream { ...@@ -42,6 +43,7 @@ struct _InputStream {
InputStreamReadFunc readFunc; InputStreamReadFunc readFunc;
InputStreamCloseFunc closeFunc; InputStreamCloseFunc closeFunc;
InputStreamAtEOFFunc atEOFFunc; InputStreamAtEOFFunc atEOFFunc;
InputStreamBufferFunc bufferFunc;
void * data; void * data;
}; };
...@@ -51,6 +53,7 @@ int openInputStream(InputStream * inStream, char * url); ...@@ -51,6 +53,7 @@ int openInputStream(InputStream * inStream, char * url);
int seekInputStream(InputStream * inStream, long offset, int whence); int seekInputStream(InputStream * inStream, long offset, int whence);
int closeInputStream(InputStream * inStream); int closeInputStream(InputStream * inStream);
int inputStreamAtEOF(InputStream * inStream); int inputStreamAtEOF(InputStream * inStream);
int bufferInputStream(InputStream * inStream);
size_t readFromInputStream(InputStream * inStream, void * ptr, size_t size, size_t readFromInputStream(InputStream * inStream, void * ptr, size_t size,
size_t nmemb); size_t nmemb);
......
...@@ -45,6 +45,7 @@ int inputStream_fileOpen(InputStream * inStream, char * filename) { ...@@ -45,6 +45,7 @@ int inputStream_fileOpen(InputStream * inStream, char * filename) {
inStream->closeFunc = inputStream_fileClose; inStream->closeFunc = inputStream_fileClose;
inStream->readFunc = inputStream_fileRead; inStream->readFunc = inputStream_fileRead;
inStream->atEOFFunc = inputStream_fileAtEOF; inStream->atEOFFunc = inputStream_fileAtEOF;
inStream->bufferFunc = inputStream_fileBuffer;
return 0; return 0;
} }
...@@ -85,4 +86,8 @@ int inputStream_fileClose(InputStream * inStream) { ...@@ -85,4 +86,8 @@ int inputStream_fileClose(InputStream * inStream) {
int inputStream_fileAtEOF(InputStream * inStream) { int inputStream_fileAtEOF(InputStream * inStream) {
return feof((FILE *)inStream->data); return feof((FILE *)inStream->data);
} }
int inputStream_fileBuffer(InputStream * inStream) {
return 0;
}
/* vim:set shiftwidth=4 tabstop=8 expandtab: */ /* vim:set shiftwidth=4 tabstop=8 expandtab: */
...@@ -32,5 +32,7 @@ int inputStream_fileClose(InputStream * inStream); ...@@ -32,5 +32,7 @@ int inputStream_fileClose(InputStream * inStream);
int inputStream_fileAtEOF(InputStream * inStream); int inputStream_fileAtEOF(InputStream * inStream);
int inputStream_fileBuffer(InputStream * inStream);
#endif #endif
/* vim:set shiftwidth=8 tabstop=8 expandtab: */ /* vim:set shiftwidth=8 tabstop=8 expandtab: */
...@@ -423,6 +423,7 @@ int inputStream_httpOpen(InputStream * inStream, char * url) { ...@@ -423,6 +423,7 @@ int inputStream_httpOpen(InputStream * inStream, char * url) {
inStream->closeFunc = inputStream_httpClose; inStream->closeFunc = inputStream_httpClose;
inStream->readFunc = inputStream_httpRead; inStream->readFunc = inputStream_httpRead;
inStream->atEOFFunc = inputStream_httpAtEOF; inStream->atEOFFunc = inputStream_httpAtEOF;
inStream->bufferFunc = inputStream_httpBuffer;
inStream->offset = 0; inStream->offset = 0;
inStream->size = 0; inStream->size = 0;
...@@ -443,20 +444,71 @@ size_t inputStream_httpRead(InputStream * inStream, void * ptr, size_t size, ...@@ -443,20 +444,71 @@ size_t inputStream_httpRead(InputStream * inStream, void * ptr, size_t size,
InputStreamHTTPData * data = (InputStreamHTTPData *)inStream->data; InputStreamHTTPData * data = (InputStreamHTTPData *)inStream->data;
int readed = 0; int readed = 0;
int inlen = size*nmemb; int inlen = size*nmemb;
inputStream_httpBuffer(inStream);
switch(data->connState) {
case HTTP_CONN_STATE_OPEN:
case HTTP_CONN_STATE_CLOSED:
break;
default:
return 0;
}
readed = inlen > data->buflen ? data->buflen : inlen;
memcpy(ptr, data->buffer, readed);
data->buflen -= readed;
memmove(data->buffer, data->buffer+readed, data->buflen);
inStream->offset+= readed;
return readed;
}
int inputStream_httpClose(InputStream * inStream) {
InputStreamHTTPData * data = (InputStreamHTTPData *)inStream->data;
switch(data->connState) {
case HTTP_CONN_STATE_CLOSED:
break;
default:
close(data->sock);
}
if(inStream->mime) free(inStream->mime);
freeInputStreamHTTPData(data);
return 0;
}
int inputStream_httpAtEOF(InputStream * inStream) {
InputStreamHTTPData * data = (InputStreamHTTPData *)inStream->data;
switch(data->connState) {
case HTTP_CONN_STATE_CLOSED:
if(data->buflen == 0) return 1;
default:
return 0;
}
}
int inputStream_httpBuffer(InputStream * inStream) {
InputStreamHTTPData * data = (InputStreamHTTPData *)inStream->data;
int readed = 0;
fd_set readSet; fd_set readSet;
struct timeval tv; struct timeval tv;
int ret; int ret;
if(data->connState == HTTP_CONN_STATE_REOPEN) { if(data->connState == HTTP_CONN_STATE_REOPEN) {
if(initHTTPConnection(inStream) < 0) return 0; if(initHTTPConnection(inStream) < 0) return -1;
} }
if(data->connState == HTTP_CONN_STATE_INIT) { if(data->connState == HTTP_CONN_STATE_INIT) {
if(finishHTTPInit(inStream) < 0) return 0; if(finishHTTPInit(inStream) < 0) return -1;
} }
if(data->connState == HTTP_CONN_STATE_HELLO) { if(data->connState == HTTP_CONN_STATE_HELLO) {
if(getHTTPHello(inStream) < 0) return 0; if(getHTTPHello(inStream) < 0) return -1;
} }
switch(data->connState) { switch(data->connState) {
...@@ -464,7 +516,7 @@ size_t inputStream_httpRead(InputStream * inStream, void * ptr, size_t size, ...@@ -464,7 +516,7 @@ size_t inputStream_httpRead(InputStream * inStream, void * ptr, size_t size,
case HTTP_CONN_STATE_CLOSED: case HTTP_CONN_STATE_CLOSED:
break; break;
default: default:
return 0; return -1;
} }
if(data->connState == HTTP_CONN_STATE_OPEN && if(data->connState == HTTP_CONN_STATE_OPEN &&
...@@ -502,40 +554,6 @@ size_t inputStream_httpRead(InputStream * inStream, void * ptr, size_t size, ...@@ -502,40 +554,6 @@ size_t inputStream_httpRead(InputStream * inStream, void * ptr, size_t size,
} }
} }
readed = inlen > data->buflen ? data->buflen : inlen;
memcpy(ptr, data->buffer, readed);
data->buflen -= readed;
memmove(data->buffer, data->buffer+readed, data->buflen);
inStream->offset+= readed;
return readed;
}
int inputStream_httpClose(InputStream * inStream) {
InputStreamHTTPData * data = (InputStreamHTTPData *)inStream->data;
switch(data->connState) {
case HTTP_CONN_STATE_CLOSED:
break;
default:
close(data->sock);
}
if(inStream->mime) free(inStream->mime);
freeInputStreamHTTPData(data);
return 0; return 0;
} }
int inputStream_httpAtEOF(InputStream * inStream) {
InputStreamHTTPData * data = (InputStreamHTTPData *)inStream->data;
switch(data->connState) {
case HTTP_CONN_STATE_CLOSED:
if(data->buflen == 0) return 1;
default:
return 0;
}
}
/* vim:set shiftwidth=8 tabstop=8 expandtab: */ /* vim:set shiftwidth=8 tabstop=8 expandtab: */
...@@ -32,5 +32,7 @@ int inputStream_httpClose(InputStream * inStream); ...@@ -32,5 +32,7 @@ int inputStream_httpClose(InputStream * inStream);
int inputStream_httpAtEOF(InputStream * inStream); int inputStream_httpAtEOF(InputStream * inStream);
int inputStream_httpBuffer(InputStream * inStream);
#endif #endif
/* vim:set shiftwidth=8 tabstop=8 expandtab: */ /* vim:set shiftwidth=8 tabstop=8 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment