SoapCommonClasses.ParseRecord

来源:互联网 发布:网页排版软件 编辑:程序博客网 时间:2024/05/21 13:56
  1. // ==++==
  2. // 
  3. //   
  4. //    Copyright (c) 2002 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: SoapCommonClasses
  18. //       
  19. // Purpose: utility classes
  20. //
  21. // Date:  June 10, 1999
  22. //
  23. //============================================================
  24. namespace System.Runtime.Serialization.Formatters.Soap
  25. {
  26.     using System;
  27.     using System.Collections;
  28.     using System.Reflection;
  29.     using System.Text;
  30.     using System.Globalization;
  31.     using System.Runtime.Serialization.Formatters;
  32.     using System.Runtime.Remoting;
  33.     using System.Runtime.Remoting.Metadata;
  34.     using System.Runtime.Remoting.Messaging;
  35.     using System.Runtime.InteropServices;
  36.     using System.Runtime.Serialization;
  37.     using System.Resources;
  38.     using System.Diagnostics;
  39.     // AttributeList class is used to transmit attributes from XMLObjectWriter to XMLWriter
  40.     internal sealed class AttributeList
  41.     {
  42.         private SerStack nameA = new SerStack("AttributeName");
  43.         private SerStack valueA = new SerStack("AttributeValue");
  44.         internal int Count
  45.         {
  46.             get {return nameA.Count();}
  47.         }
  48.         internal void Clear()
  49.         {
  50.             nameA.Clear();
  51.             valueA.Clear();            
  52.         }
  53.         internal void Put(String name, String value)
  54.         {
  55.             nameA.Push(name);
  56.             valueA.Push(value);
  57.         }
  58.         internal void Get(int index, out String name, out String value)
  59.         {
  60.             name = (String)nameA.Next();
  61.             value = (String)valueA.Next();
  62.         }
  63.         [Conditional("SER_LOGGING")]                            
  64.         internal void Dump()
  65.         {
  66.             nameA.Dump();
  67.             valueA.Dump();
  68.         }
  69.     }
  70.     // Implements a stack used for parsing
  71.     internal sealed class SerStack
  72.     {
  73.         //internal ArrayList stack = new ArrayList(10);
  74.         internal Object[] objects = new Object[10];
  75.         internal String stackId;
  76.         internal int top = -1;
  77.         internal int next = 0;
  78.         internal SerStack()
  79.         {
  80.             stackId = "System";
  81.         }
  82.         internal SerStack(String stackId) {
  83.             this.stackId = stackId;
  84.         }
  85.         internal Object GetItem(int index)
  86.         {
  87.             return objects[index];
  88.         }
  89.         internal void Clear()
  90.         {
  91.             top = -1;
  92.             next = 0;
  93.         }
  94.         // Push the object onto the stack
  95.         internal void Push(Object obj) {
  96.             InternalST.Soap(this"Push ",stackId," ",((obj is ITrace)?((ITrace)obj).Trace():""));                                    
  97.             if (top == (objects.Length -1)) {
  98.                 IncreaseCapacity();
  99.             }
  100.             objects[++top] = obj;        
  101.         }
  102.         // Pop the object from the stack
  103.         internal Object Pop() {
  104.             if (top < 0)
  105.                 return null;
  106.             Object obj = objects[top];
  107.             objects[top--] = null;
  108.             InternalST.Soap(this"Pop ",stackId," ",((obj is ITrace)?((ITrace)obj).Trace():""));            
  109.             return obj;
  110.         }
  111.         internal Object Next()
  112.         {
  113.             if (next > top)
  114.                 throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_StackRange"),stackId));                
  115.             return objects[next++];
  116.         }
  117.         internal void IncreaseCapacity() {
  118.             int size = objects.Length * 2;
  119.             Object[] newItems = new Object[size];
  120.             Array.Copy(objects, 0, newItems, 0, objects.Length);
  121.             objects = newItems;
  122.         }
  123.         // Gets the object on the top of the stack
  124.         internal Object Peek() {
  125.             if (top < 0)
  126.                 return null;        
  127.             InternalST.Soap(this"Peek ",stackId," ",((objects[top] is ITrace)?((ITrace)objects[top]).Trace():""));            
  128.             return objects[top];
  129.         }
  130.         // Gets the second entry in the stack.
  131.         internal Object PeekPeek() {
  132.             if (top < 1)
  133.                 return null;
  134.             InternalST.Soap(this"PeekPeek ",stackId," ",((objects[top - 1] is ITrace)?((ITrace)objects[top - 1]).Trace():""));                                    
  135.             return objects[top - 1];        
  136.         }
  137.         // The number of entries in the stack
  138.         internal int Count() {
  139.             return top + 1; 
  140.         }
  141.         // The number of entries in the stack
  142.         internal bool IsEmpty() {
  143.             if (top > 0) 
  144.                 return false;
  145.             else
  146.                 return true;
  147.         }
  148.         // Reverse the stack
  149.         internal void Reverse() {
  150.             Array.Reverse(objects, 0, Count());
  151.         }
  152.         [Conditional("SER_LOGGING")]                                
  153.         internal void Dump()
  154.         {
  155.             for (int i=0; i<Count(); i++)
  156.             {
  157.                 Object obj = objects[i];
  158.                 InternalST.Soap(this"Stack Dump ",stackId," "+((obj is ITrace)?((ITrace)obj).Trace():""));                                        
  159.             }
  160.         }
  161.     }
  162.     internal sealed class NameCacheEntry
  163.     {
  164.         internal String name;
  165.         internal Object value;
  166.     }
  167.     internal sealed class NameCache
  168.     {
  169.         private const int MAX_CACHE_ENTRIES = 353; // Needs to be a prime number
  170.         static NameCacheEntry[] nameCache = new NameCacheEntry[MAX_CACHE_ENTRIES];
  171.         int probe = 0;
  172.         String name = null;
  173.         internal Object GetCachedValue(String name)
  174.         {
  175.             this.name = name;
  176.             probe = Math.Abs(name.GetHashCode())%MAX_CACHE_ENTRIES;
  177.             NameCacheEntry entry = nameCache[probe];
  178.             if (entry == null)
  179.             {
  180.                 entry = new NameCacheEntry();
  181.                 entry.name = name;
  182.                 return null;
  183.             }
  184.             else if (entry.name == name)
  185.             {
  186.                 return entry.value;
  187.             }
  188.             else
  189.                 return null;
  190.         }
  191.         internal void SetCachedValue(Object value)
  192.         {
  193.             NameCacheEntry entry = new NameCacheEntry();
  194.             entry.name = name;
  195.             entry.value = value;
  196.             nameCache[probe] = entry;
  197.         }
  198.     }
  199.     internal sealed class SoapUtil
  200.     {
  201.         internal static Type typeofString = typeof(String);
  202.         internal static Type typeofBoolean = typeof(Boolean);
  203.         internal static Type typeofObject = typeof(Object);
  204.         internal static Type typeofSoapFault = typeof(SoapFault);        
  205.         internal static Assembly urtAssembly = Assembly.GetAssembly(typeofString);
  206.         internal static String urtAssemblyString = urtAssembly.FullName;
  207.         [Conditional("SER_LOGGING")]        
  208.         internal static void DumpHash(String tag, Hashtable hashTable)
  209.         {
  210.             IDictionaryEnumerator e = hashTable.GetEnumerator();
  211.             InternalST.Soap("HashTable Dump Begin ", tag);
  212.             while(e.MoveNext())
  213.             {
  214.                 InternalST.Soap("HashTable key "+e.Key+", value "+e.Value);
  215.             }
  216.             InternalST.Soap("HashTable Dump end /n");            
  217.         }
  218.         
  219.         internal static ResourceManager SystemResMgr;
  220.         private static ResourceManager InitResourceManager()
  221.         {
  222.             if (SystemResMgr == null)
  223.                 SystemResMgr = new ResourceManager("SoapFormatter"typeof(SoapParser).Module.Assembly);
  224.             return SystemResMgr;
  225.         }
  226.         // Looks up the resource string value for key.
  227.         // 
  228.         internal static String GetResourceString(String key)
  229.         {
  230.             if (SystemResMgr == null)
  231.                 InitResourceManager();
  232.             String s = SystemResMgr.GetString(key, null);
  233.             InternalST.SoapAssert(s!=null"Managed resource string lookup failed.  Was your resource name misspelled?  Did you rebuild the SoapFormatter and SoapFormatter.resource after adding a resource to SoapFormatter.txt?  Debug this w/ cordbg and bug whoever owns the code that called SoapUtil.GetResourceString.  Resource name was: /""+key+"/"");
  234.             return s;
  235.         }
  236.         internal static String GetResourceString(String key, params Object[] values) {
  237.             if (SystemResMgr == null)
  238.                 InitResourceManager();
  239.             String s = SystemResMgr.GetString(key, null);
  240.             InternalST.SoapAssert(s!=null"Managed resource string lookup failed.  Was your resource name misspelled?  Did you rebuild mscorlib after adding a resource to resources.txt?  Debug this w/ cordbg and bug whoever owns the code that called Environment.GetResourceString.  Resource name was: /""+key+"/"");
  241.             return String.Format(s, values);
  242.         }
  243.     }
  244.     internal sealed class SoapAssemblyInfo
  245.     {
  246.         internal String assemblyString;
  247.         private Assembly assembly;
  248.         internal SoapAssemblyInfo(String assemblyString)
  249.         {
  250.             this.assemblyString = assemblyString;
  251.         }
  252.         internal SoapAssemblyInfo(String assemblyString, Assembly assembly)
  253.         {
  254.             this.assemblyString = assemblyString;
  255.             this.assembly = assembly;
  256.         }
  257.         internal Assembly GetAssembly(ObjectReader objectReader)
  258.         {
  259.             if (assembly == null)
  260.             {
  261.                 assembly = objectReader.LoadAssemblyFromString(assemblyString);
  262.                 if (assembly == null)
  263.                     throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_AssemblyString"),assemblyString));
  264.             }
  265.             return assembly;
  266.         }
  267.     }
  268.     // The ParseRecord class holds the parsed XML information. There is a
  269.     // ParsedRecord for each XML Element
  270.     internal sealed class ParseRecord : ITrace
  271.     {
  272.         internal static int parseRecordIdCount = 1;
  273.         internal int PRparseRecordId = 0;
  274.         // Enums
  275.         internal InternalParseTypeE PRparseTypeEnum = InternalParseTypeE.Empty;
  276.         internal InternalObjectTypeE PRobjectTypeEnum = InternalObjectTypeE.Empty;
  277.         internal InternalArrayTypeE PRarrayTypeEnum = InternalArrayTypeE.Empty;
  278.         internal InternalMemberTypeE PRmemberTypeEnum = InternalMemberTypeE.Empty;
  279.         internal InternalMemberValueE PRmemberValueEnum = InternalMemberValueE.Empty;
  280.         internal InternalObjectPositionE PRobjectPositionEnum = InternalObjectPositionE.Empty;
  281.         // Object
  282.         internal String PRname;
  283.         internal String PRnameXmlKey;
  284.         internal String PRxmlNameSpace;
  285.         internal bool PRisParsed = false;
  286.         internal bool PRisProcessAttributes = false;
  287.         // Value
  288.         internal String PRvalue;
  289.         internal Object PRvarValue;
  290.         // dt attribute
  291.         internal String PRkeyDt;
  292.         internal String PRtypeXmlKey;
  293.         internal Type PRdtType;
  294.         internal String PRassemblyName;
  295.         internal InternalPrimitiveTypeE PRdtTypeCode;
  296.         internal bool PRisVariant = false// Used by Binary
  297.         internal bool PRisEnum = false;
  298.         // Object ID
  299.         internal long PRobjectId;
  300.         // Reference ID
  301.         internal long PRidRef;
  302.         // Array
  303.         // Array Element Type
  304.         internal String PRarrayElementTypeString;
  305.         internal Type PRarrayElementType;
  306.         internal bool PRisArrayVariant = false;
  307.         internal InternalPrimitiveTypeE PRarrayElementTypeCode;
  308.         //internal String PRarrayXmlKey;
  309.         // Binary Byte Array
  310.         //internal Byte[] PRbyteA;
  311.         // Array Primitive Element type
  312.         internal String PRprimitiveArrayTypeString;
  313.         // Parsed array information
  314.         internal int PRrank;
  315.         internal int[] PRlengthA;
  316.         internal int[] PRpositionA;
  317.         internal int[] PRlowerBoundA;
  318.         internal int[] PRupperBoundA;
  319.         // Array map for placing array elements in array
  320.         //internal int[][] indexMap;
  321.         internal int[] PRindexMap; 
  322.         internal int PRmemberIndex;
  323.         internal int PRlinearlength;
  324.         internal int[] PRrectangularMap;
  325.         internal bool    PRisLowerBound;
  326.         // SerializedStreamHeader information
  327.         internal long PRtopId;
  328.         internal long PRheaderId;
  329.         internal bool PRisHeaderRoot;
  330.         internal bool PRisAttributesProcessed;
  331.         // Parsed HeaderMember Information
  332.         internal bool PRisMustUnderstand;
  333.         // Parse State
  334.         internal InternalParseStateE PRparseStateEnum = InternalParseStateE.Initial;
  335.         internal bool PRisWaitingForNestedObject = false;
  336.         // MemberInfo accumulated during parsing of members
  337.         internal ReadObjectInfo PRobjectInfo;
  338.         // ValueType Fixup needed
  339.         internal bool PRisValueTypeFixup = false;
  340.         // Created object
  341.         internal Object PRnewObj;
  342.         internal Object[] PRobjectA; //optimization, will contain object[]
  343.         internal PrimitiveArray PRprimitiveArray; // for Primitive Soap arrays, optimization
  344.         internal bool PRisRegistered; // Used when registering nested classes
  345.         internal bool PRisXmlAttribute;
  346.         internal ParseRecord()
  347.         {
  348.             Counter();
  349.         }
  350.         private void Counter()
  351.         {
  352.             // The counter is used to test parseRecord identity
  353.             lock(typeof(ParseRecord))
  354.             {
  355.                 PRparseRecordId = parseRecordIdCount++;
  356.             }
  357.         }
  358.         // Get a String describing the ParseRecord
  359.         public String Trace()
  360.         {
  361.             //return "ParseType "+EnumInfo.ToString(InternalParseTypeE.class, parseTypeEnum)+" name "+name+" ParseState "+EnumInfo.ToString(InternalParseStateE.class, parseStateEnum);
  362.             return "ParseRecord"+PRparseRecordId+" ParseType "+ ((Enum)PRparseTypeEnum).ToString() +" name "+PRname+" keyDt "+Util.PString(PRkeyDt);
  363.         }
  364.         // Initialize ParseRecord. Called when reusing.
  365.         internal void Init()
  366.         {
  367.             // Enums
  368.             PRparseTypeEnum = InternalParseTypeE.Empty;
  369.             PRobjectTypeEnum = InternalObjectTypeE.Empty;
  370.             PRarrayTypeEnum = InternalArrayTypeE.Empty;
  371.             PRmemberTypeEnum = InternalMemberTypeE.Empty;
  372.             PRmemberValueEnum = InternalMemberValueE.Empty;
  373.             PRobjectPositionEnum = InternalObjectPositionE.Empty;
  374.             // Object
  375.             PRname = null;
  376.             PRnameXmlKey = null;
  377.             PRxmlNameSpace = null;
  378.             PRisParsed = false;
  379.             PRisProcessAttributes = false;
  380.             // Value
  381.             PRvalue = null;
  382.             // dt attribute
  383.             PRkeyDt = null;
  384.             PRdtType = null;
  385.             PRassemblyName = null;
  386.             PRdtTypeCode = InternalPrimitiveTypeE.Invalid;
  387.             PRisEnum = false;            
  388.             // Object ID
  389.             PRobjectId = 0;
  390.             // Reference ID
  391.             PRidRef = 0;
  392.             // Array
  393.             // Array Element Type
  394.             PRarrayElementTypeString = null;
  395.             PRarrayElementType = null;
  396.             PRisArrayVariant = false;
  397.             PRarrayElementTypeCode = InternalPrimitiveTypeE.Invalid;
  398.             // Array Primitive Element type
  399.             PRprimitiveArrayTypeString = null;
  400.             // Parsed array information
  401.             PRrank = 0;
  402.             PRlengthA = null;
  403.             PRpositionA = null;
  404.             PRlowerBoundA = null;
  405.             PRupperBoundA = null;        
  406.             // Array map for placing array elements in array
  407.             PRindexMap = null;
  408.             PRmemberIndex = 0;
  409.             PRlinearlength = 0;
  410.             PRrectangularMap = null;
  411.             PRisLowerBound = false;
  412.             // SerializedStreamHeader information
  413.             PRtopId = 0;
  414.             PRheaderId = 0;
  415.             PRisHeaderRoot = false;
  416.             PRisAttributesProcessed = false;
  417.             // Parsed HeaderMember Information
  418.             PRisMustUnderstand = false;
  419.             // Parse State
  420.             PRparseStateEnum = InternalParseStateE.Initial;
  421.             PRisWaitingForNestedObject = false;
  422.             // ValueType Fixup needed
  423.             PRisValueTypeFixup = false;
  424.             PRnewObj = null;
  425.             PRobjectA = null;
  426.             PRprimitiveArray = null;            
  427.             PRobjectInfo = null;
  428.             PRisRegistered = false;
  429.             PRisXmlAttribute = false;
  430.         }
  431.         internal ParseRecord Copy()
  432.         {
  433.             ParseRecord newPr = new ParseRecord();
  434.             // Enums
  435.             newPr.PRparseTypeEnum = PRparseTypeEnum;
  436.             newPr.PRobjectTypeEnum = PRobjectTypeEnum;
  437.             newPr.PRarrayTypeEnum = PRarrayTypeEnum;
  438.             newPr.PRmemberTypeEnum = PRmemberTypeEnum;
  439.             newPr.PRmemberValueEnum = PRmemberValueEnum;
  440.             newPr.PRobjectPositionEnum = PRobjectPositionEnum;
  441.             // Object
  442.             newPr.PRname = PRname;
  443.             newPr.PRisParsed = PRisParsed;            
  444.             newPr.PRisProcessAttributes = PRisProcessAttributes;
  445.             newPr.PRnameXmlKey = PRnameXmlKey;
  446.             newPr.PRxmlNameSpace = PRxmlNameSpace;            
  447.             // Value
  448.             newPr.PRvalue = PRvalue;
  449.             // dt attribute
  450.             newPr.PRkeyDt = PRkeyDt;
  451.             newPr.PRdtType = PRdtType;
  452.             newPr.PRassemblyName = PRassemblyName;
  453.             newPr.PRdtTypeCode = PRdtTypeCode;
  454.             newPr.PRisEnum = PRisEnum;            
  455.             // Object ID
  456.             newPr.PRobjectId = PRobjectId;
  457.             // Reference ID
  458.             newPr.PRidRef = PRidRef;
  459.             // Array
  460.             // Array Element Type
  461.             newPr.PRarrayElementTypeString = PRarrayElementTypeString;
  462.             newPr.PRarrayElementType = PRarrayElementType;
  463.             newPr.PRisArrayVariant = PRisArrayVariant;
  464.             newPr.PRarrayElementTypeCode = PRarrayElementTypeCode;
  465.             // Array Primitive Element type
  466.             newPr.PRprimitiveArrayTypeString = PRprimitiveArrayTypeString;
  467.             // Parsed array information
  468.             newPr.PRrank = PRrank;
  469.             newPr.PRlengthA = PRlengthA;
  470.             newPr.PRpositionA = PRpositionA;
  471.             newPr.PRlowerBoundA = PRlowerBoundA;
  472.             newPr.PRupperBoundA = PRupperBoundA;        
  473.             // Array map for placing array elements in array
  474.             newPr.PRindexMap = PRindexMap;
  475.             newPr.PRmemberIndex = PRmemberIndex;
  476.             newPr.PRlinearlength = PRlinearlength;
  477.             newPr.PRrectangularMap = PRrectangularMap;
  478.             newPr.PRisLowerBound = PRisLowerBound;
  479.             // SerializedStreamHeader information
  480.             newPr.PRtopId = PRtopId;
  481.             newPr.PRheaderId = PRheaderId;
  482.             newPr.PRisHeaderRoot = PRisHeaderRoot;
  483.             newPr.PRisAttributesProcessed = PRisAttributesProcessed;
  484.             // Parsed HeaderMember Information
  485.             newPr.PRisMustUnderstand = PRisMustUnderstand;
  486.             // Parse State
  487.             newPr.PRparseStateEnum = PRparseStateEnum;
  488.             newPr.PRisWaitingForNestedObject = PRisWaitingForNestedObject;
  489.             // ValueType Fixup needed
  490.             newPr.PRisValueTypeFixup = PRisValueTypeFixup;
  491.             newPr.PRnewObj = PRnewObj;
  492.             newPr.PRobjectA = PRobjectA;
  493.             newPr.PRprimitiveArray = PRprimitiveArray;
  494.             newPr.PRobjectInfo = PRobjectInfo;
  495.             newPr.PRisRegistered = PRisRegistered;
  496.             newPr.PRisXmlAttribute = PRisXmlAttribute;
  497.             return newPr;
  498.         }        
  499.         // Dump ParseRecord. 
  500.         [Conditional("SER_LOGGING")]                                
  501.         internal void Dump()
  502.         {
  503.             InternalST.Soap("ParseRecord Dump ",PRparseRecordId);
  504.             InternalST.Soap("Enums");
  505.             Util.NVTrace("ParseType",((Enum)PRparseTypeEnum).ToString());
  506.             Util.NVTrace("ObjectType",((Enum)PRobjectTypeEnum).ToString());
  507.             Util.NVTrace("ArrayType",((Enum)PRarrayTypeEnum).ToString());
  508.             Util.NVTrace("MemberType",((Enum)PRmemberTypeEnum).ToString());
  509.             Util.NVTrace("MemberValue",((Enum)PRmemberValueEnum).ToString());
  510.             Util.NVTrace("ObjectPosition",((Enum)PRobjectPositionEnum).ToString());
  511.             Util.NVTrace("ParseState",((Enum)PRparseStateEnum).ToString());                
  512.             InternalST.Soap("Basics");        
  513.             Util.NVTrace("Name",PRname);
  514.             Util.NVTrace("PRisParsed", PRisParsed);
  515.             Util.NVTrace("PRisProcessAttributes", PRisParsed);
  516.             Util.NVTrace("PRnameXmlKey",PRnameXmlKey);
  517.             Util.NVTrace("PRxmlNameSpace", PRxmlNameSpace);        
  518.             Util.NVTrace("Value ",PRvalue);
  519.             Util.NVTrace("varValue ",PRvarValue);
  520.             if (PRvarValue != null)
  521.                 Util.NVTrace("varValue type",PRvarValue.GetType());                
  522.             Util.NVTrace("keyDt",PRkeyDt);
  523.             Util.NVTrace("dtType",PRdtType);
  524.             Util.NVTrace("assemblyName",PRassemblyName);
  525.             Util.NVTrace("code",((Enum)PRdtTypeCode).ToString());
  526.             Util.NVTrace("objectID",PRobjectId);
  527.             Util.NVTrace("idRef",PRidRef);
  528.             Util.NVTrace("isEnum",PRisEnum);            
  529.             InternalST.Soap("Array ");
  530.             Util.NVTrace("arrayElementTypeString",PRarrayElementTypeString);
  531.             Util.NVTrace("arrayElementType",PRarrayElementType);
  532.             Util.NVTrace("arrayElementTypeCode",((Enum)PRarrayElementTypeCode).ToString());        
  533.             Util.NVTrace("isArrayVariant",PRisArrayVariant);
  534.             Util.NVTrace("primitiveArrayTypeString",PRprimitiveArrayTypeString);
  535.             Util.NVTrace("rank",PRrank);
  536.             Util.NVTrace("dimensions", Util.PArray(PRlengthA));
  537.             Util.NVTrace("position", Util.PArray(PRpositionA));
  538.             Util.NVTrace("lowerBoundA", Util.PArray(PRlowerBoundA));
  539.             Util.NVTrace("upperBoundA", Util.PArray(PRupperBoundA));        
  540.             InternalST.Soap("Header ");        
  541.             Util.NVTrace("isMustUnderstand", PRisMustUnderstand);
  542.             Util.NVTrace("isHeaderRoot", PRisHeaderRoot);
  543.             Util.NVTrace("isAttributesProcessed", PRisAttributesProcessed);
  544.             Util.NVTrace("isXmlAttribute", PRisXmlAttribute);
  545.             InternalST.Soap("New Object");
  546.             if (PRnewObj != null)
  547.                 Util.NVTrace("newObj", PRnewObj);
  548.             /*
  549.             if ((objectInfo != null) && (objectInfo.objectType != null))
  550.             Util.NVTrace("objectInfo", objectInfo.objectType.ToString());
  551.             */
  552.         }
  553.     }
  554.     internal interface ITrace
  555.     {
  556.         String Trace();
  557.     }
  558.     // Utilities
  559.     internal sealed class Util
  560.     {
  561.         
  562.         // Replaces a null string with an empty string
  563.         internal static String PString(String value)
  564.         {
  565.             if (value == null)
  566.                 return "";
  567.             else
  568.                 return value;
  569.         }
  570.         // Converts an object to a string and checks for nulls
  571.         internal static String PString(Object value)
  572.         {
  573.             if (value == null)
  574.                 return "";
  575.             else
  576.                 return value.ToString();
  577.         }
  578.         // Converts a single int array to a string
  579.         internal static String PArray(int[] array)
  580.         {
  581.             if (array != null)
  582.             {
  583.                 StringBuilder sb = new StringBuilder(10);
  584.                 sb.Append("[");        
  585.                 for (int i=0; i<array.Length; i++)
  586.                 {
  587.                     sb.Append(array[i]);
  588.                     if (i != array.Length -1)
  589.                         sb.Append(",");
  590.                 }
  591.                 sb.Append("]");
  592.                 return sb.ToString();
  593.             }
  594.             else
  595.                 return "";
  596.         }
  597.         // Traces a name value pair
  598.         [Conditional("SER_LOGGING")]                                
  599.         internal static void NVTrace(String name, String value)
  600.         {
  601.             InternalST.Soap("  "+name+((value == null)?" = null":" = "+value));
  602.         }
  603.         // Traces a name value pair
  604.         [Conditional("SER_LOGGING")]                                        
  605.         internal static void NVTrace(String name, Object value)
  606.         {
  607.             try {
  608.             InternalST.Soap("  "+name+((value == null)?" = null":" = "+value.ToString()));            
  609.             }catch(Exception)
  610.             {
  611.                 InternalST.Soap("  "+name+" = null"); //Empty StringBuilder is giving an exception
  612.             }
  613.         }
  614.         // Traces a name value pair
  615.         [Conditional("_LOGGING")]                                
  616.         internal static void NVTraceI(String name, String value)
  617.         {
  618.             InternalST.Soap("  "+name+((value == null)?" = null":" = "+value));            
  619.         }
  620.         // Traces a name value pair
  621.         [Conditional("_LOGGING")]                                        
  622.         internal static void NVTraceI(String name, Object value)
  623.         {
  624.             InternalST.Soap("  "+name+((value == null)?" = null":" = "+value.ToString()));            
  625.         }
  626.     }
  627.     // Used to fixup value types. Only currently used for value types which are array items.
  628.     internal class ValueFixup : ITrace
  629.     {
  630.         internal ValueFixupEnum valueFixupEnum = ValueFixupEnum.Empty;
  631.         internal Array arrayObj;
  632.         internal int[] indexMap;
  633.         internal Object header;
  634.         internal Object memberObject;
  635.         internal static MemberInfo valueInfo;
  636.         internal ReadObjectInfo objectInfo;
  637.         internal String memberName;
  638.         internal ValueFixup(Array arrayObj, int[] indexMap)
  639.         {
  640.             InternalST.Soap(this"Array Constructor ",arrayObj);                                        
  641.             valueFixupEnum = ValueFixupEnum.Array;
  642.             this.arrayObj = arrayObj;
  643.             this.indexMap = indexMap;
  644.         }
  645.         internal ValueFixup(Object header)
  646.         {
  647.             InternalST.Soap(this"Header Constructor ",header);                                                
  648.             valueFixupEnum = ValueFixupEnum.Header;
  649.             this.header = header;
  650.         }
  651.         internal ValueFixup(Object memberObject, String memberName, ReadObjectInfo objectInfo)
  652.         {
  653.             InternalST.Soap(this"Member Constructor ",memberObject);                                                
  654.             valueFixupEnum = ValueFixupEnum.Member;
  655.             this.memberObject = memberObject;
  656.             this.memberName = memberName;
  657.             this.objectInfo = objectInfo;
  658.         }
  659.         internal virtual void Fixup(ParseRecord record, ParseRecord parent)
  660.         {
  661.             Object obj = record.PRnewObj;
  662.             InternalST.Soap(this"Fixup ",obj," ",((Enum)valueFixupEnum).ToString());
  663.             switch(valueFixupEnum)
  664.             {
  665.                 case ValueFixupEnum.Array:
  666.                     arrayObj.SetValue(obj, indexMap);
  667.                     break;
  668.                 case ValueFixupEnum.Header:
  669.                     Type type = typeof(Header);
  670.                     if (valueInfo == null)
  671.                     {
  672.                         MemberInfo[] valueInfos = type.GetMember("Value");
  673.                         if (valueInfos.Length != 1)
  674.                             throw new SerializationException(String.Format(SoapUtil.GetResourceString("Serialization_HeaderReflection"),valueInfos.Length));                                                                                
  675.                         valueInfo = valueInfos[0];
  676.                     }
  677.                     InternalST.SerializationSetValue((FieldInfo)valueInfo, header, obj);
  678.                     break;
  679.                 case ValueFixupEnum.Member:
  680.                     InternalST.Soap(this"Fixup Member new object value ",obj," memberObject ",memberObject);
  681.                     if (objectInfo.isSi) {
  682.                         InternalST.Soap(this"Recording a fixup on member: ", memberName, 
  683.                                      " in object id", parent.PRobjectId, " Required Object ", record.PRobjectId);
  684.                         objectInfo.objectManager.RecordDelayedFixup(parent.PRobjectId, memberName, record.PRobjectId);
  685.                     } else {
  686.                         MemberInfo memberInfo = objectInfo.GetMemberInfo(memberName);
  687.                         InternalST.Soap(this"Recording a fixup on member:", memberInfo, " in object id "
  688.                                      parent.PRobjectId," Required Object", record.PRobjectId);
  689.                         objectInfo.objectManager.RecordFixup(parent.PRobjectId, memberInfo, record.PRobjectId);
  690.                     }
  691.                     break;
  692.             }
  693.         }
  694.         public virtual String Trace()
  695.         {
  696.             return "ValueFixup"+((Enum)valueFixupEnum).ToString();
  697.         }
  698.     }
  699.     // Class used to transmit Enums from the XML and Binary Formatter class to the ObjectWriter and ObjectReader class
  700.     internal sealed class InternalFE
  701.     {
  702.         internal FormatterTypeStyle FEtypeFormat;
  703.         internal FormatterAssemblyStyle FEassemblyFormat;
  704.         internal ISoapMessage FEtopObject;
  705.         internal InternalSerializerTypeE FEserializerTypeEnum;
  706.     }
  707.     // Class used to Read an XML record which has a fake object as the top object.
  708.     // A fake object is an object which has the methodName as the XML elementName rather
  709.     // then a valid object name.
  710.     // After the information is read a SoapMessage object is created as the top object
  711.     // to return the information as the top object graph
  712.     [Serializable]    
  713.     internal sealed class InternalSoapMessage : ISerializable, IFieldInfo
  714.     {
  715.         internal String methodName = null;
  716.         internal String xmlNameSpace = null;
  717.         internal String[] paramNames = null;
  718.         internal Object[] paramValues = null;
  719.         internal Type[] paramTypes = null;
  720.         internal Hashtable keyToNamespaceTable = null;
  721.         // Read Constructor
  722.         internal InternalSoapMessage()
  723.         {
  724.             InternalST.Soap(this"Constructor Read  Unitialized ");
  725.         }
  726.         // Write Constructor
  727.         internal InternalSoapMessage(String methodName, String xmlNameSpace, String[] paramNames, Object[] paramValues, Type[] paramTypes)
  728.         {
  729.             InternalST.Soap(this"Constructor Write ",methodName);
  730.             this.methodName = methodName;
  731.             this.xmlNameSpace = xmlNameSpace;
  732.             this.paramNames = paramNames;
  733.             this.paramValues = paramValues;
  734.             this.paramTypes = paramTypes;
  735.         }
  736.         internal InternalSoapMessage(SerializationInfo info, StreamingContext context)
  737.         {
  738.             InternalST.Soap(this"Constructor Write  SetObjectData ");            
  739.             SetObjectData(info, context);
  740.         }
  741.         // IFieldInfo 
  742.         public String[] FieldNames
  743.         {
  744.             get {return paramNames;}
  745.             set {paramNames = value;}
  746.         }
  747.         // IFieldInfo         
  748.         public Type[] FieldTypes
  749.         {
  750.             get {return paramTypes;}
  751.             set {paramTypes = value;}
  752.         }
  753.     
  754.         public void GetObjectData(SerializationInfo info, StreamingContext context)
  755.         {
  756.             int numberOfMembers = 0;
  757.             if (paramValues != null)
  758.                 numberOfMembers = paramValues.Length;
  759.             InternalST.Soap(this"GetObjectData ",methodName," "+numberOfMembers);        
  760.             info.FullTypeName = methodName;
  761.             if (xmlNameSpace != null)
  762.                 info.AssemblyName = xmlNameSpace;
  763.             String paramName = null;
  764.             if (paramValues != null)
  765.             {
  766.                 for (int i=0; i<paramValues.Length; i++)
  767.                 {
  768.                     InternalST.Soap(this"GetObjectData AddValue ",paramNames[i]," ",paramValues[i]);
  769.                     if ((paramNames != null) && (paramNames[i] == null))
  770.                         paramName = "param"+i;
  771.                     else
  772.                         paramName = paramNames[i];
  773.                     info.AddValue(paramName, paramValues[i], typeof(Object));
  774.                 }
  775.             }
  776.         }
  777.         internal void SetObjectData(SerializationInfo info, StreamingContext context)
  778.         {
  779.             InternalST.Soap(this"SetObjectData ");                    
  780.             ArrayList paramValuesList = new ArrayList(20); 
  781.             methodName = (string)info.GetString("__methodName");
  782.             keyToNamespaceTable = (Hashtable)info.GetValue("__keyToNamespaceTable"typeof(Hashtable));
  783.             ArrayList paramNamesList = (ArrayList)info.GetValue("__paramNameList"typeof(ArrayList));
  784.             xmlNameSpace = (String)info.GetString("__xmlNameSpace");
  785.             for (int i=0; i<paramNamesList.Count; i++)
  786.                 paramValuesList.Add(info.GetValue((string)paramNamesList[i], Converter.typeofObject));
  787.             paramNames = new String[paramNamesList.Count];
  788.             paramValues = new Object[paramValuesList.Count];
  789.             for (int i=0; i<paramNamesList.Count; i++)
  790.             {
  791.                 paramNames[i] = (String)paramNamesList[i];
  792.                 paramValues[i] = (Object)paramValuesList[i];
  793.                 InternalST.Soap(this"SetObjectData param ",i," ",paramNames[i]," paramValue ",paramValues[i]);                                                                    
  794.             }
  795.         }
  796.     }
  797.     internal sealed class SoapAttributeInfo
  798.     {
  799.         internal SoapAttributeType m_attributeType;
  800.         internal String m_nameSpace;
  801.         internal String m_elementName;
  802.         internal String m_typeName;
  803.         internal String m_typeNamespace;
  804.         internal String AttributeNameSpace
  805.         {
  806.             get {return m_nameSpace;}
  807.         }
  808.         internal String AttributeElementName
  809.         {
  810.             get {return m_elementName;}
  811.         }
  812.         internal String AttributeTypeName
  813.         {
  814.             get {return m_typeName;}
  815.         }
  816.         internal String AttributeTypeNamespace
  817.         {
  818.             get {return m_typeNamespace;}
  819.         }
  820.         internal bool IsEmbedded()
  821.         {
  822.             if ((m_attributeType & SoapAttributeType.Embedded) > 0)
  823.                 return true;
  824.             else
  825.                 return false;
  826.         }
  827.         internal bool IsXmlElement()
  828.         {
  829.             if ((m_attributeType & SoapAttributeType.XmlElement) > 0)
  830.                 return true;
  831.             else
  832.                 return false;
  833.         }
  834.         internal bool IsXmlAttribute()
  835.         {
  836.             if ((m_attributeType & SoapAttributeType.XmlAttribute) > 0)
  837.                 return true;
  838.             else
  839.                 return false;
  840.         }
  841.         internal bool IsXmlType()
  842.         {
  843.             if ((m_attributeType & SoapAttributeType.XmlType) > 0)
  844.                 return true;
  845.             else
  846.                 return false;
  847.         }
  848.         
  849.         [Conditional("SER_LOGGING")]
  850.         internal void Dump(String id)
  851.         {
  852.             InternalST.Soap("Dump SoapAttributeInfo ", id);
  853.             if (IsXmlType())
  854.                 InternalST.Soap("   SchemaType");
  855.             if (IsEmbedded())
  856.                 InternalST.Soap("   Embedded");
  857.             if (IsXmlElement())
  858.                 InternalST.Soap("   XmlElement");
  859.             if (IsXmlAttribute())
  860.                 InternalST.Soap("   XmlAttribute");            
  861.             Util.NVTrace("_nameSpace", m_nameSpace);
  862.             Util.NVTrace("_elementName", m_elementName);
  863.             Util.NVTrace("_type", m_typeName);            
  864.         }
  865.     }
  866.     internal class ObjectIdentityComparer : IComparer
  867.     {
  868.         //READTHIS READTHIS
  869.        //This cannot be used for sorting objects, but it's useful in a hashtable
  870.         //where we just care about equality.
  871.         public int Compare(Object x, Object y) {
  872.         
  873.             if (x==y) {
  874.                 return 0;
  875.             }
  876.             return 1;
  877.         }
  878.     }
  879.     internal class ObjectHashCodeProvider : IHashCodeProvider
  880.     {
  881.         public int GetHashCode(Object obj)
  882.         {
  883.             return obj.GetHashCode();
  884.         }
  885.     }
  886.         
  887.     
  888.     internal sealed class NameInfo
  889.     {
  890.         internal InternalNameSpaceE NInameSpaceEnum = InternalNameSpaceE.None;
  891.         internal String NIname; // Name from SerObjectInfo.GetType
  892.         //internal String elementName; // Name from SerObjectInfo.GetElementName, will be the same as GetType except for interopTypes
  893.         //internal String interopType; 
  894.         internal long NIobjectId;
  895.         internal long NIassemId;
  896.         internal InternalPrimitiveTypeE NIprimitiveTypeEnum = InternalPrimitiveTypeE.Invalid;
  897.         internal Type NItype;
  898.         internal bool NIisSealed;
  899.         internal bool NIisMustUnderstand;
  900.         internal String NInamespace;
  901.         internal String NIheaderPrefix;
  902.         internal String NIitemName;
  903.         internal bool NIisArray;
  904.         internal bool NIisArrayItem;
  905.         internal bool NIisTopLevelObject;
  906.         internal bool NIisNestedObject;
  907.         internal bool NItransmitTypeOnObject;
  908.         internal bool NItransmitTypeOnMember;
  909.         internal bool NIisParentTypeOnObject;
  910.         internal bool NIisHeader;
  911.         internal bool NIisRemoteRecord;
  912.         internal int NIid;
  913.         internal SoapAttributeInfo NIattributeInfo;
  914.         private static int count;
  915.         internal NameInfo()
  916.         {
  917.             Counter();
  918.         }
  919.         [Conditional("SER_LOGGING")]
  920.         private void Counter()
  921.         {
  922.             lock(typeof(NameInfo))
  923.             {
  924.                 NIid = count++;
  925.             }
  926.         }
  927.         internal void Init()
  928.         {
  929.             NInameSpaceEnum = InternalNameSpaceE.None;
  930.             NIname = null;
  931.             NIobjectId = 0;
  932.             NIassemId = 0;
  933.             NIprimitiveTypeEnum = InternalPrimitiveTypeE.Invalid;
  934.             NItype = null;
  935.             NIisSealed = false;
  936.             NItransmitTypeOnObject = false;
  937.             NItransmitTypeOnMember = false;
  938.             NIisParentTypeOnObject = false;
  939.             NIisMustUnderstand = false;
  940.             NInamespace = null;
  941.             NIheaderPrefix = null;
  942.             NIitemName = null;
  943.             NIisArray = false;
  944.             NIisArrayItem = false;
  945.             NIisTopLevelObject = false;
  946.             NIisNestedObject = false;
  947.             NIisHeader = false;
  948.             NIisRemoteRecord = false;
  949.             NIattributeInfo = null;
  950.         }
  951.         [Conditional("SER_LOGGING")]
  952.         internal void Dump(String value)
  953.         {
  954.             InternalST.Soap("Dump NameInfo ",NIid," ",value);
  955.             Util.NVTrace("nameSpaceEnum", ((Enum)NInameSpaceEnum).ToString());
  956.             Util.NVTrace("name", NIname);
  957.             Util.NVTrace("objectId", NIobjectId);
  958.             Util.NVTrace("assemId", NIassemId);
  959.             Util.NVTrace("primitiveTypeEnum", ((Enum)NIprimitiveTypeEnum).ToString());
  960.             Util.NVTrace("type", NItype);
  961.             Util.NVTrace("isSealed", NIisSealed);            
  962.             Util.NVTrace("transmitTypeOnObject", NItransmitTypeOnObject);
  963.             Util.NVTrace("transmitTypeOnMember", NItransmitTypeOnMember);
  964.             Util.NVTrace("isParentTypeOnObject", NIisParentTypeOnObject);                
  965.             Util.NVTrace("isMustUnderstand", NIisMustUnderstand);
  966.             Util.NVTrace("namespace", NInamespace);
  967.             Util.NVTrace("headerPrefix", NIheaderPrefix);
  968.             Util.NVTrace("itemName", NIitemName);                
  969.             Util.NVTrace("isArray", NIisArray);
  970.             Util.NVTrace("isArrayItem", NIisArrayItem);
  971.             Util.NVTrace("isTopLevelObject", NIisTopLevelObject);
  972.             Util.NVTrace("isNestedObject", NIisNestedObject);
  973.             Util.NVTrace("isHeader", NIisHeader);
  974.             Util.NVTrace("isRemoteRecord", NIisRemoteRecord);
  975.             if (NIattributeInfo != null)
  976.                 NIattributeInfo.Dump(NIname);
  977.         }
  978.     }
  979.     internal sealed class PrimitiveArray
  980.     {
  981.         InternalPrimitiveTypeE code;
  982.         Boolean[] booleanA = null;
  983.         Char[] charA = null;
  984.         Double[] doubleA = null;
  985.         Int16[] int16A = null;
  986.         Int32[] int32A = null;
  987.         Int64[] int64A = null;
  988.         SByte[] sbyteA = null;
  989.         Single[] singleA = null;
  990.         UInt16[] uint16A = null;
  991.         UInt32[] uint32A = null;
  992.         UInt64[] uint64A = null;
  993.         internal PrimitiveArray(InternalPrimitiveTypeE code, Array array)
  994.         {
  995.             Init(code, array);
  996.         }
  997.         internal void Init(InternalPrimitiveTypeE code, Array array)
  998.         {
  999.             this.code = code;
  1000.             switch(code)
  1001.             {
  1002.                 case InternalPrimitiveTypeE.Boolean:
  1003.                     booleanA = (Boolean[])array;
  1004.                     break;
  1005.                 case InternalPrimitiveTypeE.Char:
  1006.                     charA = (Char[])array;
  1007.                     break;                    
  1008.                 case InternalPrimitiveTypeE.Double:
  1009.                     doubleA = (Double[])array;
  1010.                     break;                    
  1011.                 case InternalPrimitiveTypeE.Int16:
  1012.                     int16A = (Int16[])array;
  1013.                     break;                    
  1014.                 case InternalPrimitiveTypeE.Int32:
  1015.                     int32A = (Int32[])array;
  1016.                     break;                    
  1017.                 case InternalPrimitiveTypeE.Int64:
  1018.                     int64A = (Int64[])array;
  1019.                     break;                    
  1020.                 case InternalPrimitiveTypeE.SByte:
  1021.                     sbyteA = (SByte[])array;
  1022.                     break;                    
  1023.                 case InternalPrimitiveTypeE.Single:
  1024.                     singleA = (Single[])array;
  1025.                     break;                    
  1026.                 case InternalPrimitiveTypeE.UInt16:
  1027.                     uint16A = (UInt16[])array;
  1028.                     break;                    
  1029.                 case InternalPrimitiveTypeE.UInt32:
  1030.                     uint32A = (UInt32[])array;
  1031.                     break;                    
  1032.                 case InternalPrimitiveTypeE.UInt64:
  1033.                     uint64A = (UInt64[])array;
  1034.                     break;
  1035.             }
  1036.         }
  1037.         internal String GetValue(int index)
  1038.         {
  1039.             String value = null;
  1040.             switch(code)
  1041.             {
  1042.                 case InternalPrimitiveTypeE.Boolean:
  1043.                     value =  (booleanA[index]).ToString();
  1044.                     break;
  1045.                 case InternalPrimitiveTypeE.Char:
  1046.                     if (charA[index] == Char.MinValue)
  1047.                         value = "_0x00_";
  1048.                     else
  1049.                         value =  Char.ToString(charA[index]);
  1050.                     break;                    
  1051.                 case InternalPrimitiveTypeE.Double:
  1052.                     if (Double.IsPositiveInfinity(doubleA[index]))
  1053.                         value = "INF";
  1054.                     else if (Double.IsNegativeInfinity(doubleA[index]))
  1055.                         value = "-INF";
  1056.                     else
  1057.                         value =  (doubleA[index]).ToString("R", CultureInfo.InvariantCulture);
  1058.                     break;                    
  1059.                 case InternalPrimitiveTypeE.Int16:
  1060.                     value =  (int16A[index]).ToString(CultureInfo.InvariantCulture);
  1061.                     break;                    
  1062.                 case InternalPrimitiveTypeE.Int32:
  1063.                     value =  (int32A[index]).ToString(CultureInfo.InvariantCulture);
  1064.                     break;                    
  1065.                 case InternalPrimitiveTypeE.Int64:
  1066.                     value =  (int64A[index]).ToString(CultureInfo.InvariantCulture);
  1067.                     break;                    
  1068.                 case InternalPrimitiveTypeE.SByte:
  1069.                     value =  (sbyteA[index]).ToString(CultureInfo.InvariantCulture);
  1070.                     break;                    
  1071.                 case InternalPrimitiveTypeE.Single:
  1072.                     if (Single.IsPositiveInfinity(singleA[index]))
  1073.                         value = "INF";
  1074.                     else if (Single.IsNegativeInfinity(singleA[index]))
  1075.                         value = "-INF";
  1076.                     else
  1077.                         value =  (singleA[index]).ToString("R", CultureInfo.InvariantCulture);
  1078.                     break;
  1079.                 case InternalPrimitiveTypeE.UInt16:
  1080.                     value =  (uint16A[index]).ToString(CultureInfo.InvariantCulture);
  1081.                     break;
  1082.                 case InternalPrimitiveTypeE.UInt32:
  1083.                     value =  (uint32A[index]).ToString(CultureInfo.InvariantCulture);
  1084.                     break;                    
  1085.                 case InternalPrimitiveTypeE.UInt64:
  1086.                     value =  (uint64A[index]).ToString(CultureInfo.InvariantCulture);
  1087.                     break;                    
  1088.             }
  1089.             return value;
  1090.         }
  1091.         internal void SetValue(String value, int index)
  1092.         {
  1093.             InternalST.Soap("PrimitiveArray value ", value," index ", index, " code ",((Enum)code).ToString());
  1094.             switch(code)
  1095.             {
  1096.                 case InternalPrimitiveTypeE.Boolean:
  1097.                     booleanA[index] = Boolean.Parse(value);
  1098.                     break;
  1099.                 case InternalPrimitiveTypeE.Char:
  1100.                     if ((value[0] == '_') && (value.Equals("_0x00_")))
  1101.                         charA[index] = Char.MinValue;
  1102.                     else
  1103.                         charA[index] = Char.Parse(value);
  1104.                     break;                    
  1105.                 case InternalPrimitiveTypeE.Double:
  1106.                     if (value == "INF")
  1107.                         doubleA[index] =  Double.PositiveInfinity;
  1108.                     else if (value == "-INF")
  1109.                         doubleA[index] =  Double.NegativeInfinity;
  1110.                     else
  1111.                         doubleA[index] = Double.Parse(value, CultureInfo.InvariantCulture);
  1112.                     break;                    
  1113.                 case InternalPrimitiveTypeE.Int16:
  1114.                     int16A[index] = Int16.Parse(value, CultureInfo.InvariantCulture);                                                            
  1115.                     break;                    
  1116.                 case InternalPrimitiveTypeE.Int32:
  1117.                     int32A[index] = Int32.Parse(value, CultureInfo.InvariantCulture);                                                                                
  1118.                     break;                    
  1119.                 case InternalPrimitiveTypeE.Int64:
  1120.                     int64A[index] = Int64.Parse(value, CultureInfo.InvariantCulture);                                                                                                    
  1121.                     break;                    
  1122.                 case InternalPrimitiveTypeE.SByte:
  1123.                     sbyteA[index] = SByte.Parse(value, CultureInfo.InvariantCulture);
  1124.                     break;                    
  1125.                 case InternalPrimitiveTypeE.Single:
  1126.                     if (value == "INF")
  1127.                         singleA[index] =  Single.PositiveInfinity;
  1128.                     else if (value == "-INF")
  1129.                         singleA[index] =  Single.NegativeInfinity;
  1130.                     else
  1131.                         singleA[index] = Single.Parse(value, CultureInfo.InvariantCulture);
  1132.                     break;
  1133.                 case InternalPrimitiveTypeE.UInt16:
  1134.                     uint16A[index] = UInt16.Parse(value, CultureInfo.InvariantCulture);
  1135.                     break;
  1136.                 case InternalPrimitiveTypeE.UInt32:
  1137.                     uint32A[index] = UInt32.Parse(value, CultureInfo.InvariantCulture);                    
  1138.                     break;                    
  1139.                 case InternalPrimitiveTypeE.UInt64:
  1140.                     uint64A[index] = UInt64.Parse(value, CultureInfo.InvariantCulture);                    
  1141.                     break;                    
  1142.             }
  1143.         }
  1144.     }
  1145. }