Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Serializer / ActivityCodeDomSerializationManager.cs / 1305376 / ActivityCodeDomSerializationManager.cs
namespace System.Workflow.ComponentModel.Serialization { using System; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Collections; using System.Resources; using System.Workflow.ComponentModel.Design; using System.Collections.Generic; using Microsoft.CSharp; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Compiler; using System.CodeDom.Compiler; using System.IO; using System.Reflection; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; #region Class ActivityCodeDomSerializationManager ////// Serialization manager class for code only serialization which inherits from /// WorkflowMarkupSerializationManager and overrides the GetService method to return the /// code-only specific reference service. /// ////// Due to the fact that the base classes used by the code-only serializer from /// System.Design rely on the reference service to generate code variable ids, we /// need to supply our own version of the reference service, since the default /// generates invalid variable ids for Activity based classes. /// public class ActivityCodeDomSerializationManager : IDesignerSerializationManager { private ServiceContainer serviceContainer = null; private IDesignerSerializationManager serializationManager; private ResolveNameEventHandler resolveNameEventHandler; private EventHandler serializationCompleteEventHandler; public ActivityCodeDomSerializationManager(IDesignerSerializationManager manager) { if (manager == null) throw new ArgumentNullException("manager"); this.serializationManager = manager; this.serviceContainer = new ServiceContainer(); this.serializationManager.ResolveName += new ResolveNameEventHandler(OnResolveName); this.serializationManager.SerializationComplete += new EventHandler(OnSerializationComplete); if (this.serializationManager is DesignerSerializationManager) ((DesignerSerializationManager)this.serializationManager).SessionDisposed += new EventHandler(OnSessionDisposed); } void OnResolveName(object sender, ResolveNameEventArgs e) { if (this.resolveNameEventHandler != null) this.resolveNameEventHandler(this, e); } void OnSerializationComplete(object sender, EventArgs e) { if (this.serializationCompleteEventHandler != null) this.serializationCompleteEventHandler(this, e); } void OnSessionDisposed(object sender, EventArgs e) { try { if (this.serializationCompleteEventHandler != null) this.serializationCompleteEventHandler(this, EventArgs.Empty); } finally { this.resolveNameEventHandler = null; this.serializationCompleteEventHandler = null; } } public event System.EventHandler SerializationComplete { add { this.serializationCompleteEventHandler += value; } remove { this.serializationCompleteEventHandler -= value; } } public void SetName(object instance, string name) { // Need to check this since code dom deserialization tries to // set name twice on all object creation statements. if (GetInstance(name) != instance) this.serializationManager.SetName(instance, name); } [SuppressMessage("Microsoft.Globalization", "CA1307:SpecifyStringComparison", MessageId="System.String.LastIndexOf(System.String)", Justification="This is not a security threat since it is called only in XAML design time scenarios")] public string GetName(object value) { string name = null; Activity a = value as Activity; if (a != null ) { if (a.Parent == null) { name = a.GetValue(WorkflowMarkupSerializer.XClassProperty) as string; if (name != null && name.LastIndexOf(".") > 0) name = name.Substring(name.LastIndexOf('.') + 1); } else name = a.QualifiedName.Replace('.', '_'); } if (name == null) name = this.serializationManager.GetName(value); return name; } ////// Overridded to force siteing of all Activity based instances created, enabling /// code-only programmers to write activity.Activities.Add(new activityType()); /// public object CreateInstance(Type type, ICollection arguments, string name, bool addToContainer) { return this.serializationManager.CreateInstance(type, arguments, name, false); } public object GetService(Type serviceType) { object service = null; if (serviceType == typeof(IReferenceService)) service = new ActivityCodeDomReferenceService(this.serializationManager.GetService(serviceType) as IReferenceService); if (serviceType == typeof(IServiceContainer)) { service = serializationManager.GetService(serviceType); if (service == null) { service = serviceContainer; } } // If we haven't provded the service, try the serialization manager we wrap if( service == null) service = this.serializationManager.GetService(serviceType); // Last ditch effort, see if our consumer had added the service if (service == null) service = serviceContainer.GetService(serviceType); return service; } // work around : PD7's PrimitiveCodeDomSerializer does not handle well strings bigger than 200 characters, // we push our own version to fix it. public object GetSerializer(Type objectType, Type serializerType) { if (objectType == typeof(string)) { return PrimitiveCodeDomSerializer.Default; } else if (objectType != null && TypeProvider.IsAssignable(typeof(ICollection), objectType) && !objectType.IsArray && serializerType == typeof(CodeDomSerializer)) { PropertyDescriptor pd = Context[typeof(PropertyDescriptor)] as PropertyDescriptor; if (pd != null) { if (string.Equals(pd.Name, "SynchronizationHandles", StringComparison.Ordinal) && TypeProvider.IsAssignable(typeof(Activity), pd.ComponentType)) return new SynchronizationHandlesCodeDomSerializer(); } else { // If property descriptor is not available, we then look at the expression context. ExpressionContext context = Context[typeof(ExpressionContext)] as ExpressionContext; if (context != null && context.Expression is CodePropertyReferenceExpression && string.Equals(((CodePropertyReferenceExpression)context.Expression).PropertyName, "SynchronizationHandles", StringComparison.Ordinal)) return new SynchronizationHandlesCodeDomSerializer(); } } object serializer = this.serializationManager.GetSerializer(objectType, serializerType); if (!UseUserDefinedSerializer(objectType, serializerType)) serializer = new SerializableTypeCodeDomSerializer(serializer as CodeDomSerializer); return serializer; } // We add this custom serializable to handler serializable types so they don't go into the resources // as majority of our types will be serializable per WinOE runtime requirements. // Note: we will not overwrite any custom serializer behaviors. If the serializer does not come // from the Sytem.ComponentModel.dll, we will not overwrite it. private bool UseUserDefinedSerializer(Type objectType, Type serializerType) { if (objectType == null || serializerType == null) return true; //If objectType is not serializable or we are not looking for codedomserializer then use user defined serializer if (!objectType.IsSerializable || serializerType != typeof(CodeDomSerializer)) return true; //For primitives always honor user defined serializer if (objectType.IsPrimitive || objectType.IsEnum || objectType == typeof(string) || typeof(Activity).IsAssignableFrom(objectType)) return true; //If user has defined instance descriptor then we always serialize to a create expression so we honor //user defined serializer TypeConverter converter = TypeDescriptor.GetConverter(objectType); if (converter != null && converter.CanConvertTo(typeof(InstanceDescriptor))) return true; //If the serializer is a custom codedom serializer ie it does not come from our or system assembly //defining codedomserializer then always honor user's serializer as user needs a way to override the //serializartion process object serializer = this.serializationManager.GetSerializer(objectType, serializerType); if (serializer.GetType().Assembly != typeof(CodeDomSerializer).Assembly && serializer.GetType().Assembly != Assembly.GetExecutingAssembly() && serializer.GetType().Assembly != Assembly.Load(AssemblyRef.ActivitiesAssemblyRef)) return true; //Special case for UI objects they need to always come from the resource only if we are not compiling Activity activity = this.serializationManager.Context[typeof(Activity)] as Activity; if (activity != null && activity.Site != null && activity.Site.Container != null && objectType.Namespace != null && objectType.Namespace.Equals(typeof(System.Drawing.Image).Namespace)) return true; return false; } public object GetInstance(string name) { return this.serializationManager.GetInstance(name); } public void AddSerializationProvider(IDesignerSerializationProvider provider) { this.serializationManager.AddSerializationProvider(provider); } public void RemoveSerializationProvider(IDesignerSerializationProvider provider) { this.serializationManager.RemoveSerializationProvider(provider); } public void ReportError(object errorInformation) { this.serializationManager.ReportError(errorInformation); } public ContextStack Context { get { return this.serializationManager.Context; } } public event ResolveNameEventHandler ResolveName { add { this.resolveNameEventHandler += value; } remove { this.resolveNameEventHandler -= value; } } public PropertyDescriptorCollection Properties { get { return this.serializationManager.Properties; } } public Type GetType(string typeName) { Type type = this.serializationManager.GetType(typeName); if (type == null) { // if this is a design time time ITypeProvider typeProvider = this.GetService(typeof(ITypeProvider)) as ITypeProvider; if (typeProvider != null) type = typeProvider.GetType(typeName); } return type; } protected IDesignerSerializationManager SerializationManager { get { return this.serializationManager; } set { this.serializationManager = value; } } } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. namespace System.Workflow.ComponentModel.Serialization { using System; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; using System.Collections; using System.Resources; using System.Workflow.ComponentModel.Design; using System.Collections.Generic; using Microsoft.CSharp; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Compiler; using System.CodeDom.Compiler; using System.IO; using System.Reflection; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; #region Class ActivityCodeDomSerializationManager /// /// Serialization manager class for code only serialization which inherits from /// WorkflowMarkupSerializationManager and overrides the GetService method to return the /// code-only specific reference service. /// ////// Due to the fact that the base classes used by the code-only serializer from /// System.Design rely on the reference service to generate code variable ids, we /// need to supply our own version of the reference service, since the default /// generates invalid variable ids for Activity based classes. /// public class ActivityCodeDomSerializationManager : IDesignerSerializationManager { private ServiceContainer serviceContainer = null; private IDesignerSerializationManager serializationManager; private ResolveNameEventHandler resolveNameEventHandler; private EventHandler serializationCompleteEventHandler; public ActivityCodeDomSerializationManager(IDesignerSerializationManager manager) { if (manager == null) throw new ArgumentNullException("manager"); this.serializationManager = manager; this.serviceContainer = new ServiceContainer(); this.serializationManager.ResolveName += new ResolveNameEventHandler(OnResolveName); this.serializationManager.SerializationComplete += new EventHandler(OnSerializationComplete); if (this.serializationManager is DesignerSerializationManager) ((DesignerSerializationManager)this.serializationManager).SessionDisposed += new EventHandler(OnSessionDisposed); } void OnResolveName(object sender, ResolveNameEventArgs e) { if (this.resolveNameEventHandler != null) this.resolveNameEventHandler(this, e); } void OnSerializationComplete(object sender, EventArgs e) { if (this.serializationCompleteEventHandler != null) this.serializationCompleteEventHandler(this, e); } void OnSessionDisposed(object sender, EventArgs e) { try { if (this.serializationCompleteEventHandler != null) this.serializationCompleteEventHandler(this, EventArgs.Empty); } finally { this.resolveNameEventHandler = null; this.serializationCompleteEventHandler = null; } } public event System.EventHandler SerializationComplete { add { this.serializationCompleteEventHandler += value; } remove { this.serializationCompleteEventHandler -= value; } } public void SetName(object instance, string name) { // Need to check this since code dom deserialization tries to // set name twice on all object creation statements. if (GetInstance(name) != instance) this.serializationManager.SetName(instance, name); } [SuppressMessage("Microsoft.Globalization", "CA1307:SpecifyStringComparison", MessageId="System.String.LastIndexOf(System.String)", Justification="This is not a security threat since it is called only in XAML design time scenarios")] public string GetName(object value) { string name = null; Activity a = value as Activity; if (a != null ) { if (a.Parent == null) { name = a.GetValue(WorkflowMarkupSerializer.XClassProperty) as string; if (name != null && name.LastIndexOf(".") > 0) name = name.Substring(name.LastIndexOf('.') + 1); } else name = a.QualifiedName.Replace('.', '_'); } if (name == null) name = this.serializationManager.GetName(value); return name; } ////// Overridded to force siteing of all Activity based instances created, enabling /// code-only programmers to write activity.Activities.Add(new activityType()); /// public object CreateInstance(Type type, ICollection arguments, string name, bool addToContainer) { return this.serializationManager.CreateInstance(type, arguments, name, false); } public object GetService(Type serviceType) { object service = null; if (serviceType == typeof(IReferenceService)) service = new ActivityCodeDomReferenceService(this.serializationManager.GetService(serviceType) as IReferenceService); if (serviceType == typeof(IServiceContainer)) { service = serializationManager.GetService(serviceType); if (service == null) { service = serviceContainer; } } // If we haven't provded the service, try the serialization manager we wrap if( service == null) service = this.serializationManager.GetService(serviceType); // Last ditch effort, see if our consumer had added the service if (service == null) service = serviceContainer.GetService(serviceType); return service; } // work around : PD7's PrimitiveCodeDomSerializer does not handle well strings bigger than 200 characters, // we push our own version to fix it. public object GetSerializer(Type objectType, Type serializerType) { if (objectType == typeof(string)) { return PrimitiveCodeDomSerializer.Default; } else if (objectType != null && TypeProvider.IsAssignable(typeof(ICollection), objectType) && !objectType.IsArray && serializerType == typeof(CodeDomSerializer)) { PropertyDescriptor pd = Context[typeof(PropertyDescriptor)] as PropertyDescriptor; if (pd != null) { if (string.Equals(pd.Name, "SynchronizationHandles", StringComparison.Ordinal) && TypeProvider.IsAssignable(typeof(Activity), pd.ComponentType)) return new SynchronizationHandlesCodeDomSerializer(); } else { // If property descriptor is not available, we then look at the expression context. ExpressionContext context = Context[typeof(ExpressionContext)] as ExpressionContext; if (context != null && context.Expression is CodePropertyReferenceExpression && string.Equals(((CodePropertyReferenceExpression)context.Expression).PropertyName, "SynchronizationHandles", StringComparison.Ordinal)) return new SynchronizationHandlesCodeDomSerializer(); } } object serializer = this.serializationManager.GetSerializer(objectType, serializerType); if (!UseUserDefinedSerializer(objectType, serializerType)) serializer = new SerializableTypeCodeDomSerializer(serializer as CodeDomSerializer); return serializer; } // We add this custom serializable to handler serializable types so they don't go into the resources // as majority of our types will be serializable per WinOE runtime requirements. // Note: we will not overwrite any custom serializer behaviors. If the serializer does not come // from the Sytem.ComponentModel.dll, we will not overwrite it. private bool UseUserDefinedSerializer(Type objectType, Type serializerType) { if (objectType == null || serializerType == null) return true; //If objectType is not serializable or we are not looking for codedomserializer then use user defined serializer if (!objectType.IsSerializable || serializerType != typeof(CodeDomSerializer)) return true; //For primitives always honor user defined serializer if (objectType.IsPrimitive || objectType.IsEnum || objectType == typeof(string) || typeof(Activity).IsAssignableFrom(objectType)) return true; //If user has defined instance descriptor then we always serialize to a create expression so we honor //user defined serializer TypeConverter converter = TypeDescriptor.GetConverter(objectType); if (converter != null && converter.CanConvertTo(typeof(InstanceDescriptor))) return true; //If the serializer is a custom codedom serializer ie it does not come from our or system assembly //defining codedomserializer then always honor user's serializer as user needs a way to override the //serializartion process object serializer = this.serializationManager.GetSerializer(objectType, serializerType); if (serializer.GetType().Assembly != typeof(CodeDomSerializer).Assembly && serializer.GetType().Assembly != Assembly.GetExecutingAssembly() && serializer.GetType().Assembly != Assembly.Load(AssemblyRef.ActivitiesAssemblyRef)) return true; //Special case for UI objects they need to always come from the resource only if we are not compiling Activity activity = this.serializationManager.Context[typeof(Activity)] as Activity; if (activity != null && activity.Site != null && activity.Site.Container != null && objectType.Namespace != null && objectType.Namespace.Equals(typeof(System.Drawing.Image).Namespace)) return true; return false; } public object GetInstance(string name) { return this.serializationManager.GetInstance(name); } public void AddSerializationProvider(IDesignerSerializationProvider provider) { this.serializationManager.AddSerializationProvider(provider); } public void RemoveSerializationProvider(IDesignerSerializationProvider provider) { this.serializationManager.RemoveSerializationProvider(provider); } public void ReportError(object errorInformation) { this.serializationManager.ReportError(errorInformation); } public ContextStack Context { get { return this.serializationManager.Context; } } public event ResolveNameEventHandler ResolveName { add { this.resolveNameEventHandler += value; } remove { this.resolveNameEventHandler -= value; } } public PropertyDescriptorCollection Properties { get { return this.serializationManager.Properties; } } public Type GetType(string typeName) { Type type = this.serializationManager.GetType(typeName); if (type == null) { // if this is a design time time ITypeProvider typeProvider = this.GetService(typeof(ITypeProvider)) as ITypeProvider; if (typeProvider != null) type = typeProvider.GetType(typeName); } return type; } protected IDesignerSerializationManager SerializationManager { get { return this.serializationManager; } set { this.serializationManager = value; } } } #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
- ServiceInfo.cs
- RegionIterator.cs
- SystemResources.cs
- TextSpan.cs
- GetReadStreamResult.cs
- Manipulation.cs
- EntryPointNotFoundException.cs
- TimeIntervalCollection.cs
- GatewayDefinition.cs
- WebPartDescription.cs
- InputLanguage.cs
- ZoneIdentityPermission.cs
- SqlClientPermission.cs
- OLEDB_Util.cs
- ValidationResult.cs
- SqlNodeTypeOperators.cs
- Html32TextWriter.cs
- PropertyCondition.cs
- Array.cs
- SystemDiagnosticsSection.cs
- WindowsListViewGroupHelper.cs
- HwndHostAutomationPeer.cs
- XpsS0ValidatingLoader.cs
- DataGridTextBox.cs
- RequestSecurityTokenResponseCollection.cs
- WindowsToolbarAsMenu.cs
- XPathBuilder.cs
- TabControlDesigner.cs
- FieldNameLookup.cs
- ParsedAttributeCollection.cs
- EventHandlerList.cs
- SrgsSemanticInterpretationTag.cs
- Aggregates.cs
- HtmlInputReset.cs
- RIPEMD160Managed.cs
- OracleBFile.cs
- StaticSiteMapProvider.cs
- ThemeDirectoryCompiler.cs
- MemberListBinding.cs
- login.cs
- NullRuntimeConfig.cs
- XmlParserContext.cs
- RMEnrollmentPage3.cs
- PointAnimationUsingPath.cs
- SqlUtil.cs
- EdmFunction.cs
- EventItfInfo.cs
- AutomationProperties.cs
- OleDbFactory.cs
- ComponentEditorPage.cs
- WebConfigurationFileMap.cs
- BuildDependencySet.cs
- AssemblyResolver.cs
- RoleBoolean.cs
- BasicKeyConstraint.cs
- NativeRecognizer.cs
- SendingRequestEventArgs.cs
- DataTableCollection.cs
- RelOps.cs
- KeyGesture.cs
- AllMembershipCondition.cs
- PreloadedPackages.cs
- Int64Converter.cs
- Column.cs
- IsolatedStoragePermission.cs
- ReachPageContentSerializer.cs
- BadImageFormatException.cs
- FlatButtonAppearance.cs
- CurrentTimeZone.cs
- ActivityPreviewDesigner.cs
- CanonicalFontFamilyReference.cs
- ButtonPopupAdapter.cs
- MeshGeometry3D.cs
- SchemaName.cs
- EncryptedKey.cs
- SplineKeyFrames.cs
- CallTemplateAction.cs
- TimeSpanOrInfiniteConverter.cs
- AuthenticationConfig.cs
- ApplicationActivator.cs
- DiscreteKeyFrames.cs
- ContentType.cs
- CurrentChangingEventManager.cs
- BitmapCodecInfo.cs
- CodeLinePragma.cs
- Label.cs
- ManagedFilter.cs
- SqlStream.cs
- PropertyCondition.cs
- RegexMatchCollection.cs
- GridLengthConverter.cs
- BitmapEffectInputData.cs
- Perspective.cs
- Bits.cs
- XmlTextWriter.cs
- AutomationPropertyChangedEventArgs.cs
- OleServicesContext.cs
- DataObjectPastingEventArgs.cs
- PackageRelationshipCollection.cs
- ImmutableObjectAttribute.cs