/* */ #ifndef D_CHUNKED_DECODING_STREAM_FILTER_H #define D_CHUNKED_DECODING_STREAM_FILTER_H #include "StreamFilter.h" namespace aria2 { class ChunkedDecodingStreamFilter : public StreamFilter { private: class StateHandler { public: virtual ~StateHandler() {} virtual bool execute (ChunkedDecodingStreamFilter* filter, ssize_t& outlen, size_t& inbufOffset, const unsigned char* inbuf, size_t inlen, const SharedHandle& out, const SharedHandle& segment) const = 0; }; StateHandler* state_; std::string buf_; uint64_t chunkSize_; size_t bytesProcessed_; static size_t MAX_BUF_SIZE; bool readChunkSize (size_t& inbufOffset, const unsigned char* inbuf, size_t inlen); bool readTrailer (size_t& inbufOffset, const unsigned char* inbuf, size_t inlen); bool readData (ssize_t& outlen, size_t& inbufOffset, const unsigned char* inbuf, size_t inlen, const SharedHandle& out, const SharedHandle& segment); bool readDataEnd (size_t& inbufOffset, const unsigned char* inbuf, size_t inlen); class ReadChunkSizeStateHandler:public StateHandler { public: virtual bool execute (ChunkedDecodingStreamFilter* filter, ssize_t& outlen, size_t& inbufOffset, const unsigned char* inbuf, size_t inlen, const SharedHandle& out, const SharedHandle& segment) const { return filter->readChunkSize(inbufOffset, inbuf, inlen); } }; class ReadTrailerStateHandler:public StateHandler { public: virtual bool execute (ChunkedDecodingStreamFilter* filter, ssize_t& outlen, size_t& inbufOffset, const unsigned char* inbuf, size_t inlen, const SharedHandle& out, const SharedHandle& segment) const { return filter->readTrailer(inbufOffset, inbuf, inlen); } }; class ReadDataStateHandler:public StateHandler { public: virtual bool execute (ChunkedDecodingStreamFilter* filter, ssize_t& outlen, size_t& inbufOffset, const unsigned char* inbuf, size_t inlen, const SharedHandle& out, const SharedHandle& segment) const { return filter->readData(outlen, inbufOffset, inbuf, inlen, out, segment); } }; class ReadDataEndStateHandler:public StateHandler { public: virtual bool execute (ChunkedDecodingStreamFilter* filter, ssize_t& outlen, size_t& inbufOffset, const unsigned char* inbuf, size_t inlen, const SharedHandle& out, const SharedHandle& segment) const { return filter->readDataEnd(inbufOffset, inbuf, inlen); } }; class StreamEndStatehandler:public StateHandler { public: virtual bool execute (ChunkedDecodingStreamFilter* filter, ssize_t& outlen, size_t& inbufOffset, const unsigned char* inbuf, size_t inlen, const SharedHandle& out, const SharedHandle& segment) const { return false; } }; static ReadChunkSizeStateHandler* readChunkSizeStateHandler_; static ReadTrailerStateHandler* readTrailerStateHandler_; static ReadDataStateHandler* readDataStateHandler_; static ReadDataEndStateHandler* readDataEndStateHandler_; static StreamEndStatehandler* streamEndStateHandler_; public: ChunkedDecodingStreamFilter (const SharedHandle& delegate = SharedHandle()); virtual ~ChunkedDecodingStreamFilter(); virtual void init(); virtual ssize_t transform (const SharedHandle& out, const SharedHandle& segment, const unsigned char* inbuf, size_t inlen); virtual bool finished(); virtual void release(); virtual const std::string& getName() const; virtual size_t getBytesProcessed() const { return bytesProcessed_; } static const std::string NAME; }; } // namespace aria2 #endif // D_CHUNKED_DECODING_STREAM_FILTER_H