Esempio n. 1
0
        /// <summary>
        /// Read from an InputStream and Process the documents we Get
        /// </summary>
        /// <param name="stream">the InputStream from which to Read the data</param>
        /// <returns>POIFSDocument list</returns>
        public List <DocumentDescriptor> Read(Stream stream)
        {
            // Read the header block from the stream
            HeaderBlockReader header_block_Reader = new HeaderBlockReader(stream);

            // Read the rest of the stream into blocks
            RawDataBlockList data_blocks = new RawDataBlockList(stream, header_block_Reader.BigBlockSize);

            // Set up the block allocation table (necessary for the
            // data_blocks to be manageable
            new BlockAllocationTableReader(header_block_Reader.BATCount,
                                           header_block_Reader.BATArray,
                                           header_block_Reader.XBATCount,
                                           header_block_Reader.XBATIndex,
                                           data_blocks);

            // Get property table from the document
            PropertyTable properties =
                new PropertyTable(header_block_Reader.PropertyStart,
                                  data_blocks);

            // Process documents
            return(ProcessProperties(SmallBlockTableReader
                                     .GetSmallDocumentBlocks(data_blocks, properties
                                                             .Root, header_block_Reader
                                                             .SBATStart), data_blocks, properties.Root
                                     .Children, new POIFSDocumentPath()));
        }
Esempio n. 2
0
        public void TestConstructors()
        {
            string[] hexData =
            {
                "D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 00",
                "06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF FF FF 00 00 00 00 00 10 00 00 FE FF FF FF",
                "01 00 00 00 FE FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
                "FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF",
            };

            byte[]            content = RawDataUtil.Decode(hexData);
            HeaderBlockReader block   = new HeaderBlockReader(new MemoryStream(content));

            Assert.AreEqual(-2, block.PropertyStart);

            // verify we can't Read a short block
            byte[] shortblock = new byte[511];

            Array.Copy(content, 0, shortblock, 0, 511);
            try
            {
                block = new HeaderBlockReader(new MemoryStream(shortblock));
                Assert.Fail("Should have caught IOException Reading a short block");
            }
            catch (IOException)
            {
                // as expected
            }

            // try various forms of corruption
            for (int index = 0; index < 8; index++)
            {
                content[index] = (byte)(content[index] - 1);
                try
                {
                    block = new HeaderBlockReader(new MemoryStream(content));
                    Assert.Fail("Should have caught IOException corrupting byte " + index);
                }
                catch (IOException)
                {
                    // as expected
                }

                // restore byte value
                content[index] = (byte)(content[index] + 1);
            }
        }
        /// <summary>
        /// Create a POIFSFileSystem from an Stream. Normally the stream is Read until
        /// EOF.  The stream is always Closed.  In the unlikely case that the caller has such a stream and
        /// needs to use it after this constructor completes, a work around is to wrap the
        /// stream in order to trap the Close() call.
        /// </summary>
        /// <param name="stream">the Streamfrom which to Read the data</param>
        public POIFSFileSystem(Stream stream) : this()
        {
            bool success = false;

            HeaderBlockReader header_block_reader;
            RawDataBlockList  data_blocks;

            try {
                // Read the header block from the stream
                header_block_reader = new HeaderBlockReader(stream);
                bigBlockSize        = header_block_reader.BigBlockSize;

                // Read the rest of the stream into blocks
                data_blocks = new RawDataBlockList(stream, bigBlockSize);
                success     = true;
            } finally {
                CloseInputStream(stream, success);
            }


            // Set up the block allocation table (necessary for the
            // data_blocks to be manageable
            new BlockAllocationTableReader(header_block_reader.BATCount,
                                           header_block_reader.BATArray,
                                           header_block_reader.XBATCount,
                                           header_block_reader.XBATIndex,
                                           data_blocks);

            // Get property table from the document
            PropertyTable properties =
                new PropertyTable(header_block_reader.PropertyStart, data_blocks);

            // init documents
            ProcessProperties(SmallBlockTableReader.GetSmallDocumentBlocks(data_blocks, properties
                                                                           .Root, header_block_reader.SBATStart), data_blocks, properties.Root
                              .Children, null, header_block_reader.PropertyStart);
        }
Esempio n. 4
0
        public void TestConstructors()
        {
            byte[] content =
            {
                ( byte )0xD0, ( byte )0xCF, ( byte )0x11, ( byte )0xE0,
                ( byte )0xA1, ( byte )0xB1, ( byte )0x1A, ( byte )0xE1,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0x3B, ( byte )0x00, ( byte )0x03, ( byte )0x00,
                ( byte )0xFE, ( byte )0xFF, ( byte )0x09, ( byte )0x00,
                ( byte )0x06, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0xFE, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0x00, ( byte )0x10, ( byte )0x00, ( byte )0x00,
                ( byte )0xFE, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0x01, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0xFE, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0x00, ( byte )0x00, ( byte )0x00, ( byte )0x00,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF,
                ( byte )0xFF, ( byte )0xFF, ( byte )0xFF, ( byte )0xFF
            };
            HeaderBlockReader block =
                new HeaderBlockReader(new MemoryStream(content));

            Assert.AreEqual(-2, block.PropertyStart);

            // verify we can't Read a short block
            byte[] shortblock = new byte[511];

            Array.Copy(content, 0, shortblock, 0, 511);
            try
            {
                block =
                    new HeaderBlockReader(new MemoryStream(shortblock));
                Assert.Fail("Should have caught IOException Reading a short block");
            }
            catch (IOException)
            {
                // as expected
            }

            // try various forms of corruption
            for (int index = 0; index < 8; index++)
            {
                content[index] = (byte)(content[index] - 1);
                try
                {
                    block =
                        new HeaderBlockReader(new MemoryStream(content));
                    Assert.Fail("Should have caught IOException corrupting byte "
                                + index);
                }
                catch (IOException)
                {
                    // as expected
                }

                // restore byte value
                content[index] = (byte)(content[index] + 1);
            }
        }