2017-10-09 18:04:49 -07:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
2020-06-11 11:44:46 -07:00
|
|
|
|
using System.IO;
|
2017-10-09 18:04:49 -07:00
|
|
|
|
using System.Text;
|
2020-06-11 11:44:46 -07:00
|
|
|
|
|
2017-10-09 18:04:49 -07:00
|
|
|
|
using SabreTools.Library.Data;
|
2017-11-02 15:44:15 -07:00
|
|
|
|
using SabreTools.Library.DatItems;
|
2020-08-01 22:46:28 -07:00
|
|
|
|
using SabreTools.Library.IO;
|
2017-10-09 18:04:49 -07:00
|
|
|
|
using SabreTools.Library.Tools;
|
|
|
|
|
|
|
|
|
|
|
|
namespace SabreTools.Library.DatFiles
|
|
|
|
|
|
{
|
2019-01-11 13:43:15 -08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Represents parsing and writing of a value-separated DAT
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
internal class SeparatedValue : DatFile
|
|
|
|
|
|
{
|
|
|
|
|
|
// Private instance variables specific to Separated Value DATs
|
2020-06-10 22:37:19 -07:00
|
|
|
|
private readonly char _delim;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Constructor designed for casting a base DatFile
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="datFile">Parent DatFile to copy from</param>
|
|
|
|
|
|
/// <param name="delim">Delimiter for parsing individual lines</param>
|
|
|
|
|
|
public SeparatedValue(DatFile datFile, char delim)
|
2020-07-15 09:41:59 -07:00
|
|
|
|
: base(datFile)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
|
|
|
|
|
_delim = delim;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Parse a character-separated value DAT and return all found games and roms within
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="filename">Name of the file to be parsed</param>
|
2020-07-15 09:41:59 -07:00
|
|
|
|
/// <param name="indexId">Index ID for the DAT</param>
|
2019-01-11 13:43:15 -08:00
|
|
|
|
/// <param name="keep">True if full pathnames are to be kept, false otherwise (default)</param>
|
2020-07-15 09:41:59 -07:00
|
|
|
|
protected override void ParseFile(
|
2019-01-11 13:43:15 -08:00
|
|
|
|
// Standard Dat parsing
|
|
|
|
|
|
string filename,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
int indexId,
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
|
|
|
|
|
// Miscellaneous
|
2020-07-15 09:41:59 -07:00
|
|
|
|
bool keep)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
|
|
|
|
|
// Open a file reader
|
2020-07-15 09:41:59 -07:00
|
|
|
|
Encoding enc = FileExtensions.GetEncoding(filename);
|
|
|
|
|
|
SeparatedValueReader svr = new SeparatedValueReader(FileExtensions.TryOpenRead(filename), enc)
|
|
|
|
|
|
{
|
|
|
|
|
|
Header = true,
|
|
|
|
|
|
Quotes = true,
|
|
|
|
|
|
Separator = _delim,
|
|
|
|
|
|
VerifyFieldCount = true
|
|
|
|
|
|
};
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
// If we're somehow at the end of the stream already, we can't do anything
|
|
|
|
|
|
if (svr.EndOfStream)
|
|
|
|
|
|
return;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
// Read in the header
|
|
|
|
|
|
svr.ReadHeader();
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
// Loop through all of the data lines
|
|
|
|
|
|
while (!svr.EndOfStream)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
2020-06-14 22:50:58 -07:00
|
|
|
|
// Get the current line, split and parse
|
|
|
|
|
|
svr.ReadNextLine();
|
2019-01-11 13:43:15 -08:00
|
|
|
|
}
|
2020-06-14 22:50:58 -07:00
|
|
|
|
catch (InvalidDataException)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
2020-06-14 22:50:58 -07:00
|
|
|
|
Globals.Logger.Warning($"Malformed line found in '{filename}' at line {svr.LineNumber}");
|
2019-01-11 13:43:15 -08:00
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Set the output item information
|
2020-06-14 22:50:58 -07:00
|
|
|
|
Machine machine = new Machine();
|
|
|
|
|
|
|
|
|
|
|
|
bool? def = null,
|
|
|
|
|
|
writable = null,
|
2020-07-28 17:00:19 -07:00
|
|
|
|
optional = null,
|
|
|
|
|
|
inverted = null;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
string name = null,
|
|
|
|
|
|
partName = null,
|
|
|
|
|
|
partInterface = null,
|
|
|
|
|
|
areaName = null,
|
|
|
|
|
|
biosDescription = null,
|
|
|
|
|
|
crc = null,
|
|
|
|
|
|
md5 = null,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
#if NET_FRAMEWORK
|
2020-06-14 22:50:58 -07:00
|
|
|
|
ripemd160 = null,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
#endif
|
2020-06-14 22:50:58 -07:00
|
|
|
|
sha1 = null,
|
|
|
|
|
|
sha256 = null,
|
|
|
|
|
|
sha384 = null,
|
|
|
|
|
|
sha512 = null,
|
|
|
|
|
|
merge = null,
|
|
|
|
|
|
region = null,
|
|
|
|
|
|
index = null,
|
|
|
|
|
|
language = null,
|
|
|
|
|
|
date = null,
|
|
|
|
|
|
bios = null,
|
|
|
|
|
|
offset = null;
|
|
|
|
|
|
long? areaSize = null;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
long size = -1;
|
|
|
|
|
|
ItemType itemType = ItemType.Rom;
|
|
|
|
|
|
ItemStatus status = ItemStatus.None;
|
2020-06-14 23:07:31 -07:00
|
|
|
|
List<KeyValuePair<string, string>> features = null;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
|
|
|
|
|
// Now we loop through and get values for everything
|
2020-06-14 22:50:58 -07:00
|
|
|
|
for (int i = 0; i < svr.HeaderValues.Count; i++)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
2020-06-14 22:50:58 -07:00
|
|
|
|
string value = svr.Line[i];
|
|
|
|
|
|
switch (GetNormalizedHeader(svr.HeaderValues[i]))
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
2020-06-14 22:50:58 -07:00
|
|
|
|
#region DatFile
|
|
|
|
|
|
|
2020-08-20 15:13:57 -07:00
|
|
|
|
#region Common
|
|
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatFile.FileName":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.FileName = (Header.FileName== null ? value : Header.FileName);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatFile.Name":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Name = (Header.Name== null ? value : Header.Name);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatFile.Description":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Description = (Header.Description== null ? value : Header.Description);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "DatFile.RootDir":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.RootDir = (Header.RootDir== null ? value : Header.RootDir);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Category":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Category = (Header.Category== null ? value : Header.Category);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Version":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Version = (Header.Version== null ? value : Header.Version);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Date":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Date = (Header.Date== null ? value : Header.Date);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Author":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Author = (Header.Author== null ? value : Header.Author);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Email":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Email = (Header.Email== null ? value : Header.Email);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Homepage":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Homepage = (Header.Homepage== null ? value : Header.Homepage);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Url":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Url = (Header.Url== null ? value : Header.Url);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Comment":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Comment = (Header.Comment== null ? value : Header.Comment);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Header":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.HeaderSkipper = (Header.HeaderSkipper== null ? value : Header.HeaderSkipper);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Type":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
Header.Type = (Header.Type== null ? value : Header.Type);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.ForceMerging":
|
2020-07-27 10:26:08 -07:00
|
|
|
|
Header.ForceMerging = (Header.ForceMerging == ForceMerging.None ? value.AsForceMerging() : Header.ForceMerging);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.ForceNodump":
|
2020-07-27 10:26:08 -07:00
|
|
|
|
Header.ForceNodump = (Header.ForceNodump == ForceNodump.None ? value.AsForceNodump() : Header.ForceNodump);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.ForcePacking":
|
2020-07-27 10:26:08 -07:00
|
|
|
|
Header.ForcePacking = (Header.ForcePacking == ForcePacking.None ? value.AsForcePacking() : Header.ForcePacking);
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 15:13:57 -07:00
|
|
|
|
#region ListXML
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Debug":
|
|
|
|
|
|
Header.Debug = (Header.Debug == null ? value.AsYesNo() : Header.Debug);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.MameConfig":
|
|
|
|
|
|
Header.MameConfig = (Header.MameConfig == null ? value : Header.MameConfig);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 15:39:32 -07:00
|
|
|
|
#region Logiqx
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.Build":
|
|
|
|
|
|
Header.Build = (Header.Build == null ? value : Header.Build);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2020-08-20 17:23:19 -07:00
|
|
|
|
case "DatFile.RomMode":
|
|
|
|
|
|
Header.RomMode = (Header.RomMode == null ? value : Header.RomMode);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.BiosMode":
|
|
|
|
|
|
Header.BiosMode = (Header.BiosMode == null ? value : Header.BiosMode);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.SampleMode":
|
|
|
|
|
|
Header.SampleMode = (Header.SampleMode == null ? value : Header.SampleMode);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.LockRomMode":
|
|
|
|
|
|
Header.LockRomMode = (Header.LockRomMode == null ? value.AsYesNo() : Header.LockRomMode);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.LockBiosMode":
|
|
|
|
|
|
Header.LockBiosMode = (Header.LockBiosMode == null ? value.AsYesNo() : Header.LockBiosMode);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.LockSampleMode":
|
|
|
|
|
|
Header.LockSampleMode = (Header.LockSampleMode == null ? value.AsYesNo() : Header.LockSampleMode);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2020-08-20 15:39:32 -07:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 15:51:13 -07:00
|
|
|
|
#region OfflineList
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.System":
|
|
|
|
|
|
Header.System = (Header.System == null ? value : Header.System);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.ScreenshotsWidth":
|
|
|
|
|
|
Header.ScreenshotsWidth = (Header.ScreenshotsWidth == null ? value : Header.ScreenshotsWidth);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.ScreenshotsHeight":
|
|
|
|
|
|
Header.ScreenshotsHeight = (Header.ScreenshotsHeight == null ? value : Header.ScreenshotsHeight);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2020-08-20 16:30:16 -07:00
|
|
|
|
case "DatFile.Infos":
|
|
|
|
|
|
// TODO: Figure out how Header.Infos could be read in
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.CanOpen":
|
|
|
|
|
|
Header.CanOpen = new List<string>();
|
|
|
|
|
|
var extensions = value.Split(';');
|
|
|
|
|
|
foreach (var extension in extensions)
|
|
|
|
|
|
{
|
|
|
|
|
|
Header.CanOpen.Add(extension);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
2020-08-20 16:20:22 -07:00
|
|
|
|
|
2020-08-20 15:51:13 -07:00
|
|
|
|
case "DatFile.RomTitle":
|
|
|
|
|
|
Header.RomTitle = (Header.RomTitle == null ? value : Header.RomTitle);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 16:49:21 -07:00
|
|
|
|
#region RomCenter
|
|
|
|
|
|
|
|
|
|
|
|
case "DatFile.RomCenterVersion":
|
|
|
|
|
|
Header.RomCenterVersion = (Header.RomCenterVersion == null ? value : Header.RomCenterVersion);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 15:13:57 -07:00
|
|
|
|
#endregion // DatFile
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
#region Machine
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
#region Common
|
|
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "Machine.Name":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
machine.Name = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Comment":
|
|
|
|
|
|
machine.Comment = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Description":
|
|
|
|
|
|
machine.Description = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Year":
|
|
|
|
|
|
machine.Year = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Manufacturer":
|
|
|
|
|
|
machine.Manufacturer = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Publisher":
|
|
|
|
|
|
machine.Publisher = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2020-07-18 21:35:17 -07:00
|
|
|
|
case "Machine.Category":
|
|
|
|
|
|
machine.Category = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "Machine.RomOf":
|
|
|
|
|
|
machine.RomOf = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.CloneOf":
|
|
|
|
|
|
machine.CloneOf = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.SampleOf":
|
|
|
|
|
|
machine.SampleOf = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2020-08-20 15:39:32 -07:00
|
|
|
|
case "Machine.MachineType":
|
|
|
|
|
|
machine.MachineType = value.AsMachineType();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region AttractMode
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Players":
|
|
|
|
|
|
machine.Players = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "Machine.Rotation":
|
|
|
|
|
|
machine.Rotation = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "Machine.Control":
|
|
|
|
|
|
machine.Control = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "Machine.Status":
|
|
|
|
|
|
machine.Status = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "Machine.DisplayCount":
|
|
|
|
|
|
machine.DisplayCount = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.DisplayType":
|
|
|
|
|
|
machine.DisplayType = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Buttons":
|
|
|
|
|
|
machine.Buttons = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region ListXML
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.SourceFile":
|
|
|
|
|
|
machine.SourceFile = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Runnable":
|
|
|
|
|
|
machine.Runnable = value.AsYesNo();
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Devices":
|
|
|
|
|
|
machine.Devices = new List<string>();
|
|
|
|
|
|
var devices = value.Split(';');
|
|
|
|
|
|
foreach (var device in devices)
|
|
|
|
|
|
{
|
|
|
|
|
|
machine.Devices.Add(device);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.SlotOptions":
|
|
|
|
|
|
machine.SlotOptions = new List<string>();
|
|
|
|
|
|
var slotOptions = value.Split(';');
|
|
|
|
|
|
foreach (var slotOption in slotOptions)
|
|
|
|
|
|
{
|
|
|
|
|
|
machine.SlotOptions.Add(slotOption);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Infos":
|
2020-06-14 23:07:31 -07:00
|
|
|
|
machine.Infos = new List<KeyValuePair<string, string>>();
|
2020-06-14 22:50:58 -07:00
|
|
|
|
var infos = value.Split(';');
|
|
|
|
|
|
foreach (var info in infos)
|
|
|
|
|
|
{
|
|
|
|
|
|
var infoPair = info.Split('=');
|
2020-06-14 23:07:31 -07:00
|
|
|
|
machine.Infos.Add(new KeyValuePair<string, string>(infoPair[0], infoPair[1]));
|
2020-06-14 22:50:58 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
#region Logiqx
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Board":
|
|
|
|
|
|
machine.Board = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.RebuildTo":
|
|
|
|
|
|
machine.RebuildTo = value;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region SoftwareList
|
|
|
|
|
|
|
|
|
|
|
|
case "Machine.Supported":
|
|
|
|
|
|
machine.Supported = value.AsYesNo();
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#endregion // Machine
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
#region DatItem
|
|
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.Type":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
itemType = value.AsItemType() ?? ItemType.Rom;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "DatItem.Name":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
name = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "DatItem.PartName":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
partName = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.PartInterface":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
partInterface = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Features":
|
2020-06-14 23:07:31 -07:00
|
|
|
|
features = new List<KeyValuePair<string, string>>();
|
2020-06-14 22:50:58 -07:00
|
|
|
|
var splitFeatures = value.Split(';');
|
|
|
|
|
|
foreach (var splitFeature in splitFeatures)
|
|
|
|
|
|
{
|
|
|
|
|
|
var featurePair = splitFeature.Split('=');
|
2020-06-14 23:07:31 -07:00
|
|
|
|
features.Add(new KeyValuePair<string, string>(featurePair[0], featurePair[1]));
|
2020-06-14 22:50:58 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.AreaName":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
areaName = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.AreaSize":
|
|
|
|
|
|
if (Int64.TryParse(value, out long tempAreaSize))
|
|
|
|
|
|
areaSize = tempAreaSize;
|
|
|
|
|
|
else
|
|
|
|
|
|
areaSize = null;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Default":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
def = value.AsYesNo();
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Description":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
biosDescription = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.Size":
|
|
|
|
|
|
if (!Int64.TryParse(value, out size))
|
|
|
|
|
|
size = -1;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.CRC":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
crc = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.MD5":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
md5 = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2020-07-15 09:41:59 -07:00
|
|
|
|
#if NET_FRAMEWORK
|
2020-06-05 22:26:44 -07:00
|
|
|
|
case "DatItem.RIPEMD160":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
ripemd160 = value;
|
2020-06-05 22:26:44 -07:00
|
|
|
|
break;
|
2020-07-15 09:41:59 -07:00
|
|
|
|
#endif
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.SHA1":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
sha1 = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.SHA256":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
sha256 = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.SHA384":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
sha384 = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.SHA512":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
sha512 = value;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "DatItem.Merge":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
merge = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Region":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
region = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Index":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
index = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Writable":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
writable = value.AsYesNo();
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Optional":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
optional = value.AsYesNo();
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Status":
|
2020-07-15 09:41:59 -07:00
|
|
|
|
status = value.AsItemStatus();
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "DatItem.Language":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
language = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case "DatItem.Date":
|
|
|
|
|
|
date = value;
|
|
|
|
|
|
break;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
|
|
|
|
|
|
case "DatItem.Bios":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
bios = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "DatItem.Offset":
|
2020-08-08 14:06:05 -07:00
|
|
|
|
offset = value;
|
2020-06-14 22:50:58 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
2020-07-28 17:00:19 -07:00
|
|
|
|
case "DatItem.Inverted":
|
2020-07-28 17:21:13 -07:00
|
|
|
|
inverted = value.AsYesNo();
|
2020-07-28 17:00:19 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
case "INVALID":
|
|
|
|
|
|
default:
|
|
|
|
|
|
// No-op, we don't even care right now
|
|
|
|
|
|
break;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// And now we populate and add the new item
|
|
|
|
|
|
switch (itemType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ItemType.Archive:
|
|
|
|
|
|
Archive archive = new Archive()
|
|
|
|
|
|
{
|
|
|
|
|
|
Name = name,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
PartName = partName,
|
|
|
|
|
|
PartInterface = partInterface,
|
|
|
|
|
|
Features = features,
|
|
|
|
|
|
AreaName = areaName,
|
|
|
|
|
|
AreaSize = areaSize,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
|
2020-08-20 13:17:14 -07:00
|
|
|
|
Source = new Source
|
|
|
|
|
|
{
|
|
|
|
|
|
Index = indexId,
|
|
|
|
|
|
Name = filename,
|
|
|
|
|
|
},
|
2019-01-11 13:43:15 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
archive.CopyMachineInformation(machine);
|
2020-07-15 09:41:59 -07:00
|
|
|
|
ParseAddHelper(archive);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case ItemType.BiosSet:
|
|
|
|
|
|
BiosSet biosset = new BiosSet()
|
|
|
|
|
|
{
|
|
|
|
|
|
Name = name,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
PartName = partName,
|
|
|
|
|
|
PartInterface = partInterface,
|
|
|
|
|
|
Features = features,
|
|
|
|
|
|
AreaName = areaName,
|
|
|
|
|
|
AreaSize = areaSize,
|
|
|
|
|
|
|
|
|
|
|
|
Description = biosDescription,
|
|
|
|
|
|
Default = def,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
|
2020-08-20 13:17:14 -07:00
|
|
|
|
Source = new Source
|
|
|
|
|
|
{
|
|
|
|
|
|
Index = indexId,
|
|
|
|
|
|
Name = filename,
|
|
|
|
|
|
},
|
2019-01-11 13:43:15 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
biosset.CopyMachineInformation(machine);
|
2020-07-15 09:41:59 -07:00
|
|
|
|
ParseAddHelper(biosset);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case ItemType.Disk:
|
|
|
|
|
|
Disk disk = new Disk()
|
|
|
|
|
|
{
|
|
|
|
|
|
Name = name,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
PartName = partName,
|
|
|
|
|
|
PartInterface = partInterface,
|
|
|
|
|
|
Features = features,
|
|
|
|
|
|
AreaName = areaName,
|
|
|
|
|
|
AreaSize = areaSize,
|
|
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
MD5 = md5,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
#if NET_FRAMEWORK
|
2020-06-05 22:26:44 -07:00
|
|
|
|
RIPEMD160 = ripemd160,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
#endif
|
2019-01-11 13:43:15 -08:00
|
|
|
|
SHA1 = sha1,
|
|
|
|
|
|
SHA256 = sha256,
|
|
|
|
|
|
SHA384 = sha384,
|
|
|
|
|
|
SHA512 = sha512,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
MergeTag = merge,
|
|
|
|
|
|
Region = region,
|
|
|
|
|
|
Index = index,
|
|
|
|
|
|
Writable = writable,
|
2019-01-11 13:43:15 -08:00
|
|
|
|
ItemStatus = status,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
Optional = optional,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
|
2020-08-20 13:17:14 -07:00
|
|
|
|
Source = new Source
|
|
|
|
|
|
{
|
|
|
|
|
|
Index = indexId,
|
|
|
|
|
|
Name = filename,
|
|
|
|
|
|
},
|
2019-01-11 13:43:15 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
disk.CopyMachineInformation(machine);
|
2020-07-15 09:41:59 -07:00
|
|
|
|
ParseAddHelper(disk);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case ItemType.Release:
|
|
|
|
|
|
Release release = new Release()
|
|
|
|
|
|
{
|
|
|
|
|
|
Name = name,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
PartName = partName,
|
|
|
|
|
|
PartInterface = partInterface,
|
|
|
|
|
|
Features = features,
|
|
|
|
|
|
AreaName = areaName,
|
|
|
|
|
|
AreaSize = areaSize,
|
|
|
|
|
|
|
|
|
|
|
|
Region = region,
|
|
|
|
|
|
Language = language,
|
|
|
|
|
|
Date = date,
|
|
|
|
|
|
Default = default,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
|
2020-08-20 13:17:14 -07:00
|
|
|
|
Source = new Source
|
|
|
|
|
|
{
|
|
|
|
|
|
Index = indexId,
|
|
|
|
|
|
Name = filename,
|
|
|
|
|
|
},
|
2019-01-11 13:43:15 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
release.CopyMachineInformation(machine);
|
2020-07-15 09:41:59 -07:00
|
|
|
|
ParseAddHelper(release);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case ItemType.Rom:
|
|
|
|
|
|
Rom rom = new Rom()
|
|
|
|
|
|
{
|
|
|
|
|
|
Name = name,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
PartName = partName,
|
|
|
|
|
|
PartInterface = partInterface,
|
|
|
|
|
|
Features = features,
|
|
|
|
|
|
AreaName = areaName,
|
|
|
|
|
|
AreaSize = areaSize,
|
|
|
|
|
|
|
|
|
|
|
|
Bios = bios,
|
2019-01-11 13:43:15 -08:00
|
|
|
|
Size = size,
|
|
|
|
|
|
CRC = crc,
|
|
|
|
|
|
MD5 = md5,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
#if NET_FRAMEWORK
|
2020-06-05 22:26:44 -07:00
|
|
|
|
RIPEMD160 = ripemd160,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
#endif
|
2019-01-11 13:43:15 -08:00
|
|
|
|
SHA1 = sha1,
|
|
|
|
|
|
SHA256 = sha256,
|
|
|
|
|
|
SHA384 = sha384,
|
|
|
|
|
|
SHA512 = sha512,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
MergeTag = merge,
|
|
|
|
|
|
Region = region,
|
|
|
|
|
|
Offset = offset,
|
2019-01-11 13:43:15 -08:00
|
|
|
|
Date = date,
|
|
|
|
|
|
ItemStatus = status,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
Optional = optional,
|
2020-07-28 17:00:19 -07:00
|
|
|
|
Inverted = inverted,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
|
2020-08-20 13:17:14 -07:00
|
|
|
|
Source = new Source
|
|
|
|
|
|
{
|
|
|
|
|
|
Index = indexId,
|
|
|
|
|
|
Name = filename,
|
|
|
|
|
|
},
|
2019-01-11 13:43:15 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
rom.CopyMachineInformation(machine);
|
2020-07-15 09:41:59 -07:00
|
|
|
|
ParseAddHelper(rom);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
2020-06-10 22:37:19 -07:00
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
case ItemType.Sample:
|
|
|
|
|
|
Sample sample = new Sample()
|
|
|
|
|
|
{
|
|
|
|
|
|
Name = name,
|
2020-06-14 22:50:58 -07:00
|
|
|
|
PartName = partName,
|
|
|
|
|
|
PartInterface = partInterface,
|
|
|
|
|
|
Features = features,
|
|
|
|
|
|
AreaName = areaName,
|
|
|
|
|
|
AreaSize = areaSize,
|
2020-07-15 09:41:59 -07:00
|
|
|
|
|
2020-08-20 13:17:14 -07:00
|
|
|
|
Source = new Source
|
|
|
|
|
|
{
|
|
|
|
|
|
Index = indexId,
|
|
|
|
|
|
Name = filename,
|
|
|
|
|
|
},
|
2019-01-11 13:43:15 -08:00
|
|
|
|
};
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
sample.CopyMachineInformation(machine);
|
2020-07-15 09:41:59 -07:00
|
|
|
|
ParseAddHelper(sample);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Get normalized header value for a given separated value header field
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private string GetNormalizedHeader(string header)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (header.ToLowerInvariant())
|
|
|
|
|
|
{
|
|
|
|
|
|
#region DatFile
|
|
|
|
|
|
|
2020-08-20 15:13:57 -07:00
|
|
|
|
#region Common
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "file":
|
|
|
|
|
|
case "filename":
|
|
|
|
|
|
case "file name":
|
|
|
|
|
|
return "DatFile.FileName";
|
|
|
|
|
|
|
|
|
|
|
|
case "datname":
|
|
|
|
|
|
case "dat name":
|
|
|
|
|
|
case "internalname":
|
|
|
|
|
|
case "internal name":
|
|
|
|
|
|
return "DatFile.Name";
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "desc":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "description":
|
|
|
|
|
|
case "dat description":
|
|
|
|
|
|
return "DatFile.Description";
|
|
|
|
|
|
|
|
|
|
|
|
case "rootdir":
|
|
|
|
|
|
case "root dir":
|
|
|
|
|
|
return "DatFile.RootDir";
|
|
|
|
|
|
|
|
|
|
|
|
case "category":
|
|
|
|
|
|
return "DatFile.Category";
|
|
|
|
|
|
|
|
|
|
|
|
case "version":
|
|
|
|
|
|
return "DatFile.Version";
|
|
|
|
|
|
|
|
|
|
|
|
case "datdate":
|
|
|
|
|
|
case "dat date":
|
2020-08-20 15:53:56 -07:00
|
|
|
|
case "dat-date":
|
|
|
|
|
|
case "timestamp":
|
|
|
|
|
|
case "time stamp":
|
|
|
|
|
|
case "time-stamp":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
return "DatFile.Date";
|
|
|
|
|
|
|
|
|
|
|
|
case "author":
|
|
|
|
|
|
return "DatFile.Author";
|
|
|
|
|
|
|
|
|
|
|
|
case "email":
|
|
|
|
|
|
return "DatFile.Email";
|
|
|
|
|
|
|
|
|
|
|
|
case "homepage":
|
|
|
|
|
|
return "DatFile.Homepage";
|
|
|
|
|
|
|
|
|
|
|
|
case "url":
|
|
|
|
|
|
return "DatFile.Url";
|
|
|
|
|
|
|
|
|
|
|
|
case "datcomment":
|
|
|
|
|
|
case "dat comment":
|
|
|
|
|
|
return "DatFile.Comment";
|
|
|
|
|
|
|
|
|
|
|
|
case "header":
|
|
|
|
|
|
return "DatFile.Header";
|
|
|
|
|
|
|
|
|
|
|
|
case "dattype":
|
|
|
|
|
|
case "dat type":
|
|
|
|
|
|
return "DatFile.Type";
|
|
|
|
|
|
|
|
|
|
|
|
case "forcemerging":
|
|
|
|
|
|
case "force merging":
|
|
|
|
|
|
return "DatFile.ForceMerging";
|
|
|
|
|
|
|
|
|
|
|
|
case "forcenodump":
|
|
|
|
|
|
case "force nodump":
|
|
|
|
|
|
return "DatFile.ForceNodump";
|
|
|
|
|
|
|
|
|
|
|
|
case "forcepacking":
|
|
|
|
|
|
case "force packing":
|
|
|
|
|
|
return "DatFile.ForcePacking";
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 15:13:57 -07:00
|
|
|
|
#region ListXML
|
|
|
|
|
|
|
|
|
|
|
|
case "debug":
|
|
|
|
|
|
return "DatFile.Debug";
|
|
|
|
|
|
|
|
|
|
|
|
case "mameconfig":
|
|
|
|
|
|
case "mame config":
|
|
|
|
|
|
case "mame-config":
|
|
|
|
|
|
return "DatFile.MameConfig";
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 15:39:32 -07:00
|
|
|
|
#region Logiqx
|
|
|
|
|
|
|
|
|
|
|
|
case "build":
|
|
|
|
|
|
return "DatFile.Build";
|
|
|
|
|
|
|
2020-08-20 17:23:19 -07:00
|
|
|
|
case "rommode":
|
|
|
|
|
|
case "rom mode":
|
|
|
|
|
|
case "rom-mode":
|
|
|
|
|
|
return "DatFile.RomMode";
|
|
|
|
|
|
|
|
|
|
|
|
case "biosmode":
|
|
|
|
|
|
case "bios mode":
|
|
|
|
|
|
case "bios-mode":
|
|
|
|
|
|
return "DatFile.BiosMode";
|
|
|
|
|
|
|
|
|
|
|
|
case "samplemode":
|
|
|
|
|
|
case "sample mode":
|
|
|
|
|
|
case "sample-mode":
|
|
|
|
|
|
return "DatFile.SampleMode";
|
|
|
|
|
|
|
|
|
|
|
|
case "lockrommode":
|
|
|
|
|
|
case "lock rom mode":
|
|
|
|
|
|
case "lock-rom-mode":
|
|
|
|
|
|
return "DatFile.LockRomMode";
|
|
|
|
|
|
|
|
|
|
|
|
case "lockbiosmode":
|
|
|
|
|
|
case "lock bios mode":
|
|
|
|
|
|
case "lock-bios-mode":
|
|
|
|
|
|
return "DatFile.LockBiosMode";
|
|
|
|
|
|
|
|
|
|
|
|
case "locksamplemode":
|
|
|
|
|
|
case "lock sample mode":
|
|
|
|
|
|
case "lock-sample-mode":
|
|
|
|
|
|
return "DatFile.LockSampleMode";
|
|
|
|
|
|
|
2020-08-20 15:39:32 -07:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 15:51:13 -07:00
|
|
|
|
#region OfflineList
|
|
|
|
|
|
|
|
|
|
|
|
case "system":
|
2020-08-20 15:57:52 -07:00
|
|
|
|
case "plugin":
|
2020-08-20 15:51:13 -07:00
|
|
|
|
return "DatFile.System";
|
|
|
|
|
|
|
|
|
|
|
|
case "screenshotwidth":
|
|
|
|
|
|
case "screenshotswidth":
|
|
|
|
|
|
case "screenshot width":
|
|
|
|
|
|
case "screenshot-width":
|
|
|
|
|
|
case "screenshots width":
|
|
|
|
|
|
case "screenshots-width":
|
|
|
|
|
|
return "DatFile.ScreenshotsWidth";
|
|
|
|
|
|
|
|
|
|
|
|
case "screenshotheight":
|
|
|
|
|
|
case "screenshotsheight":
|
|
|
|
|
|
case "screenshot height":
|
|
|
|
|
|
case "screenshot-height":
|
|
|
|
|
|
case "screenshots height":
|
|
|
|
|
|
case "screenshots-height":
|
|
|
|
|
|
return "DatFile.ScreenshotsHeight";
|
|
|
|
|
|
|
2020-08-20 16:30:16 -07:00
|
|
|
|
case "offlineinfos":
|
|
|
|
|
|
case "offline infos":
|
|
|
|
|
|
case "offline-infos":
|
|
|
|
|
|
case "olinfos":
|
|
|
|
|
|
case "ol infos":
|
|
|
|
|
|
case "ol-infos":
|
|
|
|
|
|
case "offlinelistinfos":
|
|
|
|
|
|
case "offlinelist infos":
|
|
|
|
|
|
case "offlinelist-infos":
|
|
|
|
|
|
return "DatFile.Infos";
|
|
|
|
|
|
|
|
|
|
|
|
case "canopen":
|
|
|
|
|
|
case "can open":
|
|
|
|
|
|
case "can-open":
|
|
|
|
|
|
return "DatFile.CanOpen";
|
|
|
|
|
|
|
2020-08-20 15:51:13 -07:00
|
|
|
|
case "romtitle":
|
|
|
|
|
|
case "rom title":
|
|
|
|
|
|
case "rom-title":
|
|
|
|
|
|
return "DatFile.RomTitle";
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 16:49:21 -07:00
|
|
|
|
#region RomCenter
|
|
|
|
|
|
|
|
|
|
|
|
case "rcversion":
|
|
|
|
|
|
case "rc version":
|
|
|
|
|
|
case "rc-version":
|
|
|
|
|
|
case "romcenterversion":
|
|
|
|
|
|
case "romcenter version":
|
|
|
|
|
|
case "romcenter-version":
|
|
|
|
|
|
return "DatFile.RomCenterVersion";
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 15:13:57 -07:00
|
|
|
|
#endregion // DatFile
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
#region Machine
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
#region Common
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "game":
|
|
|
|
|
|
case "gamename":
|
|
|
|
|
|
case "game name":
|
|
|
|
|
|
case "machine":
|
|
|
|
|
|
case "machinename":
|
|
|
|
|
|
case "machine name":
|
|
|
|
|
|
return "Machine.Name";
|
|
|
|
|
|
|
|
|
|
|
|
case "comment":
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "extra":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
return "Machine.Comment";
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "gamedesc":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "gamedescription":
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "game-description":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "game description":
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "machinedesc":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "machinedescription":
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "machine-description":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "machine description":
|
|
|
|
|
|
return "Machine.Description";
|
|
|
|
|
|
|
|
|
|
|
|
case "year":
|
|
|
|
|
|
return "Machine.Year";
|
|
|
|
|
|
|
|
|
|
|
|
case "manufacturer":
|
|
|
|
|
|
return "Machine.Manufacturer";
|
|
|
|
|
|
|
|
|
|
|
|
case "publisher":
|
|
|
|
|
|
return "Machine.Publisher";
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "gamecategory":
|
|
|
|
|
|
case "game-category":
|
|
|
|
|
|
case "machinecategory":
|
|
|
|
|
|
case "machine-category":
|
|
|
|
|
|
return "Machine.Category";
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
case "romof":
|
|
|
|
|
|
return "Machine.RomOf";
|
|
|
|
|
|
|
|
|
|
|
|
case "cloneof":
|
|
|
|
|
|
return "Machine.CloneOf";
|
|
|
|
|
|
|
|
|
|
|
|
case "sampleof":
|
|
|
|
|
|
return "Machine.SampleOf";
|
|
|
|
|
|
|
2020-08-20 15:39:32 -07:00
|
|
|
|
case "gametype":
|
|
|
|
|
|
case "game type":
|
|
|
|
|
|
case "game-type":
|
|
|
|
|
|
case "machinetype":
|
|
|
|
|
|
case "machine type":
|
|
|
|
|
|
case "machine-type":
|
|
|
|
|
|
return "Machine.MachineType";
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region AttractMode
|
|
|
|
|
|
|
|
|
|
|
|
case "players":
|
|
|
|
|
|
return "Machine.Players";
|
|
|
|
|
|
|
|
|
|
|
|
case "rotation":
|
|
|
|
|
|
return "Machine.Rotation";
|
|
|
|
|
|
|
|
|
|
|
|
case "control":
|
|
|
|
|
|
return "Machine.Control";
|
|
|
|
|
|
|
|
|
|
|
|
case "amstatus":
|
|
|
|
|
|
case "am-status":
|
|
|
|
|
|
case "gamestatus":
|
|
|
|
|
|
case "game-status":
|
|
|
|
|
|
case "machinestatus":
|
|
|
|
|
|
case "machine-status":
|
|
|
|
|
|
case "supportstatus":
|
|
|
|
|
|
case "support-status":
|
|
|
|
|
|
return "Machine.Status";
|
|
|
|
|
|
|
|
|
|
|
|
case "displaycount":
|
|
|
|
|
|
case "display-count":
|
|
|
|
|
|
case "displays":
|
|
|
|
|
|
return "Machine.DisplayCount";
|
|
|
|
|
|
|
|
|
|
|
|
case "displaytype":
|
|
|
|
|
|
case "display-type":
|
|
|
|
|
|
return "Machine.DisplayType";
|
|
|
|
|
|
|
|
|
|
|
|
case "buttons":
|
|
|
|
|
|
return "Machine.Buttons";
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region ListXML
|
2020-06-14 22:50:58 -07:00
|
|
|
|
|
|
|
|
|
|
case "sourcefile":
|
|
|
|
|
|
case "source file":
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "source-file":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
return "Machine.SourceFile";
|
|
|
|
|
|
|
|
|
|
|
|
case "runnable":
|
|
|
|
|
|
return "Machine.Runnable";
|
|
|
|
|
|
|
|
|
|
|
|
case "devices":
|
|
|
|
|
|
return "Machine.Devices";
|
|
|
|
|
|
|
|
|
|
|
|
case "slotoptions":
|
|
|
|
|
|
case "slot options":
|
2020-08-20 14:48:49 -07:00
|
|
|
|
case "slot-options":
|
2020-06-14 22:50:58 -07:00
|
|
|
|
return "Machine.SlotOptions";
|
|
|
|
|
|
|
|
|
|
|
|
case "infos":
|
|
|
|
|
|
return "Machine.Infos";
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
2020-08-20 14:48:49 -07:00
|
|
|
|
#region Logiqx
|
|
|
|
|
|
|
|
|
|
|
|
case "board":
|
|
|
|
|
|
return "Machine.Board";
|
|
|
|
|
|
|
|
|
|
|
|
case "rebuildto":
|
|
|
|
|
|
case "rebuild to":
|
|
|
|
|
|
case "rebuild-to":
|
|
|
|
|
|
return "Machine.RebuildTo";
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region SoftwareList
|
|
|
|
|
|
|
|
|
|
|
|
case "supported":
|
|
|
|
|
|
return "Machine.Supported";
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#endregion // Machine
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
#region DatItem
|
|
|
|
|
|
|
|
|
|
|
|
case "itemtype":
|
|
|
|
|
|
case "item type":
|
|
|
|
|
|
case "type":
|
|
|
|
|
|
return "DatItem.Type";
|
|
|
|
|
|
|
|
|
|
|
|
case "disk":
|
|
|
|
|
|
case "diskname":
|
|
|
|
|
|
case "disk name":
|
|
|
|
|
|
case "item":
|
|
|
|
|
|
case "itemname":
|
|
|
|
|
|
case "item name":
|
|
|
|
|
|
case "name":
|
|
|
|
|
|
case "rom":
|
|
|
|
|
|
case "romname":
|
|
|
|
|
|
case "rom name":
|
|
|
|
|
|
return "DatItem.Name";
|
|
|
|
|
|
|
|
|
|
|
|
case "partname":
|
|
|
|
|
|
case "part name":
|
|
|
|
|
|
return "DatItem.PartName";
|
|
|
|
|
|
|
|
|
|
|
|
case "partinterface":
|
|
|
|
|
|
case "part interface":
|
|
|
|
|
|
return "DatItem.PartInterface";
|
|
|
|
|
|
|
|
|
|
|
|
case "features":
|
|
|
|
|
|
return "DatItem.Features";
|
|
|
|
|
|
|
|
|
|
|
|
case "areaname":
|
|
|
|
|
|
case "area name":
|
|
|
|
|
|
return "DatItem.AreaName";
|
|
|
|
|
|
|
|
|
|
|
|
case "areasize":
|
|
|
|
|
|
case "area size":
|
|
|
|
|
|
return "DatItem.AreaSize";
|
|
|
|
|
|
|
|
|
|
|
|
case "default":
|
|
|
|
|
|
return "DatItem.Default";
|
|
|
|
|
|
|
|
|
|
|
|
case "biosdescription":
|
|
|
|
|
|
case "bios description":
|
|
|
|
|
|
return "DatItem.Description";
|
|
|
|
|
|
|
|
|
|
|
|
case "itemsize":
|
|
|
|
|
|
case "item size":
|
|
|
|
|
|
case "size":
|
|
|
|
|
|
return "DatItem.Size";
|
|
|
|
|
|
|
|
|
|
|
|
case "crc":
|
|
|
|
|
|
case "crc hash":
|
|
|
|
|
|
return "DatItem.CRC";
|
|
|
|
|
|
|
|
|
|
|
|
case "md5":
|
|
|
|
|
|
case "md5 hash":
|
|
|
|
|
|
return "DatItem.MD5";
|
|
|
|
|
|
|
|
|
|
|
|
case "ripemd":
|
|
|
|
|
|
case "ripemd160":
|
|
|
|
|
|
case "ripemd hash":
|
|
|
|
|
|
case "ripemd160 hash":
|
|
|
|
|
|
return "DatItem.RIPEMD160";
|
|
|
|
|
|
|
|
|
|
|
|
case "sha1":
|
|
|
|
|
|
case "sha-1":
|
|
|
|
|
|
case "sha1 hash":
|
|
|
|
|
|
case "sha-1 hash":
|
|
|
|
|
|
return "DatItem.SHA1";
|
|
|
|
|
|
|
|
|
|
|
|
case "sha256":
|
|
|
|
|
|
case "sha-256":
|
|
|
|
|
|
case "sha256 hash":
|
|
|
|
|
|
case "sha-256 hash":
|
|
|
|
|
|
return "DatItem.SHA256";
|
|
|
|
|
|
|
|
|
|
|
|
case "sha384":
|
|
|
|
|
|
case "sha-384":
|
|
|
|
|
|
case "sha384 hash":
|
|
|
|
|
|
case "sha-384 hash":
|
|
|
|
|
|
return "DatItem.SHA384";
|
|
|
|
|
|
|
|
|
|
|
|
case "sha512":
|
|
|
|
|
|
case "sha-512":
|
|
|
|
|
|
case "sha512 hash":
|
|
|
|
|
|
case "sha-512 hash":
|
|
|
|
|
|
return "DatItem.SHA512";
|
|
|
|
|
|
|
|
|
|
|
|
case "merge":
|
|
|
|
|
|
case "mergetag":
|
|
|
|
|
|
case "merge tag":
|
|
|
|
|
|
return "DatItem.Merge";
|
|
|
|
|
|
|
|
|
|
|
|
case "region":
|
|
|
|
|
|
return "DatItem.Region";
|
|
|
|
|
|
|
|
|
|
|
|
case "index":
|
|
|
|
|
|
return "DatItem.Index";
|
|
|
|
|
|
|
|
|
|
|
|
case "writable":
|
|
|
|
|
|
return "DatItem.Writable";
|
|
|
|
|
|
|
|
|
|
|
|
case "optional":
|
|
|
|
|
|
return "DatItem.Optional";
|
|
|
|
|
|
|
|
|
|
|
|
case "nodump":
|
|
|
|
|
|
case "no dump":
|
|
|
|
|
|
case "status":
|
|
|
|
|
|
case "item status":
|
|
|
|
|
|
return "DatItem.Status";
|
|
|
|
|
|
|
|
|
|
|
|
case "language":
|
|
|
|
|
|
return "DatItem.Language";
|
|
|
|
|
|
|
|
|
|
|
|
case "date":
|
|
|
|
|
|
return "DatItem.Date";
|
|
|
|
|
|
|
|
|
|
|
|
case "bios":
|
|
|
|
|
|
return "DatItem.Bios";
|
|
|
|
|
|
|
|
|
|
|
|
case "offset":
|
|
|
|
|
|
return "DatItem.Offset";
|
|
|
|
|
|
|
2020-07-28 17:00:19 -07:00
|
|
|
|
case "inverted":
|
|
|
|
|
|
return "DatItem.Inverted";
|
|
|
|
|
|
|
2020-06-14 22:50:58 -07:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
return "INVALID";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-11 13:43:15 -08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Create and open an output file for writing direct from a dictionary
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="outfile">Name of the file to write to</param>
|
|
|
|
|
|
/// <param name="ignoreblanks">True if blank roms should be skipped on output, false otherwise (default)</param>
|
|
|
|
|
|
/// <returns>True if the DAT was written correctly, false otherwise</returns>
|
|
|
|
|
|
public override bool WriteToFile(string outfile, bool ignoreblanks = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2020-06-10 22:37:19 -07:00
|
|
|
|
Globals.Logger.User($"Opening file for writing: {outfile}");
|
2020-07-15 09:41:59 -07:00
|
|
|
|
FileStream fs = FileExtensions.TryCreate(outfile);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
|
|
|
|
|
// If we get back null for some reason, just log and return
|
|
|
|
|
|
if (fs == null)
|
|
|
|
|
|
{
|
2020-06-10 22:37:19 -07:00
|
|
|
|
Globals.Logger.Warning($"File '{outfile}' could not be created for writing! Please check to see if the file is writable");
|
2019-01-11 13:43:15 -08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-07-15 09:41:59 -07:00
|
|
|
|
SeparatedValueWriter svw = new SeparatedValueWriter(fs, new UTF8Encoding(false))
|
|
|
|
|
|
{
|
|
|
|
|
|
Quotes = true,
|
|
|
|
|
|
Separator = this._delim,
|
|
|
|
|
|
VerifyFieldCount = true
|
|
|
|
|
|
};
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
|
|
|
|
|
// Write out the header
|
2020-06-13 22:15:21 -07:00
|
|
|
|
WriteHeader(svw);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
2020-07-26 21:00:30 -07:00
|
|
|
|
// Use a sorted list of games to output
|
2020-07-26 22:34:45 -07:00
|
|
|
|
foreach (string key in Items.SortedKeys)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
2020-07-26 22:34:45 -07:00
|
|
|
|
List<DatItem> roms = Items[key];
|
2019-01-11 13:43:15 -08:00
|
|
|
|
|
|
|
|
|
|
// Resolve the names in the block
|
|
|
|
|
|
roms = DatItem.ResolveNames(roms);
|
|
|
|
|
|
|
|
|
|
|
|
for (int index = 0; index < roms.Count; index++)
|
|
|
|
|
|
{
|
|
|
|
|
|
DatItem rom = roms[index];
|
|
|
|
|
|
|
|
|
|
|
|
// There are apparently times when a null rom can skip by, skip them
|
2020-08-20 13:17:14 -07:00
|
|
|
|
if (rom.Name == null || rom.Machine.Name == null)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
|
|
|
|
|
Globals.Logger.Warning("Null rom found!");
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// If we have a "null" game (created by DATFromDir or something similar), log it to file
|
|
|
|
|
|
if (rom.ItemType == ItemType.Rom
|
|
|
|
|
|
&& ((Rom)rom).Size == -1
|
|
|
|
|
|
&& ((Rom)rom).CRC == "null")
|
|
|
|
|
|
{
|
2020-08-20 13:17:14 -07:00
|
|
|
|
Globals.Logger.Verbose($"Empty folder found: {rom.Machine.Name}");
|
2019-01-11 13:43:15 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Now, output the rom data
|
2020-06-13 22:15:21 -07:00
|
|
|
|
WriteDatItem(svw, rom, ignoreblanks);
|
2019-01-11 13:43:15 -08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Globals.Logger.Verbose("File written!" + Environment.NewLine);
|
2020-06-13 22:15:21 -07:00
|
|
|
|
svw.Dispose();
|
2019-01-11 13:43:15 -08:00
|
|
|
|
fs.Dispose();
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Globals.Logger.Error(ex.ToString());
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Write out DAT header using the supplied StreamWriter
|
|
|
|
|
|
/// </summary>
|
2020-06-13 22:15:21 -07:00
|
|
|
|
/// <param name="svw">SeparatedValueWriter to output to</param>
|
2019-01-11 13:43:15 -08:00
|
|
|
|
/// <returns>True if the data was written, false on error</returns>
|
2020-06-13 22:15:21 -07:00
|
|
|
|
private bool WriteHeader(SeparatedValueWriter svw)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2020-06-13 22:15:21 -07:00
|
|
|
|
string[] headers = new string[]
|
|
|
|
|
|
{
|
|
|
|
|
|
"File Name",
|
|
|
|
|
|
"Internal Name",
|
|
|
|
|
|
"Description",
|
|
|
|
|
|
"Game Name",
|
|
|
|
|
|
"Game Description",
|
|
|
|
|
|
"Type",
|
|
|
|
|
|
"Rom Name",
|
|
|
|
|
|
"Disk Name",
|
|
|
|
|
|
"Size",
|
|
|
|
|
|
"CRC",
|
|
|
|
|
|
"MD5",
|
|
|
|
|
|
//"RIPEMD160",
|
|
|
|
|
|
"SHA1",
|
|
|
|
|
|
"SHA256",
|
|
|
|
|
|
//"SHA384",
|
|
|
|
|
|
//"SHA512",
|
|
|
|
|
|
"Nodump",
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
svw.WriteHeader(headers);
|
|
|
|
|
|
|
|
|
|
|
|
svw.Flush();
|
2019-01-11 13:43:15 -08:00
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Globals.Logger.Error(ex.ToString());
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Write out DatItem using the supplied StreamWriter
|
|
|
|
|
|
/// </summary>
|
2020-06-13 22:15:21 -07:00
|
|
|
|
/// <param name="svw">SeparatedValueWriter to output to</param>
|
2020-06-10 22:37:19 -07:00
|
|
|
|
/// <param name="datItem">DatItem object to be output</param>
|
2019-01-11 13:43:15 -08:00
|
|
|
|
/// <param name="ignoreblanks">True if blank roms should be skipped on output, false otherwise (default)</param>
|
|
|
|
|
|
/// <returns>True if the data was written, false on error</returns>
|
2020-06-13 22:15:21 -07:00
|
|
|
|
private bool WriteDatItem(SeparatedValueWriter svw, DatItem datItem, bool ignoreblanks = false)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
|
|
|
|
|
// If we are in ignore blanks mode AND we have a blank (0-size) rom, skip
|
2020-06-10 22:37:19 -07:00
|
|
|
|
if (ignoreblanks && (datItem.ItemType == ItemType.Rom && ((datItem as Rom).Size == 0 || (datItem as Rom).Size == -1)))
|
2019-01-11 13:43:15 -08:00
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
// Separated values should only output Rom and Disk
|
2020-06-10 22:37:19 -07:00
|
|
|
|
if (datItem.ItemType != ItemType.Disk && datItem.ItemType != ItemType.Rom)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
return true;
|
|
|
|
|
|
|
2020-06-13 22:15:21 -07:00
|
|
|
|
// Build the state based on excluded fields
|
2020-06-14 22:51:55 -07:00
|
|
|
|
// TODO: Can we have some way of saying what fields to write out? Support for read extends to all fields now
|
2020-06-13 22:15:21 -07:00
|
|
|
|
string[] fields = new string[14]; // 17;
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[0] = Header.FileName;
|
|
|
|
|
|
fields[1] = Header.Name;
|
|
|
|
|
|
fields[2] = Header.Description;
|
|
|
|
|
|
fields[3] = datItem.GetField(Field.MachineName, Header.ExcludeFields);
|
|
|
|
|
|
fields[4] = datItem.GetField(Field.Description, Header.ExcludeFields);
|
2020-06-12 11:02:23 -07:00
|
|
|
|
|
|
|
|
|
|
switch (datItem.ItemType)
|
2019-01-11 13:43:15 -08:00
|
|
|
|
{
|
2020-06-12 11:02:23 -07:00
|
|
|
|
case ItemType.Disk:
|
|
|
|
|
|
var disk = datItem as Disk;
|
2020-06-13 22:15:21 -07:00
|
|
|
|
fields[5] = "disk";
|
|
|
|
|
|
fields[6] = string.Empty;
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[7] = disk.GetField(Field.Name, Header.ExcludeFields);
|
2020-06-13 22:15:21 -07:00
|
|
|
|
fields[8] = string.Empty;
|
|
|
|
|
|
fields[9] = string.Empty;
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[10] = disk.GetField(Field.MD5, Header.ExcludeFields).ToLowerInvariant();
|
2020-07-15 09:41:59 -07:00
|
|
|
|
//fields[11] = disk.GetField(Field.RIPEMD160, DatHeader.ExcludeFields).ToLowerInvariant();
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[11] = disk.GetField(Field.SHA1, Header.ExcludeFields).ToLowerInvariant();
|
|
|
|
|
|
fields[12] = disk.GetField(Field.SHA256, Header.ExcludeFields).ToLowerInvariant();
|
2020-07-15 09:41:59 -07:00
|
|
|
|
//fields[13] = disk.GetField(Field.SHA384, DatHeader.ExcludeFields).ToLowerInvariant();
|
|
|
|
|
|
//fields[14] = disk.GetField(Field.SHA512, DatHeader.ExcludeFields).ToLowerInvariant();
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[13] = disk.GetField(Field.Status, Header.ExcludeFields);
|
2020-06-12 11:02:23 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ItemType.Rom:
|
|
|
|
|
|
var rom = datItem as Rom;
|
2020-06-13 22:15:21 -07:00
|
|
|
|
fields[5] = "rom";
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[6] = rom.GetField(Field.Name, Header.ExcludeFields);
|
2020-06-13 22:15:21 -07:00
|
|
|
|
fields[7] = string.Empty;
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[8] = rom.GetField(Field.Size, Header.ExcludeFields);
|
|
|
|
|
|
fields[9] = rom.GetField(Field.CRC, Header.ExcludeFields).ToLowerInvariant();
|
|
|
|
|
|
fields[10] = rom.GetField(Field.MD5, Header.ExcludeFields).ToLowerInvariant();
|
2020-07-15 09:41:59 -07:00
|
|
|
|
//fields[11] = rom.GetField(Field.RIPEMD160, DatHeader.ExcludeFields).ToLowerInvariant();
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[11] = rom.GetField(Field.SHA1, Header.ExcludeFields).ToLowerInvariant();
|
|
|
|
|
|
fields[12] = rom.GetField(Field.SHA256, Header.ExcludeFields).ToLowerInvariant();
|
2020-07-15 09:41:59 -07:00
|
|
|
|
//fields[13] = rom.GetField(Field.SHA384, DatHeader.ExcludeFields).ToLowerInvariant();
|
|
|
|
|
|
//fields[14] = rom.GetField(Field.SHA512, DatHeader.ExcludeFields).ToLowerInvariant();
|
2020-07-27 10:26:08 -07:00
|
|
|
|
fields[13] = rom.GetField(Field.Status, Header.ExcludeFields);
|
2020-06-12 11:02:23 -07:00
|
|
|
|
break;
|
2019-01-11 13:43:15 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-13 22:15:21 -07:00
|
|
|
|
svw.WriteString(CreatePrefixPostfix(datItem, true));
|
|
|
|
|
|
svw.WriteValues(fields, false);
|
|
|
|
|
|
svw.WriteString(CreatePrefixPostfix(datItem, false));
|
|
|
|
|
|
svw.WriteLine();
|
2020-06-12 11:02:23 -07:00
|
|
|
|
|
2020-06-13 22:15:21 -07:00
|
|
|
|
svw.Flush();
|
2019-01-11 13:43:15 -08:00
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Globals.Logger.Error(ex.ToString());
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-09 18:04:49 -07:00
|
|
|
|
}
|