3 using System.Reflection;
\r
5 namespace System.Runtime.Serialization.Formatters.Soap
\r
8 public enum ReferenceTypes {Array_Type, Object_Type, Interface_Type, Delegate_Type, String_Type};
\r
10 internal class SoapReader
\r
12 /******const section******/
\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
39 //FUtils= new Utils();
\r
42 /**Reference Types reader**/
\r
43 public int ReadObjectIndexFromXml(string ObjectElemt)
\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
53 private string ReadReferenceFullNameFromXmlNode(XmlNode ReferenceNode)
\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
65 public string ReadReferenceFullNameFromXml(string RefereneId)
\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
72 while((Continue)&&(index <= NodeList.Count - 1))
\r
74 XmlElement ActElement= (XmlElement)NodeList.Item(index);
\r
75 if(ActElement.GetAttribute("id")== RefId)//the attributes match
\r
77 Result= ReadReferenceFullNameFromXmlNode(ActElement);
\r
86 /**ReadReferenceIndexFromXml**/
\r
87 public int ReadReferenceIndexFromXml(string FieldName, XmlElement ParentElement)
\r
89 XmlElement FieldElement= (XmlElement)ParentElement.GetElementsByTagName(FieldName).Item(0);
\r
90 if(FieldElement.GetAttribute(cXsiNull)== "") //if it is not a null field
\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
100 public int ReadReferenceIndexFromXml(int ItemIndex, XmlElement ParentElement)
\r
102 XmlElement FieldElement= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);
\r
103 if(FieldElement.GetAttribute(cXsiNull)== "") //if it is not a null field
\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
115 /**String reader**/
\r
116 public int ReadStringIdFromXml(/*string XmlParentElement, */string FieldName,/* string XmlParentElementId, */XmlElement ParentElement)
\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
122 return ReadFieldIdValueFromXml(FieldName, ParentElement);
\r
125 public int ReadStringIdFromXml(int ItemIndex, XmlElement ParentElement)
\r
127 XmlElement FieldElement= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);
\r
128 string StrId= FieldElement.GetAttribute(cId);
\r
130 return ReadReferenceIndexFromXml(ItemIndex, ParentElement);
\r
132 return ReadFieldIdValueFromXml(ItemIndex, ParentElement);
\r
135 public string ReadStringTypeFromXml(string FieldName, XmlElement ParentElement)
\r
137 XmlNode XmlField= ParentElement.GetElementsByTagName(FieldName).Item(0);
\r
138 if(XmlField!= null)
\r
139 return XmlField.InnerXml;
\r
144 public string ReadStringTypeFromXml(int ItemIndex, XmlElement ParentElement)
\r
146 XmlNode XmlField= ParentElement.ChildNodes.Item(ItemIndex);
\r
147 if(XmlField!= null)
\r
148 return XmlField.InnerXml;
\r
153 /**Delegates reader**/
\r
154 public string GetDelegateElementName(int DelegateId)
\r
156 XmlAttributeCollection XmlAttrCollection= FXmlDoc.DocumentElement.Attributes;
\r
157 bool Continue= true;
\r
159 string ItemName= "";
\r
160 while((Continue)&&(i<= XmlAttrCollection.Count - 1))
\r
162 string AttrValue= XmlAttrCollection.Item(i).Value;
\r
163 if(AttrValue == Systemns)
\r
165 ItemName= XmlAttrCollection.Item(i).Name;
\r
166 ItemName= ItemName.Substring(ItemName.LastIndexOf(":") + 1, ItemName.Length - 1 - ItemName.LastIndexOf(":"));
\r
171 return ItemName + ":" + cDelegateSerClass;
\r
174 public Type GetDelegateTypeFromXml(XmlElement ParentElement)
\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
182 /**Arrays reader**/
\r
183 public string ReadArrayTypeFromXml(XmlElement ArrayElement, out string AssemblyName)
\r
185 string ArrayTypeAttr= ArrayElement.GetAttribute(cSoapArrayType);
\r
186 int StartIndex= ArrayTypeAttr.LastIndexOf(":");
\r
188 if(ArrayTypeAttr.Substring(0, 4) == "xsd:")
\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
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
207 public bool IsArrayItemValueType(XmlElement ParentElement, int ItemIndex, ref bool IsNull, ref bool IsStruct)
\r
209 XmlElement ArrayItem= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);
\r
210 bool Result= false;
\r
211 if(ArrayItem.GetAttribute(cXsiNull)== "")//is not null
\r
214 if((ArrayItem.InnerXml != "")&&(ArrayItem.GetAttribute(cId) == ""))
\r
217 if(ArrayItem.InnerXml.Substring(0, 1)== "<") //is an atruct
\r
226 public ValueType ReadArrayItemSimpleTypeFromXml(XmlElement ParentElement, int ItemIndex, string ItemTypeName)
\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
232 return GetValueTypeFromXsdType(XsiType, ItemValue);
\r
234 return GetValueTypeFromString(ItemTypeName, ItemValue);
\r
237 public ReferenceTypes GetReferenceType(string FieldName, XmlElement ParentElement, ref XmlElement RefElement)
\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
246 string RefIndex= ArrayItem.GetAttribute(cSoapRef);
\r
247 if(RefIndex != "") //is a other reference
\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
256 Result= ReferenceTypes.String_Type;
\r
259 if((RefName.IndexOf(cDelegateSerClass) != -1)&&(RefElement.ChildNodes.Item(0).Name== cDelegateType)) //is a delegates
\r
260 Result= ReferenceTypes.Delegate_Type;
\r
262 Result= ReferenceTypes.Object_Type;
\r
269 public ReferenceTypes GetReferenceType(int index, XmlElement ParentElement, ref XmlElement RefElement)
\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
278 string RefIndex= ArrayItem.GetAttribute(cSoapRef);
\r
279 if(RefIndex != "") //is a other reference
\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
288 Result= ReferenceTypes.String_Type;
\r
291 if((RefName.IndexOf(cDelegateSerClass) != -1)&&(RefElement.ChildNodes.Item(0).Name== cDelegateType)) //is a delegates
\r
292 Result= ReferenceTypes.Delegate_Type;
\r
294 Result= ReferenceTypes.Object_Type;
\r
301 public string GetFullObjectLocation(string XsdType, out string NsName)
\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
311 private ValueType GetValueTypeFromNotSimpleType(string XsdType, string ItemValue)
\r
314 string AssemblyName= GetFullObjectLocation(XsdType, out NsName);
\r
315 Type ItemType= Assembly.Load(AssemblyName).GetType(NsName);
\r
317 if(ItemType.IsEnum)//is an enum
\r
318 Result= Enum.Parse(ItemType, ItemValue);
\r
321 if(ItemValue == cDefaultValue)
\r
322 Result= new char();
\r
324 Result= Char.Parse(ItemValue);
\r
326 return (ValueType)Result;
\r
329 private string GetCLRTypeFromXsdType(string XsdType)
\r
334 case "xsd:int" :Result= "Int32";
\r
336 case "xsd:short" :Result= "Int16";
\r
338 case "xsd:long" :Result= "Int64";
\r
340 case "xsd:unsignedInt" :Result= "UInt32";
\r
342 case "xsd:unsignedShort":Result= "UInt16";
\r
344 case "xsd:unsignedLong" :Result= "UInt64";
\r
346 case "xsd:byte" :Result= "Byte";
\r
348 case "xsd:decimal" :Result= "Decimal";
\r
350 case "xsd:double" :Result= "Double";
\r
352 case "xsd:boolean" :Result= "Boolean";
\r
354 case "xsd:dateTime" :Result= "DateTime";
\r
356 case "xsd:string" :Result= "String";
\r
362 public ValueType GetValueTypeFromXsdType(string XsdType, string ItemValue)
\r
364 ValueType Result= null;
\r
367 case "xsd:int" : Result= Convert.ToInt32(ItemValue);
\r
369 case "xsd:short" :Result= Convert.ToInt16(ItemValue);
\r
371 case "xsd:long" :Result= Convert.ToInt64(ItemValue);
\r
373 case "xsd:unsignedInt" :Result= Convert.ToUInt32(ItemValue);
\r
375 case "xsd:unsignedShort":Result= Convert.ToUInt16(ItemValue);
\r
377 case "xsd:unsignedLong" :Result= Convert.ToUInt64(ItemValue);
\r
379 case "xsd:byte" :Result= Convert.ToByte(ItemValue);
\r
381 case "xsd:decimal" :Result= Convert.ToDecimal(ItemValue);
\r
383 case "xsd:double" :Result= Convert.ToDouble(ItemValue);
\r
385 case "xsd:boolean" :Result= Convert.ToBoolean(ItemValue);
\r
387 case "xsd:dateTime" :Result= Convert.ToDateTime(ItemValue);
\r
389 default :Result= GetValueTypeFromNotSimpleType(XsdType, ItemValue);
\r
395 /**Value types reader**/
\r
396 public string ReadValueTypeFromXml(string FieldName, XmlElement ParentElement/*string ParentElement, string ParentElementId*/)
\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
405 public ValueType GetValueTypeFromString(string fieldtype, string fieldvalue)
\r
407 ValueType result= null;
\r
410 case "Int32" : result= Convert.ToInt32(fieldvalue);
\r
412 case "Int16" : result= Convert.ToInt16(fieldvalue);
\r
414 case "Int64" : result= Convert.ToInt64(fieldvalue);
\r
416 case "UInt32" : result= Convert.ToUInt32(fieldvalue);
\r
418 case "UInt16" : result= Convert.ToUInt16(fieldvalue);
\r
420 case "UInt64" : result= Convert.ToUInt64(fieldvalue);
\r
422 case "Byte" : result= Convert.ToByte(fieldvalue);
\r
424 case "Decimal" : result= Convert.ToDecimal(fieldvalue);
\r
426 case "Double" : result= Convert.ToDouble(fieldvalue);
\r
428 case "Boolean" : result= Convert.ToBoolean(fieldvalue);
\r
430 case "DateTime" : result= Convert.ToDateTime(fieldvalue);
\r
432 case "Char" : result= Convert.ToChar(fieldvalue);
\r
438 /**Structs reader**/
\r
439 public string ReadStructValueFieldFromXml(/*string XmlParentElement, */string FieldName, XmlElement ParentElement/*string XmlParentElementId, */, string StructName, bool NestedStruct)
\r
441 XmlElement FieldElement;
\r
442 FieldElement= (XmlElement)ParentElement.GetElementsByTagName(FieldName).Item(0);
\r
443 if(FieldElement != null)
\r
444 return FieldElement.InnerXml;
\r
449 public void ReadStructParentElementFromXml(string StructName, XmlElement ParentElement, bool NestedStruct)
\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
454 DeepElement= (XmlElement)DeepElement.GetElementsByTagName(StructName).Item(0);
\r
457 /**Assemblies reader**/
\r
458 public string GetAssemblyNameFromId(int id)
\r
460 XmlNodeList ObjList= ((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0)).ChildNodes;
\r
461 bool Continue= true;
\r
463 string AssemblyName= "";
\r
464 while((Continue)&&(index<= ObjList.Count - 1))
\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
472 AssemblyName= ReadAssemblyNameFromXml(((XmlElement)ObjList.Item(index)).Name);
\r
477 return AssemblyName;
\r
480 private string GetReferenceNameFromId(int id, ref XmlElement RefElement)
\r
482 XmlNodeList ObjList= ((XmlElement)FXmlDoc.DocumentElement.GetElementsByTagName("SOAP-ENV:Body").Item(0)).ChildNodes;
\r
483 bool Continue= true;
\r
486 while((Continue)&&(index<= ObjList.Count - 1))
\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
494 Result= ((XmlElement)ObjList.Item(index)).Name;
\r
495 RefElement= (XmlElement)ObjList.Item(index);
\r
503 public string ReadAssemblyNameFromXml(string ParentElementName)
\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
515 /**Namespace reader**/
\r
516 public string ReadNamespaceFromXml(string ReferenceName)
\r
518 string XmlNamespaceName= startxmlns + ReferenceName;
\r
519 string AttributeName= FXmlDoc.DocumentElement.Attributes.GetNamedItem(XmlNamespaceName).Value;
\r
520 int StartIndex= AttributeName.LastIndexOf("/");
\r
522 string NsName= AttributeName.Substring(StartIndex + 1, AttributeName.Length - StartIndex - 1);
\r
523 if(NsName == "System")
\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
536 public XmlElement GetCurrentElement(string ElementName, string ElementId)
\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
543 XmlElement ActElement = null;
\r
544 while((Continue)&&(index <= NodeList.Count - 1))
\r
546 ActElement= (XmlElement)NodeList.Item(index);
\r
547 if(ActElement.GetAttribute("id")== RefId)//the attributes match
\r
558 private int ReadFieldIdValueFromXml(string FieldName, XmlElement ParentElement)
\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
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
571 private int ReadFieldIdValueFromXml(int ItemIndex, XmlElement ParentElement)
\r
573 XmlElement FieldElement= (XmlElement)ParentElement.ChildNodes.Item(ItemIndex);
\r
574 if(FieldElement.GetAttribute(cXsiNull)== "") //if it is not a null field
\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