summaryrefslogtreecommitdiff
path: root/include/crawler/SpoolRewindInputStream.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/crawler/SpoolRewindInputStream.hpp')
-rwxr-xr-xinclude/crawler/SpoolRewindInputStream.hpp51
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