Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Serializer / WorkflowMarkupSerializationManager.cs / 1613121 / WorkflowMarkupSerializationManager.cs
namespace System.Workflow.ComponentModel.Serialization { using System; using System.IO; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Collections; using System.Xml; using System.Xml.Serialization; using System.Reflection; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Globalization; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Design; using System.Runtime.Serialization; using System.Security.Permissions; using System.Collections.ObjectModel; using System.Drawing; using System.Diagnostics.CodeAnalysis; #region Class WorkflowMarkupSerializationManager public class WorkflowMarkupSerializationManager : IDesignerSerializationManager { private Assembly localAssembly = null; private int writerDepth = 0; private ContextStack workflowMarkupStack = new ContextStack(); // Stack to keep a list of objects being serialized, to avoid stack overflow private Stack serializationStack = new Stack(); private IDesignerSerializationManager serializationManager; private bool designMode = false; internal event EventHandlerFoundDefTag; //These are temporary variables for speedy lookup private Dictionary clrNamespaceBasedMappings = new Dictionary (); private Dictionary > xmlNamespaceBasedMappings = new Dictionary >(); private Dictionary > prefixBasedMappings = new Dictionary >(); private List extendedPropertiesProviders; private Dictionary cachedXmlQualifiedNameTypes = new Dictionary (); public WorkflowMarkupSerializationManager(IDesignerSerializationManager manager) { if (manager == null) throw new ArgumentNullException("manager"); this.serializationManager = manager; AddSerializationProvider(new WellKnownTypeSerializationProvider()); // push standard mappings AddMappings(WorkflowMarkupSerializerMapping.WellKnownMappings); //Set the local assembly correctly ITypeProvider typeProvider = manager.GetService(typeof(ITypeProvider)) as ITypeProvider; if (typeProvider != null) LocalAssembly = typeProvider.LocalAssembly; this.designMode = (manager.GetService(typeof(ITypeResolutionService)) != null); } public ContextStack Context { get { return this.serializationManager.Context; } } internal Stack SerializationStack { get { return this.serializationStack; } } public void ReportError(object errorInformation) { if (errorInformation == null) throw new ArgumentNullException("errorInformation"); this.serializationManager.ReportError(errorInformation); } protected internal IDesignerSerializationManager SerializationManager { get { return this.serializationManager; } set { this.serializationManager = value; this.serializationManager.AddSerializationProvider(new WellKnownTypeSerializationProvider()); } } public void AddSerializationProvider(IDesignerSerializationProvider provider) { if (provider == null) throw new ArgumentNullException("provider"); this.serializationManager.AddSerializationProvider(provider); } public void RemoveSerializationProvider(IDesignerSerializationProvider provider) { if (provider == null) throw new ArgumentNullException("provider"); this.serializationManager.RemoveSerializationProvider(provider); } public Assembly LocalAssembly { get { return this.localAssembly; } set { this.localAssembly = value; } } #region Public Methods public virtual XmlQualifiedName GetXmlQualifiedName(Type type, out string prefix) { if (type == null) throw new ArgumentNullException("type"); string typeNamespace = (type.Namespace != null) ? type.Namespace : String.Empty; string assemblyName = (type.Assembly != null && type.Assembly != this.localAssembly) ? type.Assembly.FullName : String.Empty; WorkflowMarkupSerializerMapping mappingForType = null; int key = typeNamespace.GetHashCode() ^ assemblyName.GetHashCode(); if (!this.clrNamespaceBasedMappings.TryGetValue(key, out mappingForType)) { IList collectedMappings = null; WorkflowMarkupSerializerMapping.GetMappingFromType(this, type, out mappingForType, out collectedMappings); AddMappings(new List (new WorkflowMarkupSerializerMapping[] { mappingForType })); AddMappings(collectedMappings); } string typeName = WorkflowMarkupSerializer.EnsureMarkupExtensionTypeName(type); //Make sure that while writting the workflow namespaces will always be the default prefix = (mappingForType.Prefix.Equals(StandardXomlKeys.WorkflowPrefix, StringComparison.Ordinal)) ? String.Empty : mappingForType.Prefix; return new XmlQualifiedName(typeName, mappingForType.XmlNamespace); } public virtual Type GetType(XmlQualifiedName xmlQualifiedName) { if (xmlQualifiedName == null) throw new ArgumentNullException("xmlQualifiedName"); string xmlns = xmlQualifiedName.Namespace; string typeName = WorkflowMarkupSerializer.EnsureMarkupExtensionTypeName(xmlQualifiedName); Type resolvedType = null; // first check our cache cachedXmlQualifiedNameTypes.TryGetValue(xmlQualifiedName, out resolvedType); if (resolvedType == null) { // lookup in well known types resolvedType = WorkflowMarkupSerializerMapping.ResolveWellKnownTypes(this, xmlns, typeName); } if (resolvedType == null) { //Lookup existing mapping List xmlnsMappings = null; if (!this.xmlNamespaceBasedMappings.TryGetValue(xmlns, out xmlnsMappings)) { IList matchingMappings = null; IList collectedMappings = null; WorkflowMarkupSerializerMapping.GetMappingsFromXmlNamespace(this, xmlns, out matchingMappings, out collectedMappings); AddMappings(matchingMappings); AddMappings(collectedMappings); xmlnsMappings = new List (matchingMappings); } foreach (WorkflowMarkupSerializerMapping xmlnsMapping in xmlnsMappings) { string assemblyName = xmlnsMapping.AssemblyName; string clrNamespace = xmlnsMapping.ClrNamespace; // append dot net namespace name string fullTypeName = xmlQualifiedName.Name; if (clrNamespace.Length > 0) fullTypeName = clrNamespace + "." + xmlQualifiedName.Name; // Work around for component model assembly if (assemblyName.Equals(Assembly.GetExecutingAssembly().FullName, StringComparison.Ordinal)) { resolvedType = Assembly.GetExecutingAssembly().GetType(fullTypeName); } else if (assemblyName.Length == 0) { if (this.localAssembly != null) resolvedType = this.localAssembly.GetType(fullTypeName); } else { string assemblyQualifiedName = fullTypeName; if (assemblyName.Length > 0) assemblyQualifiedName += (", " + assemblyName); // now grab the actual type try { resolvedType = GetType(assemblyQualifiedName); } catch { // } if (resolvedType == null) { resolvedType = GetType(fullTypeName); if (resolvedType != null && !resolvedType.AssemblyQualifiedName.Equals(assemblyQualifiedName, StringComparison.Ordinal)) resolvedType = null; } } //We found the type if (resolvedType != null) { cachedXmlQualifiedNameTypes[xmlQualifiedName] = resolvedType; break; } } } return resolvedType; } #endregion #region WorkflowMarkupSerializationManager Overrides public object GetSerializer(Type objectType, Type serializerType) { return serializationManager.GetSerializer(objectType, serializerType); } [SuppressMessage("Microsoft.Globalization", "CA1307:SpecifyStringComparison", MessageId="System.String.IndexOf(System.String)", Justification="Not a security threat since it is called in design time scenarios")] public virtual Type GetType(string typeName) { if (typeName == null) throw new ArgumentNullException("typeName"); // try serialization manager Type type = null; if (this.designMode) { try { type = this.serializationManager.GetType(typeName); } catch { //Debug.Assert(false, "VSIP framwork threw exception on resolving type." + e.ToString()); } } if (type == null) { // If this is a design time type, we need to get it from our type provider. ITypeProvider typeProvider = this.GetService(typeof(ITypeProvider)) as ITypeProvider; if (typeProvider != null) type = typeProvider.GetType(typeName, false); } if (type != null) return type; // try loading the assembly directly string assemblyName = string.Empty; int commaIndex = typeName.IndexOf(","); string fullyQualifiedTypeName = typeName; if (commaIndex > 0) { assemblyName = typeName.Substring(commaIndex + 1); typeName = typeName.Substring(0, commaIndex); } Assembly assembly = null; assemblyName = assemblyName.Trim(); if (assemblyName.Length > 0) { if (assemblyName.IndexOf(',') >= 0) { try { assembly = Assembly.Load(assemblyName); } catch { // } } typeName = typeName.Trim(); if (assembly != null) type = assembly.GetType(typeName, false); else type = Type.GetType(fullyQualifiedTypeName, false); } return type; } #endregion #region Helpers internal int WriterDepth { get { return this.writerDepth; } set { this.writerDepth = value; } } internal ContextStack WorkflowMarkupStack { get { return this.workflowMarkupStack; } } internal void FireFoundDefTag(WorkflowMarkupElementEventArgs args) { if (this.FoundDefTag != null) this.FoundDefTag(this, args); } internal IDictionary ClrNamespaceBasedMappings { get { return this.clrNamespaceBasedMappings; } } internal IDictionary > XmlNamespaceBasedMappings { get { return this.xmlNamespaceBasedMappings; } } internal Dictionary > PrefixBasedMappings { get { return this.prefixBasedMappings; } } internal void AddMappings(IList mappingsToAdd) { foreach (WorkflowMarkupSerializerMapping mapping in mappingsToAdd) { if (!this.clrNamespaceBasedMappings.ContainsKey(mapping.GetHashCode())) this.clrNamespaceBasedMappings.Add(mapping.GetHashCode(), mapping); List xmlnsMappings = null; if (!this.xmlNamespaceBasedMappings.TryGetValue(mapping.XmlNamespace, out xmlnsMappings)) { xmlnsMappings = new List (); this.xmlNamespaceBasedMappings.Add(mapping.XmlNamespace, xmlnsMappings); } xmlnsMappings.Add(mapping); List prefixMappings = null; if (!this.prefixBasedMappings.TryGetValue(mapping.Prefix, out prefixMappings)) { prefixMappings = new List (); this.prefixBasedMappings.Add(mapping.Prefix, prefixMappings); } prefixMappings.Add(mapping); } } internal IList ExtendedPropertiesProviders { get { if (this.extendedPropertiesProviders == null) this.extendedPropertiesProviders = new List (); return this.extendedPropertiesProviders; } } internal ExtendedPropertyInfo[] GetExtendedProperties(object extendee) { List extendedProperties = new List (); foreach (WorkflowMarkupSerializer markupSerializer in ExtendedPropertiesProviders) extendedProperties.AddRange(markupSerializer.GetExtendedProperties(this, extendee)); return extendedProperties.ToArray(); } #endregion #region IDesignerSerializationManager Implementation object IDesignerSerializationManager.CreateInstance(Type type, ICollection arguments, string name, bool addToContainer) { return this.serializationManager.CreateInstance(type, arguments, name, addToContainer); } object IDesignerSerializationManager.GetInstance(string name) { return this.serializationManager.GetInstance(name); } string IDesignerSerializationManager.GetName(object value) { return this.serializationManager.GetName(value); } PropertyDescriptorCollection IDesignerSerializationManager.Properties { get { return this.serializationManager.Properties; } } event ResolveNameEventHandler IDesignerSerializationManager.ResolveName{ add { } remove { } } event EventHandler IDesignerSerializationManager.SerializationComplete{ add { } remove { } } void IDesignerSerializationManager.SetName(object instance, string name) { this.serializationManager.SetName(instance, name); } #endregion #region IServiceProvider Members public object GetService(Type serviceType) { if (serviceType == null) throw new ArgumentNullException("serviceType"); return this.serializationManager.GetService(serviceType); } #endregion #region Class WellKnownTypeSerializationProvider private sealed class WellKnownTypeSerializationProvider : IDesignerSerializationProvider { #region IDesignerSerializationProvider Members object IDesignerSerializationProvider.GetSerializer(IDesignerSerializationManager manager, object currentSerializer, Type objectType, Type serializerType) { if (serializerType == typeof(WorkflowMarkupSerializer) && objectType != null) { if (TypeProvider.IsAssignable(typeof(ICollection ), objectType) && TypeProvider.IsAssignable(objectType, typeof(List )) && !TypeProvider.IsAssignable(typeof(Array), objectType)) return new StringCollectionMarkupSerializer(); else if (typeof(Color).IsAssignableFrom(objectType)) return new ColorMarkupSerializer(); else if (typeof(Size).IsAssignableFrom(objectType)) return new SizeMarkupSerializer(); else if (typeof(Point).IsAssignableFrom(objectType)) return new PointMarkupSerializer(); else if (objectType == typeof(CodeTypeReference)) return new CodeTypeReferenceSerializer(); } return null; } #endregion } #endregion } #endregion } // 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
- SqlWebEventProvider.cs
- DoubleCollectionConverter.cs
- DataGridViewRowDividerDoubleClickEventArgs.cs
- UpdateCompiler.cs
- RightsManagementPermission.cs
- MetadataItem.cs
- TextDecorationUnitValidation.cs
- ObservableCollectionDefaultValueFactory.cs
- RepeatButtonAutomationPeer.cs
- ProcessingInstructionAction.cs
- AttributeProviderAttribute.cs
- CompilerCollection.cs
- DataColumnPropertyDescriptor.cs
- ProvidersHelper.cs
- PropertySegmentSerializationProvider.cs
- GlyphInfoList.cs
- DataGridRelationshipRow.cs
- Inline.cs
- SqlDataSourceFilteringEventArgs.cs
- ProcessHostMapPath.cs
- BitmapDownload.cs
- TypeNameParser.cs
- CodeAttributeArgument.cs
- PKCS1MaskGenerationMethod.cs
- Icon.cs
- WebPartZoneCollection.cs
- ScriptRegistrationManager.cs
- SynchronizedDispatch.cs
- LowerCaseStringConverter.cs
- DataGridDetailsPresenterAutomationPeer.cs
- TreeViewEvent.cs
- ContentElementAutomationPeer.cs
- GridViewCommandEventArgs.cs
- RangeValidator.cs
- PersonalizationProviderCollection.cs
- ReadOnlyAttribute.cs
- TdsParser.cs
- LongPath.cs
- RepeatButton.cs
- ParsedAttributeCollection.cs
- ArgIterator.cs
- InternalControlCollection.cs
- URLIdentityPermission.cs
- DataListCommandEventArgs.cs
- DeviceContext2.cs
- ComboBox.cs
- AssociatedControlConverter.cs
- PnrpPeerResolver.cs
- StorageConditionPropertyMapping.cs
- LayoutDump.cs
- AstTree.cs
- RectangleGeometry.cs
- Substitution.cs
- EntityObject.cs
- HttpCacheVary.cs
- DbConnectionOptions.cs
- ConstraintConverter.cs
- TargetPerspective.cs
- AsymmetricKeyExchangeDeformatter.cs
- Polygon.cs
- TypeValidationEventArgs.cs
- TableProviderWrapper.cs
- IndicShape.cs
- TextContainerChangedEventArgs.cs
- HttpGetServerProtocol.cs
- AppDomain.cs
- WeakReference.cs
- CounterCreationData.cs
- ScrollBarRenderer.cs
- RawStylusActions.cs
- ItemAutomationPeer.cs
- BinaryFormatterSinks.cs
- EntityContainerEntitySetDefiningQuery.cs
- ArithmeticException.cs
- DecimalConstantAttribute.cs
- ActivityUtilities.cs
- SamlSecurityTokenAuthenticator.cs
- ProgressBarAutomationPeer.cs
- HwndSource.cs
- RegistryPermission.cs
- ServiceDebugBehavior.cs
- ScrollableControl.cs
- DataGridColumnCollection.cs
- Keyboard.cs
- TypedTableBase.cs
- DateTimeStorage.cs
- ScrollableControl.cs
- StreamReader.cs
- WindowsToolbar.cs
- CodeTypeReference.cs
- QueryContinueDragEvent.cs
- ImpersonationContext.cs
- RequestCachePolicyConverter.cs
- SatelliteContractVersionAttribute.cs
- SafeRegistryHandle.cs
- ExtendedPropertyDescriptor.cs
- CancelEventArgs.cs
- DataServiceQueryProvider.cs
- SchemaAttDef.cs
- Int32Collection.cs