You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			318 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			318 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | using System; | ||
|  | using System.Collections; | ||
|  | using System.Workflow.ComponentModel.Compiler; | ||
|  | using System.ComponentModel; | ||
|  | using System.ComponentModel.Design.Serialization; | ||
|  | using System.Workflow.ComponentModel.Serialization; | ||
|  | using System.ComponentModel.Design; | ||
|  | using System.Xml; | ||
|  | using System.Diagnostics; | ||
|  | using System.Collections.Generic; | ||
|  | 
 | ||
|  | namespace System.Workflow.ComponentModel.Serialization | ||
|  | { | ||
|  |     [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] | ||
|  |     public sealed class XmlnsDefinitionAttribute : Attribute | ||
|  |     { | ||
|  |         public XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace) | ||
|  |         { | ||
|  |             if (xmlNamespace == null) | ||
|  |                 throw new ArgumentNullException("xmlNamespace"); | ||
|  | 
 | ||
|  |             if (clrNamespace == null) | ||
|  |                 throw new ArgumentNullException("clrNamespace"); | ||
|  | 
 | ||
|  |             this.xmlNamespace = xmlNamespace; | ||
|  |             this.clrNamespace = clrNamespace; | ||
|  |         } | ||
|  |         public string XmlNamespace | ||
|  |         { | ||
|  |             get { return this.xmlNamespace; } | ||
|  |         } | ||
|  |         public string ClrNamespace | ||
|  |         { | ||
|  |             get { return this.clrNamespace; } | ||
|  |         } | ||
|  |         public string AssemblyName | ||
|  |         { | ||
|  |             get { return this.assemblyName; } | ||
|  |             set { this.assemblyName = value; } | ||
|  |         } | ||
|  | 
 | ||
|  |         private string xmlNamespace; | ||
|  |         private string clrNamespace; | ||
|  |         private string assemblyName; | ||
|  |     } | ||
|  | 
 | ||
