/// <summary> /// Wraps this message part's original data stream in another stream returned by the <paramref name="wrapper"/> /// delegate. /// </summary> /// <param name="messagePart"> /// The part whose original data stream is wrapped. /// </param> /// <param name="wrapper"> /// A delegate, or stream factory, that returns the stream wrapping the original one. /// </param> /// <param name="tracker"> /// Pipeline's resource tracker to which to report the newly created wrapping stream. /// </param> /// <returns> /// The new wrapping <see cref="Stream"/> if it is not the same instance as the original one. The original <see /// cref="Stream"/> otherwise. /// </returns> public static T WrapOriginalDataStream <T>(this IBaseMessagePart messagePart, Func <Stream, T> wrapper, IResourceTracker tracker) where T : Stream { // TODO ?consider providing an overload when there is no IResourceTracker as this is necessary only for unmanaged objects/resources? if (messagePart == null) { throw new ArgumentNullException("messagePart"); } if (wrapper == null) { throw new ArgumentNullException("wrapper"); } if (tracker == null) { throw new ArgumentNullException("tracker"); } var originalDataStream = messagePart.GetOriginalDataStream(); if (originalDataStream == null) { return(null); } var wrappingStream = wrapper(originalDataStream); if (ReferenceEquals(originalDataStream, wrappingStream)) { return((T)originalDataStream); } if (_logger.IsDebugEnabled) { _logger.DebugFormat("Wrapping message part's original data stream in a '{0}' stream.", wrappingStream.GetType().FullName); } messagePart.SetDataStream(wrappingStream, tracker); return(wrappingStream); }
/// <summary> /// Wraps this message part's original data stream in another stream returned by the <paramref name="wrapper"/> /// delegate. /// </summary> /// <param name="messagePart"> /// The part whose original data stream is wrapped. /// </param> /// <param name="wrapper"> /// A delegate, or stream factory, that returns the stream wrapping the original one. /// </param> /// <param name="tracker"> /// Pipeline's resource tracker to which to report the newly created wrapping stream. /// </param> /// <returns> /// The new wrapping <see cref="Stream"/> if it is not the same instance as the original one. The original <see /// cref="Stream"/> otherwise. /// </returns> public static T WrapOriginalDataStream <T>(this IBaseMessagePart messagePart, Func <Stream, T> wrapper, IResourceTracker tracker) where T : Stream { if (messagePart == null) { throw new ArgumentNullException(nameof(messagePart)); } if (wrapper == null) { throw new ArgumentNullException(nameof(wrapper)); } if (tracker == null) { throw new ArgumentNullException(nameof(tracker)); } var originalDataStream = messagePart.GetOriginalDataStream(); if (originalDataStream == null) { return(null); } var wrappingStream = wrapper(originalDataStream); if (ReferenceEquals(originalDataStream, wrappingStream)) { return((T)originalDataStream); } if (_logger.IsDebugEnabled) { _logger.DebugFormat("Wrapping message part's original data stream in a '{0}' stream.", wrappingStream.GetType().FullName); } messagePart.SetDataStream(wrappingStream, tracker); return(wrappingStream); }