//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ using Experimental.System.Messaging; using System; using System.ComponentModel; using System.ComponentModel.Design.Serialization; using System.Globalization; using System.Reflection; using System.Runtime.Serialization.Formatters; namespace Experimental.System.Messaging.Design { /// /// internal class MessageFormatterConverter : ExpandableObjectConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return (sourceType == typeof(string)); } /// /// /// Gets a value indicating whether this converter can /// convert an object to the given destination type using the context. /// public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(InstanceDescriptor)) { return true; } return base.CanConvertTo(context, destinationType); } /// /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value != null && value is string) { if (((string)value) == typeof(ActiveXMessageFormatter).Name) return new ActiveXMessageFormatter(); if (((string)value) == typeof(BinaryMessageFormatter).Name) return new BinaryMessageFormatter(); if (((string)value) == typeof(XmlMessageFormatter).Name) return new XmlMessageFormatter(); } return null; } /// /// public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType != null && destinationType == typeof(string)) { if (value == null) return Res.GetString(Res.toStringNone); return value.GetType().Name; } if (destinationType == typeof(InstanceDescriptor)) { if (value is XmlMessageFormatter) { XmlMessageFormatter f = (XmlMessageFormatter)value; ConstructorInfo ctor = typeof(XmlMessageFormatter).GetConstructor(new Type[] { typeof(string[]) }); if (ctor != null) { return new InstanceDescriptor(ctor, new object[] { f.TargetTypeNames }); } } else if (value is ActiveXMessageFormatter) { ConstructorInfo ctor = typeof(ActiveXMessageFormatter).GetConstructor(new Type[0]); if (ctor != null) { return new InstanceDescriptor(ctor, new object[0]); } } else if (value is BinaryMessageFormatter) { BinaryMessageFormatter f = (BinaryMessageFormatter)value; ConstructorInfo ctor = typeof(BinaryMessageFormatter).GetConstructor(new Type[] { typeof(FormatterAssemblyStyle), typeof(FormatterTypeStyle) }); if (ctor != null) { return new InstanceDescriptor(ctor, new object[] { f.TopObjectFormat, f.TypeFormat }); } } } return base.ConvertTo(context, culture, value, destinationType); } /// /// public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { StandardValuesCollection values = new StandardValuesCollection(new object[] { new ActiveXMessageFormatter(), new BinaryMessageFormatter(), new XmlMessageFormatter(), null }); return values; } public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; } /// /// public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } } }