#ifndef __SPOOLREWINDINPUTSTREAM_H #define __SPOOLREWINDINPUTSTREAM_H #include "RewindInputStream.hpp" #include #include #include class spool_streambuf : public std::streambuf { public: explicit CRAWLER_DLL_VISIBLE spool_streambuf( size_t bufSize = 256, size_t putBack = 1, size_t spoolBufSize = 8192 ); CRAWLER_DLL_VISIBLE ~spool_streambuf( ); CRAWLER_DLL_VISIBLE void rewind( ); protected: CRAWLER_DLL_VISIBLE virtual std::streambuf::int_type readFromSource( ) = 0; CRAWLER_DLL_VISIBLE std::streambuf::int_type spoolSourceData( char *data, size_t n ); private: CRAWLER_DLL_VISIBLE int_type underflow( ); CRAWLER_DLL_VISIBLE void spoolData( char *data, size_t n ); private: const size_t m_putBack; std::vector m_spoolBuf; size_t m_spoolBufPos; size_t m_spoolBufSize; std::fstream m_spoolFile; enum { TO_SPOOL_MEMORY = 1, TO_SPOOL_FILE = 2, FROM_SPOOL_MEMORY = 3, FROM_SPOOL_FILE = 4 } m_state; protected: std::vector m_buf; char *m_base; char *m_start; }; class SpoolRewindInputStream : public RewindInputStream { public: CRAWLER_DLL_VISIBLE SpoolRewindInputStream( const URL &url ); CRAWLER_DLL_VISIBLE virtual ~SpoolRewindInputStream( ); CRAWLER_DLL_VISIBLE virtual void rewind( ); protected: spool_streambuf *m_buf; }; #endif