Unity Udexreal开发插件包
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
9.9 KiB

//------------------------------------------------------------------------------
// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有
// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权
// CSDN博客:https://blog.csdn.net/qq_40374647
// 哔哩哔哩视频:https://space.bilibili.com/94253567
// Gitee源代码仓库:https://gitee.com/RRQM_Home
// Github源代码仓库:https://github.com/RRQM
// API首页:https://www.yuque.com/rrqm/touchsocket/index
// 交流QQ群:234762506
// 感谢您的下载和使用
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Reflection;
using System.Text;
using System.Xml;
using TouchSocket.Core;
using TouchSocket.Http;
namespace TouchSocket.Rpc.XmlRpc
{
internal static class XmlDataTool
{
public static object GetValue(XmlNode valueNode, Type type)
{
if (valueNode == null)
{
return type.GetDefault();
}
switch (valueNode.Name)
{
case "boolean":
{
return bool.Parse(valueNode.InnerText);
}
case "i4":
case "int":
{
return int.Parse(valueNode.InnerText);
}
case "double":
{
return double.Parse(valueNode.InnerText);
}
case "dateTime.iso8601":
{
return DateTime.Parse(valueNode.InnerText);
}
case "base64":
{
return valueNode.InnerText;
}
case "struct":
{
object instance = Activator.CreateInstance(type);
foreach (XmlNode memberNode in valueNode.ChildNodes)
{
string name = memberNode.SelectSingleNode("name").InnerText;
PropertyInfo property = type.GetProperty(name);
property.SetValue(instance, GetValue(memberNode.SelectSingleNode("value").FirstChild, property.PropertyType));
}
return instance;
}
case "arrays":
case "array":
{
if (type.GetElementType() != null)
{
XmlNode dataNode = valueNode.SelectSingleNode("data");
Array array = Array.CreateInstance(type.GetElementType(), dataNode.ChildNodes.Count);
int index = 0;
foreach (XmlNode arrayValueNode in dataNode.ChildNodes)
{
array.SetValue(GetValue(arrayValueNode.FirstChild, type.GetElementType()), index);
index++;
}
return array;
}
else if (type.GetGenericArguments().Length == 1)
{
XmlNode dataNode = valueNode.SelectSingleNode("data");
IList array = (IList)Activator.CreateInstance(type);
foreach (XmlNode arrayValueNode in dataNode.ChildNodes)
{
array.Add(GetValue(arrayValueNode.FirstChild, type.GetGenericArguments()[0]));
}
return array;
}
return type.GetDefault();
}
default:
case "string":
{
return valueNode.InnerText;
}
}
}
public static HttpRequest CreateRequest(string host, string url, string method, object[] parameters)
{
XmlDocument xml = new XmlDocument();
XmlDeclaration xmlDecl = xml.CreateXmlDeclaration("1.0", string.Empty, string.Empty);
xml.AppendChild(xmlDecl);
XmlElement xmlElement = xml.CreateElement("methodCall");
xml.AppendChild(xmlElement);
XmlElement methodNameElement = xml.CreateElement("methodName");
methodNameElement.InnerText = method;
xmlElement.AppendChild(methodNameElement);
XmlElement paramsElement = xml.CreateElement("params");
xmlElement.AppendChild(paramsElement);
if (parameters != null)
{
foreach (var param in parameters)
{
XmlElement paramElement = xml.CreateElement("param");
paramsElement.AppendChild(paramElement);
XmlElement valueElement = xml.CreateElement("value");
paramElement.AppendChild(valueElement);
CreateParam(xml, valueElement, param);
}
}
HttpRequest request = new HttpRequest();
request.FromXML(xml.OuterXml)
.InitHeaders()
.SetUrl(url)
.SetHost(host)
.AsPost();
return request;
}
public static void CreateParam(XmlDocument xml, XmlNode xmlNode, object value)
{
if (value == null)
{
return;
}
if (value is int)
{
XmlElement valueElement = xml.CreateElement("i4");
valueElement.InnerText = value.ToString();
xmlNode.AppendChild(valueElement);
}
else if (value is bool)
{
XmlElement valueElement = xml.CreateElement("boolean");
valueElement.InnerText = (value).ToString();
xmlNode.AppendChild(valueElement);
}
else if (value is double)
{
XmlElement valueElement = xml.CreateElement("double");
valueElement.InnerText = ((double)value).ToString();
xmlNode.AppendChild(valueElement);
}
else if (value is string)
{
XmlElement valueElement = xml.CreateElement("string");
valueElement.InnerText = value.ToString();
xmlNode.AppendChild(valueElement);
}
else if (value is DateTime)
{
XmlElement valueElement = xml.CreateElement("dateTime.iso8601");
valueElement.InnerText = ((DateTime)value).ToString();
xmlNode.AppendChild(valueElement);
}
else if (value is byte[])
{
XmlElement valueElement = xml.CreateElement("base64");
string str = Convert.ToBase64String((byte[])value);
valueElement.InnerText = str;
xmlNode.AppendChild(valueElement);
}
else if (typeof(IList).IsAssignableFrom(value.GetType()))
{
IList array = (IList)value;
XmlElement arrayElement;
arrayElement = xml.CreateElement("array");
xmlNode.AppendChild(arrayElement);
XmlElement dataElememt = xml.CreateElement("data");
arrayElement.AppendChild(dataElememt);
foreach (var item in array)
{
XmlElement valueElement = xml.CreateElement("value");
dataElememt.AppendChild(valueElement);
CreateParam(xml, valueElement, item);
}
}
else
{
XmlElement valueElement = xml.CreateElement("struct");
xmlNode.AppendChild(valueElement);
PropertyInfo[] propertyInfos = value.GetType().GetProperties();
foreach (var propertyInfo in propertyInfos)
{
XmlElement memberElement = xml.CreateElement("member");
valueElement.AppendChild(memberElement);
XmlElement nameElement = xml.CreateElement("name");
nameElement.InnerText = propertyInfo.Name;
memberElement.AppendChild(nameElement);
XmlElement oValueElement = xml.CreateElement("value");
memberElement.AppendChild(oValueElement);
object oValue = propertyInfo.GetValue(value);
CreateParam(xml, oValueElement, oValue);
}
}
}
public static void CreatResponse(HttpResponse httpResponse, object value)
{
XmlDocument xml = new XmlDocument();
XmlDeclaration xmlDecl = xml.CreateXmlDeclaration("1.0", string.Empty, string.Empty);
xml.AppendChild(xmlDecl);
XmlElement xmlElement = xml.CreateElement("methodResponse");
xml.AppendChild(xmlElement);
XmlElement paramsElement = xml.CreateElement("params");
xmlElement.AppendChild(paramsElement);
XmlElement paramElement = xml.CreateElement("param");
paramsElement.AppendChild(paramElement);
XmlElement valueElement = xml.CreateElement("value");
paramElement.AppendChild(valueElement);
CreateParam(xml, valueElement, value);
ByteBlock xmlBlock = new ByteBlock();
xml.Save(xmlBlock);
string xmlString = Encoding.UTF8.GetString(xmlBlock.Buffer, 0, xmlBlock.Len);
httpResponse.FromXML(xmlString);
xmlBlock.Dispose();
}
}
}