private void writeValue(XmlDictionaryWriter writer, Param param) { string valueType; object value = param.Value; if (param.Value.GetType().IsArray) { valueType = "array"; } else if (param.Value.GetType().Name.ToLower() == "xmlrpcstruct") { valueType = "struct"; } else { valueType = param.Value.GetType().Name.ToLower(); } switch (valueType) { case "string": valueType = "string"; break; case "bool": case "boolean": valueType = "boolean"; bool temp = (bool)value; if (temp == true) { value = 1; } else { value = 0; } break; case "int16": case "int32": case "int64": case "int": case "short": case "long": valueType = "i4"; break; case "float": case "double": valueType = "double"; break; case "array": valueType = "array"; writer.WriteStartElement(valueType); writer.WriteStartElement("data"); Array arrayParam = (Array)value; foreach (object element in arrayParam) { Param newParam = new Param() { Value = element }; writer.WriteStartElement("value"); writeValue(writer, newParam); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndElement(); return; case "struct": case "xmlrpcstruct": valueType = "struct"; writer.WriteStartElement(valueType); XmlRpcStruct structParam = (XmlRpcStruct)value; foreach (StructMember member in structParam.Member) { writer.WriteStartElement("member"); Param memberName = new Param() { Value = member.Name }; Param memberValue = new Param() { Value = member.Value }; writer.WriteStartElement("name"); writeValue(writer, memberName); writer.WriteEndElement(); writer.WriteStartElement("value"); writeValue(writer, memberValue); writer.WriteEndElement(); writer.WriteEndElement(); } writer.WriteEndElement(); return; case "datetime": valueType = "dateTime.iso8601"; DateTime dt = new DateTime(); dt = (DateTime)value; value = dt.ToString("o"); break; default: throw new NotSupportedException("Unsupported type!"); } writer.WriteStartElement(valueType); writer.WriteValue(value); writer.WriteEndElement(); }
/// <summary> /// Read XML document and deserialize into object /// </summary> /// <param name="reader">XML Reader</param> /// <param name="verifyObjectName"></param> /// <returns></returns> public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName) { MethodResponse methodResponse = null; MethodFaultResponse faultResponse = null; bool isFault = false; Param param = new Param(); object value = null; while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name.ToLower() == "fault") { faultResponse = new MethodFaultResponse(); isFault = true; } if (isFault == true) { if (reader.Name.ToLower() == "value") { value = ParseValue(reader); XmlRpcStruct xmlRpcStruct = (XmlRpcStruct)value; foreach (StructMember member in xmlRpcStruct.Member) { if (member.Name == "faultCode") { faultResponse.FaultCode = Convert.ToInt16(member.Value); } else if (member.Name == "faultString") { faultResponse.Message = (string)member.Value; } } } } else { if (reader.Name.ToLower() == "params") { methodResponse = new MethodResponse(); methodResponse.ReceiveParams = new List <Param>(); } else if (reader.Name.ToLower() == "value") { value = ParseValue(reader); if (value != null) { param.Value = value; methodResponse.ReceiveParams.Add(param); } } } } } if (isFault) { isFault = false; //return faultResponse; XmlRpcFaultException ex = new XmlRpcFaultException(faultResponse.FaultCode, faultResponse.Message); throw ex; } else { return(methodResponse); } }