#ifndef __SPOOLREWINDINPUTSTREAM_H #define __SPOOLREWINDINPUTSTREAM_H #include "RewindInputStream.hpp" #include #include #include class spool_streambuf : public std::streambuf { public: explicit spool_streambuf( size_t bufSize = 256, size_t putBack = 1, size_t spoolBufSize = 8192 ); ~spool_streambuf( ); void rewind( ); protected: virtual std::streambuf::int_type readFromSource( ) = 0; private: int_type underflow( ); 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: SpoolRewindInputStream( const URL &url ); virtual ~SpoolRewindInputStream( ); virtual void rewind( ); protected: spool_streambuf *m_buf; }; #endif