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.                     InitTypeCodeA();
  700.             }
  701.             return typeCodeA[(int)code];
  702.         }
  703.        
  704.        
  705.         private static InternalPrimitiveTypeE[] codeA;
  706.        
  707.         private static void InitCodeA()
  708.         {
  709.             codeA = new InternalPrimitiveTypeE[19];
  710.             codeA[(int)TypeCode.Empty] = InternalPrimitiveTypeE.Invalid;
  711.             codeA[(int)TypeCode.Object] = InternalPrimitiveTypeE.Invalid;
  712.             codeA[(int)TypeCode.DBNull] = InternalPrimitiveTypeE.Invalid;
  713.             codeA[(int)TypeCode.Boolean] = InternalPrimitiveTypeE.Boolean;
  714.             codeA[(int)TypeCode.Char] = InternalPrimitiveTypeE.Char;
  715.             codeA[(int)TypeCode.SByte] = InternalPrimitiveTypeE.SByte;
  716.             codeA[(int)TypeCode.Byte] = InternalPrimitiveTypeE.Byte;
  717.             codeA[(int)TypeCode.Int16] = InternalPrimitiveTypeE.Int16;
  718.             codeA[(int)TypeCode.UInt16] = InternalPrimitiveTypeE.UInt16;
  719.             codeA[(int)TypeCode.Int32] = InternalPrimitiveTypeE.Int32;
  720.             codeA[(int)TypeCode.UInt32] = InternalPrimitiveTypeE.UInt32;
  721.             codeA[(int)TypeCode.Int64] = InternalPrimitiveTypeE.Int64;
  722.             codeA[(int)TypeCode.UInt64] = InternalPrimitiveTypeE.UInt64;
  723.             codeA[(int)TypeCode.Single] = InternalPrimitiveTypeE.Single;
  724.             codeA[(int)TypeCode.Double] = InternalPrimitiveTypeE.Double;
  725.             codeA[(int)TypeCode.Decimal] = InternalPrimitiveTypeE.Decimal;
  726.             codeA[(int)TypeCode.DateTime] = InternalPrimitiveTypeE.DateTime;
  727.             codeA[17] = InternalPrimitiveTypeE.Invalid;
  728.             codeA[(int)TypeCode.String] = InternalPrimitiveTypeE.Invalid;
  729.             //codeA[(int)TypeCode.TimeSpan] = InternalPrimitiveTypeE.TimeSpan;
  730.         }
  731.        
  732.         // Returns a InternalPrimitiveTypeE from a System.TypeCode
  733.         static internal InternalPrimitiveTypeE ToPrimitiveTypeEnum(TypeCode typeCode)
  734.         {
  735.             lock (typeofConverter) {
  736.                 if (codeA == null)
  737.                     InitCodeA();
  738.             }
  739.             return codeA[(int)typeCode];
  740.         }
  741.        
  742.         //********************
  743.         private static bool[] escapeA;
  744.        
  745.         private static void InitEscapeA()
  746.         {
  747.             escapeA = new bool[primitiveTypeEnumLength];
  748.             escapeA[(int)InternalPrimitiveTypeE.Invalid] = true;
  749.             escapeA[(int)InternalPrimitiveTypeE.Boolean] = false;
  750.             escapeA[(int)InternalPrimitiveTypeE.Byte] = false;
  751.             escapeA[(int)InternalPrimitiveTypeE.Char] = true;
  752.             escapeA[(int)InternalPrimitiveTypeE.Decimal] = false;
  753.             escapeA[(int)InternalPrimitiveTypeE.Double] = false;
  754.             escapeA[(int)InternalPrimitiveTypeE.Int16] = false;
  755.             escapeA[(int)InternalPrimitiveTypeE.Int32] = false;
  756.             escapeA[(int)InternalPrimitiveTypeE.Int64] = false;
  757.             escapeA[(int)InternalPrimitiveTypeE.SByte] = false;
  758.             escapeA[(int)InternalPrimitiveTypeE.Single] = false;
  759.             escapeA[(int)InternalPrimitiveTypeE.TimeSpan] = false;
  760.             escapeA[(int)InternalPrimitiveTypeE.DateTime] = false;
  761.             escapeA[(int)InternalPrimitiveTypeE.UInt16] = false;
  762.             escapeA[(int)InternalPrimitiveTypeE.UInt32] = false;
  763.             escapeA[(int)InternalPrimitiveTypeE.UInt64] = false;
  764.            
  765.             escapeA[(int)InternalPrimitiveTypeE.Time] = false;
  766.             escapeA[(int)InternalPrimitiveTypeE.Date] = false;
  767.             escapeA[(int)InternalPrimitiveTypeE.YearMonth] = false;
  768.             escapeA[(int)InternalPrimitiveTypeE.Year] = false;
  769.             escapeA[(int)InternalPrimitiveTypeE.MonthDay] = false;
  770.             escapeA[(int)InternalPrimitiveTypeE.Day] = false;
  771.             escapeA[(int)InternalPrimitiveTypeE.Month] = false;
  772.             escapeA[(int)InternalPrimitiveTypeE.HexBinary] = false;
  773.             escapeA[(int)InternalPrimitiveTypeE.Base64Binary] = false;
  774.             escapeA[(int)InternalPrimitiveTypeE.Integer] = false;
  775.             escapeA[(int)InternalPrimitiveTypeE.PositiveInteger] = false;
  776.             escapeA[(int)InternalPrimitiveTypeE.NonPositiveInteger] = false;
  777.             escapeA[(int)InternalPrimitiveTypeE.NonNegativeInteger] = false;
  778.             escapeA[(int)InternalPrimitiveTypeE.NegativeInteger] = false;
  779.             escapeA[(int)InternalPrimitiveTypeE.AnyUri] = true;
  780.             escapeA[(int)InternalPrimitiveTypeE.QName] = true;
  781.             escapeA[(int)InternalPrimitiveTypeE.Notation] = true;
  782.             escapeA[(int)InternalPrimitiveTypeE.NormalizedString] = false;
  783.             escapeA[(int)InternalPrimitiveTypeE.Token] = true;
  784.             escapeA[(int)InternalPrimitiveTypeE.Language] = true;
  785.             escapeA[(int)InternalPrimitiveTypeE.Name] = true;
  786.             escapeA[(int)InternalPrimitiveTypeE.Idrefs] = true;
  787.             escapeA[(int)InternalPrimitiveTypeE.Entities] = true;
  788.             escapeA[(int)InternalPrimitiveTypeE.Nmtoken] = true;
  789.             escapeA[(int)InternalPrimitiveTypeE.Nmtokens] = true;
  790.             escapeA[(int)InternalPrimitiveTypeE.NcName] = true;
  791.             escapeA[(int)InternalPrimitiveTypeE.Id] = true;
  792.             escapeA[(int)InternalPrimitiveTypeE.Idref] = true;
  793.             escapeA[(int)InternalPrimitiveTypeE.Entity] = true;
  794.         }
  795.        
  796.         // Checks if the string is escaped (XML escape characters)
  797.         static internal bool IsEscaped(InternalPrimitiveTypeE code)
  798.         {
  799.             lock (typeofConverter) {
  800.                 if (escapeA == null)
  801.                     InitEscapeA();
  802.             }
  803.             return escapeA[(int)code];
  804.         }
  805.        
  806.        
  807.         // Translates an Object into a string with the COM+ runtime type name
  808.         private static StringBuilder sb = new StringBuilder(30);
  809.        
  810.         static internal string SoapToString(object data, InternalPrimitiveTypeE code)
  811.         {
  812.             return ToString(data, code);
  813.         }
  814.        
  815.         static internal string ToString(object data, InternalPrimitiveTypeE code)
  816.         {
  817.             // Any changes here need to also be made in System.Runtime.Remoting.Message.cs::SoapCoerceArg
  818.            
  819.             string value;
  820.             InternalST.Soap("Converter", "ToString Entry ", ((data == null) ? "<null>" : data.GetType().ToString()), " ", data, " ", ((Enum)code).ToString());
  821.            
  822.             switch (code) {
  823.                 case InternalPrimitiveTypeE.Boolean:
  824.                     bool b = (bool)data;
  825.                     if (b)
  826.                         value = "true";
  827.                     else
  828.                         value = "false";
  829.                     break;
  830.                 case InternalPrimitiveTypeE.TimeSpan:
  831.                    
  832.                     value = SoapDuration.ToString((TimeSpan)data);
  833.                     break;
  834.                 case InternalPrimitiveTypeE.DateTime:
  835.                     value = SoapDateTime.ToString((DateTime)data);
  836.                     break;
  837.                 case InternalPrimitiveTypeE.Invalid:
  838.                     // ToString should not be called if data is an object or string
  839.                     InternalST.SoapAssert(false, "[Converter.ToString]!InternalPrimitiveTypeE.Invalid ");
  840.                     value = data.ToString();
  841.                     break;
  842.                 case InternalPrimitiveTypeE.Double:
  843.                     double doublevalue = (double)data;
  844.                     if (Double.IsPositiveInfinity(doublevalue))
  845.                         value = "INF";
  846.                     else if (Double.IsNegativeInfinity(doublevalue))
  847.                         value = "-INF";
  848.                     else
  849.                         value = doublevalue.ToString("R", CultureInfo.InvariantCulture);
  850.                     break;
  851.                 case InternalPrimitiveTypeE.Single:
  852.                     float singlevalue = (float)data;
  853.                     if (Single.IsPositiveInfinity(singlevalue))
  854.                         value = "INF";
  855.                     else if (Single.IsNegativeInfinity(singlevalue))
  856.                         value = "-INF";
  857.                     else
  858.                         value = singlevalue.ToString("R", CultureInfo.InvariantCulture);
  859.                     break;
  860.                 case InternalPrimitiveTypeE.Time:
  861.                 case InternalPrimitiveTypeE.Date:
  862.                 case InternalPrimitiveTypeE.YearMonth:
  863.                 case InternalPrimitiveTypeE.Year:
  864.                 case InternalPrimitiveTypeE.MonthDay:
  865.                 case InternalPrimitiveTypeE.Day:
  866.                 case InternalPrimitiveTypeE.Month:
  867.                 case InternalPrimitiveTypeE.HexBinary:
  868.                 case InternalPrimitiveTypeE.Base64Binary:
  869.                 case InternalPrimitiveTypeE.Integer:
  870.                 case InternalPrimitiveTypeE.PositiveInteger:
  871.                 case InternalPrimitiveTypeE.NonPositiveInteger:
  872.                 case InternalPrimitiveTypeE.NonNegativeInteger:
  873.                 case InternalPrimitiveTypeE.NegativeInteger:
  874.                 case InternalPrimitiveTypeE.AnyUri:
  875.                 case InternalPrimitiveTypeE.QName:
  876.                 case InternalPrimitiveTypeE.Notation:
  877.                 case InternalPrimitiveTypeE.NormalizedString:
  878.                 case InternalPrimitiveTypeE.Token:
  879.                 case InternalPrimitiveTypeE.Language:
  880.                 case InternalPrimitiveTypeE.Name:
  881.                 case InternalPrimitiveTypeE.Idrefs:
  882.                 case InternalPrimitiveTypeE.Entities:
  883.                 case InternalPrimitiveTypeE.Nmtoken:
  884.                 case InternalPrimitiveTypeE.Nmtokens:
  885.                 case InternalPrimitiveTypeE.NcName:
  886.                 case InternalPrimitiveTypeE.Id:
  887.                 case InternalPrimitiveTypeE.Idref:
  888.                 case InternalPrimitiveTypeE.Entity:
  889.                     value = data.ToString();
  890.                     break;
  891.                 default:
  892.                     value = (string)Convert.ChangeType(data, typeofString, CultureInfo.InvariantCulture);
  893.                     break;
  894.             }
  895.            
  896.             InternalST.Soap("Converter", "ToString Exit ", value);
  897.             return value;
  898.         }
  899.        
  900.         // Translates a string into an Object
  901.         static internal object FromString(string value, InternalPrimitiveTypeE code)
  902.         {
  903.             object var;
  904.             InternalST.Soap("Converter", "FromString Entry ", value, " ", ((Enum)code).ToString());
  905.             switch (code) {
  906.                 case InternalPrimitiveTypeE.Boolean:
  907.                     if (value == "1" || value == "true")
  908.                         var = (bool)true;
  909.                     else if (value == "0" || value == "false")
  910.                         var = (bool)false;
  911.                     else
  912.                         throw new SerializationException(String.Format(CultureInfo.CurrentCulture, SoapUtil.GetResourceString("Serialization_typeCoercion"), value, "Boolean"));
  913.                     break;
  914.                 case InternalPrimitiveTypeE.TimeSpan:
  915.                     var = SoapDuration.Parse(value);
  916.                     break;
  917.                 case InternalPrimitiveTypeE.DateTime:
  918.                     var = SoapDateTime.Parse(value);
  919.                     break;
  920.                 case InternalPrimitiveTypeE.Double:
  921.                     if (value == "INF")
  922.                         var = Double.PositiveInfinity;
  923.                     else if (value == "-INF")
  924.                         var = Double.NegativeInfinity;
  925.                     else
  926.                         var = Double.Parse(value, CultureInfo.InvariantCulture);
  927.                     break;
  928.                 case InternalPrimitiveTypeE.Single:
  929.                     if (value == "INF")
  930.                         var = Single.PositiveInfinity;
  931.                     else if (value == "-INF")
  932.                         var = Single.NegativeInfinity;
  933.                     else
  934.                         var = Single.Parse(value, CultureInfo.InvariantCulture);
  935.                     break;
  936.                 case InternalPrimitiveTypeE.Time:
  937.                     var = SoapTime.Parse(value);
  938.                     break;
  939.                 case InternalPrimitiveTypeE.Date:
  940.                     var = SoapDate.Parse(value);
  941.                     break;
  942.                 case InternalPrimitiveTypeE.YearMonth:
  943.                     var = SoapYearMonth.Parse(value);
  944.                     break;
  945.                 case InternalPrimitiveTypeE.Year:
  946.                     var = SoapYear.Parse(value);
  947.                     break;
  948.                 case InternalPrimitiveTypeE.MonthDay:
  949.                     var = SoapMonthDay.Parse(value);
  950.                     break;
  951.                 case InternalPrimitiveTypeE.Day:
  952.                     var = SoapDay.Parse(value);
  953.                     break;
  954.                 case InternalPrimitiveTypeE.Month:
  955.                     var = SoapMonth.Parse(value);
  956.                     break;
  957.                 case InternalPrimitiveTypeE.HexBinary:
  958.                     var = SoapHexBinary.Parse(value);
  959.                     break;
  960.                 case InternalPrimitiveTypeE.Base64Binary:
  961.                     var = SoapBase64Binary.Parse(value);
  962.                     break;
  963.                 case InternalPrimitiveTypeE.Integer:
  964.                     var = SoapInteger.Parse(value);
  965.                     break;
  966.                 case InternalPrimitiveTypeE.PositiveInteger:
  967.                     var = SoapPositiveInteger.Parse(value);
  968.                     break;
  969.                 case InternalPrimitiveTypeE.NonPositiveInteger:
  970.                     var = SoapNonPositiveInteger.Parse(value);
  971.                     break;
  972.                 case InternalPrimitiveTypeE.NonNegativeInteger:
  973.                     var = SoapNonNegativeInteger.Parse(value);
  974.                     break;
  975.                 case InternalPrimitiveTypeE.NegativeInteger:
  976.                     var = SoapNegativeInteger.Parse(value);
  977.                     break;
  978.                 case InternalPrimitiveTypeE.AnyUri:
  979.                     var = SoapAnyUri.Parse(value);
  980.                     break;
  981.                 case InternalPrimitiveTypeE.QName:
  982.                     var = SoapQName.Parse(value);
  983.                     break;
  984.                 case InternalPrimitiveTypeE.Notation:
  985.                     var = SoapNotation.Parse(value);
  986.                     break;
  987.                 case InternalPrimitiveTypeE.NormalizedString:
  988.                     var = SoapNormalizedString.Parse(value);
  989.                     break;
  990.                 case InternalPrimitiveTypeE.Token:
  991.                     var = SoapToken.Parse(value);
  992.                     break;
  993.                 case InternalPrimitiveTypeE.Language:
  994.                     var = SoapLanguage.Parse(value);
  995.                     break;
  996.                 case InternalPrimitiveTypeE.Name:
  997.                     var = SoapName.Parse(value);
  998.                     break;
  999.                 case InternalPrimitiveTypeE.Idrefs:
  1000.                     var = SoapIdrefs.Parse(value);
  1001.                     break;
  1002.                 case InternalPrimitiveTypeE.Entities:
  1003.                     var = SoapEntities.Parse(value);
  1004.                     break;
  1005.                 case InternalPrimitiveTypeE.Nmtoken:
  1006.                     var = SoapNmtoken.Parse(value);
  1007.                     break;
  1008.                 case InternalPrimitiveTypeE.Nmtokens:
  1009.                     var = SoapNmtokens.Parse(value);
  1010.                     break;
  1011.                 case InternalPrimitiveTypeE.NcName:
  1012.                     var = SoapNcName.Parse(value);
  1013.                     break;
  1014.                 case InternalPrimitiveTypeE.Id:
  1015.                     var = SoapId.Parse(value);
  1016.                     break;
  1017.                 case InternalPrimitiveTypeE.Idref:
  1018.                     var = SoapIdref.Parse(value);
  1019.                     break;
  1020.                 case InternalPrimitiveTypeE.Entity:
  1021.                     var = SoapEntity.Parse(value);
  1022.                     break;
  1023.                 default:
  1024.                    
  1025.                     // InternalPrimitiveTypeE needs to be a primitive type
  1026.                     InternalST.SoapAssert((code != InternalPrimitiveTypeE.Invalid), "[Converter.FromString]!InternalPrimitiveTypeE.Invalid ");
  1027.                     if (code != InternalPrimitiveTypeE.Invalid)
  1028.                         var = Convert.ChangeType(value, ToTypeCode(code), CultureInfo.InvariantCulture);
  1029.                     else
  1030.                         var = value;
  1031.                     break;
  1032.             }
  1033.             InternalST.Soap("Converter", "FromString Exit " + ((var == null) ? "null" : var + " var type " + ((var == null) ? "<null>" : var.GetType().ToString())));
  1034.             return var;
  1035.            
  1036.         }
  1037.        
  1038.        
  1039.         static internal Type typeofISerializable = typeof(ISerializable);
  1040.         static internal Type typeofString = typeof(string);
  1041.         static internal Type typeofConverter = typeof(Converter);
  1042.         static internal Type typeofBoolean = typeof(bool);
  1043.         static internal Type typeofByte = typeof(byte);
  1044.         static internal Type typeofChar = typeof(char);
  1045.         static internal Type typeofDecimal = typeof(decimal);
  1046.         static internal Type typeofDouble = typeof(double);
  1047.         static internal Type typeofInt16 = typeof(Int16);
  1048.         static internal Type typeofInt32 = typeof(Int32);
  1049.         static internal Type typeofInt64 = typeof(Int64);
  1050.         static internal Type typeofSByte = typeof(sbyte);
  1051.         static internal Type typeofSingle = typeof(float);
  1052.         static internal Type typeofTimeSpan = typeof(TimeSpan);
  1053.         static internal Type typeofDateTime = typeof(DateTime);
  1054.         static internal Type typeofUInt16 = typeof(UInt16);
  1055.         static internal Type typeofUInt32 = typeof(UInt32);
  1056.         static internal Type typeofUInt64 = typeof(UInt64);
  1057.         static internal Type typeofSoapTime = typeof(SoapTime);
  1058.         static internal Type typeofSoapDate = typeof(SoapDate);
  1059.         static internal Type typeofSoapYear = typeof(SoapYear);
  1060.         static internal Type typeofSoapMonthDay = typeof(SoapMonthDay);
  1061.         static internal Type typeofSoapYearMonth = typeof(SoapYearMonth);
  1062.         static internal Type typeofSoapDay = typeof(SoapDay);
  1063.         static internal Type typeofSoapMonth = typeof(SoapMonth);
  1064.         static internal Type typeofSoapHexBinary = typeof(SoapHexBinary);
  1065.         static internal Type typeofSoapBase64Binary = typeof(SoapBase64Binary);
  1066.         static internal Type typeofSoapInteger = typeof(SoapInteger);
  1067.         static internal Type typeofSoapPositiveInteger = typeof(SoapPositiveInteger);
  1068.         static internal Type typeofSoapNonPositiveInteger = typeof(SoapNonPositiveInteger);
  1069.         static internal Type typeofSoapNonNegativeInteger = typeof(SoapNonNegativeInteger);
  1070.         static internal Type typeofSoapNegativeInteger = typeof(SoapNegativeInteger);
  1071.         static internal Type typeofSoapAnyUri = typeof(SoapAnyUri);
  1072.         static internal Type typeofSoapQName = typeof(SoapQName);
  1073.         static internal Type typeofSoapNotation = typeof(SoapNotation);
  1074.         static internal Type typeofSoapNormalizedString = typeof(SoapNormalizedString);
  1075.         static internal Type typeofSoapToken = typeof(SoapToken);
  1076.         static internal Type typeofSoapLanguage = typeof(SoapLanguage);
  1077.         static internal Type typeofSoapName = typeof(SoapName);
  1078.         static internal Type typeofSoapIdrefs = typeof(SoapIdrefs);
  1079.         static internal Type typeofSoapEntities = typeof(SoapEntities);
  1080.         static internal Type typeofSoapNmtoken = typeof(SoapNmtoken);
  1081.         static internal Type typeofSoapNmtokens = typeof(SoapNmtokens);
  1082.         static internal Type typeofSoapNcName = typeof(SoapNcName);
  1083.         static internal Type typeofSoapId = typeof(SoapId);
  1084.         static internal Type typeofSoapIdref = typeof(SoapIdref);
  1085.         static internal Type typeofSoapEntity = typeof(SoapEntity);
  1086.         static internal Type typeofISoapXsd = typeof(ISoapXsd);
  1087.         static internal Type typeofObject = typeof(object);
  1088.         static internal Type typeofSoapFault = typeof(SoapFault);
  1089.         static internal Type typeofTypeArray = typeof(System.Type[]);
  1090.         static internal Type typeofIConstructionCallMessage = typeof(System.Runtime.Remoting.Activation.IConstructionCallMessage);
  1091.         static internal Type typeofIMethodCallMessage = typeof(System.Runtime.Remoting.Messaging.IMethodCallMessage);
  1092.         static internal Type typeofReturnMessage = typeof(System.Runtime.Remoting.Messaging.ReturnMessage);
  1093.         static internal Type typeofSystemVoid = typeof(void);
  1094.         static internal Type typeofInternalSoapMessage = typeof(InternalSoapMessage);
  1095.         static internal Type typeofHeader = typeof(System.Runtime.Remoting.Messaging.Header);
  1096.         static internal Type typeofMarshalByRefObject = typeof(System.MarshalByRefObject);
  1097.         static internal Assembly urtAssembly = Assembly.GetAssembly(typeofString);
  1098.         static internal string urtAssemblyString = urtAssembly.FullName;
  1099.     }
  1100. }

Developer Fusion