|
//-----------------------------------------------------------------------------
//
// <copyright file="CompressionTransform.cs" company="Microsoft">
// Copyright (C) Microsoft Corporation. All rights reserved.
// </copyright>
//
// Description:
// This class implements IDataTransform for the Compression transform.
//
// History:
// 06/04/2002: BruceMac: Initial implementation.
// 05/29/2003: LGolding: Ported to WCP tree.
// 05/17/2005: BruceMac: Port to Office-compatible block-based format
// 05/30/2005: BruceMac: Moved to System.IO.Packaging namespace
// 12/14/2005: BruceMac: Moved to MS.Internal.IO.Packaging.CompoundFile namespace
//
//-----------------------------------------------------------------------------
using System;
using System.Collections; // for IDictionary
using System.IO; // for Stream
using System.IO.Packaging;
using System.Globalization; // for CultureInfo
using System.Windows; // ExceptionStringTable
using MS.Internal.IO.Packaging; // CompoundFileEmulationStream
using MS.Internal.IO.Packaging.CompoundFile;
//using System.Windows;
namespace MS.Internal.IO.Packaging.CompoundFile
{
/// <summary>
/// CompressionTransform for use in Compound File DataSpaces
/// </summary>
internal class CompressionTransform : IDataTransform
{
#region IDataTransform
/// <summary>
/// Transform readiness
/// </summary>
public bool IsReady
{
get
{
return true;
}
}
/// <summary>
/// No configuration parameters for this transform
/// </summary>
public bool FixedSettings
{
get
{
return true;
}
}
/// <summary>
/// Returns the type name identifier string.
/// </summary>
public object TransformIdentifier
{
get
{
return CompressionTransform.ClassTransformIdentifier;
}
}
/// <summary>
/// Expose the transform identifier for the use of the DataSpaceManager.
/// </summary>
internal static string ClassTransformIdentifier
{
get
{
return "{86DE7F2B-DDCE-486d-B016-405BBE82B8BC}";
}
}
//------------------------------------------------------
//
// Public Methods
//
//------------------------------------------------------
/// <summary>
/// Given output stream returns stream for encoding/decoding
/// </summary>
/// <param name="encodedStream">the encoded stream that this transform acts on</param>
/// <param name="transformContext">Dictionary object used to store any additional context information</param>
/// <returns>the stream that implements the transform</returns>
/// <remarks>
/// This method is used only by the DataSpaceManager, so we declare it as an explicit
/// interface implementation to hide it from the public interface.
/// </remarks>
Stream
IDataTransform.GetTransformedStream(
Stream encodedStream,
IDictionary transformContext
)
{
Stream tempStream = new SparseMemoryStream(_lowWaterMark, _highWaterMark);
tempStream = new CompressEmulationStream(encodedStream, tempStream, 0, new CompoundFileDeflateTransform());
// return a VersionedStream that works with the VersionedStreamOwner
// to verify/update our FormatVersion info
return new VersionedStream(tempStream, _versionedStreamOwner);
}
#endregion
/// <summary>
/// constructor
/// </summary>
/// <param name="myEnvironment">environment</param>
/// <remarks>this should only be used by the DataSpaceManager class</remarks>
public CompressionTransform(TransformEnvironment myEnvironment)
{
_transformEnvironment = myEnvironment;
// Create a wrapper that manages persistence and comparison of FormatVersion
// in our InstanceData stream. We can read/write to this stream as needed (though CompressionTransform
// does not because we don't house any non-FormatVersion data in the instance data stream).
// We need to give out our current code version so it can compare with any file version as appropriate.
_versionedStreamOwner = new VersionedStreamOwner(
_transformEnvironment.GetPrimaryInstanceData(),
new FormatVersion(_featureName, _minimumReaderVersion, _minimumUpdaterVersion, _currentFeatureVersion));
}
//------------------------------------------------------
//
// Private Data
//
//------------------------------------------------------
private TransformEnvironment _transformEnvironment;
private VersionedStreamOwner _versionedStreamOwner; // our instance data stream wrapped
private static readonly string _featureName = "Microsoft.Metadata.CompressionTransform";
private static readonly VersionPair _currentFeatureVersion = new VersionPair(1, 0);
private static readonly VersionPair _minimumReaderVersion = new VersionPair(1, 0);
private static readonly VersionPair _minimumUpdaterVersion = new VersionPair(1, 0);
private const long _lowWaterMark = 0x19000; // we definitely would like to keep everything under 100 KB in memory
private const long _highWaterMark = 0xA00000; // we would like to keep everything over 10 MB on disk
}
}
|