/// <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())); }
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); }
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); } }