// dnlib: See LICENSE.txt for more info using System; using System.IO; using System.Runtime.Serialization; using dnlib.IO; namespace dnlib.DotNet.Resources { /// /// Built-in resource data /// public sealed class BuiltInResourceData : IResourceData { readonly ResourceTypeCode code; readonly object data; /// /// Gets the data /// public object Data => data; /// public ResourceTypeCode Code => code; /// public FileOffset StartOffset { get; set; } /// public FileOffset EndOffset { get; set; } /// /// Constructor /// /// Type of data /// Data public BuiltInResourceData(ResourceTypeCode code, object data) { this.code = code; this.data = data; } /// public void WriteData(ResourceBinaryWriter writer, IFormatter formatter) { switch (code) { case ResourceTypeCode.Null: break; case ResourceTypeCode.String: writer.Write((string)data); break; case ResourceTypeCode.Boolean: writer.Write((bool)data); break; case ResourceTypeCode.Char: writer.Write((ushort)(char)data); break; case ResourceTypeCode.Byte: writer.Write((byte)data); break; case ResourceTypeCode.SByte: writer.Write((sbyte)data); break; case ResourceTypeCode.Int16: writer.Write((short)data); break; case ResourceTypeCode.UInt16: writer.Write((ushort)data); break; case ResourceTypeCode.Int32: writer.Write((int)data); break; case ResourceTypeCode.UInt32: writer.Write((uint)data); break; case ResourceTypeCode.Int64: writer.Write((long)data); break; case ResourceTypeCode.UInt64: writer.Write((ulong)data); break; case ResourceTypeCode.Single: writer.Write((float)data); break; case ResourceTypeCode.Double: writer.Write((double)data); break; case ResourceTypeCode.Decimal: writer.Write((decimal)data); break; case ResourceTypeCode.DateTime: var dateTime = (DateTime)data; if (writer.FormatVersion == 1) writer.Write(dateTime.Ticks); else writer.Write(dateTime.ToBinary()); break; case ResourceTypeCode.TimeSpan: writer.Write(((TimeSpan)data).Ticks); break; case ResourceTypeCode.ByteArray: case ResourceTypeCode.Stream: if (writer.FormatVersion == 1) throw new NotSupportedException($"{code} is not supported in format version 1 resources"); var ary = (byte[])data; writer.Write(ary.Length); writer.Write(ary); break; default: throw new InvalidOperationException("Unknown resource type code"); } } /// public override string ToString() { switch (code) { case ResourceTypeCode.Null: return "null"; case ResourceTypeCode.String: case ResourceTypeCode.Boolean: case ResourceTypeCode.Char: case ResourceTypeCode.Byte: case ResourceTypeCode.SByte: case ResourceTypeCode.Int16: case ResourceTypeCode.UInt16: case ResourceTypeCode.Int32: case ResourceTypeCode.UInt32: case ResourceTypeCode.Int64: case ResourceTypeCode.UInt64: case ResourceTypeCode.Single: case ResourceTypeCode.Double: case ResourceTypeCode.Decimal: case ResourceTypeCode.DateTime: case ResourceTypeCode.TimeSpan: return $"{code}: '{data}'"; case ResourceTypeCode.ByteArray: case ResourceTypeCode.Stream: var ary = data as byte[]; if (ary is not null) return $"{code}: Length: {ary.Length}"; return $"{code}: '{data}'"; default: return $"{code}: '{data}'"; } } } }