/// <summary> /// Initializes a new instance of the <see cref="SmallBlockTableWriter"/> class. /// </summary> /// <param name="bigBlockSize">the poifs bigBlockSize</param> /// <param name="documents">a IList of POIFSDocument instances</param> /// <param name="root">the Filesystem's root property</param> public SmallBlockTableWriter(POIFSBigBlockSize bigBlockSize, IList documents, RootProperty root) { _sbat = new BlockAllocationTableWriter(bigBlockSize); _small_blocks = new ArrayList(); _root = root; IEnumerator iter = documents.GetEnumerator(); while (iter.MoveNext()) { POIFSDocument doc = ( POIFSDocument ) iter.Current; BlockWritable[] blocks = doc.SmallBlocks; if (blocks.Length != 0) { doc.StartBlock=_sbat.AllocateSpace(blocks.Length); for (int j = 0; j < blocks.Length; j++) { _small_blocks.Add(blocks[ j ]); } } else { doc.StartBlock=POIFSConstants.END_OF_CHAIN; } } _sbat.SimpleCreateBlocks(); _root.Size=_small_blocks.Count; _big_block_count = SmallDocumentBlock.Fill(bigBlockSize, _small_blocks); }
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); }
/// <summary> /// fetch the small document block list from an existing file /// </summary> /// <param name="blockList">the raw data from which the small block table will be extracted</param> /// <param name="root">the root property (which contains the start block and small block table size)</param> /// <param name="sbatStart">the start block of the SBAT</param> /// <returns>the small document block list</returns> public static BlockList GetSmallDocumentBlocks(POIFSBigBlockSize bigBlockSize, RawDataBlockList blockList, RootProperty root, int sbatStart) { BlockList list = new SmallDocumentBlockList( SmallDocumentBlock.Extract(bigBlockSize, blockList.FetchBlocks(root.StartBlock, -1))); new BlockAllocationTableReader(bigBlockSize, blockList.FetchBlocks(sbatStart, -1), list); return list; }
private void CreateBasicRootProperty() { _property = new RootProperty(); _testblock = new byte[128]; int index = 0; for (; index < 0x40; index++) { _testblock[index] = (byte)0; } String name = "Root Entry"; int limit = Math.Min(31, name.Length); _testblock[index++] = (byte)(2 * (limit + 1)); _testblock[index++] = (byte)0; _testblock[index++] = (byte)5; _testblock[index++] = (byte)1; for (; index < 0x50; index++) { _testblock[index] = (byte)0xff; } for (; index < 0x74; index++) { _testblock[index] = (byte)0; } _testblock[index++] = unchecked((byte)POIFSConstants.END_OF_CHAIN); for (; index < 0x78; index++) { _testblock[index] = (byte)0xff; } for (; index < 0x80; index++) { _testblock[index] = (byte)0; } byte[] name_bytes = System.Text.Encoding.UTF8.GetBytes(name); for (index = 0; index < limit; index++) { _testblock[index * 2] = name_bytes[index]; } }
private void VerifyReadingProperty(int index, byte[] input, int offset, String name, String sClsId) { RootProperty property = new RootProperty(index, input, offset); MemoryStream stream = new MemoryStream(128); byte[] expected = new byte[128]; Array.Copy(input, offset, expected, 0, 128); property.WriteData(stream); byte[] output = stream.ToArray(); Assert.AreEqual(128, output.Length); for (int j = 0; j < 128; j++) { Assert.AreEqual(expected[j], output[j], "mismatch at offset " + j); } Assert.AreEqual(index, property.Index); Assert.AreEqual(name, property.Name); Assert.IsTrue(!property.Children.MoveNext()); Assert.AreEqual(property.StorageClsid.ToString(), sClsId); }