/**
         * Repositions this stream to the position at the time the mark() method was
         * last called on this input stream. If mark() has not been called this
         * method repositions the stream to its beginning.
         */

        public override void Reset()
        {
            // Special case for Reset to the start
            if (_marked_offset == 0 && _marked_offset_count == 0)
            {
                _current_block_count = _marked_offset_count;
                _current_offset      = _marked_offset;
                _data   = _document.GetBlockIterator();
                _buffer = null;
                return;
            }

            // Start again, then wind on to the required block
            _data           = _document.GetBlockIterator();
            _current_offset = 0;

            for (int i = 0; i < _marked_offset_count; i++)
            {
                _data.MoveNext();
                _buffer          = _data.Current;
                _current_offset += _buffer.Remain;
            }

            _current_block_count = _marked_offset_count;

            // Do we need to position within it?
            if (_current_offset != _marked_offset)
            {
                // Grab the right block
                _data.MoveNext();
                _buffer = _data.Current;
                _current_block_count++;

                // Skip to the right place in it
                // (It should be positioned already at the start of the block,
                //  we need to Move further inside the block)
                int skipBy = _marked_offset - _current_offset;
                _buffer.Position = (_buffer.Position + skipBy);
            }

            // All done
            _current_offset = _marked_offset;
        }
        /**
         * Create an InputStream from the specified Document
         *
         * @param document the Document to be read
         */

        public NDocumentInputStream(NPOIFSDocument document)
        {
            _current_offset      = 0;
            _current_block_count = 0;
            _marked_offset       = 0;
            _marked_offset_count = 0;
            _document_size       = document.Size;
            _closed   = false;
            _document = document;
            _data     = _document.GetBlockIterator();
        }
        /**
         * Create an InputStream from the specified DocumentEntry
         *
         * @param document the DocumentEntry to be read
         *
         * @exception IOException if the DocumentEntry cannot be opened (like, maybe it has
         *                been deleted?)
         */

        public NDocumentInputStream(DocumentEntry document)
        {
            if (!(document is DocumentNode))
            {
                throw new IOException("Cannot open internal document storage, " + document + " not a Document Node");
            }
            _current_offset      = 0;
            _current_block_count = 0;
            _marked_offset       = 0;
            _marked_offset_count = 0;
            _document_size       = document.Size;
            _closed = false;

            DocumentNode     doc      = (DocumentNode)document;
            DocumentProperty property = (DocumentProperty)doc.Property;

            _document = new NPOIFSDocument(
                property,
                ((DirectoryNode)doc.Parent).NFileSystem
                );
            _data = _document.GetBlockIterator();
        }