/* * IOManager.h * * Created on: Oct 1, 2010 * Author: daniele */ #ifndef IOMANAGER_H_ #define IOMANAGER_H_ #include #include #include "BufferDescriptor.h" #include "BufferObserver.h" #include "IOBuffer.h" #include "prototypes.h" class Chunk; class IOOperation; class IOManager { public: IOManager(); virtual ~IOManager(); /** * Check if a specific Chunk is available from the input buffer. * @param descriptor A descriptor for the chunk of data to be checked for availability * @return true if chunk is available, false otherwise. */ bool available( BufferDescriptor descriptor ); /** * Appends a Chunk to the input buffer. * @param c the Chunk to be appended. * @return number of bytes appended. */ std::size_t append_to_input( Chunk& c ); /** * Checks if output buffer is empty (if true, use read_from_output to get data). * @return true if there is data to read, false if empty. */ bool empty() { return _output->empty(); } /** * Reads all the available data from the output buffer. * @return A Chunk of data. */ Chunk read_from_output(); /** * Reads a specific Chunk from the input buffer. * @param descriptor descriptor for the Chunk to be read. * @return A Chunk of data. */ Chunk read_for_parsing( BufferDescriptor descriptor ); /** * Queues an IO operation to be executed later. * @param operation A pointer to the IOOperation to be queued. */ void queue_operation( ::prototype::IOOperation* operation ); /** * Returns the number of pending operations. * @return number of pending operations. */ std::size_t num_pending_operations() { return _pending_operations.size(); } /** * Queues a flush operation for deferred execution. * @param to_offset */ void queue_flush( std::size_t to_offset ); /** * Processes all pending IO operations in order of insertion. */ void process_pending(); /** * Registers a BufferObserver object whose update() method will be called when new data is available * in the input buffer. * @param observer The BufferObserver object to be notified. */ void register_source_observer( ::prototype::BufferObserver& observer ); /** * Unregister a BufferObserver object previously registered calling register_source_observer. * @param observer The BufferObserver object to be deregistered. */ void remove_source_observer( ::prototype::BufferObserver& observer ); /** * Tells the input buffer to discard all the data up to the specified offset. * @param to_offset */ void flush(std::size_t to_offset); /** * Moves data up to the specified offset from the input buffer to the output buffer. * @param size */ void complete(std::size_t size); /** * Appends some data to the output buffer. * @param chunk The Chunk of data to be appended. */ void append( Chunk& chunk ); /** * Returns a const reference to the input buffer. * @return An IOBuffer reference. */ IOBuffer& input() const { return *_input; } /** * Returns a const reference to the output buffer. * @return An IOBuffer reference. */ IOBuffer& output() const { return *_output; } bool operator==(IOManager const & another ) const { bool input = (_input == another._input); bool output = (_output == another._output); return ( input && output ); } private: IOBuffer* _input; IOBuffer* _output; boost::ptr_list< ::prototype::IOOperation > _pending_operations; }; #endif /* IOMANAGER_H_ */ .