Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Runtime / Remoting / Soap.cs / 1305376 / Soap.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
/*============================================================
**
** File: Soap.cs
**
** Purpose: Classes used for SOAP configuration.
**
**
===========================================================*/
namespace System.Runtime.Remoting {
using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Metadata;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
using System.Threading;
using System.Diagnostics.Contracts;
using CultureInfo = System.Globalization.CultureInfo;
[System.Security.SecurityCritical] // auto-generated_required
[System.Runtime.InteropServices.ComVisible(true)]
public class SoapServices
{
// hide the default constructor
private SoapServices()
{
}
// tables for interop type maps (both map "name namespace" to a Type object)
private static Hashtable _interopXmlElementToType = Hashtable.Synchronized(new Hashtable());
private static Hashtable _interopTypeToXmlElement = Hashtable.Synchronized(new Hashtable());
private static Hashtable _interopXmlTypeToType = Hashtable.Synchronized(new Hashtable());
private static Hashtable _interopTypeToXmlType = Hashtable.Synchronized(new Hashtable());
private static Hashtable _xmlToFieldTypeMap = Hashtable.Synchronized(new Hashtable());
private static Hashtable _methodBaseToSoapAction = Hashtable.Synchronized(new Hashtable());
private static Hashtable _soapActionToMethodBase = Hashtable.Synchronized(new Hashtable());
private static String CreateKey(String elementName, String elementNamespace)
{
if (elementNamespace == null)
return elementName;
else
return elementName + " " + elementNamespace;
}
// Used for storing interop type mappings
private class XmlEntry
{
public String Name;
public String Namespace;
public XmlEntry(String name, String xmlNamespace)
{
Name = name;
Namespace = xmlNamespace;
}
} // class XmlEntry
// contains mappings for xml element and attribute names to actual field names.
private class XmlToFieldTypeMap
{
private class FieldEntry
{
public Type Type;
public String Name;
public FieldEntry(Type type, String name)
{
Type = type;
Name = name;
}
}
private Hashtable _attributes = new Hashtable();
private Hashtable _elements = new Hashtable();
public XmlToFieldTypeMap(){}
[System.Security.SecurityCritical] // auto-generated
public void AddXmlElement(Type fieldType, String fieldName,
String xmlElement, String xmlNamespace)
{
_elements[CreateKey(xmlElement, xmlNamespace)] =
new FieldEntry(fieldType, fieldName);
}
[System.Security.SecurityCritical] // auto-generated
public void AddXmlAttribute(Type fieldType, String fieldName,
String xmlAttribute, String xmlNamespace)
{
_attributes[CreateKey(xmlAttribute, xmlNamespace)] =
new FieldEntry(fieldType, fieldName);
}
[System.Security.SecurityCritical] // auto-generated
public void GetFieldTypeAndNameFromXmlElement(String xmlElement, String xmlNamespace,
out Type type, out String name)
{
FieldEntry field = (FieldEntry)_elements[CreateKey(xmlElement, xmlNamespace)];
if (field != null)
{
type = field.Type;
name = field.Name;
}
else
{
type = null;
name = null;
}
} // GetTypeFromXmlElement
[System.Security.SecurityCritical] // auto-generated
public void GetFieldTypeAndNameFromXmlAttribute(String xmlAttribute, String xmlNamespace,
out Type type, out String name)
{
FieldEntry field = (FieldEntry)_attributes[CreateKey(xmlAttribute, xmlNamespace)];
if (field != null)
{
type = field.Type;
name = field.Name;
}
else
{
type = null;
name = null;
}
} // GetTypeFromXmlAttribute
} // class XmlToFieldTypeMap
[System.Security.SecurityCritical] // auto-generated
public static void RegisterInteropXmlElement(String xmlElement, String xmlNamespace,
Type type)
{
_interopXmlElementToType[CreateKey(xmlElement, xmlNamespace)] = type;
_interopTypeToXmlElement[type] = new XmlEntry(xmlElement, xmlNamespace);
} // RegisterInteropXmlElement
[System.Security.SecurityCritical] // auto-generated
public static void RegisterInteropXmlType(String xmlType, String xmlTypeNamespace,
Type type)
{
_interopXmlTypeToType[CreateKey(xmlType, xmlTypeNamespace)] = type;
_interopTypeToXmlType[type] = new XmlEntry(xmlType, xmlTypeNamespace);
} // RegisterInteropXmlType
[System.Security.SecurityCritical] // auto-generated
public static void PreLoad(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
Contract.EndContractBlock();
if (!(type is RuntimeType))
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));
// register soap action values
MethodInfo[] methods = type.GetMethods();
foreach (MethodInfo mi in methods)
{
// This will only add an entry to the table if SoapAction was explicitly set
// on the SoapMethodAttribute.
RegisterSoapActionForMethodBase(mi);
}
// register interop xml elements and types if specified
SoapTypeAttribute attr = (SoapTypeAttribute)
InternalRemotingServices.GetCachedSoapAttribute(type);
if (attr.IsInteropXmlElement())
RegisterInteropXmlElement(attr.XmlElementName, attr.XmlNamespace, type);
if (attr.IsInteropXmlType())
RegisterInteropXmlType(attr.XmlTypeName, attr.XmlTypeNamespace, type);
// construct field maps for mapping xml elements and attributes back to
// the correct type
int mapCount = 0;
XmlToFieldTypeMap map = new XmlToFieldTypeMap();
foreach (FieldInfo field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly))
{
SoapFieldAttribute fieldAttr = (SoapFieldAttribute)
InternalRemotingServices.GetCachedSoapAttribute(field);
if (fieldAttr.IsInteropXmlElement())
{
String xmlName = fieldAttr.XmlElementName;
String xmlNamespace = fieldAttr.XmlNamespace;
if (fieldAttr.UseAttribute)
map.AddXmlAttribute(field.FieldType, field.Name, xmlName, xmlNamespace);
else
map.AddXmlElement(field.FieldType, field.Name, xmlName, xmlNamespace);
mapCount++;
}
} // foreach field
// add field map if there is more than one entry
if (mapCount > 0)
_xmlToFieldTypeMap[type] = map;
} // PreLoad
[System.Security.SecurityCritical] // auto-generated
public static void PreLoad(Assembly assembly)
{
if (assembly == null)
throw new ArgumentNullException("assembly");
Contract.EndContractBlock();
if (!(assembly is RuntimeAssembly))
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeAssembly"), "assembly");
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
PreLoad(type);
}
} // PreLoad
[System.Security.SecurityCritical] // auto-generated
public static Type GetInteropTypeFromXmlElement(String xmlElement, String xmlNamespace)
{
return (Type)_interopXmlElementToType[CreateKey(xmlElement, xmlNamespace)];
} // GetInteropTypeFromXmlElement
[System.Security.SecurityCritical] // auto-generated
public static Type GetInteropTypeFromXmlType(String xmlType, String xmlTypeNamespace)
{
return (Type)_interopXmlTypeToType[CreateKey(xmlType, xmlTypeNamespace)];
} // GetInteropTypeFromXmlElement
public static void GetInteropFieldTypeAndNameFromXmlElement(Type containingType,
String xmlElement, String xmlNamespace,
out Type type, out String name)
{
if (containingType == null)
{
type = null;
name = null;
return;
}
XmlToFieldTypeMap map = (XmlToFieldTypeMap)_xmlToFieldTypeMap[containingType];
if (map != null)
{
map.GetFieldTypeAndNameFromXmlElement(xmlElement, xmlNamespace,
out type, out name);
}
else
{
type = null;
name = null;
}
} // GetInteropFieldTypeFromXmlElement
public static void GetInteropFieldTypeAndNameFromXmlAttribute(Type containingType,
String xmlAttribute, String xmlNamespace,
out Type type, out String name)
{
if (containingType == null)
{
type = null;
name = null;
return;
}
XmlToFieldTypeMap map = (XmlToFieldTypeMap)_xmlToFieldTypeMap[containingType];
if (map != null)
{
map.GetFieldTypeAndNameFromXmlAttribute(xmlAttribute, xmlNamespace,
out type, out name);
}
else
{
type = null;
name = null;
}
} // GetInteropFieldTypeFromXmlAttribute
[System.Security.SecurityCritical] // auto-generated
public static bool GetXmlElementForInteropType(Type type,
out String xmlElement, out String xmlNamespace)
{
// check table first
XmlEntry entry = (XmlEntry)_interopTypeToXmlElement[type];
if (entry != null)
{
xmlElement = entry.Name;
xmlNamespace = entry.Namespace;
return true;
}
// check soap attribute
SoapTypeAttribute attr = (SoapTypeAttribute)
InternalRemotingServices.GetCachedSoapAttribute(type);
if (attr.IsInteropXmlElement())
{
xmlElement = attr.XmlElementName;
xmlNamespace = attr.XmlNamespace;
return true;
}
else
{
xmlElement = null;
xmlNamespace = null;
return false;
}
} // GetXmlElementForInteropType
[System.Security.SecurityCritical] // auto-generated
public static bool GetXmlTypeForInteropType(Type type,
out String xmlType, out String xmlTypeNamespace)
{
// check table first
XmlEntry entry = (XmlEntry)_interopTypeToXmlType[type];
if (entry != null)
{
xmlType = entry.Name;
xmlTypeNamespace = entry.Namespace;
return true;
}
// check soap attribute
SoapTypeAttribute attr = (SoapTypeAttribute)
InternalRemotingServices.GetCachedSoapAttribute(type);
if (attr.IsInteropXmlType())
{
xmlType = attr.XmlTypeName;
xmlTypeNamespace = attr.XmlTypeNamespace;
return true;
}
else
{
xmlType = null;
xmlTypeNamespace = null;
return false;
}
} // GetXmlTypeForInteropType
[System.Security.SecurityCritical] // auto-generated
public static String GetXmlNamespaceForMethodCall(MethodBase mb)
{
SoapMethodAttribute attr = (SoapMethodAttribute)
InternalRemotingServices.GetCachedSoapAttribute(mb);
return attr.XmlNamespace;
} // GetXmlNamespaceForMethodCall
[System.Security.SecurityCritical] // auto-generated
public static String GetXmlNamespaceForMethodResponse(MethodBase mb)
{
SoapMethodAttribute attr = (SoapMethodAttribute)
InternalRemotingServices.GetCachedSoapAttribute(mb);
return attr.ResponseXmlNamespace;
} // GetXmlNamespaceForMethodResponse
[System.Security.SecurityCritical] // auto-generated
public static void RegisterSoapActionForMethodBase(MethodBase mb)
{
SoapMethodAttribute attr =
(SoapMethodAttribute)InternalRemotingServices.GetCachedSoapAttribute(mb);
if (attr.SoapActionExplicitySet)
RegisterSoapActionForMethodBase(mb, attr.SoapAction);
} // RegisterSoapActionForMethodBase
public static void RegisterSoapActionForMethodBase(MethodBase mb, String soapAction)
{
if (soapAction != null)
{
_methodBaseToSoapAction[mb] = soapAction;
// get table of method bases
ArrayList mbTable = (ArrayList)_soapActionToMethodBase[soapAction];
if (mbTable == null)
{
lock (_soapActionToMethodBase)
{
mbTable = ArrayList.Synchronized(new ArrayList());
_soapActionToMethodBase[soapAction] = mbTable;
}
}
mbTable.Add(mb);
}
} // RegisterSoapActionForMethodBase
[System.Security.SecurityCritical] // auto-generated
public static String GetSoapActionFromMethodBase(MethodBase mb)
{
String soapAction = (String)_methodBaseToSoapAction[mb];
if (soapAction == null)
{
SoapMethodAttribute attr =
(SoapMethodAttribute)InternalRemotingServices.GetCachedSoapAttribute(mb);
soapAction = attr.SoapAction;
}
return soapAction;
} // GetSoapActionFromMethodBase
[System.Security.SecurityCritical] // auto-generated
public static bool IsSoapActionValidForMethodBase(String soapAction, MethodBase mb)
{
if (mb == null)
throw new ArgumentNullException("mb");
// remove quotation marks if present
if ((soapAction[0] == '"') && (soapAction[soapAction.Length - 1] == '"'))
soapAction = soapAction.Substring(1, soapAction.Length - 2);
// compare this to the soapAction on the method base
SoapMethodAttribute attr = (SoapMethodAttribute)
InternalRemotingServices.GetCachedSoapAttribute(mb);
if (String.CompareOrdinal(attr.SoapAction, soapAction) == 0)
return true;
// check to see if a soap action value is registered for this
String registeredSoapAction = (String)_methodBaseToSoapAction[mb];
if (registeredSoapAction != null)
{
if (String.CompareOrdinal(registeredSoapAction, soapAction) == 0)
return true;
}
// otherwise, parse SOAPAction and verify
String typeName, methodName;
String[] parts = soapAction.Split(new char[1]{'#'});
if (parts.Length == 2)
{
bool assemblyIncluded;
typeName = XmlNamespaceEncoder.GetTypeNameForSoapActionNamespace(
parts[0], out assemblyIncluded);
if (typeName == null)
return false;
methodName = parts[1];
// compare to values of method base (
RuntimeMethodInfo rmi = mb as RuntimeMethodInfo;
RuntimeConstructorInfo rci = mb as RuntimeConstructorInfo;
RuntimeModule rtModule;
if (rmi != null)
rtModule = rmi.GetRuntimeModule();
else if (rci != null)
rtModule = rci.GetRuntimeModule();
else
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeReflectionObject"));
String actualTypeName = mb.DeclaringType.FullName;
if (assemblyIncluded)
actualTypeName += ", " + rtModule.GetRuntimeAssembly().GetSimpleName();
// return true if type and method name are the same
return actualTypeName.Equals(typeName) && mb.Name.Equals(methodName);
}
else
return false;
} // IsSoapActionValidForMethodBase
public static bool GetTypeAndMethodNameFromSoapAction(String soapAction,
out String typeName,
out String methodName)
{
// remove quotation marks if present
if ((soapAction[0] == '"') && (soapAction[soapAction.Length - 1] == '"'))
soapAction = soapAction.Substring(1, soapAction.Length - 2);
ArrayList mbTable = (ArrayList)_soapActionToMethodBase[soapAction];
if (mbTable != null)
{
// indicate that we can't resolve soap action to type and method name
if (mbTable.Count > 1)
{
typeName = null;
methodName = null;
return false;
}
MethodBase mb = (MethodBase)mbTable[0];
if (mb != null)
{
// compare to values of method base (
RuntimeMethodInfo rmi = mb as RuntimeMethodInfo;
RuntimeConstructorInfo rci = mb as RuntimeConstructorInfo;
RuntimeModule rtModule;
if (rmi != null)
rtModule = rmi.GetRuntimeModule();
else if (rci != null)
rtModule = rci.GetRuntimeModule();
else
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeReflectionObject"));
typeName = mb.DeclaringType.FullName + ", " + rtModule.GetRuntimeAssembly().GetSimpleName();
methodName = mb.Name;
return true;
}
}
String[] parts = soapAction.Split(new char[1]{'#'});
if (parts.Length == 2)
{
bool assemblyIncluded;
typeName = XmlNamespaceEncoder.GetTypeNameForSoapActionNamespace(
parts[0], out assemblyIncluded);
if (typeName == null)
{
methodName = null;
return false;
}
methodName = parts[1];
return true;
}
else
{
typeName = null;
methodName = null;
return false;
}
} // GetTypeAndMethodNameFromSoapAction
//Future namespaces might be
// urn:a.clr.ms.com/assembly
// urn:n.clr.ms.com/typeNamespace
// urn:f.clr.ms.com/typeNamespace/assembly
//namespaces are
// http://schemas.microsoft.com/clr/assem/assembly
// http://schemas.microsoft.com/clr/ns/typeNamespace
// http://schemas.microsoft.com/clr/nsassem/typeNamespace/assembly
internal static String startNS = "http://schemas.microsoft.com/clr/";
internal static String assemblyNS = "http://schemas.microsoft.com/clr/assem/";
internal static String namespaceNS = "http://schemas.microsoft.com/clr/ns/";
internal static String fullNS = "http://schemas.microsoft.com/clr/nsassem/";
public static String XmlNsForClrType
{
get {return startNS;}
}
public static String XmlNsForClrTypeWithAssembly
{
get {return assemblyNS;}
}
public static String XmlNsForClrTypeWithNs
{
get {return namespaceNS;}
}
public static String XmlNsForClrTypeWithNsAndAssembly
{
get {return fullNS;}
}
public static bool IsClrTypeNamespace(String namespaceString)
{
if (namespaceString.StartsWith(startNS, StringComparison.Ordinal))
return true;
else
return false;
}
[System.Security.SecurityCritical] // auto-generated
public static String CodeXmlNamespaceForClrTypeNamespace(String typeNamespace, String assemblyName)
{
StringBuilder sb = new StringBuilder(256);
if (IsNameNull(typeNamespace))
{
if (IsNameNull(assemblyName))
throw new ArgumentNullException("typeNamespace"+",assemblyName");
else
{
sb.Append(assemblyNS);
UriEncode(assemblyName, sb);
}
}
else if (IsNameNull(assemblyName))
{
sb.Append(namespaceNS);
sb.Append(typeNamespace);
}
else
{
sb.Append(fullNS);
if (typeNamespace[0] == '.')
sb.Append(typeNamespace.Substring(1));
else
sb.Append(typeNamespace);
sb.Append('/');
UriEncode(assemblyName, sb);
}
return sb.ToString();
}
[System.Security.SecurityCritical] // auto-generated
public static bool DecodeXmlNamespaceForClrTypeNamespace(String inNamespace, out String typeNamespace, out String assemblyName)
{
if (IsNameNull(inNamespace))
throw new ArgumentNullException("inNamespace");
assemblyName = null;
typeNamespace = "";
if (inNamespace.StartsWith(assemblyNS, StringComparison.Ordinal))
assemblyName = UriDecode(inNamespace.Substring(assemblyNS.Length));
else if (inNamespace.StartsWith(namespaceNS, StringComparison.Ordinal))
typeNamespace = inNamespace.Substring(namespaceNS.Length);
else if (inNamespace.StartsWith(fullNS, StringComparison.Ordinal))
{
int index = inNamespace.IndexOf("/", fullNS.Length);
typeNamespace = inNamespace.Substring(fullNS.Length,index-fullNS.Length);
assemblyName = UriDecode(inNamespace.Substring(index+1));
}
else
return false;
return true;
}
internal static void UriEncode(String value, StringBuilder sb)
{
if (value == null || value.Length == 0)
return;
for (int i=0; i= 3))
{
if (value[i+1] == '2' && value[i+2] == '0')
{
sb.Append(' ');
i += 2;
}
else if (value[i+1] == '3' && value[i+2] == 'D')
{
sb.Append('=');
i += 2;
}
else if (value[i+1] == '2' && value[i+2] == 'C')
{
sb.Append(',');
i += 2;
}
else
sb.Append(value[i]);
}
else
sb.Append(value[i]);
}
return sb.ToString();
}
private static bool IsNameNull(String name)
{
if (name == null || name.Length == 0)
return true;
else
return false;
}
} // class SoapServices
internal static class XmlNamespaceEncoder
{
// <
[System.Security.SecurityCritical] // auto-generated
internal static String GetXmlNamespaceForType(RuntimeType type, String dynamicUrl)
{
String typeName = type.FullName;
RuntimeAssembly assem = type.GetRuntimeAssembly();
StringBuilder sb = new StringBuilder(256);
Assembly systemAssembly = typeof(String).Module.Assembly;
if(assem == systemAssembly)
{
sb.Append(SoapServices.namespaceNS);
sb.Append(typeName);
}
else
{
sb.Append(SoapServices.fullNS);
sb.Append(typeName);
sb.Append('/');
sb.Append(assem.GetSimpleName());
}
return sb.ToString();
} // GetXmlNamespaceForType
// encode a type namespace as an xml namespace (dynamic url is for types which have
// dynamically changing uri's, such as .SOAP files)
[System.Security.SecurityCritical] // auto-generated
internal static String GetXmlNamespaceForTypeNamespace(RuntimeType type, String dynamicUrl)
{
String typeNamespace = type.Namespace;
RuntimeAssembly assem = type.GetRuntimeAssembly();
StringBuilder sb = new StringBuilder(256);
Assembly systemAssembly = typeof(String).Module.Assembly;
if(assem == systemAssembly)
{
sb.Append(SoapServices.namespaceNS);
sb.Append(typeNamespace);
}
else
{
sb.Append(SoapServices.fullNS);
sb.Append(typeNamespace);
sb.Append('/');
sb.Append(assem.GetSimpleName());
}
return sb.ToString();
} // GetXmlNamespaceForTypeNamespace
// retrieve xml namespace that matches this type
[System.Security.SecurityCritical] // auto-generated
internal static String GetTypeNameForSoapActionNamespace(String uri, out bool assemblyIncluded)
{
assemblyIncluded = false;
String urtNSprefix = SoapServices.fullNS;
String systemNSprefix = SoapServices.namespaceNS;
if (uri.StartsWith(urtNSprefix, StringComparison.Ordinal))
{
uri = uri.Substring(urtNSprefix.Length); // now contains type/assembly
char[] sep = new char[]{'/'};
String[] parts = uri.Split(sep);
if (parts.Length != 2)
return null;
else
{
assemblyIncluded = true;
return parts[0] + ", " + parts[1];
}
}
if (uri.StartsWith(systemNSprefix, StringComparison.Ordinal))
{
String assemName = ((RuntimeAssembly)typeof(String).Module.Assembly).GetSimpleName();
assemblyIncluded = true;
return uri.Substring(systemNSprefix.Length) + ", " + assemName; // now contains type
}
return null;
} // GetTypeForXmlNamespace
} // XmlNamespaceEncoder
} // namespace
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
/*============================================================
**
** File: Soap.cs
**
** Purpose: Classes used for SOAP configuration.
**
**
===========================================================*/
namespace System.Runtime.Remoting {
using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Metadata;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
using System.Threading;
using System.Diagnostics.Contracts;
using CultureInfo = System.Globalization.CultureInfo;
[System.Security.SecurityCritical] // auto-generated_required
[System.Runtime.InteropServices.ComVisible(true)]
public class SoapServices
{
// hide the default constructor
private SoapServices()
{
}
// tables for interop type maps (both map "name namespace" to a Type object)
private static Hashtable _interopXmlElementToType = Hashtable.Synchronized(new Hashtable());
private static Hashtable _interopTypeToXmlElement = Hashtable.Synchronized(new Hashtable());
private static Hashtable _interopXmlTypeToType = Hashtable.Synchronized(new Hashtable());
private static Hashtable _interopTypeToXmlType = Hashtable.Synchronized(new Hashtable());
private static Hashtable _xmlToFieldTypeMap = Hashtable.Synchronized(new Hashtable());
private static Hashtable _methodBaseToSoapAction = Hashtable.Synchronized(new Hashtable());
private static Hashtable _soapActionToMethodBase = Hashtable.Synchronized(new Hashtable());
private static String CreateKey(String elementName, String elementNamespace)
{
if (elementNamespace == null)
return elementName;
else
return elementName + " " + elementNamespace;
}
// Used for storing interop type mappings
private class XmlEntry
{
public String Name;
public String Namespace;
public XmlEntry(String name, String xmlNamespace)
{
Name = name;
Namespace = xmlNamespace;
}
} // class XmlEntry
// contains mappings for xml element and attribute names to actual field names.
private class XmlToFieldTypeMap
{
private class FieldEntry
{
public Type Type;
public String Name;
public FieldEntry(Type type, String name)
{
Type = type;
Name = name;
}
}
private Hashtable _attributes = new Hashtable();
private Hashtable _elements = new Hashtable();
public XmlToFieldTypeMap(){}
[System.Security.SecurityCritical] // auto-generated
public void AddXmlElement(Type fieldType, String fieldName,
String xmlElement, String xmlNamespace)
{
_elements[CreateKey(xmlElement, xmlNamespace)] =
new FieldEntry(fieldType, fieldName);
}
[System.Security.SecurityCritical] // auto-generated
public void AddXmlAttribute(Type fieldType, String fieldName,
String xmlAttribute, String xmlNamespace)
{
_attributes[CreateKey(xmlAttribute, xmlNamespace)] =
new FieldEntry(fieldType, fieldName);
}
[System.Security.SecurityCritical] // auto-generated
public void GetFieldTypeAndNameFromXmlElement(String xmlElement, String xmlNamespace,
out Type type, out String name)
{
FieldEntry field = (FieldEntry)_elements[CreateKey(xmlElement, xmlNamespace)];
if (field != null)
{
type = field.Type;
name = field.Name;
}
else
{
type = null;
name = null;
}
} // GetTypeFromXmlElement
[System.Security.SecurityCritical] // auto-generated
public void GetFieldTypeAndNameFromXmlAttribute(String xmlAttribute, String xmlNamespace,
out Type type, out String name)
{
FieldEntry field = (FieldEntry)_attributes[CreateKey(xmlAttribute, xmlNamespace)];
if (field != null)
{
type = field.Type;
name = field.Name;
}
else
{
type = null;
name = null;
}
} // GetTypeFromXmlAttribute
} // class XmlToFieldTypeMap
[System.Security.SecurityCritical] // auto-generated
public static void RegisterInteropXmlElement(String xmlElement, String xmlNamespace,
Type type)
{
_interopXmlElementToType[CreateKey(xmlElement, xmlNamespace)] = type;
_interopTypeToXmlElement[type] = new XmlEntry(xmlElement, xmlNamespace);
} // RegisterInteropXmlElement
[System.Security.SecurityCritical] // auto-generated
public static void RegisterInteropXmlType(String xmlType, String xmlTypeNamespace,
Type type)
{
_interopXmlTypeToType[CreateKey(xmlType, xmlTypeNamespace)] = type;
_interopTypeToXmlType[type] = new XmlEntry(xmlType, xmlTypeNamespace);
} // RegisterInteropXmlType
[System.Security.SecurityCritical] // auto-generated
public static void PreLoad(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
Contract.EndContractBlock();
if (!(type is RuntimeType))
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));
// register soap action values
MethodInfo[] methods = type.GetMethods();
foreach (MethodInfo mi in methods)
{
// This will only add an entry to the table if SoapAction was explicitly set
// on the SoapMethodAttribute.
RegisterSoapActionForMethodBase(mi);
}
// register interop xml elements and types if specified
SoapTypeAttribute attr = (SoapTypeAttribute)
InternalRemotingServices.GetCachedSoapAttribute(type);
if (attr.IsInteropXmlElement())
RegisterInteropXmlElement(attr.XmlElementName, attr.XmlNamespace, type);
if (attr.IsInteropXmlType())
RegisterInteropXmlType(attr.XmlTypeName, attr.XmlTypeNamespace, type);
// construct field maps for mapping xml elements and attributes back to
// the correct type
int mapCount = 0;
XmlToFieldTypeMap map = new XmlToFieldTypeMap();
foreach (FieldInfo field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly))
{
SoapFieldAttribute fieldAttr = (SoapFieldAttribute)
InternalRemotingServices.GetCachedSoapAttribute(field);
if (fieldAttr.IsInteropXmlElement())
{
String xmlName = fieldAttr.XmlElementName;
String xmlNamespace = fieldAttr.XmlNamespace;
if (fieldAttr.UseAttribute)
map.AddXmlAttribute(field.FieldType, field.Name, xmlName, xmlNamespace);
else
map.AddXmlElement(field.FieldType, field.Name, xmlName, xmlNamespace);
mapCount++;
}
} // foreach field
// add field map if there is more than one entry
if (mapCount > 0)
_xmlToFieldTypeMap[type] = map;
} // PreLoad
[System.Security.SecurityCritical] // auto-generated
public static void PreLoad(Assembly assembly)
{
if (assembly == null)
throw new ArgumentNullException("assembly");
Contract.EndContractBlock();
if (!(assembly is RuntimeAssembly))
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeAssembly"), "assembly");
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
PreLoad(type);
}
} // PreLoad
[System.Security.SecurityCritical] // auto-generated
public static Type GetInteropTypeFromXmlElement(String xmlElement, String xmlNamespace)
{
return (Type)_interopXmlElementToType[CreateKey(xmlElement, xmlNamespace)];
} // GetInteropTypeFromXmlElement
[System.Security.SecurityCritical] // auto-generated
public static Type GetInteropTypeFromXmlType(String xmlType, String xmlTypeNamespace)
{
return (Type)_interopXmlTypeToType[CreateKey(xmlType, xmlTypeNamespace)];
} // GetInteropTypeFromXmlElement
public static void GetInteropFieldTypeAndNameFromXmlElement(Type containingType,
String xmlElement, String xmlNamespace,
out Type type, out String name)
{
if (containingType == null)
{
type = null;
name = null;
return;
}
XmlToFieldTypeMap map = (XmlToFieldTypeMap)_xmlToFieldTypeMap[containingType];
if (map != null)
{
map.GetFieldTypeAndNameFromXmlElement(xmlElement, xmlNamespace,
out type, out name);
}
else
{
type = null;
name = null;
}
} // GetInteropFieldTypeFromXmlElement
public static void GetInteropFieldTypeAndNameFromXmlAttribute(Type containingType,
String xmlAttribute, String xmlNamespace,
out Type type, out String name)
{
if (containingType == null)
{
type = null;
name = null;
return;
}
XmlToFieldTypeMap map = (XmlToFieldTypeMap)_xmlToFieldTypeMap[containingType];
if (map != null)
{
map.GetFieldTypeAndNameFromXmlAttribute(xmlAttribute, xmlNamespace,
out type, out name);
}
else
{
type = null;
name = null;
}
} // GetInteropFieldTypeFromXmlAttribute
[System.Security.SecurityCritical] // auto-generated
public static bool GetXmlElementForInteropType(Type type,
out String xmlElement, out String xmlNamespace)
{
// check table first
XmlEntry entry = (XmlEntry)_interopTypeToXmlElement[type];
if (entry != null)
{
xmlElement = entry.Name;
xmlNamespace = entry.Namespace;
return true;
}
// check soap attribute
SoapTypeAttribute attr = (SoapTypeAttribute)
InternalRemotingServices.GetCachedSoapAttribute(type);
if (attr.IsInteropXmlElement())
{
xmlElement = attr.XmlElementName;
xmlNamespace = attr.XmlNamespace;
return true;
}
else
{
xmlElement = null;
xmlNamespace = null;
return false;
}
} // GetXmlElementForInteropType
[System.Security.SecurityCritical] // auto-generated
public static bool GetXmlTypeForInteropType(Type type,
out String xmlType, out String xmlTypeNamespace)
{
// check table first
XmlEntry entry = (XmlEntry)_interopTypeToXmlType[type];
if (entry != null)
{
xmlType = entry.Name;
xmlTypeNamespace = entry.Namespace;
return true;
}
// check soap attribute
SoapTypeAttribute attr = (SoapTypeAttribute)
InternalRemotingServices.GetCachedSoapAttribute(type);
if (attr.IsInteropXmlType())
{
xmlType = attr.XmlTypeName;
xmlTypeNamespace = attr.XmlTypeNamespace;
return true;
}
else
{
xmlType = null;
xmlTypeNamespace = null;
return false;
}
} // GetXmlTypeForInteropType
[System.Security.SecurityCritical] // auto-generated
public static String GetXmlNamespaceForMethodCall(MethodBase mb)
{
SoapMethodAttribute attr = (SoapMethodAttribute)
InternalRemotingServices.GetCachedSoapAttribute(mb);
return attr.XmlNamespace;
} // GetXmlNamespaceForMethodCall
[System.Security.SecurityCritical] // auto-generated
public static String GetXmlNamespaceForMethodResponse(MethodBase mb)
{
SoapMethodAttribute attr = (SoapMethodAttribute)
InternalRemotingServices.GetCachedSoapAttribute(mb);
return attr.ResponseXmlNamespace;
} // GetXmlNamespaceForMethodResponse
[System.Security.SecurityCritical] // auto-generated
public static void RegisterSoapActionForMethodBase(MethodBase mb)
{
SoapMethodAttribute attr =
(SoapMethodAttribute)InternalRemotingServices.GetCachedSoapAttribute(mb);
if (attr.SoapActionExplicitySet)
RegisterSoapActionForMethodBase(mb, attr.SoapAction);
} // RegisterSoapActionForMethodBase
public static void RegisterSoapActionForMethodBase(MethodBase mb, String soapAction)
{
if (soapAction != null)
{
_methodBaseToSoapAction[mb] = soapAction;
// get table of method bases
ArrayList mbTable = (ArrayList)_soapActionToMethodBase[soapAction];
if (mbTable == null)
{
lock (_soapActionToMethodBase)
{
mbTable = ArrayList.Synchronized(new ArrayList());
_soapActionToMethodBase[soapAction] = mbTable;
}
}
mbTable.Add(mb);
}
} // RegisterSoapActionForMethodBase
[System.Security.SecurityCritical] // auto-generated
public static String GetSoapActionFromMethodBase(MethodBase mb)
{
String soapAction = (String)_methodBaseToSoapAction[mb];
if (soapAction == null)
{
SoapMethodAttribute attr =
(SoapMethodAttribute)InternalRemotingServices.GetCachedSoapAttribute(mb);
soapAction = attr.SoapAction;
}
return soapAction;
} // GetSoapActionFromMethodBase
[System.Security.SecurityCritical] // auto-generated
public static bool IsSoapActionValidForMethodBase(String soapAction, MethodBase mb)
{
if (mb == null)
throw new ArgumentNullException("mb");
// remove quotation marks if present
if ((soapAction[0] == '"') && (soapAction[soapAction.Length - 1] == '"'))
soapAction = soapAction.Substring(1, soapAction.Length - 2);
// compare this to the soapAction on the method base
SoapMethodAttribute attr = (SoapMethodAttribute)
InternalRemotingServices.GetCachedSoapAttribute(mb);
if (String.CompareOrdinal(attr.SoapAction, soapAction) == 0)
return true;
// check to see if a soap action value is registered for this
String registeredSoapAction = (String)_methodBaseToSoapAction[mb];
if (registeredSoapAction != null)
{
if (String.CompareOrdinal(registeredSoapAction, soapAction) == 0)
return true;
}
// otherwise, parse SOAPAction and verify
String typeName, methodName;
String[] parts = soapAction.Split(new char[1]{'#'});
if (parts.Length == 2)
{
bool assemblyIncluded;
typeName = XmlNamespaceEncoder.GetTypeNameForSoapActionNamespace(
parts[0], out assemblyIncluded);
if (typeName == null)
return false;
methodName = parts[1];
// compare to values of method base (
RuntimeMethodInfo rmi = mb as RuntimeMethodInfo;
RuntimeConstructorInfo rci = mb as RuntimeConstructorInfo;
RuntimeModule rtModule;
if (rmi != null)
rtModule = rmi.GetRuntimeModule();
else if (rci != null)
rtModule = rci.GetRuntimeModule();
else
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeReflectionObject"));
String actualTypeName = mb.DeclaringType.FullName;
if (assemblyIncluded)
actualTypeName += ", " + rtModule.GetRuntimeAssembly().GetSimpleName();
// return true if type and method name are the same
return actualTypeName.Equals(typeName) && mb.Name.Equals(methodName);
}
else
return false;
} // IsSoapActionValidForMethodBase
public static bool GetTypeAndMethodNameFromSoapAction(String soapAction,
out String typeName,
out String methodName)
{
// remove quotation marks if present
if ((soapAction[0] == '"') && (soapAction[soapAction.Length - 1] == '"'))
soapAction = soapAction.Substring(1, soapAction.Length - 2);
ArrayList mbTable = (ArrayList)_soapActionToMethodBase[soapAction];
if (mbTable != null)
{
// indicate that we can't resolve soap action to type and method name
if (mbTable.Count > 1)
{
typeName = null;
methodName = null;
return false;
}
MethodBase mb = (MethodBase)mbTable[0];
if (mb != null)
{
// compare to values of method base (
RuntimeMethodInfo rmi = mb as RuntimeMethodInfo;
RuntimeConstructorInfo rci = mb as RuntimeConstructorInfo;
RuntimeModule rtModule;
if (rmi != null)
rtModule = rmi.GetRuntimeModule();
else if (rci != null)
rtModule = rci.GetRuntimeModule();
else
throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeReflectionObject"));
typeName = mb.DeclaringType.FullName + ", " + rtModule.GetRuntimeAssembly().GetSimpleName();
methodName = mb.Name;
return true;
}
}
String[] parts = soapAction.Split(new char[1]{'#'});
if (parts.Length == 2)
{
bool assemblyIncluded;
typeName = XmlNamespaceEncoder.GetTypeNameForSoapActionNamespace(
parts[0], out assemblyIncluded);
if (typeName == null)
{
methodName = null;
return false;
}
methodName = parts[1];
return true;
}
else
{
typeName = null;
methodName = null;
return false;
}
} // GetTypeAndMethodNameFromSoapAction
//Future namespaces might be
// urn:a.clr.ms.com/assembly
// urn:n.clr.ms.com/typeNamespace
// urn:f.clr.ms.com/typeNamespace/assembly
//namespaces are
// http://schemas.microsoft.com/clr/assem/assembly
// http://schemas.microsoft.com/clr/ns/typeNamespace
// http://schemas.microsoft.com/clr/nsassem/typeNamespace/assembly
internal static String startNS = "http://schemas.microsoft.com/clr/";
internal static String assemblyNS = "http://schemas.microsoft.com/clr/assem/";
internal static String namespaceNS = "http://schemas.microsoft.com/clr/ns/";
internal static String fullNS = "http://schemas.microsoft.com/clr/nsassem/";
public static String XmlNsForClrType
{
get {return startNS;}
}
public static String XmlNsForClrTypeWithAssembly
{
get {return assemblyNS;}
}
public static String XmlNsForClrTypeWithNs
{
get {return namespaceNS;}
}
public static String XmlNsForClrTypeWithNsAndAssembly
{
get {return fullNS;}
}
public static bool IsClrTypeNamespace(String namespaceString)
{
if (namespaceString.StartsWith(startNS, StringComparison.Ordinal))
return true;
else
return false;
}
[System.Security.SecurityCritical] // auto-generated
public static String CodeXmlNamespaceForClrTypeNamespace(String typeNamespace, String assemblyName)
{
StringBuilder sb = new StringBuilder(256);
if (IsNameNull(typeNamespace))
{
if (IsNameNull(assemblyName))
throw new ArgumentNullException("typeNamespace"+",assemblyName");
else
{
sb.Append(assemblyNS);
UriEncode(assemblyName, sb);
}
}
else if (IsNameNull(assemblyName))
{
sb.Append(namespaceNS);
sb.Append(typeNamespace);
}
else
{
sb.Append(fullNS);
if (typeNamespace[0] == '.')
sb.Append(typeNamespace.Substring(1));
else
sb.Append(typeNamespace);
sb.Append('/');
UriEncode(assemblyName, sb);
}
return sb.ToString();
}
[System.Security.SecurityCritical] // auto-generated
public static bool DecodeXmlNamespaceForClrTypeNamespace(String inNamespace, out String typeNamespace, out String assemblyName)
{
if (IsNameNull(inNamespace))
throw new ArgumentNullException("inNamespace");
assemblyName = null;
typeNamespace = "";
if (inNamespace.StartsWith(assemblyNS, StringComparison.Ordinal))
assemblyName = UriDecode(inNamespace.Substring(assemblyNS.Length));
else if (inNamespace.StartsWith(namespaceNS, StringComparison.Ordinal))
typeNamespace = inNamespace.Substring(namespaceNS.Length);
else if (inNamespace.StartsWith(fullNS, StringComparison.Ordinal))
{
int index = inNamespace.IndexOf("/", fullNS.Length);
typeNamespace = inNamespace.Substring(fullNS.Length,index-fullNS.Length);
assemblyName = UriDecode(inNamespace.Substring(index+1));
}
else
return false;
return true;
}
internal static void UriEncode(String value, StringBuilder sb)
{
if (value == null || value.Length == 0)
return;
for (int i=0; i= 3))
{
if (value[i+1] == '2' && value[i+2] == '0')
{
sb.Append(' ');
i += 2;
}
else if (value[i+1] == '3' && value[i+2] == 'D')
{
sb.Append('=');
i += 2;
}
else if (value[i+1] == '2' && value[i+2] == 'C')
{
sb.Append(',');
i += 2;
}
else
sb.Append(value[i]);
}
else
sb.Append(value[i]);
}
return sb.ToString();
}
private static bool IsNameNull(String name)
{
if (name == null || name.Length == 0)
return true;
else
return false;
}
} // class SoapServices
internal static class XmlNamespaceEncoder
{
// <
[System.Security.SecurityCritical] // auto-generated
internal static String GetXmlNamespaceForType(RuntimeType type, String dynamicUrl)
{
String typeName = type.FullName;
RuntimeAssembly assem = type.GetRuntimeAssembly();
StringBuilder sb = new StringBuilder(256);
Assembly systemAssembly = typeof(String).Module.Assembly;
if(assem == systemAssembly)
{
sb.Append(SoapServices.namespaceNS);
sb.Append(typeName);
}
else
{
sb.Append(SoapServices.fullNS);
sb.Append(typeName);
sb.Append('/');
sb.Append(assem.GetSimpleName());
}
return sb.ToString();
} // GetXmlNamespaceForType
// encode a type namespace as an xml namespace (dynamic url is for types which have
// dynamically changing uri's, such as .SOAP files)
[System.Security.SecurityCritical] // auto-generated
internal static String GetXmlNamespaceForTypeNamespace(RuntimeType type, String dynamicUrl)
{
String typeNamespace = type.Namespace;
RuntimeAssembly assem = type.GetRuntimeAssembly();
StringBuilder sb = new StringBuilder(256);
Assembly systemAssembly = typeof(String).Module.Assembly;
if(assem == systemAssembly)
{
sb.Append(SoapServices.namespaceNS);
sb.Append(typeNamespace);
}
else
{
sb.Append(SoapServices.fullNS);
sb.Append(typeNamespace);
sb.Append('/');
sb.Append(assem.GetSimpleName());
}
return sb.ToString();
} // GetXmlNamespaceForTypeNamespace
// retrieve xml namespace that matches this type
[System.Security.SecurityCritical] // auto-generated
internal static String GetTypeNameForSoapActionNamespace(String uri, out bool assemblyIncluded)
{
assemblyIncluded = false;
String urtNSprefix = SoapServices.fullNS;
String systemNSprefix = SoapServices.namespaceNS;
if (uri.StartsWith(urtNSprefix, StringComparison.Ordinal))
{
uri = uri.Substring(urtNSprefix.Length); // now contains type/assembly
char[] sep = new char[]{'/'};
String[] parts = uri.Split(sep);
if (parts.Length != 2)
return null;
else
{
assemblyIncluded = true;
return parts[0] + ", " + parts[1];
}
}
if (uri.StartsWith(systemNSprefix, StringComparison.Ordinal))
{
String assemName = ((RuntimeAssembly)typeof(String).Module.Assembly).GetSimpleName();
assemblyIncluded = true;
return uri.Substring(systemNSprefix.Length) + ", " + assemName; // now contains type
}
return null;
} // GetTypeForXmlNamespace
} // XmlNamespaceEncoder
} // namespace
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CqlLexerHelpers.cs
- QuaternionAnimation.cs
- TypeConverterMarkupExtension.cs
- ScaleTransform.cs
- TextLineResult.cs
- CounterSetInstanceCounterDataSet.cs
- TableAutomationPeer.cs
- SqlDataSourceView.cs
- HierarchicalDataBoundControlAdapter.cs
- InternalBufferOverflowException.cs
- ListBase.cs
- InheritablePropertyChangeInfo.cs
- InstanceNormalEvent.cs
- CatalogPart.cs
- FileLoadException.cs
- HttpCookie.cs
- PropertyChangingEventArgs.cs
- Predicate.cs
- DbCommandTree.cs
- ExtractorMetadata.cs
- TreeNode.cs
- BamlCollectionHolder.cs
- httpapplicationstate.cs
- XmlSchemaCompilationSettings.cs
- AssociationSetEnd.cs
- FormViewRow.cs
- SimpleHandlerBuildProvider.cs
- ExceptionRoutedEventArgs.cs
- AmbiguousMatchException.cs
- XmlSecureResolver.cs
- LateBoundBitmapDecoder.cs
- VarInfo.cs
- DBConcurrencyException.cs
- ContextMarshalException.cs
- ApplicationServiceHelper.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- Timer.cs
- FilteredXmlReader.cs
- WebPartManagerInternals.cs
- ObjectSpanRewriter.cs
- ManualResetEvent.cs
- DSACryptoServiceProvider.cs
- ConfigurationPropertyCollection.cs
- CollectionsUtil.cs
- CodeGeneratorOptions.cs
- JsonSerializer.cs
- BinaryObjectReader.cs
- BitmapEffectInput.cs
- WindowsImpersonationContext.cs
- TableSectionStyle.cs
- PropertiesTab.cs
- WebOperationContext.cs
- DataGridViewBindingCompleteEventArgs.cs
- GridView.cs
- ParenthesizePropertyNameAttribute.cs
- CompositeScriptReference.cs
- X509Certificate2Collection.cs
- PrincipalPermission.cs
- WSSecurityTokenSerializer.cs
- OrderPreservingPipeliningMergeHelper.cs
- TextWriterEngine.cs
- DoubleLinkList.cs
- Int64AnimationBase.cs
- RuleConditionDialog.cs
- WorkflowInstance.cs
- WindowCollection.cs
- DataGridViewCellValidatingEventArgs.cs
- SqlFormatter.cs
- SoapIncludeAttribute.cs
- ChoiceConverter.cs
- SerializationInfo.cs
- LineServicesRun.cs
- SerializationTrace.cs
- InputLanguageProfileNotifySink.cs
- SafeSecurityHandles.cs
- DataSourceConverter.cs
- _WinHttpWebProxyDataBuilder.cs
- HostedElements.cs
- JournalNavigationScope.cs
- NameValueSectionHandler.cs
- SqlConnectionHelper.cs
- HtmlInputSubmit.cs
- ControlDesigner.cs
- SerializationInfoEnumerator.cs
- MatrixKeyFrameCollection.cs
- GeometryDrawing.cs
- MetadataCache.cs
- RbTree.cs
- XamlTreeBuilderBamlRecordWriter.cs
- ObjectIDGenerator.cs
- SharedStatics.cs
- WeakReadOnlyCollection.cs
- MatrixValueSerializer.cs
- SocketAddress.cs
- ScrollProviderWrapper.cs
- ColorMatrix.cs
- TypeBrowser.xaml.cs
- SspiNegotiationTokenAuthenticatorState.cs
- ConnectionManagementElementCollection.cs
- XmlBoundElement.cs