Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / MS / Internal / AppModel / ResourcePart.cs / 1 / ResourcePart.cs
//------------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
// Description:
// ResourcePart is an implementation of the abstract PackagePart class. It contains an override for GetStreamCore.
//
// History:
// 10/04/2004: [....]: Initial creation.
//
//-----------------------------------------------------------------------------
using System;
using System.IO.Packaging;
using System.Windows;
using System.Windows.Resources;
using System.IO;
using System.Resources;
using System.Globalization;
using System.Security;
using MS.Internal.Resources;
using MS.Internal;
//In order to avoid generating warnings about unknown message numbers and
//unknown pragmas when compiling your C# source code with the actual C# compiler,
//you need to disable warnings 1634 and 1691. (Presharp Documentation)
#pragma warning disable 1634, 1691
namespace MS.Internal.AppModel
{
///
/// ResourcePart is an implementation of the abstract PackagePart class. It contains an override for GetStreamCore.
///
internal class ResourcePart : System.IO.Packaging.PackagePart
{
//-----------------------------------------------------
//
// Public Constructors
//
//-----------------------------------------------------
#region Public Constructors
///
/// Critical - because _rmWrapper, which is being set, is marked SecurityCriticalDataForSet.
///
[SecurityCritical]
public ResourcePart(Package container, Uri uri, string name, ResourceManagerWrapper rmWrapper) :
base(container, uri)
{
_rmWrapper.Value = rmWrapper;
_name = name;
}
#endregion
//------------------------------------------------------
//
// Protected Methods
//
//-----------------------------------------------------
#region Protected Methods
///
/// Critical - because creating a BamlStream is critical as it stores the assembly
/// passed in to it the _assembly field, and this field is used by the
/// BamlRecordReader to allow legitimate internal types in Partial Trust.
/// Safe - because the _rmWrapper from which the assembly is obtained is SecurityCriticalDataForSet,
/// and setting that when a ResourcePart is constructed is treated as safe by
/// ResourceContainer.GetPartCore(). The _rmWrapper is trated as safe as it guarantees
/// that any stream created by it is always from the assembly that it also holds on to.
/// So to the BamlRecordReader, this Assembly that it uses is always guaranteed to be
/// the one from which the baml stream that it reads, was created from.
///
[SecurityCritical, SecurityTreatAsSafe]
protected override Stream GetStreamCore(FileMode mode, FileAccess access)
{
Stream stream = null;
stream = EnsureResourceLocationSet();
// in order to find the resource we might have to open a stream.
// rather than waste the stream it is returned here and we can use it.
if (stream == null)
{
// Start looking for resources using the current ui culture.
// The resource manager will fall back to invariant culture automatically.
stream = _rmWrapper.Value.GetStream(_name);
if (stream == null)
{
throw new IOException(SR.Get(SRID.UnableToLocateResource, _name));
}
}
//
// If this is a Baml stream, it will return BamlStream object, which contains
// both raw stream and the host assembly.
//
ContentType curContent = new ContentType(ContentType);
if (MimeTypeMapper.BamlMime.AreTypeAndSubTypeEqual(curContent))
{
BamlStream bamlStream = new BamlStream(stream, _rmWrapper.Value.Assembly);
stream = bamlStream;
}
return stream;
}
protected override string GetContentTypeCore()
{
EnsureResourceLocationSet();
return MS.Internal.MimeTypeMapper.GetMimeTypeFromUri(new Uri(_name,UriKind.RelativeOrAbsolute)).ToString();
}
#endregion
//------------------------------------------------------
//
// Private Methods
//
//------------------------------------------------------
#region Private Methods
private Stream EnsureResourceLocationSet()
{
Stream stream = null;
lock (_globalLock)
{
// only need to do this once
if (_ensureResourceIsCalled)
{
return null;
}
_ensureResourceIsCalled = true;
try
{
// We do not allow the use of .baml in any Avalon public APIs. This is the code pass needed to go through for loading baml file.
// Throw here we will catch all those cases.
if (String.Compare(Path.GetExtension(_name), ResourceContainer.BamlExt, StringComparison.OrdinalIgnoreCase) == 0)
{
throw new IOException(SR.Get(SRID.UnableToLocateResource, _name));
}
if (String.Compare(Path.GetExtension(_name), ResourceContainer.XamlExt, StringComparison.OrdinalIgnoreCase) == 0)
{
// try baml extension first since it's our most common senario.
string newName = Path.ChangeExtension(_name, ResourceContainer.BamlExt);
// Get resource from resource manager wrapper.
stream = _rmWrapper.Value.GetStream(newName);
if (stream != null)
{
// Remember that we have .baml for next time GetStreamCore is called.
_name = newName;
return stream;
}
}
}
#pragma warning disable 6502 // PRESharp - Catch statements should not have empty bodies
catch (System.Resources.MissingManifestResourceException)
{
// When the main assembly doesn't contain any resource (all the resources must come from satellite assembly)
// then above GetStream( ) just throws exception. We should catch this exception here and let the code continue
// to try with the original file name.
// If the main assembly does contain resource, but the resource with above _name does't exist, the above GetStream( )
// just returns null without exception.
}
#pragma warning restore 6502
}
// Do not attempt to load the original file name here. If the .baml does not exist or if this resource not
// .xaml or .baml then we will follow the normal code path to attempt to load the stream using the original name.
return null;
}
#endregion
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Members
private SecurityCriticalDataForSet _rmWrapper;
private bool _ensureResourceIsCalled = false;
private string _name;
private Object _globalLock = new Object();
#endregion Private Members
}
}
// 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
- SessionEndingEventArgs.cs
- FlatButtonAppearance.cs
- DetailsViewUpdateEventArgs.cs
- DocumentPageHost.cs
- EntityDataSourceChangedEventArgs.cs
- BuildManager.cs
- Rotation3DKeyFrameCollection.cs
- ModuleBuilderData.cs
- ContextStack.cs
- CacheOutputQuery.cs
- ComPlusTypeValidator.cs
- PropertyOrder.cs
- WebPart.cs
- DateTime.cs
- DataGridViewCellCancelEventArgs.cs
- XamlFxTrace.cs
- XmlTypeAttribute.cs
- WorkflowServiceBuildProvider.cs
- WebPartConnection.cs
- TemplateControlBuildProvider.cs
- ReflectionUtil.cs
- EventManager.cs
- Context.cs
- AssemblyName.cs
- PerformanceCounterCategory.cs
- InstanceOwner.cs
- DefaultAsyncDataDispatcher.cs
- NameObjectCollectionBase.cs
- DrawingCollection.cs
- ScriptingJsonSerializationSection.cs
- SoapAttributeOverrides.cs
- ProgressPage.cs
- Transform3DGroup.cs
- AdapterUtil.cs
- ScrollViewerAutomationPeer.cs
- KeyValuePair.cs
- CodeGenerator.cs
- AxDesigner.cs
- PresentationTraceSources.cs
- WorkflowRuntimeServiceElement.cs
- SafePEFileHandle.cs
- VersionConverter.cs
- AnnouncementEndpointElement.cs
- PointHitTestParameters.cs
- DataGridViewRow.cs
- Cursors.cs
- DbCommandTree.cs
- ReadOnlyKeyedCollection.cs
- mactripleDES.cs
- TypeNameConverter.cs
- DetailsViewDeleteEventArgs.cs
- DbExpressionVisitor_TResultType.cs
- UInt32Storage.cs
- EventMetadata.cs
- Subtree.cs
- SupportedAddressingMode.cs
- ApplicationId.cs
- Config.cs
- DataProtection.cs
- CancellationToken.cs
- TableRowCollection.cs
- EntityPropertyMappingAttribute.cs
- ObjectParameterCollection.cs
- KeyNotFoundException.cs
- EngineSite.cs
- ContentElement.cs
- COM2TypeInfoProcessor.cs
- TextBounds.cs
- PolygonHotSpot.cs
- DesignerActionTextItem.cs
- WebConfigurationHost.cs
- XmlSchemaInfo.cs
- CardSpaceSelector.cs
- PropertyItemInternal.cs
- Schema.cs
- TextBoxLine.cs
- x509store.cs
- DoubleAnimationUsingKeyFrames.cs
- InternalSafeNativeMethods.cs
- NotConverter.cs
- BitmapPalette.cs
- HostProtectionPermission.cs
- PassportAuthentication.cs
- SafeProcessHandle.cs
- FaultFormatter.cs
- ServicesUtilities.cs
- OdbcFactory.cs
- StrokeNodeEnumerator.cs
- Transform.cs
- DoubleAnimationUsingPath.cs
- SimplePropertyEntry.cs
- BufferModesCollection.cs
- StylusDownEventArgs.cs
- SectionVisual.cs
- IntellisenseTextBox.designer.cs
- DesignOnlyAttribute.cs
- ActivityCollectionMarkupSerializer.cs
- PropertyRef.cs
- LineSegment.cs
- UTF32Encoding.cs