示例#1
0
        public NPOIFSDocument(String name, int size, NPOIFSFileSystem filesystem, POIFSWriterListener Writer)
        {
            this._filesystem = filesystem;

            if (size < POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE)
            {
                _stream     = new NPOIFSStream(filesystem.GetMiniStore());
                _block_size = _filesystem.GetMiniStore().GetBlockStoreBlockSize();
            }
            else
            {
                _stream     = new NPOIFSStream(filesystem);
                _block_size = _filesystem.GetBlockStoreBlockSize();
            }

            Stream innerOs            = _stream.GetOutputStream();
            DocumentOutputStream os   = new DocumentOutputStream(innerOs, size);
            POIFSDocumentPath    path = new POIFSDocumentPath(name.Split(new string[] { "\\\\" }, StringSplitOptions.RemoveEmptyEntries));
            String           docName  = path.GetComponent(path.Length - 1);
            POIFSWriterEvent event1   = new POIFSWriterEvent(os, path, docName, size);

            Writer.ProcessPOIFSWriterEvent(event1);
            innerOs.Close();

            // And build the property for it
            this._property       = new DocumentProperty(name, size);
            _property.StartBlock = (/*setter*/ _stream.GetStartBlock());
        }
示例#2
0
 protected internal StreamBlockByteBuffer(NPOIFSStream pStream)
 {
     this.pStream = pStream;
     loopDetector = pStream.blockStore.GetChainLoopDetector();
     prevBlock    = POIFSConstants.END_OF_CHAIN;
     nextBlock    = pStream.startBlock;
 }
示例#3
0
        /**
         * Has our in-memory objects write their state
         *  to their backing blocks
         */
        private void syncWithDataSource()
        {
            // Properties
            NPOIFSStream propStream = new NPOIFSStream(this, _header.PropertyStart);

            _property_table.PreWrite();
            _property_table.Write(propStream);
            // _header.setPropertyStart has been updated on write ...
            // HeaderBlock
            HeaderBlockWriter hbw = new HeaderBlockWriter(_header);

            hbw.WriteBlock(GetBlockAt(-1));

            // BATs
            foreach (BATBlock bat in _bat_blocks)
            {
                ByteBuffer block = GetBlockAt(bat.OurBlockIndex);
                //byte[] block = GetBlockAt(bat.OurBlockIndex);
                BlockAllocationTableWriter.WriteBlock(bat, block);
            }
            // XBats
            foreach (BATBlock bat in _xbat_blocks)
            {
                ByteBuffer block = GetBlockAt(bat.OurBlockIndex);
                BlockAllocationTableWriter.WriteBlock(bat, block);
            }
            // SBATs
            _mini_store.SyncWithDataSource();
        }
示例#4
0
        public NPOIFSMiniStore(NPOIFSFileSystem filesystem, RootProperty root,
                               List <BATBlock> sbats, HeaderBlock header)
        {
            this._filesystem  = filesystem;
            this._sbat_blocks = sbats;
            this._header      = header;
            this._root        = root;

            this._mini_stream = new NPOIFSStream(filesystem, root.StartBlock);
        }
示例#5
0
        /**
         * Load the block, extending the underlying stream if needed
         */
        public override ByteBuffer CreateBlockIfNeeded(int offset)
        {
            bool firstInStore = false;

            // If we are the first block to be allocated, initialise the stream
            if (_mini_stream.GetStartBlock() == POIFSConstants.END_OF_CHAIN)
            {
                firstInStore = true;
            }

            // Try to Get it without extending the stream
            if (!firstInStore)
            {
                try
                {
                    return(GetBlockAt(offset));
                }catch (IndexOutOfRangeException) {}
            }

            // Need to extend the stream
            // TODO Replace this with proper append support
            // For now, do the extending by hand...

            // Ask for another block
            int newBigBlock = _filesystem.GetFreeBlock();

            _filesystem.CreateBlockIfNeeded(newBigBlock);
            // If we are the first block to be allocated, initialise the stream
            if (firstInStore)
            {
                _filesystem.PropertyTable.Root.StartBlock = (newBigBlock);
                _mini_stream = new NPOIFSStream(_filesystem, newBigBlock);
            }
            else
            {
                // Tack it onto the end of our chain
                ChainLoopDetector loopDetector = _filesystem.GetChainLoopDetector();
                int block = _mini_stream.GetStartBlock();
                while (true)
                {
                    loopDetector.Claim(block);
                    int next = _filesystem.GetNextBlock(block);
                    if (next == POIFSConstants.END_OF_CHAIN)
                    {
                        break;
                    }
                    block = next;
                }
                _filesystem.SetNextBlock(block, newBigBlock);
            }
            _filesystem.SetNextBlock(newBigBlock, POIFSConstants.END_OF_CHAIN);

            // Now try again, to get the real small block
            return(CreateBlockIfNeeded(offset));
        }
