private static List<Property> BuildProperties(IEnumerator<ByteBuffer> dataSource, POIFSBigBlockSize bigBlockSize) { List<Property> properties = new List<Property>(); while(dataSource.MoveNext()) { ByteBuffer bb = dataSource.Current; // Turn it into an array byte[] data; if (bb.HasBuffer && bb.Offset == 0 && bb.Buffer.Length == bigBlockSize.GetBigBlockSize()) { data = bb.Buffer; } else { data = new byte[bigBlockSize.GetBigBlockSize()]; int toRead = data.Length; if (bb.Remaining() < bigBlockSize.GetBigBlockSize()) { // Looks to be a truncated block // This isn't allowed, but some third party created files // sometimes do this, and we can normally read anyway toRead = bb.Remaining(); } bb.Read(data, 0, toRead); } PropertyFactory.ConvertToProperties(data, properties); } return properties; }
/// <summary> /// Initializes a new instance of the <see cref="RawDataBlockList"/> class. /// </summary> /// <param name="stream">the InputStream from which the data will be read</param> /// <param name="bigBlockSize">The big block size, either 512 bytes or 4096 bytes</param> public RawDataBlockList(Stream stream, POIFSBigBlockSize bigBlockSize) { List<RawDataBlock> blocks = new List<RawDataBlock>(); while (true) { RawDataBlock block = new RawDataBlock(stream, bigBlockSize.GetBigBlockSize()); // If there was data, add the block to the list if(block.HasData) { blocks.Add(block); } // If the stream is now at the End Of File, we're done if (block.EOF) { break; } } SetBlocks((ListManagedBlock[])blocks.ToArray()); }
/** * Calculates the maximum size of a file which is addressable given the * number of FAT (BAT) sectors specified. (We don't care if those BAT * blocks come from the 109 in the header, or from header + XBATS, it * won't affect the calculation) * * The actual file size will be between [size of fatCount-1 blocks] and * [size of fatCount blocks]. * For 512 byte block sizes, this means we may over-estimate by up to 65kb. * For 4096 byte block sizes, this means we may over-estimate by up to 4mb */ public static long CalculateMaximumSize(POIFSBigBlockSize bigBlockSize, int numBATs) { long size = 1; // Header isn't FAT addressed // The header has up to 109 BATs, and extra ones are referenced // from XBATs // However, all BATs can contain 128/1024 blocks size += (numBATs * bigBlockSize.GetBATEntriesPerBlock()); // So far we've been in sector counts, turn into bytes return size * bigBlockSize.GetBigBlockSize(); }
private static int GetBlocksPerBigBlock(POIFSBigBlockSize bigBlockSize) { return bigBlockSize.GetBigBlockSize()/_block_size; }