File: System\ServiceModel\XamlIntegration\XNameTypeConverter.cs
Project: ndp\cdf\src\NetFx40\System.ServiceModel.Activities\System.ServiceModel.Activities.csproj (System.ServiceModel.Activities)
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
 
namespace System.ServiceModel.XamlIntegration
{
    using System.ComponentModel;
    using System.Diagnostics.CodeAnalysis;
    using System.Globalization;
    using System.Runtime;
    using System.Xaml;
    using System.Xml.Linq;
      
    internal static class XNameTypeConverterHelper
    {
        public static bool CanConvertFrom(Type sourceType)
        {
            return sourceType == typeof(string);
        }
        public static object ConvertFrom(ITypeDescriptorContext context, object value)
        {
            return XNameTypeConverterHelper.ConvertFromHelper(context, value);
        }
        public static bool CanConvertTo(Type destinationType)
        {
            return destinationType == typeof(string);
        }
        public static object ConvertTo(ITypeDescriptorContext context, object value, Type destinationType)
        {
            return XNameTypeConverterHelper.ConvertToHelper(context, value, destinationType);
        }
 
        internal static object ConvertFromHelper(ITypeDescriptorContext context, object value)
        {
            if (value == null)
            {
                return null;
            }
 
            String stringValue = value as String;
            if (stringValue == null)
            {
                return null;
            }
 
            stringValue = stringValue.Trim();
            if (stringValue == String.Empty)
            {
                return null;
            }
 
            IXamlNamespaceResolver resolver =
                context.GetService(typeof(IXamlNamespaceResolver)) as IXamlNamespaceResolver;
            if (resolver == null)
            {
                return null;
            }
 
            if (stringValue[0] == '{')
            {
                return XName.Get(stringValue);
            }
 
            int indexOfColon = stringValue.IndexOf(':');
            string prefix, localName;
            if (indexOfColon >= 0)
            {
                prefix = stringValue.Substring(0, indexOfColon);
                localName = stringValue.Substring(indexOfColon + 1);
            }
            else
            {
                prefix = string.Empty;
                localName = stringValue;
            }
 
            string ns = resolver.GetNamespace(prefix);
            if (ns == null)
            {
                throw FxTrace.Exception.AsError(new FormatException(SRCore.CouldNotResolveNamespacePrefix(prefix)));                
            }
 
            return XName.Get(localName, ns);
        }
 
        internal static object ConvertToHelper(ITypeDescriptorContext context, object value, Type destinationType)
        {
            XName name = value as XName;
            if (destinationType == typeof(string) && name != null)
            {
                if (context != null)
                {
                    var lookupPrefix = (INamespacePrefixLookup)context.GetService(typeof(INamespacePrefixLookup));
                    if (lookupPrefix != null)
                    {
                        string prefix = lookupPrefix.LookupPrefix(name.Namespace.NamespaceName);
                        if (String.IsNullOrEmpty(prefix))
                        {
                            // Default namespace is in scope
                            //
                            return name.LocalName;
                        }
                        else
                        {
                            return prefix + ":" + name.LocalName;
                        }
                    }
                }
            }
            return null;
        }
    }
}