more tcp channel code, renamed soap namespace to Soap
[mono.git] / mcs / class / System.Runtime.Serialization.Formatters.Soap / System.Runtime.Serialization.Formatters.Soap / SoapReader.cs
1 using System;\r
2 using System.Xml;\r
3 using System.Reflection;\r
4 \r
5 namespace System.Runtime.Serialization.Formatters.Soap\r
6 {       \r
7 \r
8         public enum ReferenceTypes {Array_Type, Object_Type, Interface_Type, Delegate_Type, String_Type};\r
9 \r
10         internal class SoapReader\r
11         {\r
12                 /******const section******/\r
13 \r
14                 const string cSoapRef           = "href";\r
15                 const string cObjectRef         = "ref-";\r
16                 const string cId                = "id";\r
17                 const string cXsiNull           = "xsi:null";\r
18                 const string basicassembly      = "mscorlib";\r
19                 const string startxmlns         = "xmlns:a";            \r
20                 const string Systemns           = "http://schemas.microsoft.com/clr/ns/System";         \r
21                 const string cDefaultValue      = "_0x00_";\r
22                 /******Array's serialization section******/\r
23                 const string cItem           = "item";\r
24                 const string cSoapEncArray   = "SOAP-ENC:Array";\r
25                 const string cSoapArrayType  = "SOAP-ENC:arrayType"; \r
26                 const string cXsiType        = "xsi:type";\r
27                 const string cNullObject     = "xsi:null=\"1\"/";\r
28                 /******Delegate's serialization section******/\r
29                 const string cDelegateSerClass  = "DelegateSerializationHolder";\r
30                 const string cDelegateType      = "DelegateType";\r
31                 const string cDelegateAssembly  = "DelegateAssembly";\r
32                 /******fields's section******/          \r
33                 public XmlDocument FXmlDoc;             \r
34                 public XmlElement  DeepElement; //the current Xml Struct Element\r
35                 //public Utils       FUtils;\r
36 \r
37                 public SoapReader()\r
38                 {               \r
39                         //FUtils= new Utils();\r
40                 }\r
41 \r
42                 /**Reference Types reader**/\r
43                 public int ReadObjectIndexFromXml(string ObjectElemt)\r
44                 {\r
45                         XmlNodeList ObjectElement= FXmlDoc.DocumentElement.GetElementsByTagName(ObjectElemt);\r
46                         XmlElement FCurrentElement= (XmlElement)ObjectElement.Item(0);\r
47                         string refid= (FCurrentElement).GetAttribute(cId);\r
48                         int startindex= refid.IndexOf("-");\r
49                         refid= refid.Substring(startindex + 1, refid.Length - startindex - 1);             \r
50                         return Convert.ToInt32(refid);\r
51                 }               \r
52 \r
53                 private string ReadReferenceFullNameFromXmlNode(XmlNode ReferenceNode)\r
54                 {\r
55                         int StartIndex= ReferenceNode.Name.IndexOf(":");\r
56                         string ClassName= ReferenceNode.Name.Substring(StartIndex + 1, ReferenceNode.Name.Length - StartIndex - 1);             \r
57                         string AttributeName= FXmlDoc.DocumentElement.Attributes.GetNamedItem("xmlns:" + ReferenceNode.Name.Substring(0, StartIndex)).Value;\r
58                         StartIndex= AttributeName.LastIndexOf("/");                     \r
59                         string TempStr= AttributeName.Substring(0, StartIndex);\r
60                         StartIndex= TempStr.LastIndexOf("/");\r
61                         string ReferenceFullName= TempStr.Substring(StartIndex + 1, TempStr.Length - StartIndex - 1);\r
62                         return ReferenceFullName + "." + ClassName;                     \r
63                 }\r
64 \r
65                 public string ReadReferenceFullNameFromXml(string RefereneId)\r
66                 {\r
67                         string RefId= cObjectRef + RefereneId;\r
68                         XmlNodeList NodeList = FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0).ChildNodes;\r
69                         bool Continue= true;\r
70                         int index= 0;\r
71                         string Result= "";\r
72                         while((Continue)&&(index <= NodeList.Count - 1))\r
73                         {\r
74                                 XmlElement ActElement= (XmlElement)NodeList.Item(index);\r
75                                 if(ActElement.GetAttribute("id")== RefId)//the attributes match\r
76                                 {\r
77                                         Result= ReadReferenceFullNameFromXmlNode(ActElement);\r
78                                         Continue= false;\r
79                                 }\r
80                                 else\r
81                                         index++;\r
82                         }\r
83                         return Result;\r
84                 }\r
85 \r
86                 /**ReadReferenceIndexFromXml**/\r
87                 public int ReadReferenceIndexFromXml(string FieldName, XmlElement ParentElement)\r
88                 {\r
89                         XmlElement FieldElement= (XmlElement)ParentElement.GetElementsByTagName(FieldName).Item(0);               \r
90                         if(FieldElement.GetAttribute(cXsiNull)== "") //if it is not a null field\r
91                         {\r
92                                 string hrefvalue= FieldElement.GetAttribute(cSoapRef);\r
93                                 int StartIndex= hrefvalue.IndexOf("-");\r
94                                 return Convert.ToInt32(hrefvalue.Substring(StartIndex + 1, hrefvalue.Length - 1 - StartIndex));\r
95                         }\r
96                         else\r
97                                 return -1;\r
98                 }\r
99 \r
100                 public int  ReadReferenceIndexFromXml(int ItemIndex, XmlElement ParentElement)\r
101                 {\r
102                         XmlElement FieldElement= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);\r
103                         if(FieldElement.GetAttribute(cXsiNull)== "") //if it is not a null field\r
104                         {\r
105                                 string hrefvalue= FieldElement.GetAttribute(cSoapRef);\r
106                                 int StartIndex= hrefvalue.IndexOf("-");\r
107                                 return Convert.ToInt32(hrefvalue.Substring(StartIndex + 1, hrefvalue.Length - 1 - StartIndex));\r
108                         }\r
109                         else\r
110                                 return -1;\r
111                 }\r
112 \r
113 \r
114 \r
115                 /**String reader**/\r
116                 public int ReadStringIdFromXml(/*string XmlParentElement, */string FieldName,/* string XmlParentElementId, */XmlElement ParentElement)\r
117                 {\r
118                         XmlElement FieldElement= (XmlElement)ParentElement.GetElementsByTagName(FieldName).Item(0);//(XmlElement)GetCurrentElement(XmlParentElement, XmlParentElementId).GetElementsByTagName(FieldName).Item(0);\r
119                         if(FieldElement.GetAttribute(cId)== "")\r
120                                 return ReadReferenceIndexFromXml(FieldName, ParentElement);\r
121                         else\r
122                                 return ReadFieldIdValueFromXml(FieldName, ParentElement);\r
123                 }\r
124 \r
125                 public int ReadStringIdFromXml(int ItemIndex, XmlElement ParentElement)\r
126                 {\r
127                         XmlElement FieldElement= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);\r
128                         string StrId= FieldElement.GetAttribute(cId);\r
129                         if(StrId == "")\r
130                                 return ReadReferenceIndexFromXml(ItemIndex, ParentElement);\r
131                         else\r
132                                 return ReadFieldIdValueFromXml(ItemIndex, ParentElement);\r
133                 }\r
134                 \r
135                 public string ReadStringTypeFromXml(string FieldName, XmlElement ParentElement)\r
136                 {\r
137                         XmlNode XmlField= ParentElement.GetElementsByTagName(FieldName).Item(0);\r
138                         if(XmlField!= null)\r
139                                 return XmlField.InnerXml;\r
140                         else\r
141                                 return null;\r
142                 }\r
143 \r
144                 public string ReadStringTypeFromXml(int ItemIndex, XmlElement ParentElement)\r
145                 {\r
146                         XmlNode XmlField= ParentElement.ChildNodes.Item(ItemIndex);\r
147                         if(XmlField!= null)\r
148                                 return XmlField.InnerXml;\r
149                         else\r
150                                 return null;\r
151                 }\r
152 \r
153                 /**Delegates reader**/\r
154                 public string GetDelegateElementName(int DelegateId)\r
155                 {                                       \r
156                         XmlAttributeCollection XmlAttrCollection= FXmlDoc.DocumentElement.Attributes;\r
157                         bool Continue= true;\r
158                         int i= 0;\r
159                         string ItemName= "";\r
160                         while((Continue)&&(i<= XmlAttrCollection.Count - 1))\r
161                         {\r
162                                 string AttrValue= XmlAttrCollection.Item(i).Value;                              \r
163                                 if(AttrValue == Systemns)\r
164                                 {\r
165                                         ItemName= XmlAttrCollection.Item(i).Name;\r
166                                         ItemName= ItemName.Substring(ItemName.LastIndexOf(":") + 1, ItemName.Length - 1 - ItemName.LastIndexOf(":"));\r
167                                         Continue= false;\r
168                                 }\r
169                                 i++;\r
170                         }\r
171                         return ItemName + ":" + cDelegateSerClass;\r
172                 }\r
173 \r
174                 public Type GetDelegateTypeFromXml(XmlElement ParentElement)\r
175                 {\r
176                         string DelegateAssembly= ParentElement.GetElementsByTagName(cDelegateAssembly).Item(0).InnerXml;\r
177                         DelegateAssembly= DelegateAssembly.Substring(0, DelegateAssembly.IndexOf(","));\r
178                         string DelegateType= ParentElement.GetElementsByTagName(cDelegateType).Item(0).InnerXml;\r
179                         return Assembly.Load(DelegateAssembly).GetType(DelegateType);              \r
180                 }\r
181         \r
182                 /**Arrays reader**/\r
183                 public string ReadArrayTypeFromXml(XmlElement ArrayElement, out string AssemblyName)\r
184                 {          \r
185                         string ArrayTypeAttr= ArrayElement.GetAttribute(cSoapArrayType);\r
186                         int StartIndex= ArrayTypeAttr.LastIndexOf(":");\r
187                         string Result;\r
188                         if(ArrayTypeAttr.Substring(0, 4) == "xsd:")     \r
189                         {\r
190                                 Result= "System";\r
191                                 string CLRType= GetCLRTypeFromXsdType(ArrayTypeAttr.Substring(0, ArrayTypeAttr.IndexOf("[")));\r
192                                 StartIndex= ArrayTypeAttr.IndexOf("[");\r
193                                 Result= "System." + CLRType + ArrayTypeAttr.Substring(StartIndex, ArrayTypeAttr.Length - StartIndex);\r
194                                 AssemblyName= basicassembly;\r
195                         }\r
196                         else\r
197                         {\r
198                                 AssemblyName= ReadAssemblyNameFromXml(ArrayTypeAttr);                           \r
199                                 string NsIndex= ArrayTypeAttr.Substring(1, StartIndex - 1);\r
200                                 Result= ReadNamespaceFromXml(NsIndex);                          \r
201                                 Result= Result +   "." + ArrayTypeAttr.Substring(StartIndex + 1, ArrayTypeAttr.Length - StartIndex - 1);\r
202                         }                 \r
203                         return Result;\r
204                 } \r
205                         \r
206 \r
207                 public bool IsArrayItemValueType(XmlElement ParentElement, int ItemIndex, ref bool IsNull, ref bool IsStruct)\r
208                 {\r
209                         XmlElement ArrayItem= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);               \r
210                         bool Result= false;\r
211                         if(ArrayItem.GetAttribute(cXsiNull)== "")//is not null\r
212                         {\r
213                                 IsNull= false;\r
214                                 if((ArrayItem.InnerXml != "")&&(ArrayItem.GetAttribute(cId) == ""))\r
215                                 {\r
216                                         Result= true; \r
217                                         if(ArrayItem.InnerXml.Substring(0, 1)== "<") //is an atruct\r
218                                                 IsStruct= true;\r
219                                 }\r
220                         }\r
221                         else\r
222                                 IsNull= true;                           \r
223                         return Result;\r
224                 }\r
225 \r
226                 public ValueType ReadArrayItemSimpleTypeFromXml(XmlElement ParentElement, int ItemIndex, string ItemTypeName)\r
227                 {\r
228                         XmlElement ArrayItem= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);//at this moment you know that this field is a value type\r
229                         string ItemValue= ArrayItem.InnerXml;\r
230                         string XsiType= ((XmlElement)ArrayItem).GetAttribute(cXsiType);\r
231                         if(XsiType != "")\r
232                                 return GetValueTypeFromXsdType(XsiType, ItemValue);\r
233                         else\r
234                                 return GetValueTypeFromString(ItemTypeName, ItemValue);\r
235                 }\r
236 \r
237                 public ReferenceTypes GetReferenceType(string FieldName, XmlElement ParentElement, ref XmlElement RefElement)\r
238                 {          \r
239                         XmlElement ArrayItem= (XmlElement)ParentElement.GetElementsByTagName(FieldName).Item(0);\r
240                         RefElement= ArrayItem;\r
241                         ReferenceTypes Result= ReferenceTypes.Object_Type;\r
242                         if(ArrayItem.GetAttribute(cId) != "") //is an string \r
243                                 Result= ReferenceTypes.String_Type;\r
244                         else\r
245                         {\r
246                                 string RefIndex= ArrayItem.GetAttribute(cSoapRef);\r
247                                 if(RefIndex != "") //is a other reference\r
248                                 {               \r
249                                         int Id= RefIndex.IndexOf("-");\r
250                                         Id= Convert.ToInt32(RefIndex.Substring(Id + 1, RefIndex.Length - 1 - Id));\r
251                                         string RefName= GetReferenceNameFromId(Convert.ToInt32(Id), ref RefElement);                                    \r
252                                         if(RefName== cSoapEncArray) //is an array \r
253                                                 Result= ReferenceTypes.Array_Type;\r
254                                         else\r
255                                                 if(RefName == "")\r
256                                                 Result= ReferenceTypes.String_Type;\r
257                                         else\r
258                                         {\r
259                                                 if((RefName.IndexOf(cDelegateSerClass) != -1)&&(RefElement.ChildNodes.Item(0).Name== cDelegateType)) //is a delegates\r
260                                                         Result= ReferenceTypes.Delegate_Type;\r
261                                                 else\r
262                                                         Result= ReferenceTypes.Object_Type;\r
263                                         }\r
264                                 }\r
265                         }        \r
266                         return Result;\r
267                 }\r
268 \r
269                 public ReferenceTypes GetReferenceType(int index, XmlElement ParentElement, ref XmlElement RefElement)\r
270                 {\r
271                         XmlElement ArrayItem= (XmlElement)ParentElement.ChildNodes.Item(index);\r
272                         RefElement= ArrayItem;\r
273                         ReferenceTypes Result= ReferenceTypes.Object_Type;\r
274                         if(ArrayItem.GetAttribute(cId) != "") //is an string \r
275                                 Result= ReferenceTypes.String_Type;\r
276                         else\r
277                         {\r
278                                 string RefIndex= ArrayItem.GetAttribute(cSoapRef);\r
279                                 if(RefIndex != "") //is a other reference\r
280                                 {               \r
281                                         int Id= RefIndex.IndexOf("-");\r
282                                         Id= Convert.ToInt32(RefIndex.Substring(Id + 1, RefIndex.Length - 1 - Id));\r
283                                         string RefName= GetReferenceNameFromId(Convert.ToInt32(Id), ref RefElement);\r
284                                         if(RefName== cSoapEncArray) //is an array \r
285                                                 Result= ReferenceTypes.Array_Type;\r
286                                         else\r
287                                                 if(RefName == "")\r
288                                                 Result= ReferenceTypes.String_Type;\r
289                                         else\r
290                                         {\r
291                                                 if((RefName.IndexOf(cDelegateSerClass) != -1)&&(RefElement.ChildNodes.Item(0).Name== cDelegateType)) //is a delegates\r
292                                                         Result= ReferenceTypes.Delegate_Type;\r
293                                                 else\r
294                                                         Result= ReferenceTypes.Object_Type;\r
295                                         }\r
296                                 }\r
297                         }        \r
298                         return Result;\r
299                 }\r
300 \r
301                 public string GetFullObjectLocation(string XsdType, out string NsName)\r
302                 {\r
303                         string AssemblyName= ReadAssemblyNameFromXml(XsdType);\r
304                         int StartIndex= XsdType.LastIndexOf(":");\r
305                         string NsIndex= XsdType.Substring(1, StartIndex - 1);\r
306                         NsName= ReadNamespaceFromXml(NsIndex);\r
307                         NsName= NsName +   "." + XsdType.Substring(StartIndex + 1, XsdType.Length - StartIndex - 1);\r
308                         return AssemblyName; \r
309                 }\r
310 \r
311                 private ValueType GetValueTypeFromNotSimpleType(string XsdType, string ItemValue)\r
312                 {\r
313                         string NsName;\r
314                         string AssemblyName= GetFullObjectLocation(XsdType, out NsName);                    \r
315                         Type ItemType= Assembly.Load(AssemblyName).GetType(NsName);\r
316                         object Result;\r
317                         if(ItemType.IsEnum)//is an enum\r
318                                 Result= Enum.Parse(ItemType, ItemValue);\r
319                         else //is a char\r
320                         {\r
321                                 if(ItemValue == cDefaultValue)                          \r
322                                         Result=  new char();\r
323                                 else                             \r
324                                         Result= Char.Parse(ItemValue);                          \r
325                         }\r
326                         return (ValueType)Result;             \r
327                 }\r
328 \r
329                 private string GetCLRTypeFromXsdType(string XsdType)\r
330                 {\r
331                         string Result= "";\r
332                         switch(XsdType)\r
333                         {                               \r
334                                 case "xsd:int"          :Result= "Int32";\r
335                                         break;\r
336                                 case "xsd:short"        :Result= "Int16";\r
337                                         break;\r
338                                 case "xsd:long"         :Result= "Int64";\r
339                                         break;\r
340                                 case "xsd:unsignedInt"  :Result= "UInt32";\r
341                                         break;\r
342                                 case "xsd:unsignedShort":Result= "UInt16";\r
343                                         break;\r
344                                 case "xsd:unsignedLong" :Result= "UInt64";\r
345                                         break;\r
346                                 case "xsd:byte"         :Result= "Byte";\r
347                                         break;\r
348                                 case "xsd:decimal"      :Result= "Decimal";\r
349                                         break;\r
350                                 case "xsd:double"       :Result= "Double"; \r
351                                         break;                          \r
352                                 case "xsd:boolean"      :Result= "Boolean";\r
353                                         break;\r
354                                 case "xsd:dateTime"     :Result= "DateTime";\r
355                                         break;\r
356                                 case "xsd:string"       :Result= "String";\r
357                                         break;\r
358                         }\r
359                         return Result;\r
360                 }\r
361 \r
362                 public ValueType GetValueTypeFromXsdType(string XsdType, string ItemValue)\r
363                 {\r
364                         ValueType Result= null;\r
365                         switch(XsdType)\r
366                         {                               \r
367                                 case "xsd:int"          : Result= Convert.ToInt32(ItemValue);\r
368                                         break;\r
369                                 case "xsd:short"        :Result= Convert.ToInt16(ItemValue);\r
370                                         break;\r
371                                 case "xsd:long"         :Result= Convert.ToInt64(ItemValue);\r
372                                         break;\r
373                                 case "xsd:unsignedInt"  :Result= Convert.ToUInt32(ItemValue);\r
374                                         break;\r
375                                 case "xsd:unsignedShort":Result= Convert.ToUInt16(ItemValue);\r
376                                         break;\r
377                                 case "xsd:unsignedLong" :Result= Convert.ToUInt64(ItemValue);\r
378                                         break;\r
379                                 case "xsd:byte"         :Result= Convert.ToByte(ItemValue);\r
380                                         break;\r
381                                 case "xsd:decimal"      :Result= Convert.ToDecimal(ItemValue);\r
382                                         break;\r
383                                 case "xsd:double"       :Result= Convert.ToDouble(ItemValue); \r
384                                         break;                          \r
385                                 case "xsd:boolean"      :Result= Convert.ToBoolean(ItemValue);\r
386                                         break;\r
387                                 case "xsd:dateTime"     :Result= Convert.ToDateTime(ItemValue);\r
388                                         break;\r
389                                 default                 :Result= GetValueTypeFromNotSimpleType(XsdType, ItemValue);\r
390                                         break;\r
391                         }\r
392                         return Result;\r
393                 }\r
394 \r
395                 /**Value types reader**/\r
396                 public string ReadValueTypeFromXml(string FieldName, XmlElement ParentElement/*string ParentElement, string ParentElementId*/)\r
397                 {\r
398                         XmlNode XmlField= ParentElement.GetElementsByTagName(FieldName).Item(0);///*FCurrentElement*/GetCurrentElement(ParentElement, ParentElementId).GetElementsByTagName(FieldName).Item(0); \r
399                         if(XmlField!= null)\r
400                                 return XmlField.InnerXml;\r
401                         else\r
402                                 return null;\r
403                 }\r
404                 \r
405                 public ValueType GetValueTypeFromString(string fieldtype, string fieldvalue)\r
406                 {\r
407                         ValueType result= null;\r
408                         switch(fieldtype)\r
409                         {\r
410                                 case "Int32"    : result= Convert.ToInt32(fieldvalue);\r
411                                         break;\r
412                                 case "Int16"    : result= Convert.ToInt16(fieldvalue);\r
413                                         break;\r
414                                 case "Int64"    : result= Convert.ToInt64(fieldvalue);\r
415                                         break;\r
416                                 case "UInt32"   : result= Convert.ToUInt32(fieldvalue);\r
417                                         break;\r
418                                 case "UInt16"   : result= Convert.ToUInt16(fieldvalue);\r
419                                         break;\r
420                                 case "UInt64"   : result= Convert.ToUInt64(fieldvalue);\r
421                                         break;\r
422                                 case "Byte"     : result= Convert.ToByte(fieldvalue);\r
423                                         break;\r
424                                 case "Decimal"  : result= Convert.ToDecimal(fieldvalue);\r
425                                         break;\r
426                                 case "Double"   : result= Convert.ToDouble(fieldvalue);\r
427                                         break;                          \r
428                                 case "Boolean"  : result= Convert.ToBoolean(fieldvalue);\r
429                                         break;\r
430                                 case "DateTime" : result= Convert.ToDateTime(fieldvalue);\r
431                                         break;\r
432                                 case "Char"     : result= Convert.ToChar(fieldvalue);\r
433                                         break;\r
434                         }\r
435                         return result;\r
436                 }               \r
437 \r
438                 /**Structs reader**/\r
439                 public string ReadStructValueFieldFromXml(/*string XmlParentElement, */string FieldName, XmlElement ParentElement/*string XmlParentElementId, */, string StructName, bool NestedStruct)\r
440                 {\r
441                         XmlElement FieldElement;                \r
442                         FieldElement= (XmlElement)ParentElement.GetElementsByTagName(FieldName).Item(0);                        \r
443                         if(FieldElement != null)\r
444                                 return FieldElement.InnerXml;\r
445                         else\r
446                                 return null;\r
447                 }\r
448 \r
449                 public void ReadStructParentElementFromXml(string StructName, XmlElement ParentElement, bool NestedStruct)\r
450                 {\r
451                         if(!NestedStruct)//is not a nested struct\r
452                                 DeepElement= (XmlElement)ParentElement.GetElementsByTagName(StructName).Item(0);//GetCurrentElement(XmlParentElement, XmlParentElementId).GetElementsByTagName(StructName).Item(0);\r
453                         else                    \r
454                                 DeepElement= (XmlElement)DeepElement.GetElementsByTagName(StructName).Item(0);\r
455                 }\r
456 \r
457                 /**Assemblies reader**/\r
458                 public string GetAssemblyNameFromId(int id)\r
459                 {                 \r
460                         XmlNodeList ObjList= ((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0)).ChildNodes;\r
461                         bool Continue= true;\r
462                         int index= 0;\r
463                         string AssemblyName= "";\r
464                         while((Continue)&&(index<= ObjList.Count - 1))\r
465                         {\r
466                                 string refid= ((XmlElement)ObjList.Item(index)).GetAttribute(cId);                        \r
467                                 int StartIndex= refid.IndexOf("-");\r
468                                 refid=  refid.Substring(StartIndex + 1, refid.Length - 1 - StartIndex);\r
469                                 if(refid== id.ToString())\r
470                                 {\r
471                                         Continue= false;                                  \r
472                                         AssemblyName= ReadAssemblyNameFromXml(((XmlElement)ObjList.Item(index)).Name);\r
473                                 }\r
474                                 else\r
475                                         index++;\r
476                         }\r
477                         return AssemblyName;\r
478                 }\r
479 \r
480                 private string GetReferenceNameFromId(int id, ref XmlElement RefElement)\r
481                 {\r
482                         XmlNodeList ObjList= ((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0)).ChildNodes;\r
483                         bool Continue= true;\r
484                         int index= 0;\r
485                         string Result= "";\r
486                         while((Continue)&&(index<= ObjList.Count - 1))\r
487                         {\r
488                                 string refid= ((XmlElement)ObjList.Item(index)).GetAttribute(cId);                        \r
489                                 int StartIndex= refid.IndexOf("-");\r
490                                 refid=  refid.Substring(StartIndex + 1, refid.Length - 1 - StartIndex);\r
491                                 if(refid== id.ToString())\r
492                                 {\r
493                                         Continue= false;                                  \r
494                                         Result= ((XmlElement)ObjList.Item(index)).Name;\r
495                                         RefElement= (XmlElement)ObjList.Item(index);\r
496                                 }\r
497                                 else\r
498                                         index++;\r
499                         }\r
500                         return Result;\r
501                 }\r
502 \r
503                 public string ReadAssemblyNameFromXml(string ParentElementName)\r
504                 {\r
505                         string RefName= ParentElementName.Substring(1, ParentElementName.LastIndexOf(":") - 1);\r
506                         string XmlNamespaceName= startxmlns + RefName;\r
507                         string AttributeName= FXmlDoc.DocumentElement.Attributes.GetNamedItem(XmlNamespaceName).Value;\r
508                         int StartIndex= AttributeName.LastIndexOf("/");\r
509                         string AssemblyName= AttributeName.Substring(StartIndex + 1, AttributeName.Length - StartIndex - 1);\r
510                         if(AssemblyName == "System")\r
511                                 AssemblyName= basicassembly;\r
512                         return AssemblyName;\r
513                 }\r
514 \r
515                 /**Namespace reader**/\r
516                 public string ReadNamespaceFromXml(string ReferenceName)\r
517                 {\r
518                         string XmlNamespaceName= startxmlns + ReferenceName; \r
519                         string AttributeName= FXmlDoc.DocumentElement.Attributes.GetNamedItem(XmlNamespaceName).Value;\r
520                         int StartIndex= AttributeName.LastIndexOf("/");\r
521                         string Result= "";\r
522                         string NsName= AttributeName.Substring(StartIndex + 1, AttributeName.Length - StartIndex - 1);\r
523                         if(NsName == "System")\r
524                                 Result= NsName;\r
525                         else\r
526                         {\r
527                                 string TmpStr= AttributeName.Substring(0, StartIndex);\r
528                                 StartIndex= TmpStr.LastIndexOf("/");\r
529                                 Result= TmpStr.Substring(StartIndex + 1, TmpStr.Length - StartIndex - 1);\r
530                         }\r
531                         return Result;\r
532                   \r
533                 }\r
534 \r
535                 /**Utils**/\r
536                 public XmlElement GetCurrentElement(string ElementName, string ElementId)\r
537                 {\r
538                         string RefId= cObjectRef + ElementId;\r
539                         XmlNodeList NodeList = ((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0)).GetElementsByTagName(ElementName);\r
540                         bool Continue= true;\r
541                         int index= 0;\r
542                         string Result= "";\r
543                         XmlElement ActElement = null;\r
544                         while((Continue)&&(index <= NodeList.Count - 1))\r
545                         {\r
546                                 ActElement= (XmlElement)NodeList.Item(index);\r
547                                 if(ActElement.GetAttribute("id")== RefId)//the attributes match\r
548                                         Continue= false;                                \r
549                                 else\r
550                                         index++;\r
551                         }\r
552                         if(!Continue)\r
553                                 return ActElement;\r
554                         else\r
555                                 return null;\r
556                 }\r
557                 \r
558                 private int ReadFieldIdValueFromXml(string FieldName, XmlElement ParentElement)\r
559                 {\r
560                         XmlElement FieldElement= (XmlElement)ParentElement.GetElementsByTagName(FieldName).Item(0);//(XmlElement)GetCurrentElement(XmlParentElement, XmlParentElementId).GetElementsByTagName(FieldName).Item(0);\r
561                         if(FieldElement.GetAttribute(cXsiNull)== "") //if it is not a null field\r
562                         {\r
563                                 string refvalue= FieldElement.GetAttribute(cId);\r
564                                 int StartIndex= refvalue.IndexOf("-");\r
565                                 return Convert.ToInt32(refvalue.Substring(StartIndex + 1, refvalue.Length - 1 - StartIndex));\r
566                         }\r
567                         else\r
568                                 return -1;\r
569                 }\r
570 \r
571                 private int ReadFieldIdValueFromXml(int ItemIndex, XmlElement ParentElement)\r
572                 {\r
573                         XmlElement FieldElement= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);\r
574                         if(FieldElement.GetAttribute(cXsiNull)== "") //if it is not a null field\r
575                         {\r
576                                 string refvalue= FieldElement.GetAttribute(cId);\r
577                                 int StartIndex= refvalue.IndexOf("-");\r
578                                 return Convert.ToInt32(refvalue.Substring(StartIndex + 1, refvalue.Length - 1 - StartIndex));\r
579                         }\r
580                         else\r
581                                 return -1;\r
582                 }\r
583         }       \r
584 }\r