We need you! We're working hard on the next version of Developer Fusion - Let us know what you think we should be up to!

The Labs \ Source Viewer \ SSCLI \ System.Runtime.Serialization.Formatters.Soap \ Converter

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. //============================================================
  16. //
  17. // Class: Converter
  18. // Purpose: Hexify and bin.base64 conversions
  19. //
  20. // Date: June 10, 1999
  21. //
  22. //============================================================
  23. namespace System.Runtime.Serialization.Formatters.Soap
  24. {
  25.     using System.Threading;
  26.     using System.Runtime.Remoting;
  27.     using System.Runtime.Remoting.Metadata;
  28.     using System.Runtime.Remoting.Metadata.W3cXsd2001;
  29.     using System.Runtime.Serialization;
  30.     using System;
  31.     using System.Reflection;
  32.     using System.Globalization;
  33.     using System.Text;
  34.     using System.Security.Permissions;
  35.    
  36.     internal sealed class Converter
  37.     {
  38.         private Converter()
  39.         {
  40.         }
  41.        
  42.        
  43.         private static int primitiveTypeEnumLength = 46;
  44.         //Number of PrimitiveTypeEnums
  45.         // The following section are utilities to read and write XML types
  46.        
  47.         // Translates a runtime type into an enumeration code
  48.        
  49.         static internal InternalPrimitiveTypeE SoapToCode(Type type)
  50.         {
  51.             return ToCode(type);
  52.         }
  53.        
  54.         static internal InternalPrimitiveTypeE ToCode(Type type)
  55.         {
  56.             InternalST.Soap("Converter", "ToCode Type Entry ", type, " IsEnum " + type.IsEnum);
  57.             InternalPrimitiveTypeE code = InternalPrimitiveTypeE.Invalid;
  58.             if (type.IsEnum)
  59.                 return code = InternalPrimitiveTypeE.Invalid;
  60.            
  61.             TypeCode typeCode = Type.GetTypeCode(type);
  62.            
  63.             if (typeCode == TypeCode.Object) {
  64.                 if (typeofISoapXsd.IsAssignableFrom(type)) {
  65.                     if (type == typeofSoapTime)
  66.                         code = InternalPrimitiveTypeE.Time;
  67.                     else if (type == typeofSoapDate)
  68.                         code = InternalPrimitiveTypeE.Date;
  69.                     else if (type == typeofSoapYearMonth)
  70.                         code = InternalPrimitiveTypeE.YearMonth;
  71.                     else if (type == typeofSoapYear)
  72.                         code = InternalPrimitiveTypeE.Year;
  73.                     else if (type == typeofSoapMonthDay)
  74.                         code = InternalPrimitiveTypeE.MonthDay;
  75.                     else if (type == typeofSoapDay)
  76.                         code = InternalPrimitiveTypeE.Day;
  77.                     else if (type == typeofSoapMonth)
  78.                         code = InternalPrimitiveTypeE.Month;
  79.                     else if (type == typeofSoapHexBinary)
  80.                         code = InternalPrimitiveTypeE.HexBinary;
  81.                     else if (type == typeofSoapBase64Binary)
  82.                         code = InternalPrimitiveTypeE.Base64Binary;
  83.                     else if (type == typeofSoapInteger)
  84.                         code = InternalPrimitiveTypeE.Integer;
  85.                     else if (type == typeofSoapPositiveInteger)
  86.                         code = InternalPrimitiveTypeE.PositiveInteger;
  87.                     else if (type == typeofSoapNonPositiveInteger)
  88.                         code = InternalPrimitiveTypeE.NonPositiveInteger;
  89.                     else if (type == typeofSoapNonNegativeInteger)
  90.                         code = InternalPrimitiveTypeE.NonNegativeInteger;
  91.                     else if (type == typeofSoapNegativeInteger)
  92.                         code = InternalPrimitiveTypeE.NegativeInteger;
  93.                     else if (type == typeofSoapAnyUri)
  94.                         code = InternalPrimitiveTypeE.AnyUri;
  95.                     else if (type == typeofSoapQName)
  96.                         code = InternalPrimitiveTypeE.QName;
  97.                     else if (type == typeofSoapNotation)
  98.                         code = InternalPrimitiveTypeE.Notation;
  99.                     else if (type == typeofSoapNormalizedString)
  100.                         code = InternalPrimitiveTypeE.NormalizedString;
  101.                     else if (type == typeofSoapToken)
  102.                         code = InternalPrimitiveTypeE.Token;
  103.                     else if (type == typeofSoapLanguage)
  104.                         code = InternalPrimitiveTypeE.Language;
  105.                     else if (type == typeofSoapName)
  106.                         code = InternalPrimitiveTypeE.Name;
  107.                     else if (type == typeofSoapIdrefs)
  108.                         code = InternalPrimitiveTypeE.Idrefs;
  109.                     else if (type == typeofSoapEntities)
  110.                         code = InternalPrimitiveTypeE.Entities;
  111.                     else if (type == typeofSoapNmtoken)
  112.                         code = InternalPrimitiveTypeE.Nmtoken;
  113.                     else if (type == typeofSoapNmtokens)
  114.                         code = InternalPrimitiveTypeE.Nmtokens;
  115.                     else if (type == typeofSoapNcName)
  116.                         code = InternalPrimitiveTypeE.NcName;
  117.                     else if (type == typeofSoapId)
  118.                         code = InternalPrimitiveTypeE.Id;
  119.                     else if (type == typeofSoapIdref)
  120.                         code = InternalPrimitiveTypeE.Idref;
  121.                     else if (type == typeofSoapEntity)
  122.                         code = InternalPrimitiveTypeE.Entity;
  123.                 }
  124.                 else {
  125.                     if (type == typeofTimeSpan)
  126.                         code = InternalPrimitiveTypeE.TimeSpan;
  127.                     else
  128.                         code = InternalPrimitiveTypeE.Invalid;
  129.                 }
  130.             }
  131.             else
  132.                 code = ToPrimitiveTypeEnum(typeCode);
  133.            
  134.             InternalST.Soap("Converter", "ToCode Exit ", ((Enum)code).ToString());
  135.             return code;
  136.         }
  137.        
  138.        
  139.         // Translates a String into a runtime type enumeration code.
  140.         // The types translated are COM+ runtime types and XML Data Types
  141.        
  142.         static internal InternalPrimitiveTypeE ToCode(string value)
  143.         {
  144.             InternalST.Soap("Converter", "ToCode String Entry ", value);
  145.             if (value == null)
  146.                 throw new ArgumentNullException("serParser", String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("ArgumentNull_WithParamName"), value));
  147.            
  148.             string lxsdType = value.ToLower(CultureInfo.InvariantCulture);
  149.             char firstChar = lxsdType[0];
  150.             InternalPrimitiveTypeE code = InternalPrimitiveTypeE.Invalid;
  151.            
  152.             switch (firstChar) {
  153.                 case 'a':
  154.                     if (lxsdType == "anyuri")
  155.                         code = InternalPrimitiveTypeE.AnyUri;
  156.                    
  157.                     break;
  158.                 case 'b':
  159.                     if (lxsdType == "boolean")
  160.                         code = InternalPrimitiveTypeE.Boolean;
  161.                     else if (lxsdType == "byte")
  162.                         code = InternalPrimitiveTypeE.SByte;
  163.                     else if (lxsdType == "base64binary")
  164.                         code = InternalPrimitiveTypeE.Base64Binary;
  165.                     else if (lxsdType == "base64")
  166.                         code = InternalPrimitiveTypeE.Base64Binary;
  167.                     break;
  168.                 case 'c':
  169.                     if ((lxsdType == "char") || (lxsdType == "character"))
  170.                         // Not xsd types
  171.                         code = InternalPrimitiveTypeE.Char;
  172.                     break;
  173.                 case 'd':
  174.                    
  175.                     if (lxsdType == "double")
  176.                         code = InternalPrimitiveTypeE.Double;
  177.                     if (lxsdType == "datetime")
  178.                         code = InternalPrimitiveTypeE.DateTime;
  179.                     else if (lxsdType == "duration")
  180.                         code = InternalPrimitiveTypeE.TimeSpan;
  181.                     else if (lxsdType == "date")
  182.                         code = InternalPrimitiveTypeE.Date;
  183.                     else if (lxsdType == "decimal")
  184.                         code = InternalPrimitiveTypeE.Decimal;
  185.                    
  186.                     break;
  187.                 case 'e':
  188.                     if (lxsdType == "entities")
  189.                         code = InternalPrimitiveTypeE.Entities;
  190.                     else if (lxsdType == "entity")
  191.                         code = InternalPrimitiveTypeE.Entity;
  192.                     break;
  193.                 case 'f':
  194.                     if (lxsdType == "float")
  195.                         code = InternalPrimitiveTypeE.Single;
  196.                     break;
  197.                 case 'g':
  198.                     if (lxsdType == "gyearmonth")
  199.                         code = InternalPrimitiveTypeE.YearMonth;
  200.                     else if (lxsdType == "gyear")
  201.                         code = InternalPrimitiveTypeE.Year;
  202.                     else if (lxsdType == "gmonthday")
  203.                         code = InternalPrimitiveTypeE.MonthDay;
  204.                     else if (lxsdType == "gday")
  205.                         code = InternalPrimitiveTypeE.Day;
  206.                     else if (lxsdType == "gmonth")
  207.                         code = InternalPrimitiveTypeE.Month;
  208.                     break;
  209.                 case 'h':
  210.                     if (lxsdType == "hexbinary")
  211.                         code = InternalPrimitiveTypeE.HexBinary;
  212.                     break;
  213.                 case 'i':
  214.                     if (lxsdType == "int")
  215.                         code = InternalPrimitiveTypeE.Int32;
  216.                     if (lxsdType == "integer")
  217.                         code = InternalPrimitiveTypeE.Integer;
  218.                     else if (lxsdType == "idrefs")
  219.                         code = InternalPrimitiveTypeE.Idrefs;
  220.                     else if (lxsdType == "id")
  221.                         code = InternalPrimitiveTypeE.Id;
  222.                     else if (lxsdType == "idref")
  223.                         code = InternalPrimitiveTypeE.Idref;
  224.                     break;
  225.                 case 'l':
  226.                     if (lxsdType == "long")
  227.                         code = InternalPrimitiveTypeE.Int64;
  228.                     else if (lxsdType == "language")
  229.                         code = InternalPrimitiveTypeE.Language;
  230.                     break;
  231.                 case 'n':
  232.                     if (lxsdType == "number")
  233.                         code = InternalPrimitiveTypeE.Decimal;
  234.                     else if (lxsdType == "normalizedstring")
  235.                         code = InternalPrimitiveTypeE.NormalizedString;
  236.                     else if (lxsdType == "nonpositiveinteger")
  237.                         code = InternalPrimitiveTypeE.NonPositiveInteger;
  238.                     else if (lxsdType == "negativeinteger")
  239.                         code = InternalPrimitiveTypeE.NegativeInteger;
  240.                     else if (lxsdType == "nonnegativeinteger")
  241.                         code = InternalPrimitiveTypeE.NonNegativeInteger;
  242.                     else if (lxsdType == "notation")
  243.                         code = InternalPrimitiveTypeE.Notation;
  244.                     else if (lxsdType == "nmtoken")
  245.                         code = InternalPrimitiveTypeE.Nmtoken;
  246.                     else if (lxsdType == "nmtokens")
  247.                         code = InternalPrimitiveTypeE.Nmtokens;
  248.                     else if (lxsdType == "name")
  249.                         code = InternalPrimitiveTypeE.Name;
  250.                     else if (lxsdType == "ncname")
  251.                         //No longer used
  252.                         code = InternalPrimitiveTypeE.NcName;
  253.                     break;
  254.                 case 'p':
  255.                     if (lxsdType == "positiveinteger")
  256.                         code = InternalPrimitiveTypeE.PositiveInteger;
  257.                     break;
  258.                 case 'q':
  259.                     if (lxsdType == "qname")
  260.                         code = InternalPrimitiveTypeE.QName;
  261.                     break;
  262.                 case 's':
  263.                     if (lxsdType == "short")
  264.                         code = InternalPrimitiveTypeE.Int16;
  265.                     else if (lxsdType == "system.byte")
  266.                         code = InternalPrimitiveTypeE.Byte;
  267.                     else if (lxsdType == "system.sbyte")
  268.                         code = InternalPrimitiveTypeE.SByte;
  269.                     else if (lxsdType == "system")
  270.                         code = ToCode(value.Substring(7));
  271.                     else if (lxsdType == "system.runtime.remoting.metadata")
  272.                         // used during serialization
  273.                         // used during serialization
  274.                         //used during serialization
  275.                         //used during serialization
  276.                         code = ToCode(value.Substring(33));
  277.                     break;
  278.                 case 't':
  279.                     if (lxsdType == "time")
  280.                         code = InternalPrimitiveTypeE.Time;
  281.                     else if (lxsdType == "token")
  282.                         code = InternalPrimitiveTypeE.Token;
  283.                     else if (lxsdType == "timeinstant")
  284.                         code = InternalPrimitiveTypeE.DateTime;
  285.                     else if (lxsdType == "timeduration")
  286.                         code = InternalPrimitiveTypeE.TimeSpan;
  287.                     break;
  288.                 case 'u':
  289.                     if (lxsdType == "unsignedlong")
  290.                         code = InternalPrimitiveTypeE.UInt64;
  291.                     else if (lxsdType == "unsignedint")
  292.                         code = InternalPrimitiveTypeE.UInt32;
  293.                     else if (lxsdType == "unsignedshort")
  294.                         code = InternalPrimitiveTypeE.UInt16;
  295.                     else if (lxsdType == "unsignedbyte")
  296.                         code = InternalPrimitiveTypeE.Byte;
  297.                     break;
  298.                 default:
  299.                     code = InternalPrimitiveTypeE.Invalid;
  300.                     break;
  301.             }
  302.            
  303.             InternalST.Soap("Converter", "ToCode Exit ", ((Enum)code).ToString());
  304.             return code;
  305.         }
  306.        
  307.         static internal bool IsWriteAsByteArray(InternalPrimitiveTypeE code)
  308.         {
  309.             bool isWrite = false;
  310.            
  311.             switch (code) {
  312.                 case InternalPrimitiveTypeE.Boolean:
  313.                 case InternalPrimitiveTypeE.Char:
  314.                 case InternalPrimitiveTypeE.Byte:
  315.                 case InternalPrimitiveTypeE.Double:
  316.                 case InternalPrimitiveTypeE.Int16:
  317.                 case InternalPrimitiveTypeE.Int32:
  318.                 case InternalPrimitiveTypeE.Int64:
  319.                 case InternalPrimitiveTypeE.SByte:
  320.                 case InternalPrimitiveTypeE.Single:
  321.                 case InternalPrimitiveTypeE.UInt16:
  322.                 case InternalPrimitiveTypeE.UInt32:
  323.                 case InternalPrimitiveTypeE.UInt64:
  324.                     isWrite = true;
  325.                     break;
  326.             }
  327.             return isWrite;
  328.         }
  329.        
  330.         static internal InternalNameSpaceE GetNameSpaceEnum(InternalPrimitiveTypeE code, Type type, WriteObjectInfo objectInfo, out string typeName)
  331.         {
  332.             InternalST.Soap("Converter", "GetNameSpaceEnum Entry ", ((Enum)code).ToString(), " type ", type);
  333.             InternalNameSpaceE nameSpaceEnum = InternalNameSpaceE.None;
  334.             typeName = null;
  335.            
  336.             if (code != InternalPrimitiveTypeE.Invalid) {
  337.                
  338.                 if (code == InternalPrimitiveTypeE.Char) {
  339.                     nameSpaceEnum = InternalNameSpaceE.UrtSystem;
  340.                     typeName = "System.Char";
  341.                 }
  342.                 else {
  343.                     nameSpaceEnum = InternalNameSpaceE.XdrPrimitive;
  344.                     typeName = ToXmlDataType(code);
  345.                 }
  346.             }
  347.            
  348.             if ((nameSpaceEnum == InternalNameSpaceE.None) && (type != null)) {
  349.                 if (type == typeofString)
  350.                     nameSpaceEnum = InternalNameSpaceE.XdrString;
  351.                 else {
  352.                     if (objectInfo == null) {
  353.                         typeName = type.FullName;
  354.                         if (type.Module.Assembly == urtAssembly)
  355.                             nameSpaceEnum = InternalNameSpaceE.UrtSystem;
  356.                         else
  357.                             nameSpaceEnum = InternalNameSpaceE.UrtUser;
  358.                     }
  359.                     else {
  360.                         typeName = objectInfo.GetTypeFullName();
  361.                         // If objref is created from a proxy, it will have the proxy namespace
  362.                         // Need to force ObjRef to have system namespace
  363.                         if (objectInfo.GetAssemblyString().Equals(urtAssemblyString))
  364.                             nameSpaceEnum = InternalNameSpaceE.UrtSystem;
  365.                         else
  366.                             nameSpaceEnum = InternalNameSpaceE.UrtUser;
  367.                     }
  368.                 }
  369.             }
  370.            
  371.             // If there is an explicitly specified namespace, then it is used
  372.             if (objectInfo != null) {
  373.                 if (!objectInfo.isSi && (objectInfo.IsAttributeNameSpace() || objectInfo.IsCustomXmlAttribute() || objectInfo.IsCustomXmlElement())) {
  374.                     nameSpaceEnum = InternalNameSpaceE.Interop;
  375.                 }
  376.                 else if (objectInfo.IsCallElement()) {
  377.                     nameSpaceEnum = InternalNameSpaceE.CallElement;
  378.                 }
  379.             }
  380.            
  381.             InternalST.Soap("Converter", "GetNameSpaceEnum Exit ", ((Enum)nameSpaceEnum).ToString(), " typeName ", typeName);
  382.             return nameSpaceEnum;
  383.         }
  384.        
  385.         // Primitive types for which types need to be transmitted in Soap for ISerialable
  386.         static internal bool IsSiTransmitType(InternalPrimitiveTypeE code)
  387.         {
  388.             switch (code) {
  389.                 case InternalPrimitiveTypeE.TimeSpan:
  390.                 case InternalPrimitiveTypeE.DateTime:
  391.                 case InternalPrimitiveTypeE.Time:
  392.                 case InternalPrimitiveTypeE.Date:
  393.                 case InternalPrimitiveTypeE.YearMonth:
  394.                 case InternalPrimitiveTypeE.Year:
  395.                 case InternalPrimitiveTypeE.MonthDay:
  396.                 case InternalPrimitiveTypeE.Day:
  397.                 case InternalPrimitiveTypeE.Month:
  398.                 case InternalPrimitiveTypeE.HexBinary:
  399.                 case InternalPrimitiveTypeE.Base64Binary:
  400.                 case InternalPrimitiveTypeE.Integer:
  401.                 case InternalPrimitiveTypeE.PositiveInteger:
  402.                 case InternalPrimitiveTypeE.NonPositiveInteger:
  403.                 case InternalPrimitiveTypeE.NonNegativeInteger:
  404.                 case InternalPrimitiveTypeE.NegativeInteger:
  405.                 case InternalPrimitiveTypeE.AnyUri:
  406.                 case InternalPrimitiveTypeE.QName:
  407.                 case InternalPrimitiveTypeE.Notation:
  408.                 case InternalPrimitiveTypeE.NormalizedString:
  409.                 case InternalPrimitiveTypeE.Token:
  410.                 case InternalPrimitiveTypeE.Language:
  411.                 case InternalPrimitiveTypeE.Name:
  412.                 case InternalPrimitiveTypeE.Idrefs:
  413.                 case InternalPrimitiveTypeE.Entities:
  414.                 case InternalPrimitiveTypeE.Nmtoken:
  415.                 case InternalPrimitiveTypeE.Nmtokens:
  416.                 case InternalPrimitiveTypeE.NcName:
  417.                 case InternalPrimitiveTypeE.Id:
  418.                 case InternalPrimitiveTypeE.Idref:
  419.                 case InternalPrimitiveTypeE.Entity:
  420.                 case InternalPrimitiveTypeE.Invalid:
  421.                     return true;
  422.                 default:
  423.                     return false;
  424.             }
  425.         }
  426.        
  427.        
  428.         private static Type[] typeA;
  429.        
  430.         private static void InitTypeA()
  431.         {
  432.             typeA = new Type[primitiveTypeEnumLength];
  433.             typeA[(int)InternalPrimitiveTypeE.Invalid] = null;
  434.             typeA[(int)InternalPrimitiveTypeE.Boolean] = typeofBoolean;
  435.             typeA[(int)InternalPrimitiveTypeE.Byte] = typeofByte;
  436.             typeA[(int)InternalPrimitiveTypeE.Char] = typeofChar;
  437.             typeA[(int)InternalPrimitiveTypeE.Decimal] = typeofDecimal;
  438.             typeA[(int)InternalPrimitiveTypeE.Double] = typeofDouble;
  439.             typeA[(int)InternalPrimitiveTypeE.Int16] = typeofInt16;
  440.             typeA[(int)InternalPrimitiveTypeE.Int32] = typeofInt32;
  441.             typeA[(int)InternalPrimitiveTypeE.Int64] = typeofInt64;
  442.             typeA[(int)InternalPrimitiveTypeE.SByte] = typeofSByte;
  443.             typeA[(int)InternalPrimitiveTypeE.Single] = typeofSingle;
  444.             typeA[(int)InternalPrimitiveTypeE.TimeSpan] = typeofTimeSpan;
  445.             typeA[(int)InternalPrimitiveTypeE.DateTime] = typeofDateTime;
  446.             typeA[(int)InternalPrimitiveTypeE.UInt16] = typeofUInt16;
  447.             typeA[(int)InternalPrimitiveTypeE.UInt32] = typeofUInt32;
  448.             typeA[(int)InternalPrimitiveTypeE.UInt64] = typeofUInt64;
  449.             typeA[(int)InternalPrimitiveTypeE.Time] = typeofSoapTime;
  450.             typeA[(int)InternalPrimitiveTypeE.Date] = typeofSoapDate;
  451.             typeA[(int)InternalPrimitiveTypeE.YearMonth] = typeofSoapYearMonth;
  452.             typeA[(int)InternalPrimitiveTypeE.Year] = typeofSoapYear;
  453.             typeA[(int)InternalPrimitiveTypeE.MonthDay] = typeofSoapMonthDay;
  454.             typeA[(int)InternalPrimitiveTypeE.Day] = typeofSoapDay;
  455.             typeA[(int)InternalPrimitiveTypeE.Month] = typeofSoapMonth;
  456.             typeA[(int)InternalPrimitiveTypeE.HexBinary] = typeofSoapHexBinary;
  457.             typeA[(int)InternalPrimitiveTypeE.Base64Binary] = typeofSoapBase64Binary;
  458.             typeA[(int)InternalPrimitiveTypeE.Integer] = typeofSoapInteger;
  459.             typeA[(int)InternalPrimitiveTypeE.PositiveInteger] = typeofSoapPositiveInteger;
  460.             typeA[(int)InternalPrimitiveTypeE.NonPositiveInteger] = typeofSoapNonPositiveInteger;
  461.             typeA[(int)InternalPrimitiveTypeE.NonNegativeInteger] = typeofSoapNonNegativeInteger;
  462.             typeA[(int)InternalPrimitiveTypeE.NegativeInteger] = typeofSoapNegativeInteger;
  463.             typeA[(int)InternalPrimitiveTypeE.AnyUri] = typeofSoapAnyUri;
  464.             typeA[(int)InternalPrimitiveTypeE.QName] = typeofSoapQName;
  465.             typeA[(int)InternalPrimitiveTypeE.Notation] = typeofSoapNotation;
  466.             typeA[(int)InternalPrimitiveTypeE.NormalizedString] = typeofSoapNormalizedString;
  467.             typeA[(int)InternalPrimitiveTypeE.Token] = typeofSoapToken;
  468.             typeA[(int)InternalPrimitiveTypeE.Language] = typeofSoapLanguage;
  469.             typeA[(int)InternalPrimitiveTypeE.Name] = typeofSoapName;
  470.             typeA[(int)InternalPrimitiveTypeE.Idrefs] = typeofSoapIdrefs;
  471.             typeA[(int)InternalPrimitiveTypeE.Entities] = typeofSoapEntities;
  472.             typeA[(int)InternalPrimitiveTypeE.Nmtoken] = typeofSoapNmtoken;
  473.             typeA[(int)InternalPrimitiveTypeE.Nmtokens] = typeofSoapNmtokens;
  474.             typeA[(int)InternalPrimitiveTypeE.NcName] = typeofSoapNcName;
  475.             typeA[(int)InternalPrimitiveTypeE.Id] = typeofSoapId;
  476.             typeA[(int)InternalPrimitiveTypeE.Idref] = typeofSoapIdref;
  477.             typeA[(int)InternalPrimitiveTypeE.Entity] = typeofSoapEntity;
  478.         }
  479.        
  480.         // Returns a COM runtime type associated with the type code
  481.        
  482.         static internal Type SoapToType(InternalPrimitiveTypeE code)
  483.         {
  484.             return ToType(code);
  485.         }
  486.        
  487.         static internal Type ToType(InternalPrimitiveTypeE code)
  488.         {
  489.             InternalST.Soap("Converter", "ToType Entry ", ((Enum)code).ToString());
  490.             lock (typeofConverter) {
  491.                 if (typeA == null)
  492.                     InitTypeA();
  493.             }
  494.             InternalST.Soap("Converter", "ToType Exit ", ((typeA[(int)code] == null) ? "null " : typeA[(int)code].Name));
  495.             return typeA[(int)code];
  496.         }
  497.        
  498.         private static string[] valueA;
  499.        
  500.         private static void InitValueA()
  501.         {
  502.             valueA = new string[primitiveTypeEnumLength];
  503.             valueA[(int)InternalPrimitiveTypeE.Invalid] = null;
  504.             valueA[(int)InternalPrimitiveTypeE.Boolean] = "System.Boolean";
  505.             valueA[(int)InternalPrimitiveTypeE.Byte] = "System.Byte";
  506.             valueA[(int)InternalPrimitiveTypeE.Char] = "System.Char";
  507.             valueA[(int)InternalPrimitiveTypeE.Decimal] = "System.Decimal";
  508.             valueA[(int)InternalPrimitiveTypeE.Double] = "System.Double";
  509.             valueA[(int)InternalPrimitiveTypeE.Int16] = "System.Int16";
  510.             valueA[(int)InternalPrimitiveTypeE.Int32] = "System.Int32";
  511.             valueA[(int)InternalPrimitiveTypeE.Int64] = "System.Int64";
  512.             valueA[(int)InternalPrimitiveTypeE.SByte] = "System.SByte";
  513.             valueA[(int)InternalPrimitiveTypeE.Single] = "System.Single";
  514.             valueA[(int)InternalPrimitiveTypeE.TimeSpan] = "System.TimeSpan";
  515.             valueA[(int)InternalPrimitiveTypeE.DateTime] = "System.DateTime";
  516.             valueA[(int)InternalPrimitiveTypeE.UInt16] = "System.UInt16";
  517.             valueA[(int)InternalPrimitiveTypeE.UInt32] = "System.UInt32";
  518.             valueA[(int)InternalPrimitiveTypeE.UInt64] = "System.UInt64";
  519.            
  520.             valueA[(int)InternalPrimitiveTypeE.Time] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapTime";
  521.             valueA[(int)InternalPrimitiveTypeE.Date] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapDate";
  522.             valueA[(int)InternalPrimitiveTypeE.YearMonth] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapYearMonth";
  523.             valueA[(int)InternalPrimitiveTypeE.Year] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapYear";
  524.             valueA[(int)InternalPrimitiveTypeE.MonthDay] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapMonthDay";
  525.             valueA[(int)InternalPrimitiveTypeE.Day] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapDay";
  526.             valueA[(int)InternalPrimitiveTypeE.Month] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapMonth";
  527.             valueA[(int)InternalPrimitiveTypeE.HexBinary] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary";
  528.             valueA[(int)InternalPrimitiveTypeE.Base64Binary] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapBase64Binary";
  529.             valueA[(int)InternalPrimitiveTypeE.Integer] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapInteger";
  530.             valueA[(int)InternalPrimitiveTypeE.PositiveInteger] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapPositiveInteger";
  531.             valueA[(int)InternalPrimitiveTypeE.NonPositiveInteger] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNonPositiveInteger";
  532.             valueA[(int)InternalPrimitiveTypeE.NonNegativeInteger] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNonNegativeInteger";
  533.             valueA[(int)InternalPrimitiveTypeE.NegativeInteger] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNegativeInteger";
  534.             valueA[(int)InternalPrimitiveTypeE.AnyUri] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapAnyUri";
  535.             valueA[(int)InternalPrimitiveTypeE.QName] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapQName";
  536.             valueA[(int)InternalPrimitiveTypeE.Notation] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNotation";
  537.             valueA[(int)InternalPrimitiveTypeE.NormalizedString] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNormalizedString";
  538.             valueA[(int)InternalPrimitiveTypeE.Token] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapToken";
  539.             valueA[(int)InternalPrimitiveTypeE.Language] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapLanguage";
  540.             valueA[(int)InternalPrimitiveTypeE.Name] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapName";
  541.             valueA[(int)InternalPrimitiveTypeE.Idrefs] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapIdrefs";
  542.             valueA[(int)InternalPrimitiveTypeE.Entities] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapEntities";
  543.             valueA[(int)InternalPrimitiveTypeE.Nmtoken] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNmtoken";
  544.             valueA[(int)InternalPrimitiveTypeE.Nmtokens] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNmtokens";
  545.             valueA[(int)InternalPrimitiveTypeE.NcName] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapNcName";
  546.             valueA[(int)InternalPrimitiveTypeE.Id] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapId";
  547.             valueA[(int)InternalPrimitiveTypeE.Idref] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapIdref";
  548.             valueA[(int)InternalPrimitiveTypeE.Entity] = "System.Runtime.Remoting.Metadata.W3cXsd2001.SoapEntity";
  549.         }
  550.        
  551.         // Returns a String containg a COM+ runtime type associated with the type code
  552.         static internal string SoapToComType(InternalPrimitiveTypeE code)
  553.         {
  554.             return ToComType(code);
  555.         }
  556.        
  557.         static internal string ToComType(InternalPrimitiveTypeE code)
  558.         {
  559.             InternalST.Soap("Converter", "ToComType Entry ", ((Enum)code).ToString());
  560.            
  561.             lock (typeofConverter) {
  562.                 if (valueA == null)
  563.                     InitValueA();
  564.             }
  565.            
  566.             InternalST.Soap("Converter", "ToComType Exit ", ((valueA[(int)code] == null) ? "null" : valueA[(int)code]));
  567.            
  568.             return valueA[(int)code];
  569.         }
  570.        
  571.         private static string[] valueB;
  572.        
  573.         private static void InitValueB()
  574.         {
  575.             valueB = new string[primitiveTypeEnumLength];
  576.             valueB[(int)InternalPrimitiveTypeE.Invalid] = null;
  577.             valueB[(int)InternalPrimitiveTypeE.Boolean] = "boolean";
  578.             valueB[(int)InternalPrimitiveTypeE.Byte] = "unsignedByte";
  579.             valueB[(int)InternalPrimitiveTypeE.Char] = "char";
  580.             //not an xsi type, but will cause problems with clr if char is not used
  581.             valueB[(int)InternalPrimitiveTypeE.Decimal] = "decimal";
  582.             valueB[(int)InternalPrimitiveTypeE.Double] = "double";
  583.             valueB[(int)InternalPrimitiveTypeE.Int16] = "short";
  584.             valueB[(int)InternalPrimitiveTypeE.Int32] = "int";
  585.             valueB[(int)InternalPrimitiveTypeE.Int64] = "long";
  586.             valueB[(int)InternalPrimitiveTypeE.SByte] = "byte";
  587.             valueB[(int)InternalPrimitiveTypeE.Single] = "float";
  588.             valueB[(int)InternalPrimitiveTypeE.TimeSpan] = "duration";
  589.             valueB[(int)InternalPrimitiveTypeE.DateTime] = "dateTime";
  590.             valueB[(int)InternalPrimitiveTypeE.UInt16] = "unsignedShort";
  591.             valueB[(int)InternalPrimitiveTypeE.UInt32] = "unsignedInt";
  592.             valueB[(int)InternalPrimitiveTypeE.UInt64] = "unsignedLong";
  593.            
  594.             valueB[(int)InternalPrimitiveTypeE.Time] = SoapTime.XsdType;
  595.             valueB[(int)InternalPrimitiveTypeE.Date] = SoapDate.XsdType;
  596.             valueB[(int)InternalPrimitiveTypeE.YearMonth] = SoapYearMonth.XsdType;
  597.             valueB[(int)InternalPrimitiveTypeE.Year] = SoapYear.XsdType;
  598.             valueB[(int)InternalPrimitiveTypeE.MonthDay] = SoapMonthDay.XsdType;
  599.             valueB[(int)InternalPrimitiveTypeE.Day] = SoapDay.XsdType;
  600.             valueB[(int)InternalPrimitiveTypeE.Month] = SoapMonth.XsdType;
  601.             valueB[(int)InternalPrimitiveTypeE.HexBinary] = SoapHexBinary.XsdType;
  602.             valueB[(int)InternalPrimitiveTypeE.Base64Binary] = SoapBase64Binary.XsdType;
  603.             valueB[(int)InternalPrimitiveTypeE.Integer] = SoapInteger.XsdType;
  604.             valueB[(int)InternalPrimitiveTypeE.PositiveInteger] = SoapPositiveInteger.XsdType;
  605.             valueB[(int)InternalPrimitiveTypeE.NonPositiveInteger] = SoapNonPositiveInteger.XsdType;
  606.             valueB[(int)InternalPrimitiveTypeE.NonNegativeInteger] = SoapNonNegativeInteger.XsdType;
  607.             valueB[(int)InternalPrimitiveTypeE.NegativeInteger] = SoapNegativeInteger.XsdType;
  608.             valueB[(int)InternalPrimitiveTypeE.AnyUri] = SoapAnyUri.XsdType;
  609.             valueB[(int)InternalPrimitiveTypeE.QName] = SoapQName.XsdType;
  610.             valueB[(int)InternalPrimitiveTypeE.Notation] = SoapNotation.XsdType;
  611.             valueB[(int)InternalPrimitiveTypeE.NormalizedString] = SoapNormalizedString.XsdType;
  612.             valueB[(int)InternalPrimitiveTypeE.Token] = SoapToken.XsdType;
  613.             valueB[(int)InternalPrimitiveTypeE.Language] = SoapLanguage.XsdType;
  614.             valueB[(int)InternalPrimitiveTypeE.Name] = SoapName.XsdType;
  615.             valueB[(int)InternalPrimitiveTypeE.Idrefs] = SoapIdrefs.XsdType;
  616.             valueB[(int)InternalPrimitiveTypeE.Entities] = SoapEntities.XsdType;
  617.             valueB[(int)InternalPrimitiveTypeE.Nmtoken] = SoapNmtoken.XsdType;
  618.             valueB[(int)InternalPrimitiveTypeE.Nmtokens] = SoapNmtokens.XsdType;
  619.             valueB[(int)InternalPrimitiveTypeE.NcName] = SoapNcName.XsdType;
  620.             valueB[(int)InternalPrimitiveTypeE.Id] = SoapId.XsdType;
  621.             valueB[(int)InternalPrimitiveTypeE.Idref] = SoapIdref.XsdType;
  622.             valueB[(int)InternalPrimitiveTypeE.Entity] = SoapEntity.XsdType;
  623.         }
  624.        
  625.        
  626.         // Returns a String containg an XML Data type associated with the type code
  627.         static internal string ToXmlDataType(InternalPrimitiveTypeE code)
  628.         {
  629.             InternalST.Soap("Converter", "ToXmlDataType Entry ", ((Enum)code).ToString());
  630.            
  631.             lock (typeofConverter) {
  632.                 if (valueB == null)
  633.                     InitValueB();
  634.             }
  635.            
  636.             InternalST.Soap("Converter", "ToXmlDataType Exit ", ((valueB[(int)code] == null) ? "null" : valueB[(int)code]));
  637.            
  638.             return valueB[(int)code];
  639.         }
  640.        
  641.         private static TypeCode[] typeCodeA;
  642.        
  643.         private static void InitTypeCodeA()
  644.         {
  645.             typeCodeA = new TypeCode[primitiveTypeEnumLength];
  646.             typeCodeA[(int)InternalPrimitiveTypeE.Invalid] = TypeCode.Object;
  647.             typeCodeA[(int)InternalPrimitiveTypeE.Boolean] = TypeCode.Boolean;
  648.             typeCodeA[(int)InternalPrimitiveTypeE.Byte] = TypeCode.Byte;
  649.             typeCodeA[(int)InternalPrimitiveTypeE.Char] = TypeCode.Char;
  650.             typeCodeA[(int)InternalPrimitiveTypeE.Decimal] = TypeCode.Decimal;
  651.             typeCodeA[(int)InternalPrimitiveTypeE.Double] = TypeCode.Double;
  652.             typeCodeA[(int)InternalPrimitiveTypeE.Int16] = TypeCode.Int16;
  653.             typeCodeA[(int)InternalPrimitiveTypeE.Int32] = TypeCode.Int32;
  654.             typeCodeA[(int)InternalPrimitiveTypeE.Int64] = TypeCode.Int64;
  655.             typeCodeA[(int)InternalPrimitiveTypeE.SByte] = TypeCode.SByte;
  656.             typeCodeA[(int)InternalPrimitiveTypeE.Single] = TypeCode.Single;
  657.             typeCodeA[(int)InternalPrimitiveTypeE.TimeSpan] = TypeCode.Object;
  658.             typeCodeA[(int)InternalPrimitiveTypeE.DateTime] = TypeCode.DateTime;
  659.             typeCodeA[(int)InternalPrimitiveTypeE.UInt16] = TypeCode.UInt16;
  660.             typeCodeA[(int)InternalPrimitiveTypeE.UInt32] = TypeCode.UInt32;
  661.             typeCodeA[(int)InternalPrimitiveTypeE.UInt64] = TypeCode.UInt64;
  662.            
  663.             typeCodeA[(int)InternalPrimitiveTypeE.Time] = TypeCode.Object;
  664.             typeCodeA[(int)InternalPrimitiveTypeE.Date] = TypeCode.Object;
  665.             typeCodeA[(int)InternalPrimitiveTypeE.YearMonth] = TypeCode.Object;
  666.             typeCodeA[(int)InternalPrimitiveTypeE.Year] = TypeCode.Object;
  667.             typeCodeA[(int)InternalPrimitiveTypeE.MonthDay] = TypeCode.Object;
  668.             typeCodeA[(int)InternalPrimitiveTypeE.Day] = TypeCode.Object;
  669.             typeCodeA[(int)InternalPrimitiveTypeE.Month] = TypeCode.Object;
  670.             typeCodeA[(int)InternalPrimitiveTypeE.HexBinary] = TypeCode.Object;
  671.             typeCodeA[(int)InternalPrimitiveTypeE.Base64Binary] = TypeCode.Object;
  672.             typeCodeA[(int)InternalPrimitiveTypeE.Integer] = TypeCode.Object;
  673.             typeCodeA[(int)InternalPrimitiveTypeE.PositiveInteger] = TypeCode.Object;
  674.             typeCodeA[(int)InternalPrimitiveTypeE.NonPositiveInteger] = TypeCode.Object;
  675.             typeCodeA[(int)InternalPrimitiveTypeE.NonNegativeInteger] = TypeCode.Object;
  676.             typeCodeA[(int)InternalPrimitiveTypeE.NegativeInteger] = TypeCode.Object;
  677.             typeCodeA[(int)InternalPrimitiveTypeE.AnyUri] = TypeCode.Object;
  678.             typeCodeA[(int)InternalPrimitiveTypeE.QName] = TypeCode.Object;
  679.             typeCodeA[(int)InternalPrimitiveTypeE.Notation] = TypeCode.Object;
  680.             typeCodeA[(int)InternalPrimitiveTypeE.NormalizedString] = TypeCode.Object;
  681.             typeCodeA[(int)InternalPrimitiveTypeE.Token] = TypeCode.Object;
  682.             typeCodeA[(int)InternalPrimitiveTypeE.Language] = TypeCode.Object;
  683.             typeCodeA[(int)InternalPrimitiveTypeE.Name] = TypeCode.Object;
  684.             typeCodeA[(int)InternalPrimitiveTypeE.Idrefs] = TypeCode.Object;
  685.             typeCodeA[(int)InternalPrimitiveTypeE.Entities] = TypeCode.Object;
  686.             typeCodeA[(int)InternalPrimitiveTypeE.Nmtoken] = TypeCode.Object;
  687.             typeCodeA[(int)InternalPrimitiveTypeE.Nmtokens] = TypeCode.Object;
  688.             typeCodeA[(int)InternalPrimitiveTypeE.NcName] = TypeCode.Object;
  689.             typeCodeA[(int)InternalPrimitiveTypeE.Id] = TypeCode.Object;
  690.             typeCodeA[(int)InternalPrimitiveTypeE.Idref] = TypeCode.Object;
  691.             typeCodeA[(int)InternalPrimitiveTypeE.Entity] = TypeCode.Object;
  692.         }
  693.        
  694.         // Returns a System.TypeCode from a InternalPrimitiveTypeE
  695.         static internal TypeCode ToTypeCode(InternalPrimitiveTypeE code)
  696.         {
  697.             lock (typeofConverter) {
  698.                 if (typeCodeA == null)
  699.           &n