File: MS\Internal\Documents\Application\StreamHelper.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\src\PresentationUI\PresentationUI_r5prqfe0_wpftmp.csproj (PresentationUI)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
// Description: A static utilitly class for stream related functions.
 
using System;
using System.IO;
 
namespace MS.Internal.Documents.Application
{
/// <summary>
/// A static utilitly class for stream related functions.
/// </summary>
internal static class StreamHelper
{
    #region Internal Methods
    //--------------------------------------------------------------------------
    // Internal Methods
    //--------------------------------------------------------------------------
 
    /// <summary>
    /// A simple stream copy from one to another.
    /// </summary>
    /// <remarks>
    /// If anyone knows of an existing mechanism please contact me and
    /// I will remove this code.
    /// 
    /// Performance:  This block of code is likely to be the most heavily used
    /// code with large packages.  We should explorer other designs if it
    /// becomes an issue.
    /// </remarks>
    /// <param name="source">The Stream to read from.</param>
    /// <param name="comparee">The Stream to write to.</param>
    internal static void CopyStream(Stream source, Stream target)
    {
        int bufferSize = 4096; // Arbitrary Value
        byte[] buffer = new byte[bufferSize];
 
        long originalSourcePosition = source.Position;
        long originalTargetPosition = target.Position;
 
        // move to the start
        source.Position = 0;
        target.Position = 0;
 
        // ensure we have enough space
        long size = source.Length;
        target.SetLength(size);
 
        // copy the stream syncronously
        int read = 0;
        long leftToCopy = size;
        while (leftToCopy > 0)
        {
            if (leftToCopy < bufferSize)
            {
                bufferSize = (int)leftToCopy;
                buffer = new byte[bufferSize];
            }
            read = source.Read(buffer, 0, bufferSize);
            target.Write(buffer, 0, read);
            leftToCopy -= read;
        }
 
        // return the streams to thier orignal locations
        source.Position = originalSourcePosition;
        target.Position = originalTargetPosition;
 
        Trace.SafeWrite(Trace.File, "Copied: {0} bytes.", target.Length);
    }
 
#if DRT
    /// <summary>
    /// Compares two streams byte by byte.
    /// </summary>
    /// <param name="original">The original stream</param>
    /// <param name="comparee">The stream to compare with.</param>
    internal static void CompareStream(Stream original, Stream comparee)
    {
        original.Position = 0;
        comparee.Position = 0;
        int data = 0;
        int pos = 0;
        while (data != -1)
        {
            data = original.ReadByte();
            pos++;
            Invariant.Assert(data == comparee.ReadByte(),
                "Data mismatch at postion " + pos);
        }
        if (pos - 1 == comparee.Length)
        {
            Trace.SafeWrite(Trace.File, "Validate: {0} bytes.", comparee.Length);
        }
    }
#endif
    #endregion Internal Methods
}
}