コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }