diff --git a/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs b/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs
index 425fd0d4..1eabc2bf 100644
--- a/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs
+++ b/SabreTools.Serialization.Test/CrossModel/LogiqxTests.cs
@@ -28,10 +28,11 @@ namespace SabreTools.Serialization.Test.CrossModel
Validate(newDf.Header);
Assert.NotNull(newDf.Game);
- var newGame = Assert.Single(newDf.Game);
- Validate(newGame);
+ Assert.Equal(2, newDf.Game.Length);
+ Validate(newDf.Game[0], nested: false);
+ Validate(newDf.Game[1], nested: true);
- // TODO: Unsupported
+ // TODO: Unsupported for round-trip
Assert.Null(newDf.Dir);
}
@@ -59,10 +60,11 @@ namespace SabreTools.Serialization.Test.CrossModel
Validate(newDf.Header);
Assert.NotNull(newDf.Game);
- var newGame = Assert.Single(newDf.Game);
- Validate(newGame);
+ Assert.Equal(2, newDf.Game.Length);
+ Validate(newDf.Game[0], nested: false);
+ Validate(newDf.Game[1], nested: true);
- // TODO: Unsupported
+ // TODO: Unsupported for round-trip
Assert.Null(newDf.Dir);
}
@@ -253,6 +255,18 @@ namespace SabreTools.Serialization.Test.CrossModel
gameBase.Driver = driver;
gameBase.SoftwareList = [softwarelist];
+ var subdir = new Models.Logiqx.Dir
+ {
+ Name = "XXXXXX",
+ Game = [gameBase],
+ };
+
+ var dir = new Models.Logiqx.Dir
+ {
+ Name = "XXXXXX",
+ Subdir = [subdir],
+ };
+
return new Models.Logiqx.Datafile
{
Build = "XXXXXX",
@@ -260,7 +274,7 @@ namespace SabreTools.Serialization.Test.CrossModel
SchemaLocation = "XXXXXX",
Header = header,
Game = [gameBase],
- // Dir = [dir], // TODO: Unsupported
+ Dir = [dir],
};
}
@@ -317,10 +331,13 @@ namespace SabreTools.Serialization.Test.CrossModel
///
/// Validate a GameBase
///
- private static void Validate(Models.Logiqx.GameBase? gb)
+ private static void Validate(Models.Logiqx.GameBase? gb, bool nested)
{
Assert.NotNull(gb);
- Assert.Equal("XXXXXX", gb.Name);
+ if (nested)
+ Assert.Equal("XXXXXX\\XXXXXX\\XXXXXX", gb.Name);
+ else
+ Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.SourceFile);
Assert.Equal("XXXXXX", gb.IsBios);
Assert.Equal("XXXXXX", gb.IsDevice);
diff --git a/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs
index 7e1e2d81..7b1d98ca 100644
--- a/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs
+++ b/SabreTools.Serialization/CrossModel/Logiqx.Serializer.cs
@@ -94,27 +94,40 @@ namespace SabreTools.Serialization.CrossModel
///
/// Convert from to an array of
///
- private static Models.Metadata.Machine[] ConvertDirToInternalModel(Dir item)
+ private static Models.Metadata.Machine[] ConvertDirToInternalModel(Dir item, string? parent = null)
{
- if (item.Game == null || item.Game.Length == 0)
- return [];
+ // Get the directory name
+ string? dirName = item.Name;
+ if (parent != null)
+ dirName = $"{parent}\\{item.Name}";
- return Array.ConvertAll(item.Game, g =>
- {
- var machine = ConvertMachineToInternalModel(g);
- machine[Models.Metadata.Machine.DirNameKey] = item.Name;
- return machine;
- });
+ // Handle machine items
+ Models.Metadata.Machine[] machines = [];
+ if (item.Game != null && item.Game.Length > 0)
+ machines = Array.ConvertAll(item.Game, g => ConvertMachineToInternalModel(g, dirName));
+
+ // Handle dir items
+ List dirs = [];
+ foreach (var subdir in item.Subdir ?? [])
+ {
+ dirs.AddRange(ConvertDirToInternalModel(subdir, dirName));
+ }
+
+ return [.. machines, .. dirs];
}
///
/// Convert from to
///
- private static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item)
+ private static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item, string? dir = null)
{
+ string? machineName = item.Name;
+ if (machineName != null && dir != null)
+ machineName = $"{dir}\\{machineName}";
+
var machine = new Models.Metadata.Machine
{
- [Models.Metadata.Machine.NameKey] = item.Name,
+ [Models.Metadata.Machine.NameKey] = machineName,
[Models.Metadata.Machine.SourceFileKey] = item.SourceFile,
[Models.Metadata.Machine.IsBiosKey] = item.IsBios,
[Models.Metadata.Machine.IsDeviceKey] = item.IsDevice,