diff options
Diffstat (limited to 'include/crawler/SpoolRewindInputStream.hpp')
-rwxr-xr-x | include/crawler/SpoolRewindInputStream.hpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/include/crawler/SpoolRewindInputStream.hpp b/include/crawler/SpoolRewindInputStream.hpp new file mode 100755 index 0000000..f065271 --- /dev/null +++ b/include/crawler/SpoolRewindInputStream.hpp @@ -0,0 +1,51 @@ +#ifndef __SPOOLREWINDINPUTSTREAM_H +#define __SPOOLREWINDINPUTSTREAM_H + +#include "RewindInputStream.hpp" + +#include <iostream> +#include <fstream> +#include <vector> + +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; + + private: + CRAWLER_DLL_VISIBLE int_type underflow( ); + + private: + const size_t m_putBack; + std::vector<char> 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<char> 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 |