// Spludlow Software // Copyright © Samuel P. Ludlow 2020 All Rights Reserved // Distributed under the terms of the GNU General Public License version 3 // Distributed WITHOUT ANY WARRANTY; without implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE // https://www.spludlow.co.uk/LICENCE.TXT // The Spludlow logo is a registered trademark of Samuel P. Ludlow and may not be used without permission // v1.14 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Data; namespace Spludlow.Mame { public class MameLink { public static string LinkAll() { StringBuilder info = new StringBuilder(); info.AppendLine(LinkMachineRom()); info.AppendLine(LinkMachineDisk()); info.AppendLine(LinkSoftwareRom()); info.AppendLine(LinkSoftwareDisk()); return info.ToString(); } public static string LinkMachineRom() { MameConfiguration config = new MameConfiguration(); return LinkMachineRom(config.LinkDirectoryMachineRom); } public static string LinkMachineRom(string targetDirectory) { MameHashStores hashStores = new MameHashStores(); HashStore hashStore = hashStores.MachineRom; DataTable table = MameDatabase.MachineRomQuery("sha1 IS NOT NULL"); Dictionary nameHashes = new Dictionary(); foreach (DataRow row in table.Rows) { string sha1 = ((string)row["sha1"]).ToUpper(); // Don't have if (hashStore.Exists(sha1) == false) continue; string machine_name = (string)row["machine_name"]; string rom_name = (string)row["rom_name"]; bool invalidName = MamePath.IsInvalidFilename(rom_name); string name = invalidName == false ? rom_name : MamePath.FixFilename(rom_name, '-'); name = machine_name + @"\" + name; if (invalidName == true) Spludlow.Log.Warning("Invalid Name: " + machine_name + ", " + rom_name); // duplate names if (nameHashes.ContainsKey(name) == true) { if (nameHashes[name] != sha1) throw new ApplicationException("ROM name sha1 mismatch: " + name); continue; } nameHashes.Add(name, sha1); } List links = new List(); foreach (string name in nameHashes.Keys) { string storeFilename = hashStore.Filename(nameHashes[name]); string linkFilename = targetDirectory + @"\" + name; if (File.Exists(linkFilename) == true) continue; links.Add(new string[] { linkFilename, storeFilename }); } if (links.Count > 0) Spludlow.Io.FsLinks.LinkFiles(links.ToArray()); return "Link Machine Rom: " + links.Count; } public static string LinkMachineDisk() { MameConfiguration config = new MameConfiguration(); return LinkMachineDisk(config.LinkDirectoryMachineDisk); } public static string LinkMachineDisk(string targetDirectory) { MameHashStores hashStores = new MameHashStores(); HashStore hashStore = hashStores.MachineDisk; DataTable table = MameDatabase.MachineDiskQuery("sha1 IS NOT NULL"); Dictionary nameHashes = new Dictionary(); foreach (DataRow row in table.Rows) { string sha1 = ((string)row["sha1"]).ToUpper(); // Don't have if (hashStore.Exists(sha1) == false) continue; string machine_name = (string)row["machine_name"]; string disk_name = (string)row["disk_name"]; bool invalidName = MamePath.IsInvalidFilename(disk_name); string name = invalidName == false ? disk_name : MamePath.FixFilename(disk_name, '-'); name = machine_name + @"\" + name; if (invalidName == true) Spludlow.Log.Warning("Invalid Name: " + machine_name + ", " + disk_name); // duplate names if (nameHashes.ContainsKey(name) == true) { if (nameHashes[name] != sha1) throw new ApplicationException("Disk name sha1 mismatch: " + name); continue; } nameHashes.Add(name, sha1); } List links = new List(); foreach (string name in nameHashes.Keys) { string storeFilename = hashStore.Filename(nameHashes[name]); string linkFilename = targetDirectory + @"\" + name + ".chd"; if (File.Exists(linkFilename) == true) continue; links.Add(new string[] { linkFilename, storeFilename }); } if (links.Count > 0) Spludlow.Io.FsLinks.LinkFiles(links.ToArray()); return "Link Machine Disk: " + links.Count; } public static string LinkSoftwareRom() { MameConfiguration config = new MameConfiguration(); return LinkSoftwareRom(config.LinkDirectorySoftwareRom); } public static string LinkSoftwareRom(string targetDirectory) { MameHashStores hashStores = new MameHashStores(); HashStore hashStore = hashStores.SoftwareRom; DataTable table = MameDatabase.SoftwareRomQuery("sha1 IS NOT NULL"); Dictionary nameHashes = new Dictionary(); foreach (DataRow row in table.Rows) { string sha1 = ((string)row["sha1"]).ToUpper(); // Don't have if (hashStore.Exists(sha1) == false) continue; string softwarelist_name = (string)row["softwarelist_name"]; string software_name = (string)row["software_name"]; string rom_name = (string)row["rom_name"]; bool invalidName = MamePath.IsInvalidFilename(rom_name); string name = invalidName == false ? rom_name : MamePath.FixFilename(rom_name, '-'); name = softwarelist_name + @"\" + software_name + @"\" + name; if (invalidName == true) Spludlow.Log.Warning("Invalid Name: " + softwarelist_name + @", " + software_name + ", " + rom_name); // duplate names if (nameHashes.ContainsKey(name) == true) { if (nameHashes[name] != sha1) throw new ApplicationException("ROM name sha1 mismatch: " + name); continue; } nameHashes.Add(name, sha1); } List links = new List(); foreach (string name in nameHashes.Keys) { string storeFilename = hashStore.Filename(nameHashes[name]); string linkFilename = targetDirectory + @"\" + name; if (File.Exists(linkFilename) == true) continue; links.Add(new string[] { linkFilename, storeFilename }); } if (links.Count > 0) Spludlow.Io.FsLinks.LinkFiles(links.ToArray()); return "Link Software Rom: " + links.Count; } public static string LinkSoftwareDisk() { MameConfiguration config = new MameConfiguration(); return LinkSoftwareDisk(config.LinkDirectorySoftwareDisk); } public static string LinkSoftwareDisk(string targetDirectory) { MameHashStores hashStores = new MameHashStores(); HashStore hashStore = hashStores.SoftwareDisk; DataTable table = MameDatabase.SoftwareDiskQuery("sha1 IS NOT NULL"); Dictionary nameHashes = new Dictionary(); foreach (DataRow row in table.Rows) { string sha1 = ((string)row["sha1"]).ToUpper(); // Don't have if (hashStore.Exists(sha1) == false) continue; string softwarelist_name = (string)row["softwarelist_name"]; string software_name = (string)row["software_name"]; string disk_name = (string)row["disk_name"]; bool invalidName = MamePath.IsInvalidFilename(disk_name); string name = invalidName == false ? disk_name : MamePath.FixFilename(disk_name, '-'); name = softwarelist_name + @"\" + software_name + @"\" + name; if (invalidName == true) Spludlow.Log.Warning("Invalid Name: " + softwarelist_name + ", " + software_name + ", " + disk_name); // duplate names if (nameHashes.ContainsKey(name) == true) { if (nameHashes[name] != sha1) throw new ApplicationException("Disk name sha1 mismatch: " + name); continue; } nameHashes.Add(name, sha1); } List links = new List(); foreach (string name in nameHashes.Keys) { string storeFilename = hashStore.Filename(nameHashes[name]); string linkFilename = targetDirectory + @"\" + name + ".chd"; if (File.Exists(linkFilename) == true) continue; links.Add(new string[] { linkFilename, storeFilename }); } if (links.Count > 0) Spludlow.Io.FsLinks.LinkFiles(links.ToArray()); return "Link Software Disk: " + links.Count; } } }