Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Security / Policy / EvidenceBase.cs / 1305376 / EvidenceBase.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// [....]
//
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.IO;
using System.Runtime.InteropServices;
#if FEATURE_SERIALIZATION
using System.Runtime.Serialization.Formatters.Binary;
#endif // FEATURE_SERIALIZATION
using System.Security.Permissions;
namespace System.Security.Policy
{
///
/// Base class from which all objects to be used as Evidence must derive
///
[ComVisible(true)]
[Serializable]
public abstract class EvidenceBase
{
protected EvidenceBase()
{
#if FEATURE_SERIALIZATION
// All objects to be used as evidence must be serializable. Make sure that any derived types
// are marked serializable to enforce this, since the attribute does not inherit down to derived
// classes.
if (!GetType().IsSerializable)
{
throw new InvalidOperationException(Environment.GetResourceString("Policy_EvidenceMustBeSerializable"));
}
#endif // FEATURE_SERIALIZATION
}
///
/// Since legacy evidence objects would be cloned by being serialized, the default implementation
/// of EvidenceBase will do the same.
///
[SecurityPermission(SecurityAction.Assert, SerializationFormatter = true)]
[SecuritySafeCritical]
public virtual EvidenceBase Clone()
{
#if FEATURE_SERIALIZATION
using (MemoryStream memoryStream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, this);
memoryStream.Position = 0;
return formatter.Deserialize(memoryStream) as EvidenceBase;
}
#else // !FEATURE_SERIALIZATION
throw new NotImplementedException();
#endif // FEATURE_SERIALIZATION
}
}
///
/// Interface for types which wrap Whidbey evidence objects for compatibility with v4 evidence rules
///
internal interface ILegacyEvidenceAdapter
{
object EvidenceObject { get; }
Type EvidenceType { get; }
}
///
/// Wrapper class to hold legacy evidence objects which do not derive from EvidenceBase, and allow
/// them to be held in the Evidence collection which expects to maintain lists of EvidenceBase only
///
[Serializable]
internal sealed class LegacyEvidenceWrapper : EvidenceBase, ILegacyEvidenceAdapter
{
private object m_legacyEvidence;
internal LegacyEvidenceWrapper(object legacyEvidence)
{
Contract.Assert(legacyEvidence != null);
Contract.Assert(legacyEvidence.GetType() != typeof(EvidenceBase), "Attempt to wrap an EvidenceBase in a LegacyEvidenceWrapper");
Contract.Assert(legacyEvidence.GetType().IsSerializable, "legacyEvidence.GetType().IsSerializable");
m_legacyEvidence = legacyEvidence;
}
public object EvidenceObject
{
get { return m_legacyEvidence; }
}
public Type EvidenceType
{
get { return m_legacyEvidence.GetType(); }
}
public override bool Equals(object obj)
{
return m_legacyEvidence.Equals(obj);
}
public override int GetHashCode()
{
return m_legacyEvidence.GetHashCode();
}
}
///
/// Pre-v4 versions of the runtime allow multiple pieces of evidence that all have the same type.
/// This type wraps those evidence objects into a single type of list, allowing legacy code to continue
/// to work with the Evidence collection that does not expect multiple evidences of the same type.
///
/// This may not be limited to LegacyEvidenceWrappers, since it's valid for legacy code to add multiple
/// objects of built-in evidence to an Evidence collection. The built-in evidence now derives from
/// EvienceObject, so when the legacy code runs on v4, it may end up attempting to add multiple
/// Hash evidences for intsance.
///
[Serializable]
internal sealed class LegacyEvidenceList : EvidenceBase, IEnumerable, ILegacyEvidenceAdapter
{
private List m_legacyEvidenceList = new List();
public object EvidenceObject
{
get
{
// We'll choose the first item in the list to represent us if we're forced to return only
// one object. This can occur if multiple pieces of evidence are added via the legacy APIs,
// and then the new APIs are used to retrieve that evidence.
return m_legacyEvidenceList.Count > 0 ? m_legacyEvidenceList[0] : null;
}
}
public Type EvidenceType
{
get
{
Contract.Assert(m_legacyEvidenceList.Count > 0, "No items in LegacyEvidenceList, cannot tell what type they are");
ILegacyEvidenceAdapter adapter = m_legacyEvidenceList[0] as ILegacyEvidenceAdapter;
return adapter == null ? m_legacyEvidenceList[0].GetType() : adapter.EvidenceType;
}
}
public void Add(EvidenceBase evidence)
{
Contract.Assert(evidence != null);
Contract.Assert(m_legacyEvidenceList.Count == 0 || EvidenceType == evidence.GetType() || (evidence is LegacyEvidenceWrapper && (evidence as LegacyEvidenceWrapper).EvidenceType == EvidenceType),
"LegacyEvidenceList must be ----geonous");
Contract.Assert(evidence.GetType() != typeof(LegacyEvidenceList),
"Attempt to add a legacy evidence list to another legacy evidence list");
m_legacyEvidenceList.Add(evidence);
}
public IEnumerator GetEnumerator()
{
return m_legacyEvidenceList.GetEnumerator();
}
IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return m_legacyEvidenceList.GetEnumerator();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Dispatcher.cs
- NativeMethods.cs
- FileReader.cs
- FillBehavior.cs
- WebConfigurationHostFileChange.cs
- EntityDescriptor.cs
- Queue.cs
- UriScheme.cs
- Renderer.cs
- SessionState.cs
- CharUnicodeInfo.cs
- AnnotationDocumentPaginator.cs
- StopStoryboard.cs
- NoPersistScope.cs
- COM2Properties.cs
- DrawingVisual.cs
- Lasso.cs
- PipelineModuleStepContainer.cs
- DateTimeConstantAttribute.cs
- WebPartDeleteVerb.cs
- DataSourceHelper.cs
- BaseCollection.cs
- _StreamFramer.cs
- DashStyles.cs
- SHA1CryptoServiceProvider.cs
- TableItemStyle.cs
- WmlValidationSummaryAdapter.cs
- SqlParameterizer.cs
- Compilation.cs
- recordstatescratchpad.cs
- CompositeTypefaceMetrics.cs
- StringSource.cs
- IProducerConsumerCollection.cs
- XmlSchema.cs
- ChannelServices.cs
- MessageDescription.cs
- XmlResolver.cs
- SettingsPropertyNotFoundException.cs
- ToolStripContentPanelRenderEventArgs.cs
- AdornedElementPlaceholder.cs
- DesignSurfaceEvent.cs
- SpotLight.cs
- Matrix3D.cs
- ValidationManager.cs
- UInt16Storage.cs
- BrowserCapabilitiesCompiler.cs
- ParallelTimeline.cs
- EncryptedData.cs
- AppDomainAttributes.cs
- PopupRoot.cs
- COM2ColorConverter.cs
- RemotingConfigParser.cs
- SeekStoryboard.cs
- BitmapMetadataBlob.cs
- CollectionsUtil.cs
- PersonalizableTypeEntry.cs
- PEFileReader.cs
- PageThemeParser.cs
- RelatedView.cs
- XslCompiledTransform.cs
- GeometryConverter.cs
- CodeCommentStatement.cs
- DbConnectionPoolGroupProviderInfo.cs
- ClosableStream.cs
- SortAction.cs
- OraclePermission.cs
- TextBox.cs
- BuildProviderUtils.cs
- CompressEmulationStream.cs
- ChangeInterceptorAttribute.cs
- XmlDigitalSignatureProcessor.cs
- InstanceKeyView.cs
- SecurityAttributeGenerationHelper.cs
- Gdiplus.cs
- XmlDataDocument.cs
- DocumentOrderComparer.cs
- DefaultParameterValueAttribute.cs
- PackageFilter.cs
- EntityTypeEmitter.cs
- ExpandoClass.cs
- RoutedEvent.cs
- SqlDataReader.cs
- ToolStripComboBox.cs
- ListViewSortEventArgs.cs
- assertwrapper.cs
- BooleanAnimationUsingKeyFrames.cs
- DataGridViewCellValueEventArgs.cs
- CompilerGlobalScopeAttribute.cs
- PackageFilter.cs
- SqlWebEventProvider.cs
- SectionInformation.cs
- HtmlButton.cs
- PeerTransportElement.cs
- FastEncoder.cs
- BinHexDecoder.cs
- BufferedMessageWriter.cs
- Point.cs
- ModelItemImpl.cs
- TaskScheduler.cs
- HostingEnvironment.cs