summaryrefslogtreecommitdiff
path: root/src/modules/fetcher/libfetch/LibFetchRewindInputStream.cpp
blob: 1b4ab205568c98040f4aad01e9f9f960536cc0b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "LibFetchRewindInputStream.hpp"
#include "SpoolRewindInputStream.hpp"

using namespace std;

class libfetch_buffer : public spool_streambuf
{
	public:
		explicit libfetch_buffer( fetchIO *io, size_t bufSize = 256, size_t putBack = 1, size_t spoolBufSize = 8192 );
		
	protected:
	
		virtual streambuf::int_type readFromSource( );

	private:
		fetchIO *m_io;
};

libfetch_buffer::libfetch_buffer( fetchIO *io, size_t bufSize, size_t putBack, size_t spoolBufSize )
	: spool_streambuf( bufSize, putBack, spoolBufSize ), m_io( io )
{
}

streambuf::int_type libfetch_buffer::readFromSource( )
{
	ssize_t n;

	n = fetchIO_read( m_io, m_start, m_buf.size( ) - ( m_start - m_base ) );
	if( n == 0 ) {
		return traits_type::eof( );
	} else if( n < 0 ) {
		// TODO handle error
	}
	return n;
}

LibFetchRewindInputStream::LibFetchRewindInputStream( const URL &url )
	: SpoolRewindInputStream( url ), m_io( 0 )
{
	m_io = fetchGetURL( url.str( ).c_str( ), "" );
	if( m_io == NULL ) {
		setstate( badbit );
		return;
	}
	
	m_buf = new libfetch_buffer( m_io );
	rdbuf( m_buf );
}

LibFetchRewindInputStream::~LibFetchRewindInputStream( )
{
	if( m_buf ) delete m_buf;
	if( m_io ) fetchIO_close( m_io );
}

string LibFetchRewindInputStream::lastErrMsg( ) const
{
	return fetchLastErrString;
}