/// <summary> /// Creates a new instance of a CfgVarMetadataBlock by inflating it from a Stream. /// </summary> /// <param name="stream">The stream containing the data to deserialize to create the object.</param> /// <returns>A new instance of a CfgVarMetadataBlock.</returns> public static CfgVarMetadataBlock Inflate(System.IO.Stream stream) { CfgVarMetadataBlock metadataBlock = null; using (var reader = new INTV.Core.Utility.BinaryReader(stream)) { metadataBlock = Inflate(reader); } return(metadataBlock); }
/// <summary> /// Inflates all the recognizable metadata from a .CFG file from the given stream. /// </summary> /// <param name="stream">The stream containing the data to parse for CFGVAR metadata.</param> /// <returns>An enumerable of the recognizable metadata.</returns> /// <remarks>Callers should be dutiful in handling exceptions, as stream, Regex and other exceptions may result during parsing. /// Also note that this is a really simplistic parser, so it's possible that all sorts of holes exist.</remarks> public static IEnumerable <CfgVarMetadataBlock> InflateAll(System.IO.Stream stream) { var metadataBlocks = new List <CfgVarMetadataBlock>(); var cfgFileSize = (int)stream.Length; var cfgFileBytes = new byte[cfgFileSize]; if (stream.Read(cfgFileBytes, 0, cfgFileSize) == cfgFileSize) { var cfgFileContents = System.Text.Encoding.UTF8.GetString(cfgFileBytes, 0, cfgFileBytes.Length).Trim('\0'); var cfgFileLines = cfgFileContents.Split(new[] { "\n", "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries); var currentSection = string.Empty; const string VarsSection = "[vars]"; foreach (var cfgFileLine in cfgFileLines) { var sectionMatch = Regex.Match(cfgFileLine, @"\[(.*?)\]"); if (sectionMatch.Success) { currentSection = sectionMatch.Value; } else if (currentSection.Equals(VarsSection, StringComparison.OrdinalIgnoreCase)) { var cfgFileLineBytes = System.Text.Encoding.UTF8.GetBytes(cfgFileLine); using (var cfgFileLineStream = new System.IO.MemoryStream(cfgFileLineBytes)) { var metadataBlock = CfgVarMetadataBlock.Inflate(cfgFileLineStream); if (metadataBlock != null) { metadataBlocks.Add(metadataBlock); } } } } } return(metadataBlocks); }
/// <summary> /// Creates a new instance of a CfgVarMetadataBlock by inflating it from a BinaryReader. /// </summary> /// <param name="reader">The binary reader containing the data to deserialize to create the object.</param> /// <returns>A new instance of a CfgVarMetadataBlock.</returns> /// <remarks>It is assumed that the reader is currently positioned at the beginning of a serialized CFGVAR metadata entry.</remarks> public static CfgVarMetadataBlock Inflate(INTV.Core.Utility.BinaryReader reader) { CfgVarMetadataBlock metadataBlock = null; var metadataBlockType = DecodeBlockType(reader); switch (metadataBlockType) { case CfgVarMetadataIdTag.Name: case CfgVarMetadataIdTag.ShortName: case CfgVarMetadataIdTag.Author: case CfgVarMetadataIdTag.GameArt: case CfgVarMetadataIdTag.Music: case CfgVarMetadataIdTag.SoundEffects: case CfgVarMetadataIdTag.VoiceActing: case CfgVarMetadataIdTag.Description: case CfgVarMetadataIdTag.Documentation: case CfgVarMetadataIdTag.BoxOrOtherArtwork: case CfgVarMetadataIdTag.ConceptDesign: case CfgVarMetadataIdTag.MoreInfo: case CfgVarMetadataIdTag.Publisher: case CfgVarMetadataIdTag.License: case CfgVarMetadataIdTag.Version: metadataBlock = new CfgVarMetadataString(metadataBlockType); break; case CfgVarMetadataIdTag.ReleaseDate: case CfgVarMetadataIdTag.Year: case CfgVarMetadataIdTag.BuildDate: metadataBlock = new CfgVarMetadataDate(metadataBlockType); break; case CfgVarMetadataIdTag.EcsCompatibility: case CfgVarMetadataIdTag.IntellivoiceCompatibility: case CfgVarMetadataIdTag.IntellivisionIICompatibility: case CfgVarMetadataIdTag.KeyboardComponentCompatibility: case CfgVarMetadataIdTag.TutorvisionCompatibility: case CfgVarMetadataIdTag.Ecs: case CfgVarMetadataIdTag.Voice: case CfgVarMetadataIdTag.IntellivisionII: case CfgVarMetadataIdTag.JlpAccelerators: case CfgVarMetadataIdTag.Jlp: metadataBlock = new CfgVarMetadataFeatureCompatibility(metadataBlockType); break; case CfgVarMetadataIdTag.LtoFlashMapper: metadataBlock = new CfgVarMetadataBoolean(metadataBlockType); break; case CfgVarMetadataIdTag.JlpFlash: metadataBlock = new CfgVarMetadataInteger(metadataBlockType); break; default: break; } if (metadataBlock != null) { metadataBlock._deserializeByteCount = (int)reader.BaseStream.Length; metadataBlock.Deserialize(reader); } return(metadataBlock); }