/// <summary> /// Creates a provider for a stream of the specified size beginning at its current position. /// </summary> /// <param name="stream">Stream.</param> /// <param name="size">Size of the metadata blob in the stream. If not specified the metadata blob is assumed to span to the end of the stream.</param> /// <param name="options"> /// Options specifying how sections of the image are read from the stream. /// /// Unless <see cref="MetadataStreamOptions.LeaveOpen"/> is specified, ownership of the stream is transferred to the <see cref="MetadataReaderProvider"/> /// upon successful argument validation. It will be disposed by the <see cref="MetadataReaderProvider"/> and the caller must not manipulate it. /// /// Unless <see cref="MetadataStreamOptions.PrefetchMetadata"/> is specified no data /// is read from the stream during the construction of the <see cref="MetadataReaderProvider"/>. Furthermore, the stream must not be manipulated /// by caller while the <see cref="MetadataReaderProvider"/> is alive and undisposed. /// /// If <see cref="MetadataStreamOptions.PrefetchMetadata"/>, the <see cref="MetadataReaderProvider"/> /// will have read all of the data requested during construction. As such, if <see cref="MetadataStreamOptions.LeaveOpen"/> is also /// specified, the caller retains full ownership of the stream and is assured that it will not be manipulated by the <see cref="MetadataReaderProvider"/> /// after construction. /// </param> /// <exception cref="ArgumentNullException"><paramref name="stream"/> is null.</exception> /// <exception cref="ArgumentException"><paramref name="stream"/> doesn't support read and seek operations.</exception> /// <exception cref="ArgumentOutOfRangeException">Size is negative or extends past the end of the stream.</exception> /// <exception cref="IOException">Error reading from the stream (only when <see cref="MetadataStreamOptions.PrefetchMetadata"/> is specified).</exception> public static MetadataReaderProvider FromMetadataStream(Stream stream, MetadataStreamOptions options = MetadataStreamOptions.Default, int size = 0) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (!stream.CanRead || !stream.CanSeek) { throw new ArgumentException(SR.StreamMustSupportReadAndSeek, nameof(stream)); } if (!options.IsValid()) { throw new ArgumentOutOfRangeException(nameof(options)); } long start = stream.Position; int actualSize = StreamExtensions.GetAndValidateSize(stream, size, nameof(stream)); MetadataReaderProvider result; bool closeStream = true; try { bool isFileStream = FileStreamReadLightUp.IsFileStream(stream); if ((options & MetadataStreamOptions.PrefetchMetadata) == 0) { result = new MetadataReaderProvider(new StreamMemoryBlockProvider(stream, start, actualSize, isFileStream, (options & MetadataStreamOptions.LeaveOpen) != 0)); closeStream = false; } else { // Read in the entire image or metadata blob: result = new MetadataReaderProvider(StreamMemoryBlockProvider.ReadMemoryBlockNoLock(stream, isFileStream, start, actualSize)); // We read all we need, the stream is going to be closed. } } finally { if (closeStream && (options & MetadataStreamOptions.LeaveOpen) == 0) { stream.Dispose(); } } return(result); }
/// <summary> /// Creates a provider for a stream of the specified size beginning at its current position. /// </summary> /// <param name="stream">Stream.</param> /// <param name="size">Size of the metadata blob in the stream. If not specified the metadata blob is assumed to span to the end of the stream.</param> /// <param name="options"> /// Options specifying how sections of the image are read from the stream. /// /// Unless <see cref="MetadataStreamOptions.LeaveOpen"/> is specified, ownership of the stream is transferred to the <see cref="MetadataReaderProvider"/> /// upon successful argument validation. It will be disposed by the <see cref="MetadataReaderProvider"/> and the caller must not manipulate it. /// /// Unless <see cref="MetadataStreamOptions.PrefetchMetadata"/> is specified no data /// is read from the stream during the construction of the <see cref="MetadataReaderProvider"/>. Furthermore, the stream must not be manipulated /// by caller while the <see cref="MetadataReaderProvider"/> is alive and undisposed. /// /// If <see cref="MetadataStreamOptions.PrefetchMetadata"/>, the <see cref="MetadataReaderProvider"/> /// will have read all of the data requested during construction. As such, if <see cref="MetadataStreamOptions.LeaveOpen"/> is also /// specified, the caller retains full ownership of the stream and is assured that it will not be manipulated by the <see cref="MetadataReaderProvider"/> /// after construction. /// </param> /// <exception cref="ArgumentNullException"><paramref name="stream"/> is null.</exception> /// <exception cref="ArgumentException"><paramref name="stream"/> doesn't support read and seek operations.</exception> /// <exception cref="ArgumentOutOfRangeException">Size is negative or extends past the end of the stream.</exception> public static MetadataReaderProvider FromPortablePdbStream(Stream stream, MetadataStreamOptions options = MetadataStreamOptions.Default, int size = 0) => FromMetadataStream(stream, options, size);
/// <summary> /// Creates a provider for a stream of the specified size beginning at its current position. /// </summary> /// <param name="stream">Stream.</param> /// <param name="size">Size of the metadata blob in the stream. If not specified the metadata blob is assumed to span to the end of the stream.</param> /// <param name="options"> /// Options specifying how sections of the image are read from the stream. /// /// Unless <see cref="MetadataStreamOptions.LeaveOpen"/> is specified, ownership of the stream is transferred to the <see cref="MetadataReaderProvider"/> /// upon successful argument validation. It will be disposed by the <see cref="MetadataReaderProvider"/> and the caller must not manipulate it. /// /// Unless <see cref="MetadataStreamOptions.PrefetchMetadata"/> is specified no data /// is read from the stream during the construction of the <see cref="MetadataReaderProvider"/>. Furthermore, the stream must not be manipulated /// by caller while the <see cref="MetadataReaderProvider"/> is alive and undisposed. /// /// If <see cref="MetadataStreamOptions.PrefetchMetadata"/>, the <see cref="MetadataReaderProvider"/> /// will have read all of the data requested during construction. As such, if <see cref="MetadataStreamOptions.LeaveOpen"/> is also /// specified, the caller retains full ownership of the stream and is assured that it will not be manipulated by the <see cref="MetadataReaderProvider"/> /// after construction. /// </param> /// <exception cref="ArgumentNullException"><paramref name="stream"/> is null.</exception> /// <exception cref="ArgumentException"><paramref name="stream"/> doesn't support read and seek operations.</exception> /// <exception cref="ArgumentOutOfRangeException">Size is negative or extends past the end of the stream.</exception> /// <exception cref="IOException">Error reading from the stream (only when <see cref="MetadataStreamOptions.PrefetchMetadata"/> is specified).</exception> public static MetadataReaderProvider FromMetadataStream(Stream stream, MetadataStreamOptions options = MetadataStreamOptions.Default, int size = 0) { if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (!stream.CanRead || !stream.CanSeek) { throw new ArgumentException(SR.StreamMustSupportReadAndSeek, nameof(stream)); } if (!options.IsValid()) { throw new ArgumentOutOfRangeException(nameof(options)); } long start = stream.Position; int actualSize = StreamExtensions.GetAndValidateSize(stream, size, nameof(stream)); MetadataReaderProvider result; bool closeStream = true; try { bool isFileStream = FileStreamReadLightUp.IsFileStream(stream); if ((options & MetadataStreamOptions.PrefetchMetadata) == 0) { result = new MetadataReaderProvider(new StreamMemoryBlockProvider(stream, start, actualSize, isFileStream, (options & MetadataStreamOptions.LeaveOpen) != 0)); closeStream = false; } else { // Read in the entire image or metadata blob: result = new MetadataReaderProvider(StreamMemoryBlockProvider.ReadMemoryBlockNoLock(stream, isFileStream, start, actualSize)); // We read all we need, the stream is going to be closed. } } finally { if (closeStream && (options & MetadataStreamOptions.LeaveOpen) == 0) { stream.Dispose(); } } return result; }
public static bool IsValid(this MetadataStreamOptions options) { return((options & ~(MetadataStreamOptions.LeaveOpen | MetadataStreamOptions.PrefetchMetadata)) == 0); }