#include "LibCurlRewindInputStream.hpp" #include "SpoolRewindInputStream.hpp" #include //#include //#include using namespace cURLpp; using namespace std; class libcurl_buffer : public spool_streambuf { public: explicit libcurl_buffer( Easy *curl, size_t bufSize = 256, size_t putBack = 1, size_t spoolBufSize = 8192 ); size_t write_data( char *ptr, size_t s, size_t n ); protected: virtual streambuf::int_type readFromSource( ); private: Easy *m_curl; }; libcurl_buffer::libcurl_buffer( Easy *curl, size_t bufSize, size_t putBack, size_t spoolBufSize ) : spool_streambuf( bufSize, putBack, spoolBufSize ), m_curl( curl ) { } size_t libcurl_buffer::write_data( char *ptr, size_t s, size_t n ) { size_t chunk_size = s * n; size_t data_spooled = spoolSourceData( ptr, chunk_size ); // otherwise we must use CURL_WRITEFUNC_PAUSE assert( data_spooled == n ); return data_spooled; } streambuf::int_type libcurl_buffer::readFromSource( ) { // done before, we should not get called here! return 0; } LibCurlRewindInputStream::LibCurlRewindInputStream( const URL &url ) : SpoolRewindInputStream( url ), m_curl( 0 ) { m_curl = new Easy( ); m_curl->setOpt( Options::Url( url.str( ).c_str( ) ) ); // how to use logger here? // m_curl->setOpt( Options::Header( true ) ); // m_curl->setOpt( Options::Verbose( true ) ); /* m_curl->set( DebugFunction( types::DebugFunctionFunctor( & request.setOpt(Verbose(true)); request.setOpt(DebugFunction(curlpp::types::DebugFunctionFunctor(&myWindow, &MyWindow::writeDebug))); */ m_buf = new libcurl_buffer( m_curl ); rdbuf( m_buf ); Types::WriteFunctionFunctor functor( static_cast( m_buf ), &libcurl_buffer::write_data ); Options::WriteFunction *wf = new Options::WriteFunction( functor ); m_curl->setOpt( wf ); m_curl->perform( ); // TODO: error handling } LibCurlRewindInputStream::~LibCurlRewindInputStream( ) { if( m_buf ) delete m_buf; if( m_curl ) delete m_curl; } string LibCurlRewindInputStream::lastErrMsg( ) const { // TODO: fetch m_curl state and return error return "ERROR"; }