diff --git a/SabreHelper/Output.cs b/SabreHelper/Output.cs index 2ea5dd01..936de860 100644 --- a/SabreHelper/Output.cs +++ b/SabreHelper/Output.cs @@ -85,7 +85,7 @@ namespace SabreTools.Helper StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); // Write out the header - WriteHeader(sw, datdata); + WriteHeader(sw, datdata, logger); // Write out each of the machines and roms int depth = 2, last = -1; @@ -198,111 +198,11 @@ namespace SabreTools.Helper } // Now, output the rom data - switch (datdata.OutputFormat) - { - case OutputFormat.ClrMamePro: - state += "\t" + rom.Type + " ( name \"" + rom.Name + "\"" + - (rom.Size != -1 ? " size " + rom.Size : "") + - (!String.IsNullOrEmpty(rom.CRC) ? " crc " + rom.CRC.ToLowerInvariant() : "") + - (!String.IsNullOrEmpty(rom.MD5) ? " md5 " + rom.MD5.ToLowerInvariant() : "") + - (!String.IsNullOrEmpty(rom.SHA1) ? " sha1 " + rom.SHA1.ToLowerInvariant() : "") + - (!String.IsNullOrEmpty(rom.Date) ? " date \"" + rom.Date + "\"" : "") + - (rom.Nodump ? " flags nodump" : "") + - " )\n"; - break; - case OutputFormat.MissFile: - string pre = datdata.Prefix + (datdata.Quotes ? "\"" : ""); - string post = (datdata.Quotes ? "\"" : "") + datdata.Postfix; - - // Check for special strings in prefix and postfix - pre = pre.Replace("%crc%", rom.CRC).Replace("%md5%", rom.MD5).Replace("%sha1%", rom.SHA1).Replace("%size%", rom.Size.ToString()); - post = post.Replace("%crc%", rom.CRC).Replace("%md5%", rom.MD5).Replace("%sha1%", rom.SHA1).Replace("%size%", rom.Size.ToString()); - - // If we're in Romba mode, the state is consistent - if (datdata.Romba) - { - // We can only write out if there's a SHA-1 - if (rom.SHA1 != "") - { - string name = "/" + rom.SHA1.Substring(0, 2) + "/" + rom.SHA1.Substring(2, 2) + "/" + rom.SHA1.Substring(4, 2) + "/" + - rom.SHA1.Substring(6, 2) + "/" + rom.SHA1 + ".gz\n"; - state += pre + name + post; - } - } - // Otherwise, use any flags - else - { - string name = (datdata.UseGame ? rom.Game : rom.Name); - if (datdata.RepExt != "") - { - string dir = Path.GetDirectoryName(name); - dir = (dir.EndsWith(Path.DirectorySeparatorChar.ToString()) ? dir : dir + Path.DirectorySeparatorChar); - dir = (dir.StartsWith(Path.DirectorySeparatorChar.ToString()) ? dir.Remove(0, 1) : dir); - name = dir + Path.GetFileNameWithoutExtension(name) + datdata.RepExt; - } - if (datdata.AddExt != "") - { - name += datdata.AddExt; - } - if (!datdata.UseGame && datdata.GameName) - { - name = (rom.Game.EndsWith(Path.DirectorySeparatorChar.ToString()) ? rom.Game : rom.Game + Path.DirectorySeparatorChar) + name; - } - - if (datdata.UseGame && rom.Game != lastgame) - { - state += pre + name + post + "\n"; - lastgame = rom.Game; - } - else if (!datdata.UseGame) - { - state += pre + name + post + "\n"; - } - } - break; - case OutputFormat.RomCenter: - state += "¬¬¬" + HttpUtility.HtmlEncode(rom.Game) + - "¬" + HttpUtility.HtmlEncode(rom.Game) + - "¬" + HttpUtility.HtmlEncode(rom.Name) + - "¬" + rom.CRC.ToLowerInvariant() + - "¬" + (rom.Size != -1 ? rom.Size.ToString() : "") + "¬¬¬\n"; - break; - case OutputFormat.SabreDat: - string prefix = ""; - for (int i = 0; i < depth; i++) - { - prefix += "\t"; - } - - state += prefix; - state += "\n" + prefix + "\t\n" + - prefix + "\t\t\n" + - prefix + "\t\n" + - prefix + "\n" : - "/>\n"); - break; - case OutputFormat.Xml: - state += "\t\t<" + rom.Type + " name=\"" + HttpUtility.HtmlEncode(rom.Name) + "\"" + - (rom.Size != -1 ? " size=\"" + rom.Size + "\"" : "") + - (!String.IsNullOrEmpty(rom.CRC) ? " crc=\"" + rom.CRC.ToLowerInvariant() + "\"" : "") + - (!String.IsNullOrEmpty(rom.MD5) ? " md5=\"" + rom.MD5.ToLowerInvariant() + "\"" : "") + - (!String.IsNullOrEmpty(rom.SHA1) ? " sha1=\"" + rom.SHA1.ToLowerInvariant() + "\"" : "") + - (!String.IsNullOrEmpty(rom.Date) ? " date=\"" + rom.Date + "\"" : "") + - (rom.Nodump ? " status=\"nodump\"" : "") + - "/>\n"; - break; - } + WriteRomData(sw, rom, lastgame, datdata, depth, logger); + // Set the new data to compare against splitpath = newsplit; lastgame = rom.Game; - - sw.Write(state); } } @@ -343,77 +243,202 @@ namespace SabreTools.Helper return true; } - public static bool WriteHeader(StreamWriter sw, DatData datdata) + public static bool WriteHeader(StreamWriter sw, DatData datdata, Logger logger) { - string header = ""; - switch (datdata.OutputFormat) + try { - case OutputFormat.ClrMamePro: - header = "clrmamepro (\n" + - "\tname \"" + HttpUtility.HtmlEncode(datdata.Name) + "\"\n" + - "\tdescription \"" + HttpUtility.HtmlEncode(datdata.Description) + "\"\n" + - "\tcategory \"" + HttpUtility.HtmlEncode(datdata.Category) + "\"\n" + - "\tversion \"" + HttpUtility.HtmlEncode(datdata.Version) + "\"\n" + - "\tdate \"" + HttpUtility.HtmlEncode(datdata.Date) + "\"\n" + - "\tauthor \"" + HttpUtility.HtmlEncode(datdata.Author) + "\"\n" + - "\tcomment \"" + HttpUtility.HtmlEncode(datdata.Comment) + "\"\n" + - (datdata.ForcePacking == ForcePacking.Unzip ? "\tforcezipping no\n" : "") + - ")\n"; - break; - case OutputFormat.RomCenter: - header = "[CREDITS]\n" + - "author=" + HttpUtility.HtmlEncode(datdata.Author) + "\n" + - "version=" + HttpUtility.HtmlEncode(datdata.Version) + "\n" + - "comment=" + HttpUtility.HtmlEncode(datdata.Comment) + "\n" + - "[DAT]\n" + - "version=2.50\n" + - "split=" + (datdata.ForceMerging == ForceMerging.Split ? "1" : "0") + "\n" + - "merge=" + (datdata.ForceMerging == ForceMerging.Full ? "1" : "0") + "\n" + - "[EMULATOR]\n" + - "refname=" + HttpUtility.HtmlEncode(datdata.Name) + "\n" + - "version=" + HttpUtility.HtmlEncode(datdata.Description) + "\n" + - "[GAMES]\n"; - break; - case OutputFormat.SabreDat: - header = "\n" + - "\n\n" + - "\n" + - "\t
\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Name) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Description) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Category) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Version) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Date) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Author) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Comment) + "\n" + - (!String.IsNullOrEmpty(datdata.Type) && datdata.ForcePacking != ForcePacking.Unzip ? - "\t\t\n" + - (!String.IsNullOrEmpty(datdata.Type) ? "\t\t\t\n" : "") + - (datdata.ForcePacking == ForcePacking.Unzip ? "\t\t\t\n" : "") + - "\t\t\n" : "") + - "\t
\n" + - "\t\n"; - break; - case OutputFormat.Xml: - header = "\n" + - "\n\n" + - "\n" + - "\t
\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Name) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Description) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Category) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Version) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Date) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Author) + "\n" + - "\t\t" + HttpUtility.HtmlEncode(datdata.Comment) + "\n" + - (!String.IsNullOrEmpty(datdata.Type) ? "\t\t" + datdata.Type + "\n" : "") + - (datdata.ForcePacking == ForcePacking.Unzip ? "\t\t\n" : "") + - "\t
\n"; - break; + string header = ""; + switch (datdata.OutputFormat) + { + case OutputFormat.ClrMamePro: + header = "clrmamepro (\n" + + "\tname \"" + HttpUtility.HtmlEncode(datdata.Name) + "\"\n" + + "\tdescription \"" + HttpUtility.HtmlEncode(datdata.Description) + "\"\n" + + "\tcategory \"" + HttpUtility.HtmlEncode(datdata.Category) + "\"\n" + + "\tversion \"" + HttpUtility.HtmlEncode(datdata.Version) + "\"\n" + + "\tdate \"" + HttpUtility.HtmlEncode(datdata.Date) + "\"\n" + + "\tauthor \"" + HttpUtility.HtmlEncode(datdata.Author) + "\"\n" + + "\tcomment \"" + HttpUtility.HtmlEncode(datdata.Comment) + "\"\n" + + (datdata.ForcePacking == ForcePacking.Unzip ? "\tforcezipping no\n" : "") + + ")\n"; + break; + case OutputFormat.RomCenter: + header = "[CREDITS]\n" + + "author=" + HttpUtility.HtmlEncode(datdata.Author) + "\n" + + "version=" + HttpUtility.HtmlEncode(datdata.Version) + "\n" + + "comment=" + HttpUtility.HtmlEncode(datdata.Comment) + "\n" + + "[DAT]\n" + + "version=2.50\n" + + "split=" + (datdata.ForceMerging == ForceMerging.Split ? "1" : "0") + "\n" + + "merge=" + (datdata.ForceMerging == ForceMerging.Full ? "1" : "0") + "\n" + + "[EMULATOR]\n" + + "refname=" + HttpUtility.HtmlEncode(datdata.Name) + "\n" + + "version=" + HttpUtility.HtmlEncode(datdata.Description) + "\n" + + "[GAMES]\n"; + break; + case OutputFormat.SabreDat: + header = "\n" + + "\n\n" + + "\n" + + "\t
\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Name) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Description) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Category) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Version) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Date) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Author) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Comment) + "\n" + + (!String.IsNullOrEmpty(datdata.Type) && datdata.ForcePacking != ForcePacking.Unzip ? + "\t\t\n" + + (!String.IsNullOrEmpty(datdata.Type) ? "\t\t\t\n" : "") + + (datdata.ForcePacking == ForcePacking.Unzip ? "\t\t\t\n" : "") + + "\t\t\n" : "") + + "\t
\n" + + "\t\n"; + break; + case OutputFormat.Xml: + header = "\n" + + "\n\n" + + "\n" + + "\t
\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Name) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Description) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Category) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Version) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Date) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Author) + "\n" + + "\t\t" + HttpUtility.HtmlEncode(datdata.Comment) + "\n" + + (!String.IsNullOrEmpty(datdata.Type) ? "\t\t" + datdata.Type + "\n" : "") + + (datdata.ForcePacking == ForcePacking.Unzip ? "\t\t\n" : "") + + "\t
\n"; + break; + } + + // Write the header out + sw.Write(header); + } + catch (Exception ex) + { + logger.Error(ex.ToString()); + return false; } - // Write the header out - sw.Write(header); + return true; + } + + public static bool WriteRomData(StreamWriter sw, RomData rom, string lastgame, DatData datdata, int depth, Logger logger) + { + try + { + string state = ""; + switch (datdata.OutputFormat) + { + case OutputFormat.ClrMamePro: + state += "\t" + rom.Type + " ( name \"" + rom.Name + "\"" + + (rom.Size != -1 ? " size " + rom.Size : "") + + (!String.IsNullOrEmpty(rom.CRC) ? " crc " + rom.CRC.ToLowerInvariant() : "") + + (!String.IsNullOrEmpty(rom.MD5) ? " md5 " + rom.MD5.ToLowerInvariant() : "") + + (!String.IsNullOrEmpty(rom.SHA1) ? " sha1 " + rom.SHA1.ToLowerInvariant() : "") + + (!String.IsNullOrEmpty(rom.Date) ? " date \"" + rom.Date + "\"" : "") + + (rom.Nodump ? " flags nodump" : "") + + " )\n"; + break; + case OutputFormat.MissFile: + string pre = datdata.Prefix + (datdata.Quotes ? "\"" : ""); + string post = (datdata.Quotes ? "\"" : "") + datdata.Postfix; + + // Check for special strings in prefix and postfix + pre = pre.Replace("%crc%", rom.CRC).Replace("%md5%", rom.MD5).Replace("%sha1%", rom.SHA1).Replace("%size%", rom.Size.ToString()); + post = post.Replace("%crc%", rom.CRC).Replace("%md5%", rom.MD5).Replace("%sha1%", rom.SHA1).Replace("%size%", rom.Size.ToString()); + + // If we're in Romba mode, the state is consistent + if (datdata.Romba) + { + // We can only write out if there's a SHA-1 + if (rom.SHA1 != "") + { + string name = "/" + rom.SHA1.Substring(0, 2) + "/" + rom.SHA1.Substring(2, 2) + "/" + rom.SHA1.Substring(4, 2) + "/" + + rom.SHA1.Substring(6, 2) + "/" + rom.SHA1 + ".gz\n"; + state += pre + name + post; + } + } + // Otherwise, use any flags + else + { + string name = (datdata.UseGame ? rom.Game : rom.Name); + if (datdata.RepExt != "") + { + string dir = Path.GetDirectoryName(name); + dir = (dir.EndsWith(Path.DirectorySeparatorChar.ToString()) ? dir : dir + Path.DirectorySeparatorChar); + dir = (dir.StartsWith(Path.DirectorySeparatorChar.ToString()) ? dir.Remove(0, 1) : dir); + name = dir + Path.GetFileNameWithoutExtension(name) + datdata.RepExt; + } + if (datdata.AddExt != "") + { + name += datdata.AddExt; + } + if (!datdata.UseGame && datdata.GameName) + { + name = (rom.Game.EndsWith(Path.DirectorySeparatorChar.ToString()) ? rom.Game : rom.Game + Path.DirectorySeparatorChar) + name; + } + + if (datdata.UseGame && rom.Game != lastgame) + { + state += pre + name + post + "\n"; + lastgame = rom.Game; + } + else if (!datdata.UseGame) + { + state += pre + name + post + "\n"; + } + } + break; + case OutputFormat.RomCenter: + state += "¬¬¬" + HttpUtility.HtmlEncode(rom.Game) + + "¬" + HttpUtility.HtmlEncode(rom.Game) + + "¬" + HttpUtility.HtmlEncode(rom.Name) + + "¬" + rom.CRC.ToLowerInvariant() + + "¬" + (rom.Size != -1 ? rom.Size.ToString() : "") + "¬¬¬\n"; + break; + case OutputFormat.SabreDat: + string prefix = ""; + for (int i = 0; i < depth; i++) + { + prefix += "\t"; + } + + state += prefix; + state += "\n" + prefix + "\t\n" + + prefix + "\t\t\n" + + prefix + "\t\n" + + prefix + "\n" : + "/>\n"); + break; + case OutputFormat.Xml: + state += "\t\t<" + rom.Type + " name=\"" + HttpUtility.HtmlEncode(rom.Name) + "\"" + + (rom.Size != -1 ? " size=\"" + rom.Size + "\"" : "") + + (!String.IsNullOrEmpty(rom.CRC) ? " crc=\"" + rom.CRC.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(rom.MD5) ? " md5=\"" + rom.MD5.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(rom.SHA1) ? " sha1=\"" + rom.SHA1.ToLowerInvariant() + "\"" : "") + + (!String.IsNullOrEmpty(rom.Date) ? " date=\"" + rom.Date + "\"" : "") + + (rom.Nodump ? " status=\"nodump\"" : "") + + "/>\n"; + break; + } + + sw.Write(state); + } + catch (Exception ex) + { + logger.Error(ex.ToString()); + return false; + } return true; }