private VaultRecordCSV_ViewModel ImportUCEs(string[] fileNames) { VaultRecordCSV_ViewModel explodedCart = new VaultRecordCSV_ViewModel(); foreach (var UCEFile in fileNames) { try { explodedCart = BLL.ExplodeUCE(UCEFile, "Unknown", true); var vaultFile = $"{BLL._Settings.DefaultFolder_USBRoot}\\{explodedCart.Genre}\\AddOn_{explodedCart.Title}.UCE"; bool doCopy = true; if (File.Exists(vaultFile)) { var dlgResult = MessageBox.Show("File exists, do you wish to overwrite?", "File Exists", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); doCopy = dlgResult == DialogResult.Yes; } if (doCopy) { File.Copy(UCEFile, vaultFile, true); BLL._VaultRecords = BLL._VaultRecords.AddRecord(explodedCart, false); } } catch (Exception ex) { MessageBox.Show($"{UCEFile}: {ex.kGetAllMessages()}", "Error on Explode UCE", MessageBoxButtons.OK, MessageBoxIcon.Error); return(null); } } LoadVault(true); return(explodedCart); }
private void AddNewCartToLayout(string UCEFilename, VaultRecordCSV_ViewModel vCart) { var newPic = GetCartImageForLayout(UCEFilename); if (tabCon.Controls.Find(vCart.Genre + "_Container", true).FirstOrDefault() is FlowLayoutPanel fPanel) { } }
public static List <VaultRecordCSV_ViewModel> GetVaultList(string path) { if (!File.Exists(path)) { _VaultRecords.kSaveToCSVFile(BLL._Settings.TheVault); } //check the file for appropriate columns List <VaultRecordCSV_ViewModel> retVal = File.ReadAllLines(path) .Skip(1) .Select(v => VaultRecordCSV_ViewModel.FromCSV(v)) .ToList(); return(retVal); }
public static List <VaultRecordCSV_ViewModel> UpdateRecord(this List <VaultRecordCSV_ViewModel> list, VaultRecordCSV_ViewModel vCart, bool persist = false) { if (vCart.Index > -1) { int foundObj = list.FindIndex(en => en.Index == vCart.Index); if (foundObj != null) { list[foundObj] = vCart; } } if (persist) { BLL._VaultRecords.kSaveToCSVFile(BLL._Settings.TheVault); } return(list); }
private void PopulateCartridgeProfile(VaultRecordCSV_ViewModel vCart) { if (vCart == null) { return; } txtVIndex.Text = "-1"; txtVTitle.Text = vCart.Title; cboVGenre.SelectedIndex = cboVGenre.FindString(vCart.Genre); txtVBoxArt.Text = vCart.CoverArtFile; txtVBezelArt.Text = vCart.BezelArtFile; txtVCore.Text = vCart.EmulatorCoreFile; txtVROM.Text = vCart.ROMFile; cbVUseInternalCore.Checked = vCart.UseInternalCore; cbOverlay.Checked = vCart.UseOverLayFile; cbResizeImages.Checked = vCart.ResizeImages; LoadBoxArt(txtVBoxArt.Text); LoadBezelArt(txtVBezelArt.Text); }
private void MoveCartToNewGenre(VaultRecordCSV_ViewModel vCart, string newGenre, bool persist = true) { var UCEFile = $"{BLL._Settings.DefaultFolder_USBRoot}\\{vCart.Genre}\\AddOn_{vCart.Title}.UCE"; bool doCopy = true; if (File.Exists(UCEFile)) { var NewGenreFile = $"{BLL._Settings.DefaultFolder_USBRoot}\\{newGenre}\\AddOn_{vCart.Title}.UCE"; if (File.Exists(NewGenreFile)) { var dlgResult = MessageBox.Show("UCE Already exists in Genre, do you wish to overwrite?", "UCE Already Exists", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); doCopy = dlgResult == DialogResult.Yes; } if (doCopy) { File.Copy(UCEFile, NewGenreFile, true); File.Delete(UCEFile); vCart.Genre = newGenre; BLL._VaultRecords = BLL._VaultRecords.UpdateRecord(vCart, persist); } } }
internal static void BuildPseudoFile(VaultRecordCSV_ViewModel vCart) { var sb = new StringBuilder(); sb.AppendLine("exec.sh m 755 0 0"); sb.AppendLine("cartridge.xml m 664 0 0"); sb.AppendLine("title.png m 664 0 0"); sb.AppendLine("boxart m 775 0 0"); sb.AppendLine("emu m 775 0 0"); sb.AppendLine("roms m 775 0 0"); sb.AppendLine("save m 775 0 0"); sb.AppendLine($"boxart/boxart.png m 664 0 0"); sb.AppendLine($"boxart/bezelart.png m 664 0 0"); sb.AppendLine($"\"emu/{Path.GetFileName(vCart.EmulatorCoreFile)}\" m 664 0 0"); sb.AppendLine($"\"roms/{Path.GetFileName(vCart.ROMFile)}\" m 664 0 0"); sb.AppendLine("roms/hiscore.dat m 664 0 0"); using (StreamWriter file = new StreamWriter($"{_Settings.DefaultFolder_Working}\\pseudo-file")) { file.WriteLine(sb.ToString()); } }
public static List <VaultRecordCSV_ViewModel> AddRecord(this List <VaultRecordCSV_ViewModel> list, VaultRecordCSV_ViewModel vCart, bool persist = false) { try { if (vCart.Index == -1) { var fRec = list.FirstOrDefault(r => r.Index == vCart.Index); if (fRec == null) { if (list.Any()) { vCart.Index = list.Max(m => m.Index) + 1; } else { vCart.Index = 1; } list.Add(vCart); } else { list = list.UpdateRecord(vCart); } } } catch (Exception ex) { return(null); } if (persist) { BLL._VaultRecords.kSaveToCSVFile(BLL._Settings.TheVault); } return(list); }
/// <summary>Builds the uce.</summary> /// <param name="vCart">The v cart.</param> /// <returns>The folder where the final UCE FIle exists</returns> internal string BuildUCE(VaultRecordCSV_ViewModel vCart) { string Working_Path = BLL._Settings.DefaultFolder_Working; var tmpCartridge = $"{Working_Path}\\byog_cartridge_shfs_twin.img"; //Populates the UCE_Template directory with the correct files for this cart. BLL.BuildUCETemplate(vCart); //Pseudo-file is used to give proper permissions to files in Squashfs BLL.BuildPseudoFile(vCart); RemoveFile(tmpCartridge); //Build the SquashFS File var madeFile = BLL.LaunchMKSquashFS(tmpCartridge, BLL._Settings.ShowBuildWindow); string finalUCEImg = ""; string cartSaveImg = $"{Directory.GetCurrentDirectory()}\\img\\byog_cart_saving_ext4.img"; string md5binImg = $"{Working_Path}\\my_md5string_hex.bin"; if (madeFile) { // Pad file to 4k Boundary var fSize = new FileInfo(tmpCartridge).Length; Debug.Write($"Size of img: {fSize} Bytes (before applying 4k alignment){Environment.NewLine}"); var realBytesUsedDividedBy4k = fSize / 4096; if (fSize % 4096 != 0) { Debug.Write($"DIFF: {fSize % 4096}{Environment.NewLine}"); realBytesUsedDividedBy4k += 1; } var realBytesUsed = realBytesUsedDividedBy4k * 4096; var padding = (int)(realBytesUsed - fSize); var nulPad = BLL.CreateSpecialByteArray(padding); BLL.AppendBinaryData(tmpCartridge, nulPad); fSize = new FileInfo(tmpCartridge).Length; Debug.Write($"Size of img: {fSize} Bytes after applying 4k alignment ({padding}){Environment.NewLine}"); Debug.Write($"*** Offset of Ext4 partition for file saving would be: {fSize + 64}{ Environment.NewLine}"); var strMD5Hexidecimal = BLL.getMD5HashAsString(tmpCartridge); BLL.WriteToFile($"{Working_Path}\\md5sum.wintst", strMD5Hexidecimal); var tstMD5 = BLL.HexToByteArray(strMD5Hexidecimal); BLL.WriteToFile($"{md5binImg}", tstMD5); // Add MD5 Hash BLL.AppendBinaryData(tmpCartridge, tstMD5); Debug.Write($"{Environment.NewLine}*** SQFS Partition MD5 Hash: {strMD5Hexidecimal} -- {BLL.HexToByteArray(strMD5Hexidecimal)} {Environment.NewLine}"); fSize = new FileInfo(tmpCartridge).Length; Debug.Write($"After md5: {fSize}{Environment.NewLine}"); nulPad = BLL.CreateSpecialByteArray(32); // Add 32 Bytes of reserved space BLL.AppendBinaryData(tmpCartridge, nulPad); BLL.WriteToFile($"{Working_Path}\\reservedspace.wintst", nulPad); fSize = new FileInfo(tmpCartridge).Length; Debug.Write($"After Reserved: {fSize}{Environment.NewLine}"); BLL.appendFile(tmpCartridge, md5binImg); fSize = new FileInfo(tmpCartridge).Length; Debug.Write($"After md5 of cart: {fSize}{Environment.NewLine}"); finalUCEImg = $"{BLL._Settings.DefaultFolder_USBRoot}\\{vCart.Genre}\\AddOn_{vCart.Title}.UCE"; File.Copy(tmpCartridge, finalUCEImg, true); //append the cart save img file BLL.appendFile(finalUCEImg, cartSaveImg); fSize = new FileInfo(finalUCEImg).Length; Debug.Write($"Final imgSave: {fSize}\n"); } return(finalUCEImg); }
/// <summary>Builds the uce template folder out with all needed files before generating the UCE File.</summary> /// <param name="title">The title.</param> /// <param name="boxArtPath">The box art path.</param> /// <param name="bezelPath">The bezel path.</param> /// <param name="corePath">The core path.</param> /// <param name="romPath">The rom path.</param> /// <exception cref="Exception">Could not clean UCE_Template directory - is it in use somewhere? /// or</exception> internal static void BuildUCETemplate(VaultRecordCSV_ViewModel vCart) { var boxArtFileName = Path.GetFileName(vCart.CoverArtFile); var bezelFileName = Path.GetFileName(vCart.BezelArtFile); var coreFileName = Path.GetFileName(vCart.EmulatorCoreFile); var romFileName = Path.GetFileName(vCart.ROMFile); try { if (Directory.Exists($"{_CurDir}\\{_TemplateDir}")) { Directory.Delete($"{_CurDir}\\{_TemplateDir}", true); } } catch (Exception ex) { throw new Exception("Could not clean UCE_Template directory - is it in use somewhere?"); } try { Directory.CreateDirectory($"{_CurDir}\\{_TemplateDir}"); Directory.CreateDirectory($"{_CurDir}\\{_TemplateDir}\\boxart"); Directory.CreateDirectory($"{_CurDir}\\{_TemplateDir}\\emu"); Directory.CreateDirectory($"{_CurDir}\\{_TemplateDir}\\roms"); Directory.CreateDirectory($"{_CurDir}\\{_TemplateDir}\\save"); Image tmpBoxArtImg = null; string boxArtFile = vCart.CoverArtFile; if (vCart.UseOverLayFile) { var tmpBoxArt = Image.FromFile(vCart.CoverArtFile); var tmpOverlay = Image.FromFile(GetOverLayFileName(vCart.EmulatorCoreFile)); tmpBoxArtImg = MergeTwoImages(tmpBoxArt, tmpOverlay); boxArtFile = $"{_Settings.DefaultFolder_Working}\\tmpBoxArtImg.png"; } File.Copy(boxArtFile, $"{_CurDir}\\{_TemplateDir}\\title.png"); File.Copy(boxArtFile, $"{_CurDir}\\{_TemplateDir}\\boxart\\boxart.png", true); File.Copy(vCart.EmulatorCoreFile, $"{_CurDir}\\{_TemplateDir}\\emu\\{coreFileName}", true); File.Copy(vCart.ROMFile, $"{_CurDir}\\{_TemplateDir}\\roms\\{romFileName}", true); File.Copy(vCart.BezelArtFile, $"{_CurDir}\\{_TemplateDir}\\boxart\\bezelart.png", true); File.Create($"{_CurDir}\\{_TemplateDir}\\roms\\hiscore.dat").Dispose(); StringBuilder sbCartridge = new StringBuilder(); sbCartridge.AppendFormat("<?xml version=\"1.0\" encoding=\"UTF-8\"?>{0}", _NewLine); sbCartridge.AppendFormat(" <byog_cartridge version=\"1.0\">{0}", _NewLine); sbCartridge.AppendFormat(" <title>{0}</title>{1}", vCart.Title, _NewLine); sbCartridge.AppendFormat(" <desc>Community Add On</desc>{0}", _NewLine); sbCartridge.AppendFormat(" <boxart file=\"boxart\\boxart.png\" ext=\"png\">{0}", _NewLine); sbCartridge.AppendFormat("</byog_cartridge>{0}", _NewLine); File.WriteAllText($"{_CurDir}\\{_TemplateDir}\\cartridge.xml", sbCartridge.ToString()); StringBuilder sb = new StringBuilder(); sb.AppendFormat("#!/bin/sh{0}{0}", _NewLine); sb.AppendFormat("cp ./boxart/bezelart.png /tmp{0}", _NewLine); sb.AppendFormat("echo -e \"[Property]\\nBezelPath=/tmp/bezelart.png\" > /tmp/gameinfo.ini{0}{0}", _NewLine); sb.AppendFormat("set -x{0}", _NewLine); sb.AppendFormat("/emulator/retroplayer \"./emu/{0}\" \"./roms/{1}\"{2}", coreFileName, romFileName, _NewLine); sb.AppendFormat("rm -f /tmp/gameinfo.ini{0}{0}", _NewLine); File.WriteAllText($"{_CurDir}\\{_TemplateDir}\\exec.sh", sb.ToString()); } catch (Exception ex) { throw new Exception(ex.kGetAllMessages()); } }
/// <summary>Explodes the UCE file and places individual files in repsective directories (coverart, bezelart, etc.).</summary> /// <param name="fileName">Name of the file.</param> /// <param name="overwrite">if set to <c>true</c> [overwrite].</param> /// <returns></returns> internal static VaultRecordCSV_ViewModel ExplodeUCE(string fileName, string defaultGenre = "Unknown", bool overwrite = false) { var vCart = new VaultRecordCSV_ViewModel(); string boxArtFileName = ""; string bezelArtFileName = ""; string emulatorFileName = ""; string romFileName = ""; vCart.Genre = defaultGenre; using (FileStream isoStream = File.OpenRead(fileName)) { SquashFileSystemReader readCart = new SquashFileSystemReader(isoStream); if (readCart.FileExists($"cartridge.xml")) { using (Stream entryFs = readCart.OpenFile("cartridge.xml", FileMode.Open)) { byte[] bytes = new byte[entryFs.Length]; entryFs.Position = 0; entryFs.Read(bytes, 0, (int)entryFs.Length); string data = Encoding.ASCII.GetString(bytes); Match m = Regex.Match(data, @"<title>\s*(.+?)\s*</title>"); vCart.Title = m.Success ? m.Groups[1].Value : "No Title Found"; m = Regex.Match(data, @"<desc>\s*(.+?)\s*</desc>"); vCart.Description = m.Success ? m.Groups[1].Value : "No Desc Found"; } if (readCart.FileExists($"exec.sh")) { using (Stream entryFs = readCart.OpenFile("exec.sh", FileMode.Open)) { byte[] bytes = new byte[entryFs.Length]; entryFs.Position = 0; entryFs.Read(bytes, 0, (int)entryFs.Length); string data = Encoding.ASCII.GetString(bytes); //Parse out Bezel FileName var bezelArtData = data.Split(new string[] { " /tmp" }, StringSplitOptions.None)[0]; var indexOfBoxArt = bezelArtData.kIndexOf("./boxart/", System.Globalization.CompareOptions.IgnoreCase); bezelArtFileName = bezelArtData.Substring(indexOfBoxArt + 9).TrimEnd(new char[] { ' ', '\"' }); // /emulator/retroplayer ./emu/fceumm_libretro.so "./roms/Top gun.nes" var emulatorData = data.Split(new string[] { "./roms" }, StringSplitOptions.None); var indexOfEmulator = emulatorData[0].kIndexOf(" ./emu/", System.Globalization.CompareOptions.IgnoreCase); emulatorFileName = emulatorData[0].Substring(indexOfEmulator + 7).TrimEnd(new char[] { ' ', '\"' }); vCart.EmulatorCoreFile = emulatorFileName; var indexOfROM = emulatorData[1].kIndexOf("\n", System.Globalization.CompareOptions.IgnoreCase); romFileName = emulatorData[1].Substring(1, indexOfROM - 1).TrimEnd(new char[] { ' ', '\"' }); vCart.ROMFile = romFileName; } //Cover Art (Boxart) if (readCart.FileExists($"title.png")) { vCart.CoverArtFile = $"{_Settings.DefaultFolder_BoxArt}\\{vCart.Title.Replace(" ", "_")}_cover.png"; if (!File.Exists(vCart.CoverArtFile) || overwrite) { using (Stream bxArtFile = readCart.OpenFile($"title.png", FileMode.Open)) { Image.FromStream(bxArtFile).Save(vCart.CoverArtFile); } } else { throw new Exception($"File {vCart.CoverArtFile} already exists in Vault"); } } //Bezel Art if (readCart.FileExists($"boxart\\{bezelArtFileName}")) { vCart.BezelArtFile = $"{_Settings.DefaultFolder_BezelArt}\\{vCart.Title.Replace(" ", "_")}_bezel.png"; if (!File.Exists(vCart.BezelArtFile) || overwrite) { using (Stream bzArtFile = readCart.OpenFile($"boxart\\{bezelArtFileName}", FileMode.Open)) { Image.FromStream(bzArtFile).Save(vCart.BezelArtFile); } } else { throw new Exception($"File {vCart.BezelArtFile} already exists in Vault"); } } //Emulator if (readCart.FileExists($"emu\\{emulatorFileName}")) { using (Stream emuFile = readCart.OpenFile($"emu\\{emulatorFileName}", FileMode.Open)) { vCart.EmulatorCoreFile = $"{_Settings.DefaultFolder_Cores}\\{emulatorFileName}"; if (!File.Exists(vCart.EmulatorCoreFile)) { using (var fileStream = File.Create(vCart.EmulatorCoreFile)) { emuFile.Seek(0, SeekOrigin.Begin); emuFile.CopyTo(fileStream); } } } } //ROM if (readCart.FileExists($"roms\\{romFileName}")) { using (Stream romFile = readCart.OpenFile($"roms\\{romFileName}", FileMode.Open)) { vCart.ROMFile = $"{_Settings.DefaultFolder_ROMS}\\{romFileName.Replace(" ", "_")}"; if (!File.Exists(vCart.ROMFile) || overwrite) { using (var fileStream = File.Create(vCart.ROMFile)) { romFile.Seek(0, SeekOrigin.Begin); romFile.CopyTo(fileStream); } } else { throw new Exception($"File {vCart.BezelArtFile} already exists in Vault"); } } } } // end if exec.sh exists } // end if cartridge.xml exists } vCart.Index = -1; return(vCart); }