|  |     [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] | ||
|  |     public sealed class XmlnsPrefixAttribute : Attribute | ||
|  |     { | ||
|  |         private string xmlNamespace; | ||
|  |         private string prefix; | ||
|  | 
 | ||
|  |         public XmlnsPrefixAttribute(string xmlNamespace, string prefix) | ||
|  |         { | ||
|  |             if (xmlNamespace == null) | ||
|  |                 throw new ArgumentNullException("xmlNamespace"); | ||
|  |             if (prefix == null) | ||
|  |                 throw new ArgumentNullException("prefix"); | ||
|  | 
 | ||
|  |             this.xmlNamespace = xmlNamespace; | ||
|  |             this.prefix = prefix; | ||
|  |         } | ||
|  |         public string XmlNamespace | ||
|  |         { | ||
|  |             get { return this.xmlNamespace; } | ||
|  |         } | ||
|  |         public string Prefix | ||
|  |         { | ||
|  |             get { return this.prefix; } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [AttributeUsage(AttributeTargets.Class)] | ||
|  |     public sealed class RuntimeNamePropertyAttribute : Attribute | ||
|  |     { | ||
|  |         private string name = null; | ||
|  |         public RuntimeNamePropertyAttribute(string name) | ||
|  |         { | ||
|  |             this.name = name; | ||
|  |         } | ||
|  |         public string Name | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 return this.name; | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] | ||
|  |     public sealed class ContentPropertyAttribute : Attribute | ||
|  |     { | ||
|  |         private string name; | ||
|  |         public ContentPropertyAttribute() { } | ||
|  |         public ContentPropertyAttribute(string name) | ||
|  |         { | ||
|  |             this.name = name; | ||
|  |         } | ||
|  |         public string Name | ||
|  |         { | ||
|  |             get { return this.name; } | ||
|  |         } | ||
|  |     } | ||
|  |     [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] | ||
|  |     public sealed class ConstructorArgumentAttribute : Attribute | ||
|  |     { | ||
|  |         private string argumentName; | ||
|  | 
 | ||
|  |         public ConstructorArgumentAttribute(string argumentName) | ||
|  |         { | ||
|  |             this.argumentName = argumentName; | ||
|  |         } | ||
|  |         public string ArgumentName | ||
|  |         { | ||
|  |             get { return this.argumentName; } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public abstract class MarkupExtension | ||
|  |     { | ||
|  |         public abstract object ProvideValue(IServiceProvider provider); | ||
|  |     } | ||
|  | 
 | ||
|  |     [DesignerSerializer(typeof(MarkupExtensionSerializer), typeof(WorkflowMarkupSerializer))] | ||
|  |     internal sealed class NullExtension : MarkupExtension | ||
|  |     { | ||
|  |         public NullExtension() { } | ||
|  |         public override object ProvideValue(IServiceProvider serviceProvider) | ||
|  |         { | ||
|  |             return null; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [DesignerSerializer(typeof(TypeExtensionSerializer), typeof(WorkflowMarkupSerializer))] | ||
|  |     internal sealed class TypeExtension : MarkupExtension | ||
|  |     { | ||
|  |         private string typeName; | ||
|  |         private Type type; | ||
|  | 
 | ||
|  |         public TypeExtension() { } | ||
|  | 
 | ||
|  |         public TypeExtension(string type) | ||
|  |         { | ||
|  |             if (type == null) | ||
|  |                 throw new ArgumentNullException("typeName"); | ||
|  | 
 | ||
|  |             this.typeName = type; | ||
|  |         } | ||
|  |         public TypeExtension(Type type) | ||
|  |         { | ||
|  |             if (type == null) | ||
|  |                 throw new ArgumentNullException("type"); | ||
|  | 
 | ||
|  |             this.type = type; | ||
|  |         } | ||
|  |         public override object ProvideValue(IServiceProvider provider) | ||
|  |         { | ||
|  |             if (this.type != null) | ||
|  |                 return this.type; | ||
|  | 
 | ||
|  |             if (provider == null) | ||
|  |                 throw new ArgumentNullException("provider"); | ||
|  | 
 | ||
|  |             if (this.typeName == null) | ||
|  |                 throw new InvalidOperationException("typename"); | ||
|  | 
 | ||
|  |             WorkflowMarkupSerializationManager manager = provider as WorkflowMarkupSerializationManager; | ||
|  |             if (manager == null) | ||
|  |                 throw new ArgumentNullException("provider"); | ||
|  | 
 | ||
|  |             XmlReader reader = manager.WorkflowMarkupStack[typeof(XmlReader)] as XmlReader; | ||
|  |             if (reader == null) | ||
|  |             { | ||
|  |                 Debug.Assert(false); | ||
|  |                 return this.typeName; | ||
|  |             } | ||
|  | 
 | ||
|  |             string typename = this.typeName.Trim(); | ||
|  |             string prefix = String.Empty; | ||
|  |             int typeIndex = typename.IndexOf(':'); | ||
|  |             if (typeIndex >= 0) | ||
|  |             { | ||
|  |                 prefix = typename.Substring(0, typeIndex); | ||
|  |                 typename = typename.Substring(typeIndex + 1); | ||
|  |                 type = manager.GetType(new XmlQualifiedName(typename, reader.LookupNamespace(prefix))); | ||
|  |                 if (type != null) | ||
|  |                     return type; | ||
|  | 
 | ||
|  |                 // To Support types whose assembly is not available, we need to still resolve the clr namespace | ||
|  |                 List<WorkflowMarkupSerializerMapping> xmlnsMappings = null; | ||
|  |                 if (manager.XmlNamespaceBasedMappings.TryGetValue(reader.LookupNamespace(prefix), out xmlnsMappings) && xmlnsMappings != null && xmlnsMappings.Count > 0) | ||
|  |                     return xmlnsMappings[0].ClrNamespace + "." + typename; | ||
|  |                 else | ||
|  |                     return typename; | ||
|  |             } | ||
|  |             type = manager.GetType(new XmlQualifiedName(typename, reader.LookupNamespace(string.Empty))); | ||
|  | 
 | ||
|  |             // To Support Beta2 format | ||
|  |             if (type == null) | ||
|  |             { | ||
|  |                 ITypeProvider typeProvider = provider.GetService(typeof(ITypeProvider)) as ITypeProvider; | ||
|  |                 if (typeProvider != null) | ||
|  |                     type = typeProvider.GetType(typename); | ||
|  | 
 | ||
|  |                 // If not design mode, get the value from serialization manager | ||
|  |                 // At design time, we need to get the type from ITypeProvider else | ||
|  |                 // we need to store the string in the hashtable we maintain internally | ||
|  |                 if (type == null && manager.GetService(typeof(ITypeResolutionService)) == null) | ||
|  |                     type = manager.SerializationManager.GetType(typename); | ||
|  |             } | ||
|  |             if (type != null) | ||
|  |                 return type; | ||
|  | 
 | ||
|  |             return this.typeName; | ||
|  |         } | ||
|  | 
 | ||
|  |         [DefaultValue(null)] | ||
|  |         [ConstructorArgument("type")] | ||
|  |         public string TypeName | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 if (this.type != null) | ||
|  |                     return this.type.FullName; | ||
|  |                 return this.typeName; | ||
|  |             } | ||
|  |             set | ||
|  |             { | ||
|  |                 if (value == null) | ||
|  |                     throw new ArgumentNullException("value"); | ||
|  | 
 | ||
|  |                 this.typeName = value; | ||
|  |             } | ||
|  |         } | ||
|  |         internal Type Type | ||
|  |         { | ||
|  |             get { return this.type; } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [ContentProperty("Items")] | ||
|  |     internal sealed class ArrayExtension : MarkupExtension | ||
|  |     { | ||
|  |         private ArrayList arrayElementList = new ArrayList(); | ||
|  |         private Type arrayType; | ||
|  | 
 | ||
|  |         public ArrayExtension() | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         public ArrayExtension(Type arrayType) | ||
|  |         { | ||
|  |             if (arrayType == null) | ||
|  |                 throw new ArgumentNullException("arrayType"); | ||
|  | 
 | ||
|  |             this.arrayType = arrayType; | ||
|  |         } | ||
|  | 
 | ||
|  |         public ArrayExtension(Array elements) | ||
|  |         { | ||
|  |             if (elements == null) | ||
|  |                 throw new ArgumentNullException("elements"); | ||
|  | 
 | ||
|  |             arrayElementList.AddRange(elements); | ||
|  |             this.arrayType = elements.GetType().GetElementType(); | ||
|  |         } | ||
|  | 
 | ||
|  |         // | ||
|  | 
 | ||
|  |         public Type Type | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 return this.arrayType; | ||
|  |             } | ||
|  | 
 | ||
|  |             set | ||
|  |             { | ||
|  |                 this.arrayType = value; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] | ||
|  |         public IList Items | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 return arrayElementList; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override object ProvideValue(IServiceProvider provider) | ||
|  |         { | ||
|  |             if (provider == null) | ||
|  |                 throw new ArgumentNullException("provider"); | ||
|  | 
 | ||
|  |             if (this.arrayType == null) | ||
|  |                 throw new InvalidOperationException("ArrayType needs to be set."); | ||
|  | 
 | ||
|  |             object retArray = null; | ||
|  |             try | ||
|  |             { | ||
|  |                 retArray = arrayElementList.ToArray(this.arrayType); | ||
|  |             } | ||
|  |             catch (System.InvalidCastException) | ||
|  |             { | ||
|  |                 // | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |                 throw new InvalidOperationException(); | ||
|  |             } | ||
|  | 
 | ||
|  |             return retArray; | ||
|  |         } | ||
|  |     } | ||
|  | } |