示例#6
0
            public override void Close()
            {
                // If we're overwriting, free any remaining blocks
                NPOIFSStream toFree = new NPOIFSStream(pStream.blockStore, nextBlock);

                toFree.Free(loopDetector);

                // Mark the end of the stream
                pStream.blockStore.SetNextBlock(prevBlock, POIFSConstants.END_OF_CHAIN);

                base.Close();
            }
示例#7
0
 public StreamBlockByteBufferIterator(NPOIFSStream pStream, int firstBlock)
 {
     this.pStream   = pStream;
     this.nextBlock = firstBlock;
     try
     {
         this.loopDetector = pStream.blockStore.GetChainLoopDetector();
     }
     catch (IOException e)
     {
         //throw new System.RuntimeException(e);
         throw new Exception(e.Message);
     }
 }
示例#8
0
        /**
         * Constructor for an existing Document
         */
        public NPOIFSDocument(DocumentProperty property, NPOIFSFileSystem filesystem)
        {
            this._property   = property;
            this._filesystem = filesystem;

            if (property.Size < POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE)
            {
                _stream     = new NPOIFSStream(_filesystem.GetMiniStore(), property.StartBlock);
                _block_size = _filesystem.GetMiniStore().GetBlockStoreBlockSize();
            }
            else
            {
                _stream     = new NPOIFSStream(_filesystem, property.StartBlock);
                _block_size = _filesystem.GetBlockStoreBlockSize();
            }
        }
        public override void Write(byte[] b, int off, int len)
        {
            dieIfClosed();

            if (_buffer != null)
            {
                _buffer.Write(b, off, len);
                CheckBufferSize();
            }
            else
            {
                if (_stream == null)
                {
                    _stream        = new NPOIFSStream(_document.FileSystem);
                    _stream_output = _stream.GetOutputStream();
                }
                _stream_output.Write(b, off, len);
                _document_size += len;
            }
        }
示例#10
0
        private int Store(Stream inStream)
        {
            int bigBlockSize = POIFSConstants.BIG_BLOCK_MINIMUM_DOCUMENT_SIZE;

            //BufferedStream bis = new BufferedStream(stream, bigBlockSize + 1);
            //bis.mark(bigBlockSize);

            //// Buffer the contents into memory. This is a bit icky...
            //// TODO Replace with a buffer up to the mini stream size, then streaming write
            //byte[] contents;
            //if (stream is MemoryStream)
            //{
            //    MemoryStream bais = (MemoryStream)stream;
            //    contents = new byte[bais.Length];
            //    bais.Read(contents, 0, contents.Length);
            //}
            //else
            //{
            //    MemoryStream baos = new MemoryStream();
            //    IOUtils.Copy(stream, baos);
            //    contents = baos.ToArray();
            //}

            // Do we need to store as a mini stream or a full one?
            if (inStream.Length < bigBlockSize)
            {
                _stream     = new NPOIFSStream(_filesystem.GetMiniStore());
                _block_size = _filesystem.GetMiniStore().GetBlockStoreBlockSize();
            }
            else
            {
                _stream     = new NPOIFSStream(_filesystem);
                _block_size = _filesystem.GetBlockStoreBlockSize();
            }

            // start from the beginning
            //bis.Seek(0, SeekOrigin.Begin);

            // Store it
            Stream outStream = _stream.GetOutputStream();

            byte[] buf    = new byte[1024];
            int    length = 0;

            //for (int readBytes; (readBytes = bis.Read(buf, 0, buf.Length)) != 0; length += readBytes)
            //{
            //    outStream.Write(buf, 0, readBytes);
            //}

            for (int readBytes = 0; ;)
            {
                readBytes = inStream.Read(buf, 0, buf.Length);
                if (readBytes <= 0)
                {
                    break;
                }
                length += readBytes;
                outStream.Write(buf, 0, readBytes);
            }
            outStream.Close();
            return(length);
        }