Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / MS / Internal / IO / Packaging / PreloadedPackages.cs / 1305600 / PreloadedPackages.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation, 2005
//
// File: PreloadedPackages.cs
//
// Description: Collection of preloaded packages to be used with
// PackWebRequest.
//
//-----------------------------------------------------------------------------
using System;
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Packaging;
using MS.Internal;
using MS.Internal.PresentationCore; // for ExceptionStringTable
namespace MS.Internal.IO.Packaging
{
///
/// PreloadedPackages
///
/// Note: we purposely didn't make this class a dictionary since it is an internal
/// class and we won't be using even half of the dictionary functionalities.
/// If this class becomes a public class which is strongly discouraged, this class
/// needs to implement IDictionary.
//
// Critical: This class serves as a depository of all well-known pre-populated
// packages. This class is marked as SecurityCritical to ensure that
// 1. only trusted code can add/get/remove trusted packages into the depository
// 2. a whole package will never be given out to the platform client
// Note: it is OK to give out a part stream from a package instance but
// the package related objects such as Package, PackagePart,
// PackageRelationship should NEVER be given out to a client.
// List of the trusted packages allowed:
// 1. ResourceContainer
// 2. SiteOfOriginContainer
// 3. ZipPackage that is only instantiated by XPS Viewer
//
[SecurityCritical(SecurityCriticalScope.Everything)]
[FriendAccessAllowed]
internal static class PreloadedPackages
{
//-----------------------------------------------------
//
// Static Constructors
//
//-----------------------------------------------------
static PreloadedPackages()
{
_globalLock = new Object();
}
//------------------------------------------------------
//
// Internal Methods
//
//-----------------------------------------------------
#region Internal Methods
///
/// GetPackage given a uri
///
/// uri to match on
/// object if found - else null
/// uri must be absolute
internal static Package GetPackage(Uri uri)
{
bool ignored;
return GetPackage(uri, out ignored);
}
///
/// GetPackage given a uri
///
/// uri to match on
/// true if the returned package is threadsafe - undefined if null is returned
/// object if found - else null
/// uri must be absolute
internal static Package GetPackage(Uri uri, out bool threadSafe)
{
ValidateUriKey(uri);
lock (_globalLock)
{
Package package = null;
threadSafe = false;
if (_packagePairs != null)
{
PackageThreadSafePair packagePair = _packagePairs[uri] as PackageThreadSafePair;
if (packagePair != null)
{
package = packagePair.Package;
threadSafe = packagePair.ThreadSafe;
}
}
return package;
}
}
///
/// AddPackage - default to non-thread-safe
///
/// uri to use for matching
/// package object to serve content from
/// Adds a uri, content pair to the cache. If the uri is already
/// in the cache, this removes the old content and replaces it.
/// The object will not be subject to automatic removal from the cache
internal static void AddPackage(Uri uri, Package package)
{
AddPackage(uri, package, false);
}
///
/// AddPackage
///
/// uri to use for matching
/// package object to serve content from
/// is package thread-safe?
/// Adds a uri, content pair to the cache. If the uri is already
/// in the cache, this removes the old content and replaces it.
/// The object will not be subject to automatic removal from the cache
internal static void AddPackage(Uri uri, Package package, bool threadSafe)
{
ValidateUriKey(uri);
lock (_globalLock)
{
if (_packagePairs == null)
{
_packagePairs = new HybridDictionary(3);
}
_packagePairs.Add(uri, new PackageThreadSafePair(package, threadSafe));
}
}
///
/// RemovePackage
///
/// uri of the package that needs to be removed
/// Removes the package corresponding to the uri from the cache. If a matching uri isn't found
/// the status of the cache doesn't change and no exception is throwen
///
internal static void RemovePackage(Uri uri)
{
ValidateUriKey(uri);
lock (_globalLock)
{
if (_packagePairs != null)
{
_packagePairs.Remove(uri);
}
}
}
// Null the instance. Similar to Dispose, but not quite.
internal static void Clear()
{
lock (_globalLock)
{
_packagePairs = null;
}
}
private static void ValidateUriKey(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (!uri.IsAbsoluteUri)
{
throw new ArgumentException(SR.Get(SRID.UriMustBeAbsolute), "uri");
}
}
#endregion Internal Methods
///
/// Package-bool pair where the bool represents the thread-safety status of the package
///
private class PackageThreadSafePair
{
//------------------------------------------------------
//
// Internal Constructors
//
//------------------------------------------------------
internal PackageThreadSafePair(Package package, bool threadSafe)
{
Invariant.Assert(package != null);
_package = package;
_threadSafe = threadSafe;
}
//-----------------------------------------------------
//
// Internal Properties
//
//------------------------------------------------------
///
/// Package
///
internal Package Package
{
get
{
return _package;
}
}
///
/// True if package is thread-safe
///
internal bool ThreadSafe
{
get
{
return _threadSafe;
}
}
//-----------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
private readonly Package _package;
private readonly bool _threadSafe;
}
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
// We are expect to have no more than 10 preloaded packages
// per AppDomain for our scenarios
// ListDictionary is the best fit for this scenarios; otherwise we should be using
// Hashtable. HybridDictionary already has functionality of switching between
// ListDictionary and Hashtable depending on the size of the collection
static private HybridDictionary _packagePairs;
static private Object _globalLock;
#endregion Private Fields
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation, 2005
//
// File: PreloadedPackages.cs
//
// Description: Collection of preloaded packages to be used with
// PackWebRequest.
//
//-----------------------------------------------------------------------------
using System;
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Packaging;
using MS.Internal;
using MS.Internal.PresentationCore; // for ExceptionStringTable
namespace MS.Internal.IO.Packaging
{
///
/// PreloadedPackages
///
/// Note: we purposely didn't make this class a dictionary since it is an internal
/// class and we won't be using even half of the dictionary functionalities.
/// If this class becomes a public class which is strongly discouraged, this class
/// needs to implement IDictionary.
//
// Critical: This class serves as a depository of all well-known pre-populated
// packages. This class is marked as SecurityCritical to ensure that
// 1. only trusted code can add/get/remove trusted packages into the depository
// 2. a whole package will never be given out to the platform client
// Note: it is OK to give out a part stream from a package instance but
// the package related objects such as Package, PackagePart,
// PackageRelationship should NEVER be given out to a client.
// List of the trusted packages allowed:
// 1. ResourceContainer
// 2. SiteOfOriginContainer
// 3. ZipPackage that is only instantiated by XPS Viewer
//
[SecurityCritical(SecurityCriticalScope.Everything)]
[FriendAccessAllowed]
internal static class PreloadedPackages
{
//-----------------------------------------------------
//
// Static Constructors
//
//-----------------------------------------------------
static PreloadedPackages()
{
_globalLock = new Object();
}
//------------------------------------------------------
//
// Internal Methods
//
//-----------------------------------------------------
#region Internal Methods
///
/// GetPackage given a uri
///
/// uri to match on
/// object if found - else null
/// uri must be absolute
internal static Package GetPackage(Uri uri)
{
bool ignored;
return GetPackage(uri, out ignored);
}
///
/// GetPackage given a uri
///
/// uri to match on
/// true if the returned package is threadsafe - undefined if null is returned
/// object if found - else null
/// uri must be absolute
internal static Package GetPackage(Uri uri, out bool threadSafe)
{
ValidateUriKey(uri);
lock (_globalLock)
{
Package package = null;
threadSafe = false;
if (_packagePairs != null)
{
PackageThreadSafePair packagePair = _packagePairs[uri] as PackageThreadSafePair;
if (packagePair != null)
{
package = packagePair.Package;
threadSafe = packagePair.ThreadSafe;
}
}
return package;
}
}
///
/// AddPackage - default to non-thread-safe
///
/// uri to use for matching
/// package object to serve content from
/// Adds a uri, content pair to the cache. If the uri is already
/// in the cache, this removes the old content and replaces it.
/// The object will not be subject to automatic removal from the cache
internal static void AddPackage(Uri uri, Package package)
{
AddPackage(uri, package, false);
}
///
/// AddPackage
///
/// uri to use for matching
/// package object to serve content from
/// is package thread-safe?
/// Adds a uri, content pair to the cache. If the uri is already
/// in the cache, this removes the old content and replaces it.
/// The object will not be subject to automatic removal from the cache
internal static void AddPackage(Uri uri, Package package, bool threadSafe)
{
ValidateUriKey(uri);
lock (_globalLock)
{
if (_packagePairs == null)
{
_packagePairs = new HybridDictionary(3);
}
_packagePairs.Add(uri, new PackageThreadSafePair(package, threadSafe));
}
}
///
/// RemovePackage
///
/// uri of the package that needs to be removed
/// Removes the package corresponding to the uri from the cache. If a matching uri isn't found
/// the status of the cache doesn't change and no exception is throwen
///
internal static void RemovePackage(Uri uri)
{
ValidateUriKey(uri);
lock (_globalLock)
{
if (_packagePairs != null)
{
_packagePairs.Remove(uri);
}
}
}
// Null the instance. Similar to Dispose, but not quite.
internal static void Clear()
{
lock (_globalLock)
{
_packagePairs = null;
}
}
private static void ValidateUriKey(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (!uri.IsAbsoluteUri)
{
throw new ArgumentException(SR.Get(SRID.UriMustBeAbsolute), "uri");
}
}
#endregion Internal Methods
///
/// Package-bool pair where the bool represents the thread-safety status of the package
///
private class PackageThreadSafePair
{
//------------------------------------------------------
//
// Internal Constructors
//
//------------------------------------------------------
internal PackageThreadSafePair(Package package, bool threadSafe)
{
Invariant.Assert(package != null);
_package = package;
_threadSafe = threadSafe;
}
//-----------------------------------------------------
//
// Internal Properties
//
//------------------------------------------------------
///
/// Package
///
internal Package Package
{
get
{
return _package;
}
}
///
/// True if package is thread-safe
///
internal bool ThreadSafe
{
get
{
return _threadSafe;
}
}
//-----------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
private readonly Package _package;
private readonly bool _threadSafe;
}
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
// We are expect to have no more than 10 preloaded packages
// per AppDomain for our scenarios
// ListDictionary is the best fit for this scenarios; otherwise we should be using
// Hashtable. HybridDictionary already has functionality of switching between
// ListDictionary and Hashtable depending on the size of the collection
static private HybridDictionary _packagePairs;
static private Object _globalLock;
#endregion Private Fields
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DataGridPagerStyle.cs
- NumericUpDownAcceleration.cs
- RSAOAEPKeyExchangeDeformatter.cs
- ToolStripDesigner.cs
- LongTypeConverter.cs
- BamlResourceSerializer.cs
- DataSourceHelper.cs
- XmlSchemaValidator.cs
- DefaultTextStoreTextComposition.cs
- TextServicesHost.cs
- GeometryConverter.cs
- DoubleAnimationUsingPath.cs
- Registration.cs
- WebPart.cs
- XmlSchemaGroupRef.cs
- SafeFindHandle.cs
- CompilerScope.Storage.cs
- RegistrySecurity.cs
- Size3DValueSerializer.cs
- SqlConnectionPoolProviderInfo.cs
- RMEnrollmentPage3.cs
- ZipIOModeEnforcingStream.cs
- EntityKeyElement.cs
- DbProviderFactoriesConfigurationHandler.cs
- LongSumAggregationOperator.cs
- PrintDocument.cs
- SingleSelectRootGridEntry.cs
- CompareInfo.cs
- ADConnectionHelper.cs
- PenContexts.cs
- ComponentChangedEvent.cs
- KeySplineConverter.cs
- EmptyStringExpandableObjectConverter.cs
- XmlTextReader.cs
- TcpChannelListener.cs
- StrongName.cs
- EventMappingSettingsCollection.cs
- PrivilegeNotHeldException.cs
- DataGridTable.cs
- SigningDialog.cs
- UrlUtility.cs
- ParallelTimeline.cs
- StrongTypingException.cs
- FormViewPageEventArgs.cs
- CLRBindingWorker.cs
- hresults.cs
- TCEAdapterGenerator.cs
- SqlMethodAttribute.cs
- RectAnimationClockResource.cs
- GridViewUpdatedEventArgs.cs
- TimeSpanValidatorAttribute.cs
- _NegoStream.cs
- RegistrationServices.cs
- TableRow.cs
- ApplicationProxyInternal.cs
- TableDetailsCollection.cs
- BinaryObjectInfo.cs
- CodePageUtils.cs
- ClassHandlersStore.cs
- TextEncodedRawTextWriter.cs
- unitconverter.cs
- RootBrowserWindow.cs
- Control.cs
- MetadataCollection.cs
- SimpleLine.cs
- ClaimComparer.cs
- PermissionSetTriple.cs
- HwndTarget.cs
- XmlSortKey.cs
- DataServiceRequest.cs
- PngBitmapEncoder.cs
- KernelTypeValidation.cs
- BooleanConverter.cs
- ChildrenQuery.cs
- ExceptionRoutedEventArgs.cs
- HtmlHistory.cs
- XmlElement.cs
- EncryptedKeyIdentifierClause.cs
- KeyboardDevice.cs
- Calendar.cs
- XPathException.cs
- Point3DAnimation.cs
- XmlExpressionDumper.cs
- ScrollPattern.cs
- StrongNamePublicKeyBlob.cs
- GeneralTransform3D.cs
- NonSerializedAttribute.cs
- VSDExceptions.cs
- AutoScrollHelper.cs
- SubpageParaClient.cs
- DefaultEvaluationContext.cs
- DataFormat.cs
- GlyphRunDrawing.cs
- RequestQueue.cs
- Subset.cs
- XmlReflectionMember.cs
- ObservableDictionary.cs
- UriTemplateClientFormatter.cs
- GlyphInfoList.cs
- MeshGeometry3D.cs