2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.Runtime.Serialization.Formatters.Soap / System.Runtime.Serialization.Formatters.Soap / SoapReader.cs
index 69ff966dbb2f9f4c6806bfb3589a8f09a54b8a00..ee345899019a836eff597544315c856cc6cf3b2d 100755 (executable)
@@ -193,10 +193,12 @@ namespace System.Runtime.Serialization.Formatters.Soap {
                private Type GetComponentType()\r
                {\r
                        Type type = null;\r
-                       if(GetId() != 0) return typeof(string);\r
                        \r
                        string strValue = xmlReader["type", XmlSchema.InstanceNamespace];\r
-                       if(strValue == null) return null;\r
+                       if(strValue == null) {\r
+                               if(GetId() != 0) return typeof(string);\r
+                               return null;\r
+                       }\r
                        string[] strName = strValue.Split(':');\r
                        string namespaceURI = xmlReader.LookupNamespace(strName[0]);\r
                        type = mapper[new Element(string.Empty, strName[1], namespaceURI)];\r
@@ -226,48 +228,55 @@ namespace System.Runtime.Serialization.Formatters.Soap {
                        long paramValuesId = NextAvailableId;\r
                        int[] indices = new int[1];\r
 \r
-                       int initialDepth = xmlReader.Depth;\r
-                       xmlReader.Read();\r
-                       int i = 0;\r
-                       while(xmlReader.Depth > initialDepth) \r
+                       if (!xmlReader.IsEmptyElement)\r
                        {\r
-                               long paramId, paramHref;\r
-                               object objParam = null;\r
-                               paramNames.Add (xmlReader.Name);\r
-                               Type paramType = null;\r
-                               \r
-                               if (message.ParamTypes != null) {\r
-                                       if (i >= message.ParamTypes.Length)\r
-                                               throw new SerializationException ("Not enough parameter types in SoapMessages");\r
-                                       paramType = message.ParamTypes [i];\r
-                               }\r
-                               \r
-                               indices[0] = i;\r
-                               objParam = DeserializeComponent(\r
-                                       paramType,\r
-                                       out paramId,\r
-                                       out paramHref,\r
-                                       paramValuesId,\r
-                                       null,\r
-                                       indices);\r
-                               indices[0] = paramValues.Add(objParam);\r
-                               if(paramHref != 0) \r
-                               {\r
-                                       RecordFixup(paramValuesId, paramHref, paramValues.ToArray(), null, null, null, indices);\r
-                               }\r
-                               else if(paramId != 0) \r
-                               {\r
-//                                     RegisterObject(paramId, objParam, null, paramValuesId, null, indices);\r
-                               }\r
-                               else \r
+                               int initialDepth = xmlReader.Depth;\r
+                               xmlReader.Read();\r
+                               int i = 0;\r
+                               while(xmlReader.Depth > initialDepth) \r
                                {\r
+                                       long paramId, paramHref;\r
+                                       object objParam = null;\r
+                                       paramNames.Add (xmlReader.Name);\r
+                                       Type paramType = null;\r
+                                       \r
+                                       if (message.ParamTypes != null) {\r
+                                               if (i >= message.ParamTypes.Length)\r
+                                                       throw new SerializationException ("Not enough parameter types in SoapMessages");\r
+                                               paramType = message.ParamTypes [i];\r
+                                       }\r
+                                       \r
+                                       indices[0] = i;\r
+                                       objParam = DeserializeComponent(\r
+                                               paramType,\r
+                                               out paramId,\r
+                                               out paramHref,\r
+                                               paramValuesId,\r
+                                               null,\r
+                                               indices);\r
+                                       indices[0] = paramValues.Add(objParam);\r
+                                       if(paramHref != 0) \r
+                                       {\r
+                                               RecordFixup(paramValuesId, paramHref, paramValues.ToArray(), null, null, null, indices);\r
+                                       }\r
+                                       else if(paramId != 0) \r
+                                       {\r
+//                                             RegisterObject(paramId, objParam, null, paramValuesId, null, indices);\r
+                                       }\r
+                                       else \r
+                                       {\r
+                                       }\r
+                                       i++;\r
                                }\r
-                               i++;\r
+                               xmlReader.ReadEndElement();\r
                        }\r
-\r
+                       else\r
+                       {\r
+                               xmlReader.Read();\r
+                       }\r
+                       \r
                        message.ParamNames = (string[]) paramNames.ToArray(typeof(string));\r
                        message.ParamValues = paramValues.ToArray();\r
-                       xmlReader.ReadEndElement();\r
                        RegisterObject(paramValuesId, message.ParamValues, null, 0, null, null);\r
                        return true;\r
                }
@@ -325,6 +334,13 @@ namespace System.Runtime.Serialization.Formatters.Soap {
                \r
                private object DeserializeArray(long id)\r
                {\r
+                       // Special case for base64 byte arrays\r
+                       if (GetComponentType () == typeof(byte[])) {\r
+                               byte[] data = Convert.FromBase64String (xmlReader.ReadElementString());\r
+                               RegisterObject(id, data, null, 0, null, null);\r
+                               return data;\r
+                       }\r
+                       \r
                        // Get the array properties\r
                        string strArrayType = xmlReader["arrayType", SoapTypeMapper.SoapEncodingNamespace];\r
                        string[] arrayInfo = strArrayType.Split(':','[',',',']');\r
@@ -350,13 +366,11 @@ namespace System.Runtime.Serialization.Formatters.Soap {
                                indices[i] = array.GetLowerBound(i);\r
                        }\r
 \r
-\r
                        // Deserialize the array items\r
                        int arrayDepth = xmlReader.Depth;\r
                        xmlReader.Read();\r
                        while(xmlReader.Depth > arrayDepth)\r
                        {\r
-\r
                                Type itemType = GetComponentType();\r
                                if(itemType == null) \r
                                        itemType = array.GetType().GetElementType();\r
@@ -508,7 +522,6 @@ namespace System.Runtime.Serialization.Formatters.Soap {
                        Type currentType = obj.GetType();\r
                        TypeMetadata tm = GetTypeMetadata (currentType);\r
 \r
-                       int objDepth = xmlReader.Depth;\r
                        object[] data = new object[tm.MemberInfos.Length];\r
                        xmlReader.Read();\r
                        for(int i = 0; i < tm.MemberInfos.Length; i++)\r