#include <sockets.h>

Public Member Functions | |
| SocketReader (Socket &socket) | |
| int | get_state () |
| int | peek () |
| void | next () |
| int | read_line (char *line, size_t len) |
| int | read (char *buffer, size_t len) |
| string | receive_all () |
Private Member Functions | |
| void | fetch () |
Private Attributes | |
| Socket & | _socket |
| int | _state |
| char | _buffer [BUFFER_LEN] |
| char * | _g_ptr |
| char * | _e_ptr |
Definition at line 325 of file sockets.h.
| SocketReader::SocketReader | ( | Socket & | socket ) | [inline] |
| void SocketReader::fetch | ( | ) | [inline, private] |
Definition at line 465 of file sockets.h.
References _buffer, _e_ptr, _g_ptr, _socket, BUFFER_LEN, read(), and Socket::receive_fragmented().
Referenced by peek().
{
int read = _socket.receive_fragmented(_buffer, BUFFER_LEN);
if (read >= 0) {
_g_ptr = _buffer;
_e_ptr = _buffer + read;
}
}


| int SocketReader::get_state | ( | ) | [inline] |
| void SocketReader::next | ( | ) | [inline] |
| int SocketReader::peek | ( | ) | [inline] |
| int SocketReader::read | ( | char * | buffer, |
| size_t | len | ||
| ) | [inline] |
Definition at line 407 of file sockets.h.
References _e_ptr, _g_ptr, _socket, and Socket::receive().
Referenced by fetch(), HttpServer::handle_request(), and receive_all().
{
int sum = 0;
// first read the available data from the buffer
size_t avail = _e_ptr - _g_ptr;
if (avail > 0) {
size_t read = min(avail, len);
memcpy(buffer, _g_ptr, read);
_g_ptr += read;
buffer += read;
len -= read;
}
// Do we need more data?
if (len > 0)
sum += _socket.receive(buffer, len);
return sum;
}


| int SocketReader::read_line | ( | char * | line, |
| size_t | len | ||
| ) | [inline] |
Definition at line 359 of file sockets.h.
References _state, next(), and peek().
Referenced by HttpServer::handle_request().
{
char* p = NULL;
char* end = line + (len-1);
for(;;) {
if (p && p>=end)
break;
int c = peek();
if (c == EOF) {
_state |= ios_base::eofbit;
if (p == line)
_state |= ios_base::failbit;
break;
}
if (!p)
p = line;
if (c == '\n') {
next();
break;
} else if (c == '\r') {
next();
if (peek() == '\n')
next();
break;
} else
*p++ = (char)c;
next();
}
if (!p)
p = line;
*p = '\0';
return p - line;
}


| string SocketReader::receive_all | ( | ) | [inline] |
Definition at line 431 of file sockets.h.
References _e_ptr, _g_ptr, _socket, BUFFER_LEN, read(), and Socket::receive_fragmented().
{
ostringstream ret;
char buffer[BUFFER_LEN];
// first read all data from the buffer
int avail = _e_ptr - _g_ptr;
if (avail > 0) {
ret.write(_g_ptr, avail);
_g_ptr = _e_ptr;
}
// now loop until no more data can be read from the socket
for(;;) {
int read = _socket.receive_fragmented(buffer, BUFFER_LEN);
if (read <= 0)
break;
ret.write(buffer, read);
}
return ret.str();
}

char SocketReader::_buffer[BUFFER_LEN] [private] |
Definition at line 461 of file sockets.h.
Referenced by fetch(), and SocketReader().
char* SocketReader::_e_ptr [private] |
char* SocketReader::_g_ptr [private] |
Socket& SocketReader::_socket [private] |
Definition at line 458 of file sockets.h.
Referenced by fetch(), read(), and receive_all().
int SocketReader::_state [private] |
Definition at line 459 of file sockets.h.
Referenced by get_state(), and read_line().
1.7.2