diff --git a/SabreTools.DatFiles/DatFile.MetadataConverter.cs b/SabreTools.DatFiles/DatFile.MetadataConverter.cs index ee2c047c..4f6fbc65 100644 --- a/SabreTools.DatFiles/DatFile.MetadataConverter.cs +++ b/SabreTools.DatFiles/DatFile.MetadataConverter.cs @@ -3,7 +3,6 @@ using System.Linq; namespace SabreTools.DatFiles { // TODO: Convert nested items (e.g. Configuration, DipLocation) - // TODO: Determine which items need to have their values flipped (e.g. Part, DiskArea, DataArea) public partial class DatFile { #region Converters @@ -14,25 +13,23 @@ namespace SabreTools.DatFiles /// Metadata file to convert /// Name of the file to be parsed /// Index ID for the DAT + /// True if full pathnames are to be kept, false otherwise (default) /// True to only add item statistics while parsing, false otherwise - public void ConvertMetadata(Models.Metadata.MetadataFile? item, string filename, int indexId, bool statsOnly) + public void ConvertMetadata(Models.Metadata.MetadataFile? item, string filename, int indexId, bool keep, bool statsOnly) { // If the metadata file is invalid, we can't do anything if (item == null || !item.Any()) return; - // TODO: Add header parsing + // Get the header from the metadata + var header = item.Read(Models.Metadata.MetadataFile.HeaderKey); + if (header != null) + ConvertHeader(header); // Get the machines from the metadata var machines = ReadItemArray(item, Models.Metadata.MetadataFile.MachineKey); - if (machines == null) - return; - - // Loop through the machines and add - foreach (var machine in machines) - { - ConvertMachine(machine, filename, indexId, statsOnly); - } + if (machines != null) + ConvertMachines(machines, filename, indexId, statsOnly); } /// @@ -41,7 +38,65 @@ namespace SabreTools.DatFiles /// Header to convert private void ConvertHeader(Models.Metadata.Header? item) { + // If the header is invalid, we can't do anything + if (item == null || !item.Any()) + return; + // Create an internal header + var header = new DatFiles.DatHeader(item); + + // Convert subheader values + if (item.ContainsKey(Models.Metadata.Header.CanOpenKey)) + { + // TODO: Implement + } + if (item.ContainsKey(Models.Metadata.Header.ImagesKey)) + { + // TODO: Implement + } + if (item.ContainsKey(Models.Metadata.Header.InfosKey)) + { + // TODO: Implement + } + if (item.ContainsKey(Models.Metadata.Header.NewDatKey)) + { + // TODO: Implement + } + if (item.ContainsKey(Models.Metadata.Header.SearchKey)) + { + // TODO: Implement + } + + // Get all fields that can be set + var nonItemFields = Filter.TypeHelper.GetConstants(typeof(Models.Metadata.Header)); + if (nonItemFields == null) + return; + + // Loop through and selectively set all fields + foreach (string field in nonItemFields) + { + // TODO: Implement selective setting of all fields in Header + } + } + + /// + /// Convert machines information + /// + /// Machine array to convert + /// Name of the file to be parsed + /// Index ID for the DAT + /// True to only add item statistics while parsing, false otherwise + private void ConvertMachines(Models.Metadata.Machine[]? items, string filename, int indexId, bool statsOnly) + { + // If the array is invalid, we can't do anything + if (items == null || !items.Any()) + return; + + // Loop through the machines and add + foreach (var machine in items) + { + ConvertMachine(machine, filename, indexId, statsOnly); + } } /// @@ -197,22 +252,6 @@ namespace SabreTools.DatFiles } } - /// - /// Read an item array from a given key, if possible - /// - private static T[]? ReadItemArray(Models.Metadata.DictionaryBase item, string key) where T : Models.Metadata.DictionaryBase - { - var items = item.Read(key); - if (items == default) - { - var single = item.Read(key); - if (single != default) - items = [single]; - } - - return items; - } - /// /// Convert Adjuster information /// @@ -938,6 +977,22 @@ namespace SabreTools.DatFiles } } + /// + /// Read an item array from a given key, if possible + /// + private static T[]? ReadItemArray(Models.Metadata.DictionaryBase item, string key) where T : Models.Metadata.DictionaryBase + { + var items = item.Read(key); + if (items == default) + { + var single = item.Read(key); + if (single != default) + items = [single]; + } + + return items; + } + #endregion } } \ No newline at end of file diff --git a/SabreTools.DatFiles/DatHeader.cs b/SabreTools.DatFiles/DatHeader.cs index f2c8b129..f5f3fc12 100644 --- a/SabreTools.DatFiles/DatHeader.cs +++ b/SabreTools.DatFiles/DatHeader.cs @@ -112,6 +112,28 @@ namespace SabreTools.DatFiles #region Instance Methods + #region Constructors + + public DatHeader() { } + + public DatHeader(Models.Metadata.Header header) + { + // Get all fields to automatically copy without processing + var nonItemFields = TypeHelper.GetConstants(typeof(Models.Metadata.Header)); + if (nonItemFields == null) + return; + + // Populate the internal machine from non-filter fields + _header = []; + foreach (string fieldName in nonItemFields) + { + if (header.ContainsKey(fieldName)) + _header[fieldName] = header[fieldName]; + } + } + + #endregion + #region Accessors /// diff --git a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs b/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs index 91a87c80..12a51f2f 100644 --- a/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs +++ b/SabreTools.DatFiles/Formats/ArchiveDotOrg.Reader.cs @@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats var metadata = new Serialization.CrossModel.ArchiveDotOrg().Serialize(files); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatFiles/Formats/AttractMode.Reader.cs b/SabreTools.DatFiles/Formats/AttractMode.Reader.cs index a2f8b0a8..0bc46540 100644 --- a/SabreTools.DatFiles/Formats/AttractMode.Reader.cs +++ b/SabreTools.DatFiles/Formats/AttractMode.Reader.cs @@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats var metadata = new Serialization.CrossModel.AttractMode().Serialize(metadataFile); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs b/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs index 9d7ece06..d213526e 100644 --- a/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs +++ b/SabreTools.DatFiles/Formats/ClrMamePro.Reader.cs @@ -22,7 +22,7 @@ namespace SabreTools.DatFiles.Formats ConvertHeader(metadataFile?.ClrMamePro, keep); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatFiles/Formats/DosCenter.Reader.cs b/SabreTools.DatFiles/Formats/DosCenter.Reader.cs index 8d93e144..b30a3c40 100644 --- a/SabreTools.DatFiles/Formats/DosCenter.Reader.cs +++ b/SabreTools.DatFiles/Formats/DosCenter.Reader.cs @@ -20,7 +20,7 @@ namespace SabreTools.DatFiles.Formats ConvertHeader(metadataFile?.DosCenter, keep); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs b/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs index f4447eaf..b784f92b 100644 --- a/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs +++ b/SabreTools.DatFiles/Formats/EverdriveSMDB.Reader.cs @@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats var metadata = new Serialization.CrossModel.EverdriveSMDB().Serialize(metadataFile); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatFiles/Formats/Hashfile.Reader.cs b/SabreTools.DatFiles/Formats/Hashfile.Reader.cs index 94937de3..cf1c7d72 100644 --- a/SabreTools.DatFiles/Formats/Hashfile.Reader.cs +++ b/SabreTools.DatFiles/Formats/Hashfile.Reader.cs @@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats var metadata = new Serialization.CrossModel.Hashfile().Serialize(hashfile); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs index 651a1813..92a24eef 100644 --- a/SabreTools.DatFiles/Formats/Logiqx.Reader.cs +++ b/SabreTools.DatFiles/Formats/Logiqx.Reader.cs @@ -22,7 +22,7 @@ namespace SabreTools.DatFiles.Formats ConvertHeader(metadataFile, keep); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatFiles/Formats/OfflineList.Reader.cs b/SabreTools.DatFiles/Formats/OfflineList.Reader.cs index f49e945a..337ebd26 100644 --- a/SabreTools.DatFiles/Formats/OfflineList.Reader.cs +++ b/SabreTools.DatFiles/Formats/OfflineList.Reader.cs @@ -27,7 +27,7 @@ namespace SabreTools.DatFiles.Formats ConvertConfiguration(dat?.Configuration, keep); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); // Convert the GUI to the internal format ConvertGUI(dat?.GUI); diff --git a/SabreTools.DatFiles/Formats/RomCenter.Reader.cs b/SabreTools.DatFiles/Formats/RomCenter.Reader.cs index ecff7abc..3f91e931 100644 --- a/SabreTools.DatFiles/Formats/RomCenter.Reader.cs +++ b/SabreTools.DatFiles/Formats/RomCenter.Reader.cs @@ -28,7 +28,7 @@ namespace SabreTools.DatFiles.Formats ConvertEmulator(metadataFile?.Emulator); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) { diff --git a/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs b/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs index 5c6678d8..d6c519f5 100644 --- a/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs +++ b/SabreTools.DatFiles/Formats/SeparatedValue.Reader.cs @@ -17,7 +17,7 @@ namespace SabreTools.DatFiles.Formats var metadata = new Serialization.CrossModel.SeparatedValue().Serialize(metadataFile); // Convert to the internal format - ConvertMetadata(metadata, filename, indexId, statsOnly); + ConvertMetadata(metadata, filename, indexId, keep, statsOnly); } catch (Exception ex) when (!throwOnError) {