private void bgmGenAddButton_Click(object sender, EventArgs e)
 {
     // Add a new element
     BgmEntry bgmEntry = new BgmEntry();
     FormBgmEntry newEntry = new FormBgmEntry(bgmEntry);
     bgmFormEntries.Insert(currentBgmIndex + 1, newEntry);
     bgmGenBgmListBox.SetSelected(currentBgmIndex + 1, true);
 }
 private void addBgmDlcExcelDataForEntry(int bgmDlcSlot, FormBgmEntry formEntry, ExcelWorksheet bgmDlcWorksheet, int bgmExcelRow)
 {
     bgmDlcWorksheet.Cells["A" + bgmExcelRow].Value = formEntry.bgmTitle;
     bgmDlcWorksheet.Cells["B" + bgmExcelRow].Value = bgmDlcSlot;
     bgmDlcWorksheet.Cells["C" + bgmExcelRow].Value = formEntry.entry.id.ToString("X4");
     bgmDlcWorksheet.Cells["D" + bgmExcelRow].Value = Hasher.hash(String.Format("bgm/{0}",
         formEntry.entry.internalFileName)) + ".edat";
     bgmDlcWorksheet.Cells["E" + bgmExcelRow].Value = Hasher.hash(
         String.Format("dlc/bgm/dlc_{0}.bin", bgmDlcSlot.ToString("D3"))) + ".edat";
     bgmDlcWorksheet.Cells["F" + bgmExcelRow].Value = Hasher.hash(
         String.Format("text/jp/dlc/bgm_{0}t.bin", bgmDlcSlot.ToString("D3"))) + ".edat";
 }
        private void button10_Click(object sender, EventArgs e)
        {
            // Restart data
            currentBgmIndex = -1;

            // Get Controller
            String controllerFilePath = FormUtils.openGenericFileDialog();

            if (controllerFilePath != null)
            {
                String controllerFileName = System.IO.Path.GetFileName(controllerFilePath);

                // Needed to locate original BGM DLC data
                String controllerFolder = Directory.GetParent(controllerFilePath).FullName;

                try
                {
                    // Getting data from BgmTable
                    BgmTable bgmTable = new BgmTable(controllerFilePath);

                    // Attempt to crack BGM DLC Slot from filename
                    int dlcSlotNumber = 0;
                    ArrayList bgmTitles = new ArrayList();
                    foreach (int i in Enumerable.Range(1, 999))
                    {
                        if (controllerFileName.Contains(Hasher.hash(String.Format("dlc/bgm/dlc_{0}.bin", i.ToString("D3")))))
                        {
                            dlcSlotNumber = i;
                            break;
                        }
                    }
                    if (dlcSlotNumber != 0)
                    {
                        // Try getting strings from text file in DLC slot
                        String textHashedFileName = Hasher.hash(String.Format("text/jp/dlc/bgm_{0}t.bin", dlcSlotNumber.ToString("D3"))) + ".edat";
                        String textHashedFilePath = System.IO.Path.Combine(controllerFolder, textHashedFileName);
                        if (File.Exists(textHashedFilePath))
                        {
                            bgmTitles = MessFileReader.decodeDLCText(@textHashedFilePath);
                        }
                    }

                    // Getting Form BGM entries
                    BindingList<FormBgmEntry> formEntries = new BindingList<FormBgmEntry>();
                    foreach (int i in Enumerable.Range(0, bgmTable.entries.Count))
                    {
                        BgmEntry entry = bgmTable.entries[i];
                        FormBgmEntry formEntry = new FormBgmEntry(entry);
                        String hashedInternalFileName = Hasher.hash(String.Format("bgm/{0}", entry.internalFileName)) + ".edat";
                        String hashedInternalFilePath = System.IO.Path.Combine(controllerFolder, hashedInternalFileName);
                        if (File.Exists(hashedInternalFilePath))
                        {
                            formEntry.filePath = hashedInternalFilePath;
                        }
                        if (bgmTitles.Count > 0 && bgmTitles.Count > i)
                        {
                            formEntry.bgmTitle = (String)bgmTitles[i];
                        }
                        formEntries.Add(formEntry);
                    }

                    // Set DLC slot if any
                    bgmGenDlcSlotComboBox.SelectedIndex = (dlcSlotNumber != -1)
                            ? dlcSlotNumber - 1
                            : 0;

                    // Bind data
                    bindDataAndEnableForm(formEntries);
                }
                catch (Exception ex)
                {
                    Logger.Log("MainFormBgmGenUserControl", ex);
                    MessageBoxEx.Show(this, "There was a problem while processing the BGM table. Make sure that you selected the right file");
                }
            }
        }
        private void bgmGenNewButton_Click(object sender, EventArgs e)
        {
            BindingList<FormBgmEntry> newBgmFormEntries = new BindingList<FormBgmEntry>();

            // Setup slot to 1 by default
            bgmGenDlcSlotComboBox.SelectedIndex = 0;

            // Add new dummy entry and select it
            BgmEntry bgmEntry = new BgmEntry();
            FormBgmEntry newEntry = new FormBgmEntry(bgmEntry);
            newBgmFormEntries.Add(newEntry);
            bindDataAndEnableForm(newBgmFormEntries);
        }
 private string getBgmDlcTextDataForEntry(int bgmDlcSlot, FormBgmEntry formEntry)
 {
     StringBuilder builder = new StringBuilder();
     builder.AppendLine("BGM Title: " + formEntry.bgmTitle);
     builder.AppendLine("BGM Slot: " + bgmDlcSlot);
     builder.AppendLine("BGM ID: " + formEntry.entry.id.ToString("X4"));
     builder.AppendLine("BGM File: " + Hasher.hash(String.Format("bgm/{0}", formEntry.entry.internalFileName)) + ".edat");
     builder.AppendLine("BGM Slot File: " + Hasher.hash(String.Format("dlc/bgm/dlc_{0}.bin", bgmDlcSlot.ToString("D3"))) + ".edat");
     builder.AppendLine("BGM Slot Text File: " + Hasher.hash(String.Format("text/jp/dlc/bgm_{0}t.bin", bgmDlcSlot.ToString("D3"))) + ".edat");
     builder.AppendLine("--------------------------------------");
     return builder.ToString();
 }
        private void reportSelectedFolder(String folder)
        {
            // First check: check if there are files in the folder, and check if the folder exists, just in case
            DirectoryInfo dirInfo = new DirectoryInfo(folder);
            if (!dirInfo.Exists)
            {
                MessageBoxEx.Show(this, "The selected folder does not exist");
                return;
            }
            else if (dirInfo.GetFiles().Length == 0)
            {
                MessageBoxEx.Show(this, "The selected folder hasn't got any files");
                return;
            }

            // Clean TextBox
            reporterDataTextBox.Text = "";

            // Get a worksheet to write excel values
            initExcelWorkbook();
            int characterExcelRow = 2;
            int bgmExcelRow = 2;

            // Character DLC checking
            // Iterate through all possible DLC Object Table names
            try
            {
                foreach (int i in Enumerable.Range(1, 999))
                {
                    String objectTableHashFileName = Hasher.hash("dlc/obj/dlc_" + i.ToString("d3") + "oe.bin") + ".edat";
                    String pathToSearch = System.IO.Path.Combine(folder, objectTableHashFileName);
                    if (File.Exists(pathToSearch))
                    {
                        // We have found an object table inside the folder; scan it
                        ObjectTable hashedFileObjectTable = new ObjectTable(pathToSearch);
                        foreach (ObjectEntry entry in hashedFileObjectTable.entries)
                        {
                            // Print results in TextBox
                            String textData = getCharacterDlcTextDataForEntry(folder, i, objectTableHashFileName, entry);
                            reporterDataTextBox.AppendText(textData);
                            // And add them to Excel sheet
                            addCharacterDlcExcelDataForEntry(folder, i, objectTableHashFileName, entry, characterDlcWorksheet, characterExcelRow);
                            characterDlcWorksheet.Cells[characterDlcWorksheet.Dimension.Address].AutoFitColumns();
                            characterExcelRow++;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                MessageBoxEx.Show(this, "There was a problem with one or some of the files in the selected folder");
                Logger.Log(TAG, e);
                return;
            }

            // BGM DLC Checking
            try
            {
                foreach (int i in Enumerable.Range(1, 999))
                {
                    String bgmTableHashFileName = Hasher.hash(String.Format("dlc/bgm/dlc_{0}.bin", i.ToString("D3"))) + ".edat";
                    String pathToSearch = System.IO.Path.Combine(folder, bgmTableHashFileName);
                    if (File.Exists(pathToSearch))
                    {
                        // We have found a Bgm table inside the folder; try to find the corresponding
                        // strings from text file in DLC slot
                        ArrayList bgmTitles = new ArrayList();
                        String textHashedFileName = Hasher.hash(String.Format("text/jp/dlc/bgm_{0}t.bin", i.ToString("D3"))) + ".edat";
                        String textHashedFilePath = System.IO.Path.Combine(folder, textHashedFileName);
                        if (File.Exists(textHashedFilePath))
                        {
                            bgmTitles = MessFileReader.decodeDLCText(@textHashedFilePath);
                        }

                        BgmTable bgmTable = new BgmTable(pathToSearch);

                        // Getting Form BGM entries
                        List<FormBgmEntry> formEntries = new List<FormBgmEntry>();
                        foreach (int j in Enumerable.Range(0, bgmTable.entries.Count))
                        {
                            BgmEntry entry = bgmTable.entries[j];
                            FormBgmEntry formEntry = new FormBgmEntry(entry);
                            if (bgmTitles.Count > j)
                            {
                                formEntry.bgmTitle = (String)bgmTitles[j];
                            }
                            formEntries.Add(formEntry);
                        }

                        foreach (FormBgmEntry entry in formEntries)
                        {
                            // Print results in TextBox
                            String textData = getBgmDlcTextDataForEntry(i, entry);
                            reporterDataTextBox.AppendText(textData);
                            // And add them to Excel sheet
                            addBgmDlcExcelDataForEntry(i, entry, bgmDlcWorksheet, bgmExcelRow);
                            bgmDlcWorksheet.Cells[bgmDlcWorksheet.Dimension.Address].AutoFitColumns();
                            bgmExcelRow++;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                MessageBoxEx.Show(this, "There was a problem with one or some of the files in the selected folder");
                Logger.Log(TAG, e);
                return;
            }

            // If the reporter text box has any data, then that means that there's data in the folder
            if (!reporterDataTextBox.Text.Trim().Equals(""))
            {
                reporterSaveToExcelButton.Enabled = true;
                reporterFolderLabel.Text = folder;
                MessageBoxEx.Show(this, "DLC read OK!!");
            }
            else
            {
                MessageBoxEx.Show(this, "Couldn't find DLC in this folder");
            }
        }