Exemple #1
0
 private void WriteClass(Stream stream, object classobj, ulong pos)
 {
     stream.Position = (long)pos;
     foreach (var i in classobj.GetType().GetFields())
     {
         VersionAttribute versionAttribute = null;
         if (Attribute.IsDefined(i, typeof(VersionAttribute)))
         {
             versionAttribute = (VersionAttribute)Attribute.GetCustomAttribute(i, typeof(VersionAttribute));
         }
         if (versionAttribute != null)
         {
             if (version < versionAttribute.Min || version > versionAttribute.Max)
             {
                 continue;
             }
         }
         var bytes = GetBytes(i.GetValue(classobj));
         stream.Write(bytes, 0, bytes.Length);
     }
 }
Exemple #2
0
        public void WriteClass <T>(Stream stream, ref T obj, long addedlen) where T : new()
        {
            var type = typeof(T);

            if (type.IsPrimitive)
            {
                object objk2 = obj; //long.Parse(obj.ToString()) + addedlen;
                switch (type.Name)
                {
                case "Int32":
                    objk2 = int.Parse(obj.ToString()) + (int)addedlen;
                    break;

                case "UInt32":
                    objk2 = uint.Parse(obj.ToString()) + (uint)addedlen;
                    break;

                case "Int16":
                    objk2 = short.Parse(obj.ToString()) + (short)addedlen;
                    break;

                case "UInt16":
                    objk2 = ushort.Parse(obj.ToString()) + (ushort)addedlen;
                    break;

                case "Byte":
                    objk2 = byte.Parse(obj.ToString()) + (byte)addedlen;
                    break;

                case "Int64" when is32Bit:
                    objk2 = int.Parse(obj.ToString()) + (int)addedlen;
                    break;

                case "Int64":
                    objk2 = long.Parse(obj.ToString()) + (long)addedlen;
                    break;

                case "UInt64" when is32Bit:
                    objk2 = uint.Parse(obj.ToString()) + (uint)addedlen;
                    break;

                case "UInt64":
                    objk2 = ulong.Parse(obj.ToString()) + (ulong)addedlen;
                    break;

                default:
                    break;
                }
                var bytes = GetBytes(obj);
                stream.Write(bytes, 0, bytes.Length);
            }
            else
            {
                var t = obj;
                foreach (var i in t.GetType().GetFields())
                {
                    VersionAttribute versionAttribute = null;
                    {
                        if (Attribute.IsDefined(i, typeof(VersionAttribute)))
                        {
                            versionAttribute = (VersionAttribute)Attribute.GetCustomAttribute(i, typeof(VersionAttribute));
                        }
                    }
                    if (versionAttribute != null)
                    {
                        if (version < versionAttribute.Min || version > versionAttribute.Max)
                        {
                            continue;
                        }
                    }
                    switch (i.GetValue(obj).GetType().Name)
                    {
                    case "Int32":
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToInt32(i.GetValue(obj)) + (int)addedlen);
                        }
                        break;

                    case "UInt32":
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToUInt32(i.GetValue(obj)) + (uint)addedlen);
                        }
                        break;

                    case "Int16":
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToInt16(i.GetValue(obj)) + (short)addedlen);
                        }
                        break;

                    case "UInt16":
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToUInt16(i.GetValue(obj)) + (ushort)addedlen);
                        }
                        break;

                    case "Byte":
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToByte(i.GetValue(obj)) + (byte)addedlen);
                        }
                        break;

                    case "Int64" when is32Bit:
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToInt32(i.GetValue(obj)) + (int)addedlen);
                        }
                        break;

                    case "Int64":
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToInt64(i.GetValue(obj)) + (long)addedlen);
                        }
                        break;

                    case "UInt64" when is32Bit:
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToUInt32(i.GetValue(obj)) + (uint)addedlen);
                        }
                        break;

                    case "UInt64":
                        if (!Attribute.IsDefined(i, typeof(OffsetAttribute)))
                        {
                            break;
                        }
                        if (Convert.ToInt64(i.GetValue(obj)) >= (long)globaloffset)
                        {
                            i.SetValue(obj, Convert.ToUInt64(i.GetValue(obj)) + (ulong)addedlen);
                        }
                        break;

                    default:
                        break;
                    }
                    if (i.FieldType.IsPrimitive)
                    {
                        var bytes = GetBytes(i.GetValue(obj));
                        stream.Write(bytes, 0, bytes.Length);
                    }
                    else
                    {
                        break;
                    }
                }
                obj = t;
            }
        }