Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        private void AddNewCartToLayout(string UCEFilename, VaultRecordCSV_ViewModel vCart)
        {
            var newPic = GetCartImageForLayout(UCEFilename);

            if (tabCon.Controls.Find(vCart.Genre + "_Container", true).FirstOrDefault() is FlowLayoutPanel fPanel)
            {
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
                }
            }
        }
Esempio n. 7
0
        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());
            }
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
        /// <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());
            }
        }
Esempio n. 11
0
        /// <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);
        }