using System.IO; using System.Text; using SabreTools.Models.BDPlus; namespace BinaryObjectScanner.Wrappers { public class BDPlusSVM : WrapperBase { #region Descriptive Properties /// public override string DescriptionString => "BD+ SVM"; #endregion #region Pass-Through Properties /// #if NET48 public string Signature => _model.Signature; #else public string? Signature => _model.Signature; #endif /// #if NET48 public byte[] Unknown1 => _model.Unknown1; #else public byte[]? Unknown1 => _model.Unknown1; #endif /// public ushort Year => _model.Year; /// public byte Month => _model.Month; /// public byte Day => _model.Day; /// #if NET48 public byte[] Unknown2 => _model.Unknown2; #else public byte[]? Unknown2 => _model.Unknown2; #endif /// public uint Length => _model.Length; /// #if NET48 public byte[] Data => _model.Data; #else public byte[]? Data => _model.Data; #endif #endregion #region Constructors /// #if NET48 public BDPlusSVM(SVM model, byte[] data, int offset) #else public BDPlusSVM(SVM? model, byte[]? data, int offset) #endif : base(model, data, offset) { // All logic is handled by the base class } /// #if NET48 public BDPlusSVM(SVM model, Stream data) #else public BDPlusSVM(SVM? model, Stream? data) #endif : base(model, data) { // All logic is handled by the base class } /// /// Create a BD+ SVM from a byte array and offset /// /// Byte array representing the archive /// Offset within the array to parse /// A BD+ SVM wrapper on success, null on failure #if NET48 public static BDPlusSVM Create(byte[] data, int offset) #else public static BDPlusSVM? Create(byte[]? data, int offset) #endif { // If the data is invalid if (data == null) return null; // If the offset is out of bounds if (offset < 0 || offset >= data.Length) return null; // Create a memory stream and use that MemoryStream dataStream = new MemoryStream(data, offset, data.Length - offset); return Create(dataStream); } /// /// Create a BD+ SVM from a Stream /// /// Stream representing the archive /// A BD+ SVM wrapper on success, null on failure #if NET48 public static BDPlusSVM Create(Stream data) #else public static BDPlusSVM? Create(Stream? data) #endif { // If the data is invalid if (data == null || data.Length == 0 || !data.CanSeek || !data.CanRead) return null; var svm = new SabreTools.Serialization.Streams.BDPlus().Deserialize(data); if (svm == null) return null; try { return new BDPlusSVM(svm, data); } catch { return null; } } #endregion #region Printing /// public override StringBuilder PrettyPrint() { StringBuilder builder = new StringBuilder(); Printing.BDPlusSVM.Print(builder, _model); return builder; } #if NET6_0_OR_GREATER /// public override string ExportJSON() => System.Text.Json.JsonSerializer.Serialize(_model, _jsonSerializerOptions); #endif #endregion } }