From 09c241f428f3fbdbca6bbb9d87ed6b933af697f2 Mon Sep 17 00:00:00 2001 From: lidgren Date: Sun, 30 May 2010 13:58:04 +0000 Subject: [PATCH] Moved reflection read/write methods to their own partial class files --- Lidgren.Network/Lidgren.Network.csproj | 4 + .../NetIncomingMessage.Read.Reflection.cs | 139 ++++++++++++++++++ Lidgren.Network/NetIncomingMessage.Read.cs | 116 +-------------- .../NetOutgoingMessage.Write.Reflection.cs | 91 ++++++++++++ Lidgren.Network/NetOutgoingMessage.Write.cs | 88 +++-------- Lidgren.Network/NetPeer.Internal.cs | 3 +- 6 files changed, 256 insertions(+), 185 deletions(-) create mode 100644 Lidgren.Network/NetIncomingMessage.Read.Reflection.cs create mode 100644 Lidgren.Network/NetOutgoingMessage.Write.Reflection.cs diff --git a/Lidgren.Network/Lidgren.Network.csproj b/Lidgren.Network/Lidgren.Network.csproj index 4edeaf1..c153175 100644 --- a/Lidgren.Network/Lidgren.Network.csproj +++ b/Lidgren.Network/Lidgren.Network.csproj @@ -33,6 +33,8 @@ + + @@ -51,12 +53,14 @@ + + diff --git a/Lidgren.Network/NetIncomingMessage.Read.Reflection.cs b/Lidgren.Network/NetIncomingMessage.Read.Reflection.cs new file mode 100644 index 0000000..8937490 --- /dev/null +++ b/Lidgren.Network/NetIncomingMessage.Read.Reflection.cs @@ -0,0 +1,139 @@ +/* Copyright (c) 2010 Michael Lidgren + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +using System; +using System.Reflection; + +namespace Lidgren.Network +{ + public partial class NetIncomingMessage + { + /// + /// Reads all public and private declared instance fields of the object in alphabetical order using reflection + /// + public void ReadAllFields(object target) + { + ReadAllFields(target, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + } + + /// + /// Reads all fields with the specified binding of the object in alphabetical order using reflection + /// + public void ReadAllFields(object target, BindingFlags flags) + { + if (target == null) + return; + Type tp = target.GetType(); + + FieldInfo[] fields = tp.GetFields(flags); + SortMembersList(fields); + + foreach (FieldInfo fi in fields) + { + object value; + + // find read method + MethodInfo readMethod; + if (s_readMethods.TryGetValue(fi.FieldType, out readMethod)) + { + // read value + value = readMethod.Invoke(this, null); + + // set the value + fi.SetValue(target, value); + } + } + } + + /// + /// Reads all public and private declared instance fields of the object in alphabetical order using reflection + /// + public void ReadAllProperties(object target) + { + ReadAllProperties(target, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + } + + /// + /// Reads all fields with the specified binding of the object in alphabetical order using reflection + /// + public void ReadAllProperties(object target, BindingFlags flags) + { + if (target == null) + return; + Type tp = target.GetType(); + + PropertyInfo[] fields = tp.GetProperties(flags); + SortMembersList(fields); + foreach (PropertyInfo fi in fields) + { + object value; + + // find read method + MethodInfo readMethod; + if (s_readMethods.TryGetValue(fi.PropertyType, out readMethod)) + { + // read value + value = readMethod.Invoke(this, null); + + // set the value + MethodInfo setMethod = fi.GetSetMethod((flags & BindingFlags.NonPublic) == BindingFlags.NonPublic); + setMethod.Invoke(target, new object[] { value }); + } + } + } + + // shell sort + internal static void SortMembersList(MemberInfo[] list) + { + int h; + int j; + MemberInfo tmp; + + h = 1; + while (h * 3 + 1 <= list.Length) + h = 3 * h + 1; + + while (h > 0) + { + for (int i = h - 1; i < list.Length; i++) + { + tmp = list[i]; + j = i; + while (true) + { + if (j >= h) + { + if (string.Compare(list[j - h].Name, tmp.Name, StringComparison.InvariantCulture) > 0) + { + list[j] = list[j - h]; + j -= h; + } + else + break; + } + else + break; + } + + list[j] = tmp; + } + h /= 3; + } + } + } +} diff --git a/Lidgren.Network/NetIncomingMessage.Read.cs b/Lidgren.Network/NetIncomingMessage.Read.cs index aa56443..7224b60 100644 --- a/Lidgren.Network/NetIncomingMessage.Read.cs +++ b/Lidgren.Network/NetIncomingMessage.Read.cs @@ -18,10 +18,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. */ using System; -using System.Diagnostics; +using System.Collections.Generic; using System.Net; using System.Reflection; -using System.Collections.Generic; namespace Lidgren.Network { @@ -472,118 +471,5 @@ namespace Lidgren.Network { m_readPosition += numberOfBits; } - - /// - /// Reads all public and private declared instance fields of the object in alphabetical order using reflection - /// - public void ReadAllFields(object target) - { - ReadAllFields(target, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); - } - - /// - /// Reads all fields with the specified binding of the object in alphabetical order using reflection - /// - public void ReadAllFields(object target, BindingFlags flags) - { - if (target == null) - return; - Type tp = target.GetType(); - - FieldInfo[] fields = tp.GetFields(flags); - SortMembersList(fields); - - foreach (FieldInfo fi in fields) - { - object value; - - // find read method - MethodInfo readMethod; - if (s_readMethods.TryGetValue(fi.FieldType, out readMethod)) - { - // read value - value = readMethod.Invoke(this, null); - - // set the value - fi.SetValue(target, value); - } - } - } - - /// - /// Reads all public and private declared instance fields of the object in alphabetical order using reflection - /// - public void ReadAllProperties(object target) - { - ReadAllProperties(target, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); - } - - /// - /// Reads all fields with the specified binding of the object in alphabetical order using reflection - /// - public void ReadAllProperties(object target, BindingFlags flags) - { - if (target == null) - return; - Type tp = target.GetType(); - - PropertyInfo[] fields = tp.GetProperties(flags); - SortMembersList(fields); - foreach (PropertyInfo fi in fields) - { - object value; - - // find read method - MethodInfo readMethod; - if (s_readMethods.TryGetValue(fi.PropertyType, out readMethod)) - { - // read value - value = readMethod.Invoke(this, null); - - // set the value - MethodInfo setMethod = fi.GetSetMethod((flags & BindingFlags.NonPublic) == BindingFlags.NonPublic); - setMethod.Invoke(target, new object[] { value }); - } - } - } - - // shell sort - internal static void SortMembersList(MemberInfo[] list) - { - int h; - int j; - MemberInfo tmp; - - h = 1; - while (h * 3 + 1 <= list.Length) - h = 3 * h + 1; - - while (h > 0) - { - for (int i = h - 1; i < list.Length; i++) - { - tmp = list[i]; - j = i; - while (true) - { - if (j >= h) - { - if (string.Compare(list[j - h].Name, tmp.Name, StringComparison.InvariantCulture) > 0) - { - list[j] = list[j - h]; - j -= h; - } - else - break; - } - else - break; - } - - list[j] = tmp; - } - h /= 3; - } - } } } diff --git a/Lidgren.Network/NetOutgoingMessage.Write.Reflection.cs b/Lidgren.Network/NetOutgoingMessage.Write.Reflection.cs new file mode 100644 index 0000000..252a2c1 --- /dev/null +++ b/Lidgren.Network/NetOutgoingMessage.Write.Reflection.cs @@ -0,0 +1,91 @@ +/* Copyright (c) 2010 Michael Lidgren + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +using System; +using System.Reflection; + +namespace Lidgren.Network +{ + public partial class NetOutgoingMessage + { + /// + /// Writes all public and private declared instance fields of the object in alphabetical order using reflection + /// + public void WriteAllFields(object ob) + { + WriteAllFields(ob, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + } + + /// + /// Writes all fields with specified binding in alphabetical order using reflection + /// + public void WriteAllFields(object ob, BindingFlags flags) + { + if (ob == null) + return; + Type tp = ob.GetType(); + + FieldInfo[] fields = tp.GetFields(flags); + NetIncomingMessage.SortMembersList(fields); + + foreach (FieldInfo fi in fields) + { + object value = fi.GetValue(ob); + + // find the appropriate Write method + MethodInfo writeMethod; + if (s_writeMethods.TryGetValue(fi.FieldType, out writeMethod)) + writeMethod.Invoke(this, new object[] { value }); + else + throw new NetException("Failed to find write method for type " + fi.FieldType); + } + } + + /// + /// Writes all public and private declared instance properties of the object in alphabetical order using reflection + /// + public void WriteAllProperties(object ob) + { + WriteAllProperties(ob, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + } + + /// + /// Writes all properties with specified binding in alphabetical order using reflection + /// + public void WriteAllProperties(object ob, BindingFlags flags) + { + if (ob == null) + return; + Type tp = ob.GetType(); + + PropertyInfo[] fields = tp.GetProperties(flags); + NetIncomingMessage.SortMembersList(fields); + + foreach (PropertyInfo fi in fields) + { + MethodInfo getMethod = fi.GetGetMethod((flags & BindingFlags.NonPublic) == BindingFlags.NonPublic); + object value = getMethod.Invoke(ob, null); + + // find the appropriate Write method + MethodInfo writeMethod; + if (s_writeMethods.TryGetValue(fi.PropertyType, out writeMethod)) + writeMethod.Invoke(this, new object[] { value }); + } + } + } +} \ No newline at end of file diff --git a/Lidgren.Network/NetOutgoingMessage.Write.cs b/Lidgren.Network/NetOutgoingMessage.Write.cs index febf280..6de51a9 100644 --- a/Lidgren.Network/NetOutgoingMessage.Write.cs +++ b/Lidgren.Network/NetOutgoingMessage.Write.cs @@ -1,9 +1,26 @@ -using System; +/* Copyright (c) 2010 Michael Lidgren + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom +the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +using System; using System.Collections.Generic; using System.Net; -using System.Diagnostics; -using System.Text; using System.Reflection; +using System.Text; namespace Lidgren.Network { @@ -535,71 +552,6 @@ namespace Lidgren.Network EnsureBufferSize(m_bitLength); } - /// - /// Writes all public and private declared instance fields of the object in alphabetical order using reflection - /// - public void WriteAllFields(object ob) - { - WriteAllFields(ob, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); - } - - /// - /// Writes all fields with specified binding in alphabetical order using reflection - /// - public void WriteAllFields(object ob, BindingFlags flags) - { - if (ob == null) - return; - Type tp = ob.GetType(); - - FieldInfo[] fields = tp.GetFields(flags); - NetIncomingMessage.SortMembersList(fields); - - foreach (FieldInfo fi in fields) - { - object value = fi.GetValue(ob); - - // find the appropriate Write method - MethodInfo writeMethod; - if (s_writeMethods.TryGetValue(fi.FieldType, out writeMethod)) - writeMethod.Invoke(this, new object[] { value }); - else - throw new NetException("Failed to find write method for type " + fi.FieldType); - } - } - - /// - /// Writes all public and private declared instance properties of the object in alphabetical order using reflection - /// - public void WriteAllProperties(object ob) - { - WriteAllProperties(ob, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); - } - - /// - /// Writes all properties with specified binding in alphabetical order using reflection - /// - public void WriteAllProperties(object ob, BindingFlags flags) - { - if (ob == null) - return; - Type tp = ob.GetType(); - - PropertyInfo[] fields = tp.GetProperties(flags); - NetIncomingMessage.SortMembersList(fields); - - foreach (PropertyInfo fi in fields) - { - MethodInfo getMethod = fi.GetGetMethod((flags & BindingFlags.NonPublic) == BindingFlags.NonPublic); - object value = getMethod.Invoke(ob, null); - - // find the appropriate Write method - MethodInfo writeMethod; - if (s_writeMethods.TryGetValue(fi.PropertyType, out writeMethod)) - writeMethod.Invoke(this, new object[] { value }); - } - } - /// /// Append all the bits of message to this message /// diff --git a/Lidgren.Network/NetPeer.Internal.cs b/Lidgren.Network/NetPeer.Internal.cs index def3656..6d00348 100644 --- a/Lidgren.Network/NetPeer.Internal.cs +++ b/Lidgren.Network/NetPeer.Internal.cs @@ -438,8 +438,7 @@ namespace Lidgren.Network break; case NetMessageLibraryType.Connect: - - + if (!m_configuration.m_acceptIncomingConnections) { LogWarning("Connect received; but we're not accepting incoming connections!");