commit 2210572805c331256701eaece97a3697f736dfe4 Author: TommySalami Date: Thu Jul 31 11:26:53 2025 -0600 Add project files. diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..77f2dc3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,369 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# Extra misc solution files +misc/ + +# Libraries +*.dll diff --git a/AutomatedRedump2IRD-Release/AutomatedRedump2IRD-Release.csproj b/AutomatedRedump2IRD-Release/AutomatedRedump2IRD-Release.csproj new file mode 100644 index 0000000..7c43a0f --- /dev/null +++ b/AutomatedRedump2IRD-Release/AutomatedRedump2IRD-Release.csproj @@ -0,0 +1,95 @@ + + + + + Debug + AnyCPU + {F0DD14E6-BDD1-408B-B826-D45DFDD2F4AB} + + + AnyCPU + bin\Debug\ + + + AnyCPU + bin\Release\ + + + + AutomatedRedump2IRD + 0.0.8 + AutomatedRedump2IRD-Portable + AutomatedRedump2IRD-Alt + AutomatedRedump2IRD-Source + $(OutputPath)Portable\ + $(OutputPath)Alt\ + $(OutputPath)Source\ + $(OutputPath)Releases\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AutomatedRedump2IRD.sln b/AutomatedRedump2IRD.sln new file mode 100644 index 0000000..6275db1 --- /dev/null +++ b/AutomatedRedump2IRD.sln @@ -0,0 +1,45 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33627.172 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutomatedRedump2IRD", "AutomatedRedump2IRD\AutomatedRedump2IRD.csproj", "{4535930B-6F1D-43C5-B661-3CB8A8332F07}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutomatedRedump2IRD-Release", "AutomatedRedump2IRD-Release\AutomatedRedump2IRD-Release.csproj", "{F0DD14E6-BDD1-408B-B826-D45DFDD2F4AB}" + ProjectSection(ProjectDependencies) = postProject + {4535930B-6F1D-43C5-B661-3CB8A8332F07} = {4535930B-6F1D-43C5-B661-3CB8A8332F07} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7703CBE6-6FAB-46BB-B637-ECF2326A6D2E}" + ProjectSection(SolutionItems) = preProject + CHANGELOG.md = CHANGELOG.md + CODE_OF_CONDUCT.md = CODE_OF_CONDUCT.md + CONTRIBUTING.md = CONTRIBUTING.md + LICENSE = LICENSE + README.md = README.md + TODO.md = TODO.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + Description = The Original Automated IRD Builder + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4535930B-6F1D-43C5-B661-3CB8A8332F07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4535930B-6F1D-43C5-B661-3CB8A8332F07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4535930B-6F1D-43C5-B661-3CB8A8332F07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4535930B-6F1D-43C5-B661-3CB8A8332F07}.Release|Any CPU.Build.0 = Release|Any CPU + {F0DD14E6-BDD1-408B-B826-D45DFDD2F4AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0DD14E6-BDD1-408B-B826-D45DFDD2F4AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0DD14E6-BDD1-408B-B826-D45DFDD2F4AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0DD14E6-BDD1-408B-B826-D45DFDD2F4AB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CDE9A6F7-33F3-44CC-A41B-50EA62F8FDF4} + EndGlobalSection +EndGlobal diff --git a/AutomatedRedump2IRD/App.config b/AutomatedRedump2IRD/App.config new file mode 100644 index 0000000..43bf521 --- /dev/null +++ b/AutomatedRedump2IRD/App.config @@ -0,0 +1,29 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AutomatedRedump2IRD/App.ico b/AutomatedRedump2IRD/App.ico new file mode 100644 index 0000000..5a1eaee Binary files /dev/null and b/AutomatedRedump2IRD/App.ico differ diff --git a/AutomatedRedump2IRD/AutomatedRedump2IRD.csproj b/AutomatedRedump2IRD/AutomatedRedump2IRD.csproj new file mode 100644 index 0000000..50c5de9 --- /dev/null +++ b/AutomatedRedump2IRD/AutomatedRedump2IRD.csproj @@ -0,0 +1,158 @@ + + + + + Debug + AnyCPU + {4535930B-6F1D-43C5-B661-3CB8A8332F07} + WinExe + AutomatedRedump2IRD + AutomatedRedump2IRD + v4.0 + 512 + true + true + + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + bin\Debug\AutomatedRedump2IRD.xml + + + AnyCPU + none + true + bin\Release\ + TRACE + prompt + 4 + + + App.ico + + + + False + Resources\Libs\IsoTools.1.34.9\DiscUtils.dll + + + False + Resources\Libs\IsoTools.1.34.9\Ionic.Zip.dll + + + False + Resources\Libs\IsoTools.1.34.9\IsoTools.Common.dll + + + False + Resources\Libs\IsoTools.1.34.9\Microsoft.CompilerServices.AsyncTargetingPack.Net4.dll + + + + + + ..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.118.0\lib\net40\System.Data.SQLite.dll + + + + + False + + + + False + + + + + + + + + Form + + + FrmAutomatedRedump2IRD.cs + + + + + + + + + FrmAutomatedRedump2IRD.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/AutomatedRedump2IRD/DatabaseSQLite.cs b/AutomatedRedump2IRD/DatabaseSQLite.cs new file mode 100644 index 0000000..e614080 --- /dev/null +++ b/AutomatedRedump2IRD/DatabaseSQLite.cs @@ -0,0 +1,231 @@ +using System; +using System.Data; +using System.Data.SQLite; + +namespace AutomatedRedump2IRD +{ + /// + /// Database SQLite class. + /// + class DatabaseSQLite + { + #region Constructors + + /// + /// Constructor + /// + public DatabaseSQLite() + { + // + } + + /// + /// Overloaded Constructor + /// + /// + public DatabaseSQLite(string strPathDatabaseFile) + { + connectionString = @"Data Source=" + strPathDatabaseFile + "; Version=3"; + } + + #endregion + + #region Fields + + /// Connection string + public string connectionString = @"Data Source=dbfile; Version=3"; + + string sqlSelectAllPS3IRDs = @"SELECT * FROM `ps3_irds`"; + string sqlSelectAllPS3ISOs = @"SELECT * FROM `ps3_isos`"; + + #endregion + + #region Update Methods + + /// + /// Update the PS3 IRDs database. + /// + /// + /// + public bool UpdatePS3IRDs(DataTable dt) + { + using (SQLiteConnection con = new SQLiteConnection(connectionString)) + { + con.Open(); + + SQLiteCommand command = new SQLiteCommand(); + command.Connection = con; + command.CommandText = sqlSelectAllPS3IRDs; + + SQLiteDataAdapter daPS3IRDs = new SQLiteDataAdapter(command); + + SQLiteCommandBuilder scbPS3IRDs = new SQLiteCommandBuilder(daPS3IRDs); + + daPS3IRDs.Update(dt); + + con.Close(); + } + + return true; + } + + /// + /// Update the PS3 ISOs database. + /// + /// + /// + public bool UpdatePS3ISOs(DataTable dt) + { + using (SQLiteConnection con = new SQLiteConnection(connectionString)) + { + con.Open(); + + SQLiteCommand command = new SQLiteCommand(); + command.Connection = con; + command.CommandText = sqlSelectAllPS3ISOs; + + SQLiteDataAdapter daPS3ISOs = new SQLiteDataAdapter(command); + + SQLiteCommandBuilder scbPS3ISOs = new SQLiteCommandBuilder(daPS3ISOs); + + daPS3ISOs.Update(dt); + + con.Close(); + } + + return true; + } + + #endregion + + #region Select Methods + + /// + /// Selects all PS3 IRDs and returns a DataTable. + /// + /// + public DataTable SelectAllPS3IRDsDataTable() + { + DataTable dt = new DataTable(); + dt.Locale = System.Globalization.CultureInfo.InvariantCulture; + + using (SQLiteConnection con = new SQLiteConnection(connectionString)) + { + con.Open(); + + SQLiteCommand command = new SQLiteCommand(); + command.Connection = con; + command.CommandText = sqlSelectAllPS3IRDs; + + SQLiteDataAdapter daPS3IRDs = new SQLiteDataAdapter(command); + + SQLiteCommandBuilder scbPS3IRDs = new SQLiteCommandBuilder(daPS3IRDs); + + daPS3IRDs.Fill(dt); + + con.Close(); + } + + return dt; + } + + /// + /// Selects all PS3 ISOs and returns a DataTable. + /// + /// + public DataTable SelectAllPS3ISOsDataTable() + { + DataTable dt = new DataTable(); + dt.Locale = System.Globalization.CultureInfo.InvariantCulture; + + using (SQLiteConnection con = new SQLiteConnection(connectionString)) + { + con.Open(); + + SQLiteCommand command = new SQLiteCommand(); + command.Connection = con; + command.CommandText = sqlSelectAllPS3ISOs; + + SQLiteDataAdapter daPS3ISOs = new SQLiteDataAdapter(command); + + SQLiteCommandBuilder scbPS3ISOs = new SQLiteCommandBuilder(daPS3ISOs); + + daPS3ISOs.Fill(dt); + + con.Close(); + } + + return dt; + } + + #endregion + + #region Insert Methods + + /// + /// Inserts the PS3 ISO into the database. + /// + /// + /// + public bool InsertPS3ISO(string[] arrPS3ISOInfo) + { + using (SQLiteConnection con = new SQLiteConnection(connectionString)) + { + con.Open(); + + SQLiteCommand cmd = new SQLiteCommand(); + cmd.Connection = con; + + cmd.CommandText = @"INSERT INTO `ps3_isos` (disc_redump_id, disc_dkey, disc_did, disc_dpic, ps3_iso_filename, ps3_iso_size, ps3_iso_crc32, ps3_iso_md5, ps3_iso_sha1) VALUES (@disc_redump_id, @disc_dkey, @disc_did, @disc_dpic, @ps3_iso_filename, @ps3_iso_size, @ps3_iso_crc32, @ps3_iso_md5, @ps3_iso_sha1)"; + cmd.Parameters.AddWithValue("@disc_redump_id", arrPS3ISOInfo[0]); + cmd.Parameters.AddWithValue("@disc_dkey", arrPS3ISOInfo[1]); + cmd.Parameters.AddWithValue("@disc_did", arrPS3ISOInfo[2]); + cmd.Parameters.AddWithValue("@disc_dpic", arrPS3ISOInfo[3]); + cmd.Parameters.AddWithValue("@ps3_iso_filename", arrPS3ISOInfo[4]); + cmd.Parameters.AddWithValue("@ps3_iso_size", arrPS3ISOInfo[5]); + cmd.Parameters.AddWithValue("@ps3_iso_crc32", arrPS3ISOInfo[6]); + cmd.Parameters.AddWithValue("@ps3_iso_md5", arrPS3ISOInfo[7]); + cmd.Parameters.AddWithValue("@ps3_iso_sha1", arrPS3ISOInfo[8]); + cmd.ExecuteNonQuery(); + + con.Close(); + } + + return true; + } + + /// + /// Inserts the PS3 IRD into the database. + /// + /// + /// + public int InsertPS3IRD(string[] arrPS3IRDInfo) + { + int intIRDID; + + using (SQLiteConnection con = new SQLiteConnection(connectionString)) + { + con.Open(); + + SQLiteCommand cmd = new SQLiteCommand(); + cmd.Connection = con; + + cmd.CommandText = @"INSERT INTO `ps3_irds` (ps3_iso_md5, ps3_ird_filename, ps3_ird_size, ps3_ird_crc32, ps3_ird_md5, ps3_ird_sha1) VALUES (@ps3_iso_md5, @ps3_ird_filename, @ps3_ird_size, @ps3_ird_crc32, @ps3_ird_md5, @ps3_ird_sha1)"; + cmd.Parameters.AddWithValue("@ps3_iso_md5", arrPS3IRDInfo[0]); + cmd.Parameters.AddWithValue("@ps3_ird_filename", arrPS3IRDInfo[1]); + cmd.Parameters.AddWithValue("@ps3_ird_size", arrPS3IRDInfo[2]); + cmd.Parameters.AddWithValue("@ps3_ird_crc32", arrPS3IRDInfo[3]); + cmd.Parameters.AddWithValue("@ps3_ird_md5", arrPS3IRDInfo[4]); + cmd.Parameters.AddWithValue("@ps3_ird_sha1", arrPS3IRDInfo[5]); + cmd.ExecuteNonQuery(); + intIRDID = (Int32)con.LastInsertRowId; + + con.Close(); + } + + return intIRDID; + } + + #endregion + } +} diff --git a/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.Designer.cs b/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.Designer.cs new file mode 100644 index 0000000..52803e7 --- /dev/null +++ b/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.Designer.cs @@ -0,0 +1,1207 @@ +namespace AutomatedRedump2IRD +{ + partial class FrmAutomatedRedump2IRD + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmAutomatedRedump2IRD)); + this.msMain = new System.Windows.Forms.MenuStrip(); + this.tsmiAutomatedRedump2IRD = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiBuildIRDs = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiSaveLog = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiExit = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiView = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiViewLog = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiViewOptions = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiViewDatabase = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiViewHelp = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiViewLicense = new System.Windows.Forms.ToolStripMenuItem(); + this.tsmiViewToolbar = new System.Windows.Forms.ToolStripMenuItem(); + this.tsMain = new System.Windows.Forms.ToolStrip(); + this.tsbBuildIRDs = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbSaveLog = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbViewLog = new System.Windows.Forms.ToolStripButton(); + this.tsbViewOptions = new System.Windows.Forms.ToolStripButton(); + this.tsbViewDatabase = new System.Windows.Forms.ToolStripButton(); + this.tsbViewHelp = new System.Windows.Forms.ToolStripButton(); + this.tsbViewLicense = new System.Windows.Forms.ToolStripButton(); + this.tsbViewToolbar = new System.Windows.Forms.ToolStripButton(); + this.ssMain = new System.Windows.Forms.StatusStrip(); + this.tsbCancel = new System.Windows.Forms.ToolStripSplitButton(); + this.tsslStatusMessage = new System.Windows.Forms.ToolStripStatusLabel(); + this.tsslSnap = new System.Windows.Forms.ToolStripStatusLabel(); + this.tspbTaskProgress = new System.Windows.Forms.ToolStripProgressBar(); + this.tspbOverallProgress = new System.Windows.Forms.ToolStripProgressBar(); + this.tcMain = new System.Windows.Forms.TabControl(); + this.tabLog = new System.Windows.Forms.TabPage(); + this.rtbLog = new System.Windows.Forms.RichTextBox(); + this.tabOptions = new System.Windows.Forms.TabPage(); + this.tcOptions = new System.Windows.Forms.TabControl(); + this.tabPaths = new System.Windows.Forms.TabPage(); + this.gbPaths = new System.Windows.Forms.GroupBox(); + this.lblPathTempExtractionDir = new System.Windows.Forms.Label(); + this.txtPathTempExtractionDir = new System.Windows.Forms.TextBox(); + this.lblPathRedumpPS3IRDsDir = new System.Windows.Forms.Label(); + this.txtPathRedumpPS3IRDsDir = new System.Windows.Forms.TextBox(); + this.txtPathRedumpPS3ROMsDir = new System.Windows.Forms.TextBox(); + this.lblPathRedumpPS3ROMsDir = new System.Windows.Forms.Label(); + this.lblPathRedumpSQLiteDBFile = new System.Windows.Forms.Label(); + this.txtPathRedumpSQLiteDBFile = new System.Windows.Forms.TextBox(); + this.gbPathsInfo = new System.Windows.Forms.GroupBox(); + this.lblPathsInfo2 = new System.Windows.Forms.Label(); + this.lblPathsInfo1 = new System.Windows.Forms.Label(); + this.tabPreferences = new System.Windows.Forms.TabPage(); + this.gbPreferencesInfo = new System.Windows.Forms.GroupBox(); + this.lblPreferencesInfo1 = new System.Windows.Forms.Label(); + this.gbPreferences = new System.Windows.Forms.GroupBox(); + this.lblOutputName = new System.Windows.Forms.Label(); + this.lblInputName = new System.Windows.Forms.Label(); + this.cbOutputName = new System.Windows.Forms.ComboBox(); + this.cbInputName = new System.Windows.Forms.ComboBox(); + this.chkSkipExistingIRDs = new System.Windows.Forms.CheckBox(); + this.tabAR2I = new System.Windows.Forms.TabPage(); + this.gbAR2IInfo = new System.Windows.Forms.GroupBox(); + this.lblAR2IInfo = new System.Windows.Forms.Label(); + this.gbAR2I = new System.Windows.Forms.GroupBox(); + this.chkSendIRDsToAutomatedRedump2IRDDatabase = new System.Windows.Forms.CheckBox(); + this.txtPassword = new System.Windows.Forms.TextBox(); + this.txtUsername = new System.Windows.Forms.TextBox(); + this.lblPassword = new System.Windows.Forms.Label(); + this.lblUsername = new System.Windows.Forms.Label(); + this.tabDatabase = new System.Windows.Forms.TabPage(); + this.tcDatabase = new System.Windows.Forms.TabControl(); + this.tabPS3ISOs = new System.Windows.Forms.TabPage(); + this.gbPS3ISOs = new System.Windows.Forms.GroupBox(); + this.btnSaveISOsDB = new System.Windows.Forms.Button(); + this.btnLoadISOsDB = new System.Windows.Forms.Button(); + this.dgvPS3ISOs = new System.Windows.Forms.DataGridView(); + this.tabPS3IRDs = new System.Windows.Forms.TabPage(); + this.gbPS3IRDs = new System.Windows.Forms.GroupBox(); + this.btnSaveIRDsDB = new System.Windows.Forms.Button(); + this.btnLoadIRDsDB = new System.Windows.Forms.Button(); + this.dgvPS3IRDs = new System.Windows.Forms.DataGridView(); + this.tabHelp = new System.Windows.Forms.TabPage(); + this.rtbHelp = new System.Windows.Forms.RichTextBox(); + this.tabLicense = new System.Windows.Forms.TabPage(); + this.rtbLicense = new System.Windows.Forms.RichTextBox(); + this.tabHidden = new System.Windows.Forms.TabPage(); + this.bgwBuildIRDs = new System.ComponentModel.BackgroundWorker(); + this.bgwStartupTasks = new System.ComponentModel.BackgroundWorker(); + this.lblPS3IRDsWarning = new System.Windows.Forms.Label(); + this.lblPS3ISOsWarning = new System.Windows.Forms.Label(); + this.msMain.SuspendLayout(); + this.tsMain.SuspendLayout(); + this.ssMain.SuspendLayout(); + this.tcMain.SuspendLayout(); + this.tabLog.SuspendLayout(); + this.tabOptions.SuspendLayout(); + this.tcOptions.SuspendLayout(); + this.tabPaths.SuspendLayout(); + this.gbPaths.SuspendLayout(); + this.gbPathsInfo.SuspendLayout(); + this.tabPreferences.SuspendLayout(); + this.gbPreferencesInfo.SuspendLayout(); + this.gbPreferences.SuspendLayout(); + this.tabAR2I.SuspendLayout(); + this.gbAR2IInfo.SuspendLayout(); + this.gbAR2I.SuspendLayout(); + this.tabDatabase.SuspendLayout(); + this.tcDatabase.SuspendLayout(); + this.tabPS3ISOs.SuspendLayout(); + this.gbPS3ISOs.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPS3ISOs)).BeginInit(); + this.tabPS3IRDs.SuspendLayout(); + this.gbPS3IRDs.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPS3IRDs)).BeginInit(); + this.tabHelp.SuspendLayout(); + this.tabLicense.SuspendLayout(); + this.SuspendLayout(); + // + // msMain + // + this.msMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiAutomatedRedump2IRD, + this.tsmiView}); + this.msMain.Location = new System.Drawing.Point(0, 0); + this.msMain.Name = "msMain"; + this.msMain.Size = new System.Drawing.Size(764, 24); + this.msMain.TabIndex = 0; + this.msMain.Text = "msMain"; + // + // tsmiAutomatedRedump2IRD + // + this.tsmiAutomatedRedump2IRD.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiBuildIRDs, + this.tsmiSaveLog, + this.tsmiExit}); + this.tsmiAutomatedRedump2IRD.Name = "tsmiAutomatedRedump2IRD"; + this.tsmiAutomatedRedump2IRD.Size = new System.Drawing.Size(157, 20); + this.tsmiAutomatedRedump2IRD.Text = "Automated Redump 2 IRD"; + // + // tsmiBuildIRDs + // + this.tsmiBuildIRDs.Enabled = false; + this.tsmiBuildIRDs.Image = global::AutomatedRedump2IRD.Properties.Resources.BuildIRDs_32x32; + this.tsmiBuildIRDs.Name = "tsmiBuildIRDs"; + this.tsmiBuildIRDs.Size = new System.Drawing.Size(127, 22); + this.tsmiBuildIRDs.Text = "Build IRDs"; + this.tsmiBuildIRDs.Click += new System.EventHandler(this.BuildIRDs_Click); + // + // tsmiSaveLog + // + this.tsmiSaveLog.Enabled = false; + this.tsmiSaveLog.Image = global::AutomatedRedump2IRD.Properties.Resources.SaveLog_32x32; + this.tsmiSaveLog.Name = "tsmiSaveLog"; + this.tsmiSaveLog.Size = new System.Drawing.Size(127, 22); + this.tsmiSaveLog.Text = "Save Log"; + this.tsmiSaveLog.Click += new System.EventHandler(this.SaveLog_Click); + // + // tsmiExit + // + this.tsmiExit.Image = global::AutomatedRedump2IRD.Properties.Resources.Exit_32x32; + this.tsmiExit.Name = "tsmiExit"; + this.tsmiExit.Size = new System.Drawing.Size(127, 22); + this.tsmiExit.Text = "Exit"; + this.tsmiExit.Click += new System.EventHandler(this.Exit_Click); + // + // tsmiView + // + this.tsmiView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsmiViewLog, + this.tsmiViewOptions, + this.tsmiViewDatabase, + this.tsmiViewHelp, + this.tsmiViewLicense, + this.tsmiViewToolbar}); + this.tsmiView.Name = "tsmiView"; + this.tsmiView.Size = new System.Drawing.Size(44, 20); + this.tsmiView.Text = "View"; + // + // tsmiViewLog + // + this.tsmiViewLog.Checked = true; + this.tsmiViewLog.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsmiViewLog.Name = "tsmiViewLog"; + this.tsmiViewLog.Size = new System.Drawing.Size(150, 22); + this.tsmiViewLog.Text = "View Log"; + this.tsmiViewLog.Click += new System.EventHandler(this.ViewLog_Click); + // + // tsmiViewOptions + // + this.tsmiViewOptions.Checked = true; + this.tsmiViewOptions.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsmiViewOptions.Name = "tsmiViewOptions"; + this.tsmiViewOptions.Size = new System.Drawing.Size(150, 22); + this.tsmiViewOptions.Text = "View Options"; + this.tsmiViewOptions.Click += new System.EventHandler(this.ViewOptions_Click); + // + // tsmiViewDatabase + // + this.tsmiViewDatabase.Checked = true; + this.tsmiViewDatabase.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsmiViewDatabase.Name = "tsmiViewDatabase"; + this.tsmiViewDatabase.Size = new System.Drawing.Size(150, 22); + this.tsmiViewDatabase.Text = "View Database"; + this.tsmiViewDatabase.Click += new System.EventHandler(this.ViewDatabase_Click); + // + // tsmiViewHelp + // + this.tsmiViewHelp.Name = "tsmiViewHelp"; + this.tsmiViewHelp.Size = new System.Drawing.Size(150, 22); + this.tsmiViewHelp.Text = "View Help"; + this.tsmiViewHelp.Click += new System.EventHandler(this.ViewHelp_Click); + // + // tsmiViewLicense + // + this.tsmiViewLicense.Name = "tsmiViewLicense"; + this.tsmiViewLicense.Size = new System.Drawing.Size(150, 22); + this.tsmiViewLicense.Text = "View License"; + this.tsmiViewLicense.Click += new System.EventHandler(this.ViewLicense_Click); + // + // tsmiViewToolbar + // + this.tsmiViewToolbar.Checked = true; + this.tsmiViewToolbar.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsmiViewToolbar.Name = "tsmiViewToolbar"; + this.tsmiViewToolbar.Size = new System.Drawing.Size(150, 22); + this.tsmiViewToolbar.Text = "View Toolbar"; + this.tsmiViewToolbar.Click += new System.EventHandler(this.ViewToolbar_Click); + // + // tsMain + // + this.tsMain.ImageScalingSize = new System.Drawing.Size(32, 32); + this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbBuildIRDs, + this.toolStripSeparator1, + this.tsbSaveLog, + this.toolStripSeparator2, + this.tsbViewLog, + this.tsbViewOptions, + this.tsbViewDatabase, + this.tsbViewHelp, + this.tsbViewLicense, + this.tsbViewToolbar}); + this.tsMain.Location = new System.Drawing.Point(0, 24); + this.tsMain.Name = "tsMain"; + this.tsMain.Size = new System.Drawing.Size(764, 39); + this.tsMain.TabIndex = 1; + this.tsMain.Text = "tsMain"; + // + // tsbBuildIRDs + // + this.tsbBuildIRDs.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbBuildIRDs.Enabled = false; + this.tsbBuildIRDs.Image = global::AutomatedRedump2IRD.Properties.Resources.BuildIRDs_32x32; + this.tsbBuildIRDs.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbBuildIRDs.Name = "tsbBuildIRDs"; + this.tsbBuildIRDs.Size = new System.Drawing.Size(36, 36); + this.tsbBuildIRDs.Text = "Build IRDs"; + this.tsbBuildIRDs.Click += new System.EventHandler(this.BuildIRDs_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 39); + // + // tsbSaveLog + // + this.tsbSaveLog.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbSaveLog.Enabled = false; + this.tsbSaveLog.Image = global::AutomatedRedump2IRD.Properties.Resources.SaveLog_32x32; + this.tsbSaveLog.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbSaveLog.Name = "tsbSaveLog"; + this.tsbSaveLog.Size = new System.Drawing.Size(36, 36); + this.tsbSaveLog.Text = "Save Log"; + this.tsbSaveLog.Click += new System.EventHandler(this.SaveLog_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 39); + // + // tsbViewLog + // + this.tsbViewLog.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbViewLog.Image = global::AutomatedRedump2IRD.Properties.Resources.Log_32x32; + this.tsbViewLog.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbViewLog.Name = "tsbViewLog"; + this.tsbViewLog.Size = new System.Drawing.Size(36, 36); + this.tsbViewLog.Text = "View Log"; + this.tsbViewLog.Click += new System.EventHandler(this.ViewLog_Click); + // + // tsbViewOptions + // + this.tsbViewOptions.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbViewOptions.Image = global::AutomatedRedump2IRD.Properties.Resources.Options_32x32; + this.tsbViewOptions.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbViewOptions.Name = "tsbViewOptions"; + this.tsbViewOptions.Size = new System.Drawing.Size(36, 36); + this.tsbViewOptions.Text = "View Options"; + this.tsbViewOptions.Click += new System.EventHandler(this.ViewOptions_Click); + // + // tsbViewDatabase + // + this.tsbViewDatabase.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbViewDatabase.Image = global::AutomatedRedump2IRD.Properties.Resources.DB_32x32; + this.tsbViewDatabase.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbViewDatabase.Name = "tsbViewDatabase"; + this.tsbViewDatabase.Size = new System.Drawing.Size(36, 36); + this.tsbViewDatabase.Text = "View Database"; + this.tsbViewDatabase.Click += new System.EventHandler(this.ViewDatabase_Click); + // + // tsbViewHelp + // + this.tsbViewHelp.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbViewHelp.Image = global::AutomatedRedump2IRD.Properties.Resources.Help_32x32; + this.tsbViewHelp.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbViewHelp.Name = "tsbViewHelp"; + this.tsbViewHelp.Size = new System.Drawing.Size(36, 36); + this.tsbViewHelp.Text = "View Help"; + this.tsbViewHelp.Click += new System.EventHandler(this.ViewHelp_Click); + // + // tsbViewLicense + // + this.tsbViewLicense.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbViewLicense.Image = global::AutomatedRedump2IRD.Properties.Resources.License_32x32; + this.tsbViewLicense.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbViewLicense.Name = "tsbViewLicense"; + this.tsbViewLicense.Size = new System.Drawing.Size(36, 36); + this.tsbViewLicense.Text = "View License"; + this.tsbViewLicense.Click += new System.EventHandler(this.ViewLicense_Click); + // + // tsbViewToolbar + // + this.tsbViewToolbar.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbViewToolbar.Image = global::AutomatedRedump2IRD.Properties.Resources.Toolbar_32x32; + this.tsbViewToolbar.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbViewToolbar.Name = "tsbViewToolbar"; + this.tsbViewToolbar.Size = new System.Drawing.Size(36, 36); + this.tsbViewToolbar.Text = "View Toolbar"; + this.tsbViewToolbar.Click += new System.EventHandler(this.ViewToolbar_Click); + // + // ssMain + // + this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbCancel, + this.tsslStatusMessage, + this.tsslSnap, + this.tspbTaskProgress, + this.tspbOverallProgress}); + this.ssMain.Location = new System.Drawing.Point(0, 477); + this.ssMain.Name = "ssMain"; + this.ssMain.Size = new System.Drawing.Size(764, 22); + this.ssMain.TabIndex = 2; + this.ssMain.Text = "ssMain"; + // + // tsbCancel + // + this.tsbCancel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.tsbCancel.DropDownButtonWidth = 0; + this.tsbCancel.Enabled = false; + this.tsbCancel.Image = ((System.Drawing.Image)(resources.GetObject("tsbCancel.Image"))); + this.tsbCancel.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsbCancel.Name = "tsbCancel"; + this.tsbCancel.Size = new System.Drawing.Size(21, 20); + this.tsbCancel.Text = "Cancel"; + this.tsbCancel.Click += new System.EventHandler(this.Cancel_Click); + // + // tsslStatusMessage + // + this.tsslStatusMessage.Name = "tsslStatusMessage"; + this.tsslStatusMessage.Size = new System.Drawing.Size(150, 17); + this.tsslStatusMessage.Text = "Performing Startup Tasks ..."; + // + // tsslSnap + // + this.tsslSnap.Name = "tsslSnap"; + this.tsslSnap.Size = new System.Drawing.Size(174, 17); + this.tsslSnap.Spring = true; + // + // tspbTaskProgress + // + this.tspbTaskProgress.Name = "tspbTaskProgress"; + this.tspbTaskProgress.Size = new System.Drawing.Size(200, 16); + // + // tspbOverallProgress + // + this.tspbOverallProgress.Name = "tspbOverallProgress"; + this.tspbOverallProgress.Size = new System.Drawing.Size(200, 16); + // + // tcMain + // + this.tcMain.Controls.Add(this.tabLog); + this.tcMain.Controls.Add(this.tabOptions); + this.tcMain.Controls.Add(this.tabDatabase); + this.tcMain.Controls.Add(this.tabHelp); + this.tcMain.Controls.Add(this.tabLicense); + this.tcMain.Controls.Add(this.tabHidden); + this.tcMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.tcMain.Location = new System.Drawing.Point(0, 63); + this.tcMain.Name = "tcMain"; + this.tcMain.SelectedIndex = 0; + this.tcMain.Size = new System.Drawing.Size(764, 414); + this.tcMain.TabIndex = 3; + // + // tabLog + // + this.tabLog.Controls.Add(this.rtbLog); + this.tabLog.Location = new System.Drawing.Point(4, 22); + this.tabLog.Name = "tabLog"; + this.tabLog.Padding = new System.Windows.Forms.Padding(3); + this.tabLog.Size = new System.Drawing.Size(756, 388); + this.tabLog.TabIndex = 0; + this.tabLog.Text = " Log "; + this.tabLog.UseVisualStyleBackColor = true; + // + // rtbLog + // + this.rtbLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.rtbLog.Location = new System.Drawing.Point(6, 6); + this.rtbLog.Name = "rtbLog"; + this.rtbLog.ReadOnly = true; + this.rtbLog.Size = new System.Drawing.Size(744, 376); + this.rtbLog.TabIndex = 0; + this.rtbLog.Text = ""; + // + // tabOptions + // + this.tabOptions.Controls.Add(this.tcOptions); + this.tabOptions.Location = new System.Drawing.Point(4, 22); + this.tabOptions.Name = "tabOptions"; + this.tabOptions.Padding = new System.Windows.Forms.Padding(3); + this.tabOptions.Size = new System.Drawing.Size(756, 388); + this.tabOptions.TabIndex = 1; + this.tabOptions.Text = " Options "; + this.tabOptions.UseVisualStyleBackColor = true; + // + // tcOptions + // + this.tcOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tcOptions.Controls.Add(this.tabPaths); + this.tcOptions.Controls.Add(this.tabPreferences); + this.tcOptions.Controls.Add(this.tabAR2I); + this.tcOptions.Location = new System.Drawing.Point(6, 6); + this.tcOptions.Name = "tcOptions"; + this.tcOptions.SelectedIndex = 0; + this.tcOptions.Size = new System.Drawing.Size(744, 376); + this.tcOptions.TabIndex = 3; + // + // tabPaths + // + this.tabPaths.Controls.Add(this.gbPaths); + this.tabPaths.Controls.Add(this.gbPathsInfo); + this.tabPaths.Location = new System.Drawing.Point(4, 22); + this.tabPaths.Name = "tabPaths"; + this.tabPaths.Padding = new System.Windows.Forms.Padding(3); + this.tabPaths.Size = new System.Drawing.Size(736, 350); + this.tabPaths.TabIndex = 0; + this.tabPaths.Text = " Paths "; + this.tabPaths.UseVisualStyleBackColor = true; + // + // gbPaths + // + this.gbPaths.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbPaths.Controls.Add(this.lblPathTempExtractionDir); + this.gbPaths.Controls.Add(this.txtPathTempExtractionDir); + this.gbPaths.Controls.Add(this.lblPathRedumpPS3IRDsDir); + this.gbPaths.Controls.Add(this.txtPathRedumpPS3IRDsDir); + this.gbPaths.Controls.Add(this.txtPathRedumpPS3ROMsDir); + this.gbPaths.Controls.Add(this.lblPathRedumpPS3ROMsDir); + this.gbPaths.Controls.Add(this.lblPathRedumpSQLiteDBFile); + this.gbPaths.Controls.Add(this.txtPathRedumpSQLiteDBFile); + this.gbPaths.Location = new System.Drawing.Point(6, 6); + this.gbPaths.Name = "gbPaths"; + this.gbPaths.Size = new System.Drawing.Size(724, 123); + this.gbPaths.TabIndex = 0; + this.gbPaths.TabStop = false; + this.gbPaths.Text = "Paths"; + // + // lblPathTempExtractionDir + // + this.lblPathTempExtractionDir.AutoSize = true; + this.lblPathTempExtractionDir.Location = new System.Drawing.Point(6, 100); + this.lblPathTempExtractionDir.Name = "lblPathTempExtractionDir"; + this.lblPathTempExtractionDir.Size = new System.Drawing.Size(106, 13); + this.lblPathTempExtractionDir.TabIndex = 7; + this.lblPathTempExtractionDir.Text = "Temp Extraction Dir: "; + // + // txtPathTempExtractionDir + // + this.txtPathTempExtractionDir.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPathTempExtractionDir.Enabled = false; + this.txtPathTempExtractionDir.Location = new System.Drawing.Point(137, 97); + this.txtPathTempExtractionDir.Name = "txtPathTempExtractionDir"; + this.txtPathTempExtractionDir.ReadOnly = true; + this.txtPathTempExtractionDir.Size = new System.Drawing.Size(581, 20); + this.txtPathTempExtractionDir.TabIndex = 3; + this.txtPathTempExtractionDir.Click += new System.EventHandler(this.PathTempExtractionDir_Click); + // + // lblPathRedumpPS3IRDsDir + // + this.lblPathRedumpPS3IRDsDir.AutoSize = true; + this.lblPathRedumpPS3IRDsDir.Location = new System.Drawing.Point(6, 74); + this.lblPathRedumpPS3IRDsDir.Name = "lblPathRedumpPS3IRDsDir"; + this.lblPathRedumpPS3IRDsDir.Size = new System.Drawing.Size(119, 13); + this.lblPathRedumpPS3IRDsDir.TabIndex = 6; + this.lblPathRedumpPS3IRDsDir.Text = "Redump PS3 IRDs Dir: "; + // + // txtPathRedumpPS3IRDsDir + // + this.txtPathRedumpPS3IRDsDir.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPathRedumpPS3IRDsDir.Enabled = false; + this.txtPathRedumpPS3IRDsDir.Location = new System.Drawing.Point(137, 71); + this.txtPathRedumpPS3IRDsDir.Name = "txtPathRedumpPS3IRDsDir"; + this.txtPathRedumpPS3IRDsDir.ReadOnly = true; + this.txtPathRedumpPS3IRDsDir.Size = new System.Drawing.Size(581, 20); + this.txtPathRedumpPS3IRDsDir.TabIndex = 2; + this.txtPathRedumpPS3IRDsDir.Click += new System.EventHandler(this.PathRedumpPS3IRDsDir_Click); + // + // txtPathRedumpPS3ROMsDir + // + this.txtPathRedumpPS3ROMsDir.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPathRedumpPS3ROMsDir.Enabled = false; + this.txtPathRedumpPS3ROMsDir.Location = new System.Drawing.Point(137, 45); + this.txtPathRedumpPS3ROMsDir.Name = "txtPathRedumpPS3ROMsDir"; + this.txtPathRedumpPS3ROMsDir.ReadOnly = true; + this.txtPathRedumpPS3ROMsDir.Size = new System.Drawing.Size(581, 20); + this.txtPathRedumpPS3ROMsDir.TabIndex = 1; + this.txtPathRedumpPS3ROMsDir.Click += new System.EventHandler(this.PathRedumpPS3ROMsDir_Click); + // + // lblPathRedumpPS3ROMsDir + // + this.lblPathRedumpPS3ROMsDir.AutoSize = true; + this.lblPathRedumpPS3ROMsDir.Location = new System.Drawing.Point(6, 48); + this.lblPathRedumpPS3ROMsDir.Name = "lblPathRedumpPS3ROMsDir"; + this.lblPathRedumpPS3ROMsDir.Size = new System.Drawing.Size(125, 13); + this.lblPathRedumpPS3ROMsDir.TabIndex = 5; + this.lblPathRedumpPS3ROMsDir.Text = "Redump PS3 ROMs Dir: "; + // + // lblPathRedumpSQLiteDBFile + // + this.lblPathRedumpSQLiteDBFile.AutoSize = true; + this.lblPathRedumpSQLiteDBFile.Location = new System.Drawing.Point(6, 22); + this.lblPathRedumpSQLiteDBFile.Name = "lblPathRedumpSQLiteDBFile"; + this.lblPathRedumpSQLiteDBFile.Size = new System.Drawing.Size(125, 13); + this.lblPathRedumpSQLiteDBFile.TabIndex = 4; + this.lblPathRedumpSQLiteDBFile.Text = "Redump SQLite DB File: "; + // + // txtPathRedumpSQLiteDBFile + // + this.txtPathRedumpSQLiteDBFile.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPathRedumpSQLiteDBFile.Enabled = false; + this.txtPathRedumpSQLiteDBFile.Location = new System.Drawing.Point(137, 19); + this.txtPathRedumpSQLiteDBFile.Name = "txtPathRedumpSQLiteDBFile"; + this.txtPathRedumpSQLiteDBFile.ReadOnly = true; + this.txtPathRedumpSQLiteDBFile.Size = new System.Drawing.Size(581, 20); + this.txtPathRedumpSQLiteDBFile.TabIndex = 0; + this.txtPathRedumpSQLiteDBFile.Click += new System.EventHandler(this.PathRedumpSQLiteDBFile_Click); + // + // gbPathsInfo + // + this.gbPathsInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbPathsInfo.Controls.Add(this.lblPathsInfo2); + this.gbPathsInfo.Controls.Add(this.lblPathsInfo1); + this.gbPathsInfo.Location = new System.Drawing.Point(6, 135); + this.gbPathsInfo.Name = "gbPathsInfo"; + this.gbPathsInfo.Size = new System.Drawing.Size(724, 64); + this.gbPathsInfo.TabIndex = 1; + this.gbPathsInfo.TabStop = false; + this.gbPathsInfo.Text = "Paths Info"; + // + // lblPathsInfo2 + // + this.lblPathsInfo2.AutoSize = true; + this.lblPathsInfo2.Location = new System.Drawing.Point(6, 41); + this.lblPathsInfo2.Name = "lblPathsInfo2"; + this.lblPathsInfo2.Size = new System.Drawing.Size(367, 13); + this.lblPathsInfo2.TabIndex = 1; + this.lblPathsInfo2.Text = "ROMs in the Redump PS3 ROMs Dir will not be moved, modified, or deleted"; + // + // lblPathsInfo1 + // + this.lblPathsInfo1.AutoSize = true; + this.lblPathsInfo1.Location = new System.Drawing.Point(6, 22); + this.lblPathsInfo1.Name = "lblPathsInfo1"; + this.lblPathsInfo1.Size = new System.Drawing.Size(482, 13); + this.lblPathsInfo1.TabIndex = 0; + this.lblPathsInfo1.Text = "The Temp Extraction Path must have at least enough freee space for the largest IS" + + "O being extracted"; + // + // tabPreferences + // + this.tabPreferences.Controls.Add(this.gbPreferencesInfo); + this.tabPreferences.Controls.Add(this.gbPreferences); + this.tabPreferences.Location = new System.Drawing.Point(4, 22); + this.tabPreferences.Name = "tabPreferences"; + this.tabPreferences.Padding = new System.Windows.Forms.Padding(3); + this.tabPreferences.Size = new System.Drawing.Size(736, 350); + this.tabPreferences.TabIndex = 1; + this.tabPreferences.Text = " Preferences "; + this.tabPreferences.UseVisualStyleBackColor = true; + // + // gbPreferencesInfo + // + this.gbPreferencesInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbPreferencesInfo.Controls.Add(this.lblPreferencesInfo1); + this.gbPreferencesInfo.Location = new System.Drawing.Point(6, 108); + this.gbPreferencesInfo.Name = "gbPreferencesInfo"; + this.gbPreferencesInfo.Size = new System.Drawing.Size(724, 38); + this.gbPreferencesInfo.TabIndex = 1; + this.gbPreferencesInfo.TabStop = false; + this.gbPreferencesInfo.Text = "Preferences Info"; + // + // lblPreferencesInfo1 + // + this.lblPreferencesInfo1.AutoSize = true; + this.lblPreferencesInfo1.Location = new System.Drawing.Point(6, 19); + this.lblPreferencesInfo1.Name = "lblPreferencesInfo1"; + this.lblPreferencesInfo1.Size = new System.Drawing.Size(326, 13); + this.lblPreferencesInfo1.TabIndex = 0; + this.lblPreferencesInfo1.Text = "Skip existing IRDs to continue collecting IRDs in the IRDs directory."; + // + // gbPreferences + // + this.gbPreferences.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbPreferences.Controls.Add(this.lblOutputName); + this.gbPreferences.Controls.Add(this.lblInputName); + this.gbPreferences.Controls.Add(this.cbOutputName); + this.gbPreferences.Controls.Add(this.cbInputName); + this.gbPreferences.Controls.Add(this.chkSkipExistingIRDs); + this.gbPreferences.Location = new System.Drawing.Point(6, 6); + this.gbPreferences.Name = "gbPreferences"; + this.gbPreferences.Size = new System.Drawing.Size(724, 96); + this.gbPreferences.TabIndex = 0; + this.gbPreferences.TabStop = false; + this.gbPreferences.Text = "Preferences"; + // + // lblOutputName + // + this.lblOutputName.AutoSize = true; + this.lblOutputName.Location = new System.Drawing.Point(6, 72); + this.lblOutputName.Name = "lblOutputName"; + this.lblOutputName.Size = new System.Drawing.Size(147, 13); + this.lblOutputName.TabIndex = 4; + this.lblOutputName.Text = "Output Filenames (IRD Files): "; + // + // lblInputName + // + this.lblInputName.AutoSize = true; + this.lblInputName.Location = new System.Drawing.Point(6, 45); + this.lblInputName.Name = "lblInputName"; + this.lblInputName.Size = new System.Drawing.Size(177, 13); + this.lblInputName.TabIndex = 3; + this.lblInputName.Text = "Input Filenames (ISO and Zip Files): "; + // + // cbOutputName + // + this.cbOutputName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cbOutputName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbOutputName.FormattingEnabled = true; + this.cbOutputName.Items.AddRange(new object[] { + "MD5"}); + this.cbOutputName.Location = new System.Drawing.Point(189, 69); + this.cbOutputName.Name = "cbOutputName"; + this.cbOutputName.Size = new System.Drawing.Size(529, 21); + this.cbOutputName.TabIndex = 2; + // + // cbInputName + // + this.cbInputName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cbInputName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbInputName.FormattingEnabled = true; + this.cbInputName.Items.AddRange(new object[] { + "Title"}); + this.cbInputName.Location = new System.Drawing.Point(189, 42); + this.cbInputName.Name = "cbInputName"; + this.cbInputName.Size = new System.Drawing.Size(529, 21); + this.cbInputName.TabIndex = 1; + // + // chkSkipExistingIRDs + // + this.chkSkipExistingIRDs.AutoSize = true; + this.chkSkipExistingIRDs.Checked = true; + this.chkSkipExistingIRDs.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkSkipExistingIRDs.Enabled = false; + this.chkSkipExistingIRDs.Location = new System.Drawing.Point(6, 19); + this.chkSkipExistingIRDs.Name = "chkSkipExistingIRDs"; + this.chkSkipExistingIRDs.Size = new System.Drawing.Size(113, 17); + this.chkSkipExistingIRDs.TabIndex = 0; + this.chkSkipExistingIRDs.Text = "Skip Existing IRDs"; + this.chkSkipExistingIRDs.UseVisualStyleBackColor = true; + // + // tabAR2I + // + this.tabAR2I.Controls.Add(this.gbAR2IInfo); + this.tabAR2I.Controls.Add(this.gbAR2I); + this.tabAR2I.Location = new System.Drawing.Point(4, 22); + this.tabAR2I.Name = "tabAR2I"; + this.tabAR2I.Padding = new System.Windows.Forms.Padding(3); + this.tabAR2I.Size = new System.Drawing.Size(736, 350); + this.tabAR2I.TabIndex = 2; + this.tabAR2I.Text = " AR2I "; + this.tabAR2I.UseVisualStyleBackColor = true; + // + // gbAR2IInfo + // + this.gbAR2IInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbAR2IInfo.Controls.Add(this.lblAR2IInfo); + this.gbAR2IInfo.Location = new System.Drawing.Point(6, 104); + this.gbAR2IInfo.Name = "gbAR2IInfo"; + this.gbAR2IInfo.Size = new System.Drawing.Size(724, 32); + this.gbAR2IInfo.TabIndex = 1; + this.gbAR2IInfo.TabStop = false; + this.gbAR2IInfo.Text = "Automated Redump 2 IRD Database Info"; + // + // lblAR2IInfo + // + this.lblAR2IInfo.AutoSize = true; + this.lblAR2IInfo.Location = new System.Drawing.Point(6, 16); + this.lblAR2IInfo.Name = "lblAR2IInfo"; + this.lblAR2IInfo.Size = new System.Drawing.Size(173, 13); + this.lblAR2IInfo.TabIndex = 0; + this.lblAR2IInfo.Text = "Passwords are stored unencrypted."; + // + // gbAR2I + // + this.gbAR2I.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbAR2I.Controls.Add(this.chkSendIRDsToAutomatedRedump2IRDDatabase); + this.gbAR2I.Controls.Add(this.txtPassword); + this.gbAR2I.Controls.Add(this.txtUsername); + this.gbAR2I.Controls.Add(this.lblPassword); + this.gbAR2I.Controls.Add(this.lblUsername); + this.gbAR2I.Location = new System.Drawing.Point(6, 6); + this.gbAR2I.Name = "gbAR2I"; + this.gbAR2I.Size = new System.Drawing.Size(724, 92); + this.gbAR2I.TabIndex = 0; + this.gbAR2I.TabStop = false; + this.gbAR2I.Text = "Automated Redump 2 IRD Database"; + // + // chkSendIRDsToAutomatedRedump2IRDDatabase + // + this.chkSendIRDsToAutomatedRedump2IRDDatabase.AutoSize = true; + this.chkSendIRDsToAutomatedRedump2IRDDatabase.Enabled = false; + this.chkSendIRDsToAutomatedRedump2IRDDatabase.Location = new System.Drawing.Point(6, 19); + this.chkSendIRDsToAutomatedRedump2IRDDatabase.Name = "chkSendIRDsToAutomatedRedump2IRDDatabase"; + this.chkSendIRDsToAutomatedRedump2IRDDatabase.Size = new System.Drawing.Size(336, 17); + this.chkSendIRDsToAutomatedRedump2IRDDatabase.TabIndex = 0; + this.chkSendIRDsToAutomatedRedump2IRDDatabase.Text = "Send IRDs To Automated Redump 2 IRD Database After Building"; + this.chkSendIRDsToAutomatedRedump2IRDDatabase.UseVisualStyleBackColor = true; + // + // txtPassword + // + this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPassword.Enabled = false; + this.txtPassword.Location = new System.Drawing.Point(73, 68); + this.txtPassword.Name = "txtPassword"; + this.txtPassword.Size = new System.Drawing.Size(645, 20); + this.txtPassword.TabIndex = 2; + // + // txtUsername + // + this.txtUsername.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtUsername.Enabled = false; + this.txtUsername.Location = new System.Drawing.Point(73, 42); + this.txtUsername.Name = "txtUsername"; + this.txtUsername.Size = new System.Drawing.Size(645, 20); + this.txtUsername.TabIndex = 1; + // + // lblPassword + // + this.lblPassword.AutoSize = true; + this.lblPassword.Location = new System.Drawing.Point(6, 71); + this.lblPassword.Name = "lblPassword"; + this.lblPassword.Size = new System.Drawing.Size(59, 13); + this.lblPassword.TabIndex = 4; + this.lblPassword.Text = "Password: "; + // + // lblUsername + // + this.lblUsername.AutoSize = true; + this.lblUsername.Location = new System.Drawing.Point(6, 45); + this.lblUsername.Name = "lblUsername"; + this.lblUsername.Size = new System.Drawing.Size(61, 13); + this.lblUsername.TabIndex = 3; + this.lblUsername.Text = "Username: "; + // + // tabDatabase + // + this.tabDatabase.Controls.Add(this.tcDatabase); + this.tabDatabase.Location = new System.Drawing.Point(4, 22); + this.tabDatabase.Name = "tabDatabase"; + this.tabDatabase.Padding = new System.Windows.Forms.Padding(3); + this.tabDatabase.Size = new System.Drawing.Size(756, 388); + this.tabDatabase.TabIndex = 4; + this.tabDatabase.Text = " Database "; + this.tabDatabase.UseVisualStyleBackColor = true; + // + // tcDatabase + // + this.tcDatabase.Controls.Add(this.tabPS3ISOs); + this.tcDatabase.Controls.Add(this.tabPS3IRDs); + this.tcDatabase.Dock = System.Windows.Forms.DockStyle.Fill; + this.tcDatabase.Location = new System.Drawing.Point(3, 3); + this.tcDatabase.Name = "tcDatabase"; + this.tcDatabase.SelectedIndex = 0; + this.tcDatabase.Size = new System.Drawing.Size(750, 382); + this.tcDatabase.TabIndex = 3; + // + // tabPS3ISOs + // + this.tabPS3ISOs.Controls.Add(this.gbPS3ISOs); + this.tabPS3ISOs.Location = new System.Drawing.Point(4, 22); + this.tabPS3ISOs.Name = "tabPS3ISOs"; + this.tabPS3ISOs.Padding = new System.Windows.Forms.Padding(3); + this.tabPS3ISOs.Size = new System.Drawing.Size(742, 356); + this.tabPS3ISOs.TabIndex = 0; + this.tabPS3ISOs.Text = " PS3 ISOs "; + this.tabPS3ISOs.UseVisualStyleBackColor = true; + // + // gbPS3ISOs + // + this.gbPS3ISOs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbPS3ISOs.Controls.Add(this.lblPS3ISOsWarning); + this.gbPS3ISOs.Controls.Add(this.btnSaveISOsDB); + this.gbPS3ISOs.Controls.Add(this.btnLoadISOsDB); + this.gbPS3ISOs.Controls.Add(this.dgvPS3ISOs); + this.gbPS3ISOs.Location = new System.Drawing.Point(6, 6); + this.gbPS3ISOs.Name = "gbPS3ISOs"; + this.gbPS3ISOs.Size = new System.Drawing.Size(730, 344); + this.gbPS3ISOs.TabIndex = 2; + this.gbPS3ISOs.TabStop = false; + this.gbPS3ISOs.Text = "PS3 ISOs"; + // + // btnSaveISOsDB + // + this.btnSaveISOsDB.Enabled = false; + this.btnSaveISOsDB.Location = new System.Drawing.Point(112, 19); + this.btnSaveISOsDB.Name = "btnSaveISOsDB"; + this.btnSaveISOsDB.Size = new System.Drawing.Size(100, 23); + this.btnSaveISOsDB.TabIndex = 2; + this.btnSaveISOsDB.Text = "Save ISOs DB"; + this.btnSaveISOsDB.UseVisualStyleBackColor = true; + this.btnSaveISOsDB.Click += new System.EventHandler(this.SaveISOsDB_Click); + // + // btnLoadISOsDB + // + this.btnLoadISOsDB.Enabled = false; + this.btnLoadISOsDB.Location = new System.Drawing.Point(6, 19); + this.btnLoadISOsDB.Name = "btnLoadISOsDB"; + this.btnLoadISOsDB.Size = new System.Drawing.Size(100, 23); + this.btnLoadISOsDB.TabIndex = 1; + this.btnLoadISOsDB.Text = "Load ISOs DB"; + this.btnLoadISOsDB.UseVisualStyleBackColor = true; + this.btnLoadISOsDB.Click += new System.EventHandler(this.LoadISOsDB_Click); + // + // dgvPS3ISOs + // + this.dgvPS3ISOs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dgvPS3ISOs.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvPS3ISOs.Location = new System.Drawing.Point(6, 48); + this.dgvPS3ISOs.Name = "dgvPS3ISOs"; + this.dgvPS3ISOs.Size = new System.Drawing.Size(718, 290); + this.dgvPS3ISOs.TabIndex = 0; + // + // tabPS3IRDs + // + this.tabPS3IRDs.Controls.Add(this.gbPS3IRDs); + this.tabPS3IRDs.Location = new System.Drawing.Point(4, 22); + this.tabPS3IRDs.Name = "tabPS3IRDs"; + this.tabPS3IRDs.Padding = new System.Windows.Forms.Padding(3); + this.tabPS3IRDs.Size = new System.Drawing.Size(742, 356); + this.tabPS3IRDs.TabIndex = 1; + this.tabPS3IRDs.Text = " PS3 IRDs "; + this.tabPS3IRDs.UseVisualStyleBackColor = true; + // + // gbPS3IRDs + // + this.gbPS3IRDs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbPS3IRDs.Controls.Add(this.lblPS3IRDsWarning); + this.gbPS3IRDs.Controls.Add(this.btnSaveIRDsDB); + this.gbPS3IRDs.Controls.Add(this.btnLoadIRDsDB); + this.gbPS3IRDs.Controls.Add(this.dgvPS3IRDs); + this.gbPS3IRDs.Location = new System.Drawing.Point(6, 6); + this.gbPS3IRDs.Name = "gbPS3IRDs"; + this.gbPS3IRDs.Size = new System.Drawing.Size(730, 344); + this.gbPS3IRDs.TabIndex = 0; + this.gbPS3IRDs.TabStop = false; + this.gbPS3IRDs.Text = "PS3 IRDs"; + // + // btnSaveIRDsDB + // + this.btnSaveIRDsDB.Enabled = false; + this.btnSaveIRDsDB.Location = new System.Drawing.Point(112, 19); + this.btnSaveIRDsDB.Name = "btnSaveIRDsDB"; + this.btnSaveIRDsDB.Size = new System.Drawing.Size(100, 23); + this.btnSaveIRDsDB.TabIndex = 2; + this.btnSaveIRDsDB.Text = "Save IRDs DB"; + this.btnSaveIRDsDB.UseVisualStyleBackColor = true; + this.btnSaveIRDsDB.Click += new System.EventHandler(this.SaveIRDsDB_Click); + // + // btnLoadIRDsDB + // + this.btnLoadIRDsDB.Enabled = false; + this.btnLoadIRDsDB.Location = new System.Drawing.Point(6, 19); + this.btnLoadIRDsDB.Name = "btnLoadIRDsDB"; + this.btnLoadIRDsDB.Size = new System.Drawing.Size(100, 23); + this.btnLoadIRDsDB.TabIndex = 1; + this.btnLoadIRDsDB.Text = "Load IRDs DB"; + this.btnLoadIRDsDB.UseVisualStyleBackColor = true; + this.btnLoadIRDsDB.Click += new System.EventHandler(this.LoadIRDsDB_Click); + // + // dgvPS3IRDs + // + this.dgvPS3IRDs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dgvPS3IRDs.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvPS3IRDs.Location = new System.Drawing.Point(6, 48); + this.dgvPS3IRDs.Name = "dgvPS3IRDs"; + this.dgvPS3IRDs.Size = new System.Drawing.Size(718, 290); + this.dgvPS3IRDs.TabIndex = 0; + // + // tabHelp + // + this.tabHelp.Controls.Add(this.rtbHelp); + this.tabHelp.Location = new System.Drawing.Point(4, 22); + this.tabHelp.Name = "tabHelp"; + this.tabHelp.Padding = new System.Windows.Forms.Padding(3); + this.tabHelp.Size = new System.Drawing.Size(756, 388); + this.tabHelp.TabIndex = 2; + this.tabHelp.Text = " Help "; + this.tabHelp.UseVisualStyleBackColor = true; + // + // rtbHelp + // + this.rtbHelp.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.rtbHelp.Location = new System.Drawing.Point(6, 6); + this.rtbHelp.Name = "rtbHelp"; + this.rtbHelp.ReadOnly = true; + this.rtbHelp.Size = new System.Drawing.Size(744, 376); + this.rtbHelp.TabIndex = 0; + this.rtbHelp.Text = ""; + // + // tabLicense + // + this.tabLicense.Controls.Add(this.rtbLicense); + this.tabLicense.Location = new System.Drawing.Point(4, 22); + this.tabLicense.Name = "tabLicense"; + this.tabLicense.Padding = new System.Windows.Forms.Padding(3); + this.tabLicense.Size = new System.Drawing.Size(756, 388); + this.tabLicense.TabIndex = 3; + this.tabLicense.Text = " License "; + this.tabLicense.UseVisualStyleBackColor = true; + // + // rtbLicense + // + this.rtbLicense.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.rtbLicense.Location = new System.Drawing.Point(6, 6); + this.rtbLicense.Name = "rtbLicense"; + this.rtbLicense.ReadOnly = true; + this.rtbLicense.Size = new System.Drawing.Size(744, 376); + this.rtbLicense.TabIndex = 0; + this.rtbLicense.Text = ""; + // + // tabHidden + // + this.tabHidden.Location = new System.Drawing.Point(4, 22); + this.tabHidden.Name = "tabHidden"; + this.tabHidden.Padding = new System.Windows.Forms.Padding(3); + this.tabHidden.Size = new System.Drawing.Size(756, 388); + this.tabHidden.TabIndex = 5; + this.tabHidden.Text = " Hidden "; + this.tabHidden.UseVisualStyleBackColor = true; + // + // bgwBuildIRDs + // + this.bgwBuildIRDs.WorkerReportsProgress = true; + this.bgwBuildIRDs.WorkerSupportsCancellation = true; + this.bgwBuildIRDs.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BuildIRDs_DoWork); + this.bgwBuildIRDs.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.BuildIRDs_ProgressChanged); + this.bgwBuildIRDs.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.BuildIRDs_RunWorkerCompleted); + // + // bgwStartupTasks + // + this.bgwStartupTasks.DoWork += new System.ComponentModel.DoWorkEventHandler(this.StartupTasks_DoWork); + this.bgwStartupTasks.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.StartupTasks_RunWorkerCompleted); + // + // lblPS3IRDsWarning + // + this.lblPS3IRDsWarning.AutoSize = true; + this.lblPS3IRDsWarning.Location = new System.Drawing.Point(218, 24); + this.lblPS3IRDsWarning.Name = "lblPS3IRDsWarning"; + this.lblPS3IRDsWarning.Size = new System.Drawing.Size(316, 13); + this.lblPS3IRDsWarning.TabIndex = 3; + this.lblPS3IRDsWarning.Text = "WARNING: Incorrectly edited data WILL cause this app to crash!"; + // + // lblPS3ISOsWarning + // + this.lblPS3ISOsWarning.AutoSize = true; + this.lblPS3ISOsWarning.Location = new System.Drawing.Point(218, 24); + this.lblPS3ISOsWarning.Name = "lblPS3ISOsWarning"; + this.lblPS3ISOsWarning.Size = new System.Drawing.Size(316, 13); + this.lblPS3ISOsWarning.TabIndex = 3; + this.lblPS3ISOsWarning.Text = "WARNING: Incorrectly edited data WILL cause this app to crash!"; + // + // FrmAutomatedRedump2IRD + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(764, 499); + this.Controls.Add(this.tcMain); + this.Controls.Add(this.ssMain); + this.Controls.Add(this.tsMain); + this.Controls.Add(this.msMain); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.msMain; + this.Name = "FrmAutomatedRedump2IRD"; + this.Text = "Automated Redump 2 IRD"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_FormClosing); + this.Load += new System.EventHandler(this.Form_Load); + this.Shown += new System.EventHandler(this.Form_Shown); + this.msMain.ResumeLayout(false); + this.msMain.PerformLayout(); + this.tsMain.ResumeLayout(false); + this.tsMain.PerformLayout(); + this.ssMain.ResumeLayout(false); + this.ssMain.PerformLayout(); + this.tcMain.ResumeLayout(false); + this.tabLog.ResumeLayout(false); + this.tabOptions.ResumeLayout(false); + this.tcOptions.ResumeLayout(false); + this.tabPaths.ResumeLayout(false); + this.gbPaths.ResumeLayout(false); + this.gbPaths.PerformLayout(); + this.gbPathsInfo.ResumeLayout(false); + this.gbPathsInfo.PerformLayout(); + this.tabPreferences.ResumeLayout(false); + this.gbPreferencesInfo.ResumeLayout(false); + this.gbPreferencesInfo.PerformLayout(); + this.gbPreferences.ResumeLayout(false); + this.gbPreferences.PerformLayout(); + this.tabAR2I.ResumeLayout(false); + this.gbAR2IInfo.ResumeLayout(false); + this.gbAR2IInfo.PerformLayout(); + this.gbAR2I.ResumeLayout(false); + this.gbAR2I.PerformLayout(); + this.tabDatabase.ResumeLayout(false); + this.tcDatabase.ResumeLayout(false); + this.tabPS3ISOs.ResumeLayout(false); + this.gbPS3ISOs.ResumeLayout(false); + this.gbPS3ISOs.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPS3ISOs)).EndInit(); + this.tabPS3IRDs.ResumeLayout(false); + this.gbPS3IRDs.ResumeLayout(false); + this.gbPS3IRDs.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dgvPS3IRDs)).EndInit(); + this.tabHelp.ResumeLayout(false); + this.tabLicense.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip msMain; + private System.Windows.Forms.ToolStrip tsMain; + private System.Windows.Forms.StatusStrip ssMain; + private System.Windows.Forms.ToolStripMenuItem tsmiAutomatedRedump2IRD; + private System.Windows.Forms.ToolStripMenuItem tsmiBuildIRDs; + private System.Windows.Forms.ToolStripMenuItem tsmiExit; + private System.Windows.Forms.ToolStripButton tsbBuildIRDs; + private System.Windows.Forms.ToolStripSplitButton tsbCancel; + private System.Windows.Forms.ToolStripStatusLabel tsslStatusMessage; + private System.Windows.Forms.TabControl tcMain; + private System.Windows.Forms.TabPage tabLog; + private System.Windows.Forms.TabPage tabOptions; + private System.Windows.Forms.ToolStripStatusLabel tsslSnap; + private System.Windows.Forms.RichTextBox rtbLog; + private System.Windows.Forms.GroupBox gbPreferences; + private System.Windows.Forms.GroupBox gbPaths; + private System.Windows.Forms.Label lblPathRedumpSQLiteDBFile; + private System.Windows.Forms.TextBox txtPathRedumpSQLiteDBFile; + private System.Windows.Forms.TextBox txtPathRedumpPS3ROMsDir; + private System.Windows.Forms.Label lblPathRedumpPS3ROMsDir; + private System.Windows.Forms.Label lblPathRedumpPS3IRDsDir; + private System.Windows.Forms.TextBox txtPathRedumpPS3IRDsDir; + private System.Windows.Forms.Label lblPathTempExtractionDir; + private System.Windows.Forms.TextBox txtPathTempExtractionDir; + private System.Windows.Forms.ToolStripProgressBar tspbTaskProgress; + private System.Windows.Forms.ToolStripProgressBar tspbOverallProgress; + private System.ComponentModel.BackgroundWorker bgwBuildIRDs; + private System.Windows.Forms.GroupBox gbPathsInfo; + private System.Windows.Forms.Label lblPathsInfo1; + private System.Windows.Forms.CheckBox chkSkipExistingIRDs; + private System.Windows.Forms.Label lblPathsInfo2; + private System.Windows.Forms.TabPage tabHelp; + private System.Windows.Forms.TabPage tabLicense; + private System.Windows.Forms.RichTextBox rtbHelp; + private System.Windows.Forms.RichTextBox rtbLicense; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton tsbSaveLog; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripButton tsbViewLog; + private System.Windows.Forms.ToolStripButton tsbViewOptions; + private System.Windows.Forms.ToolStripButton tsbViewHelp; + private System.Windows.Forms.ToolStripButton tsbViewLicense; + private System.Windows.Forms.ToolStripMenuItem tsmiSaveLog; + private System.Windows.Forms.ToolStripMenuItem tsmiView; + private System.Windows.Forms.ToolStripMenuItem tsmiViewLog; + private System.Windows.Forms.ToolStripMenuItem tsmiViewOptions; + private System.Windows.Forms.ToolStripMenuItem tsmiViewHelp; + private System.Windows.Forms.ToolStripMenuItem tsmiViewLicense; + private System.Windows.Forms.ToolStripMenuItem tsmiViewToolbar; + private System.Windows.Forms.ToolStripButton tsbViewToolbar; + private System.Windows.Forms.TabControl tcOptions; + private System.Windows.Forms.TabPage tabPaths; + private System.Windows.Forms.TabPage tabPreferences; + private System.ComponentModel.BackgroundWorker bgwStartupTasks; + private System.Windows.Forms.Label lblOutputName; + private System.Windows.Forms.Label lblInputName; + private System.Windows.Forms.ComboBox cbOutputName; + private System.Windows.Forms.ComboBox cbInputName; + private System.Windows.Forms.TabPage tabAR2I; + private System.Windows.Forms.GroupBox gbAR2I; + private System.Windows.Forms.CheckBox chkSendIRDsToAutomatedRedump2IRDDatabase; + private System.Windows.Forms.TextBox txtPassword; + private System.Windows.Forms.TextBox txtUsername; + private System.Windows.Forms.Label lblPassword; + private System.Windows.Forms.Label lblUsername; + private System.Windows.Forms.GroupBox gbAR2IInfo; + private System.Windows.Forms.Label lblAR2IInfo; + private System.Windows.Forms.GroupBox gbPreferencesInfo; + private System.Windows.Forms.Label lblPreferencesInfo1; + private System.Windows.Forms.TabPage tabDatabase; + private System.Windows.Forms.GroupBox gbPS3ISOs; + private System.Windows.Forms.DataGridView dgvPS3ISOs; + private System.Windows.Forms.ToolStripButton tsbViewDatabase; + private System.Windows.Forms.ToolStripMenuItem tsmiViewDatabase; + private System.Windows.Forms.TabPage tabHidden; + private System.Windows.Forms.TabControl tcDatabase; + private System.Windows.Forms.TabPage tabPS3ISOs; + private System.Windows.Forms.TabPage tabPS3IRDs; + private System.Windows.Forms.GroupBox gbPS3IRDs; + private System.Windows.Forms.DataGridView dgvPS3IRDs; + private System.Windows.Forms.Button btnSaveIRDsDB; + private System.Windows.Forms.Button btnLoadIRDsDB; + private System.Windows.Forms.Button btnSaveISOsDB; + private System.Windows.Forms.Button btnLoadISOsDB; + private System.Windows.Forms.Label lblPS3ISOsWarning; + private System.Windows.Forms.Label lblPS3IRDsWarning; + } +} + diff --git a/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.cs b/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.cs new file mode 100644 index 0000000..01fffd2 --- /dev/null +++ b/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.cs @@ -0,0 +1,1377 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using IsoTools; +using Ionic.Zip; + +namespace AutomatedRedump2IRD +{ + /// + /// AutomatedRedump2IRD Class + /// + public partial class FrmAutomatedRedump2IRD : Form, INotifyPropertyChanged + { + #region Constructors + + /// + /// Constructor + /// + public FrmAutomatedRedump2IRD() + { + // Initialize the form. + InitializeComponent(); + + // Print the version. + PrintVersion(); + + // Add data bindings. + chkSendIRDsToAutomatedRedump2IRDDatabase.DataBindings.Add("Checked", this, "SendIRDsToTheUltimateIRDDatabase"); + chkSkipExistingIRDs.DataBindings.Add("Checked", this, "SkipExistingIRDs"); + txtPathRedumpSQLiteDBFile.DataBindings.Add("Text", this, "PathRedumpSQLiteDBFile"); + txtPathRedumpPS3IRDsDir.DataBindings.Add("Text", this, "PathRedumpPS3IRDsDir"); + txtPathRedumpPS3ROMsDir.DataBindings.Add("Text", this, "PathRedumpPS3ROMsDir"); + txtPathTempExtractionDir.DataBindings.Add("Text", this, "PathTempExtractionDir"); + txtUsername.DataBindings.Add("Text", this, "Username"); + txtPassword.DataBindings.Add("Text", this, "Password"); + cbInputName.DataBindings.Add("SelectedItem", this, "InputName"); + cbOutputName.DataBindings.Add("SelectedItem", this, "OutputName"); + + // Hide the Help and License and Hidden tabs. + tcMain.TabPages.Remove(tabHelp); + tcMain.TabPages.Remove(tabLicense); + tcMain.TabPages.Remove(tabHidden); + + // Set the title. + UpdateTitle(); + + // Load the GUI RichTextBoxes from resources. + rtbHelp.Text = Properties.Resources.AutomatedRedump2IRD_HELP; + rtbLicense.Text = Properties.Resources.AutomatedRedump2IRD_LICENSE; + } + + #endregion + + #region INotifyPropertyChanged + + /// PropertyChanged Event + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// NotifyPropertyChanged + /// + /// + private void NotifyPropertyChanged(String pName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(pName)); + } + + #endregion + + #region Members + + CancellationTokenSource cancellation_ = null; + private static readonly byte[] D1_IV = { 105, 71, 71, 114, 175, 111, 218, 179, 66, 116, 58, 239, 170, 24, 98, 135 }; + private static readonly byte[] D1_KEY = { 56, 11, 207, 11, 83, 69, 91, 60, 120, 23, 171, 79, 163, 186, 144, 237 }; + + private readonly string AppName = "Automated Redump 2 IRD"; + private readonly string AppVersion = "0.0.8"; + private readonly string AppCopyright = "Copyright (c) 2016-2025 Automated Redump 2 IRD - All Rights Reserved"; + + private string _PathRedumpSQLiteDBFile = Path.Combine(Application.StartupPath, "DB", "ps3.redump.sqlite.db"); + private string _PathRedumpPS3ROMsDir = Path.Combine(Application.StartupPath, "ROMs"); + private string _PathRedumpPS3IRDsDir = Path.Combine(Application.StartupPath, "IRDs"); + private string _PathTempExtractionDir = Path.Combine(Application.StartupPath, "Tmp"); + private bool _SkipExistingIRDs = true; + private string _InputName = "Title"; + private string _OutputName = "MD5"; + private bool _SendIRDsToTheUltimateIRDDatabase = false; + private string _Username = ""; + private string _Password = ""; + private BindingSource bsPS3ISOs = new BindingSource(); + private BindingSource bsPS3IRDs = new BindingSource(); + + #endregion + + #region Getters/Setters Public Accessors + + /// PathRedumpSQLiteDBFile + public string PathRedumpSQLiteDBFile + { + get { return _PathRedumpSQLiteDBFile; } + set { _PathRedumpSQLiteDBFile = value; NotifyPropertyChanged("PathRedumpSQLiteDBFile"); } + } + /// PathRedumpPS3ROMsDir + public string PathRedumpPS3ROMsDir + { + get { return _PathRedumpPS3ROMsDir; } + set { _PathRedumpPS3ROMsDir = value; NotifyPropertyChanged("PathRedumpPS3ROMsDir"); } + } + /// PathRedumpPS3IRDsDir + public string PathRedumpPS3IRDsDir + { + get { return _PathRedumpPS3IRDsDir; } + set { _PathRedumpPS3IRDsDir = value; NotifyPropertyChanged("PathRedumpPS3IRDsDir"); } + } + /// PathTempExtractionDir + public string PathTempExtractionDir + { + get { return _PathTempExtractionDir; } + set { _PathTempExtractionDir = value; NotifyPropertyChanged("PathTempExtractionDir"); } + } + /// SkipExistingIRDs + public bool SkipExistingIRDs + { + get { return _SkipExistingIRDs; } + set { _SkipExistingIRDs = value; NotifyPropertyChanged("SkipExistingIRDs"); } + } + /// InputName + public string InputName + { + get { return _InputName; } + set { _InputName = value; NotifyPropertyChanged("InputName"); } + } + /// OutputName + public string OutputName + { + get { return _OutputName; } + set { _OutputName = value; NotifyPropertyChanged("OutputName"); } + } + /// SendIRDsToTheUltimateIRDDatabase + public bool SendIRDsToTheUltimateIRDDatabase + { + get { return _SendIRDsToTheUltimateIRDDatabase; } + set { _SendIRDsToTheUltimateIRDDatabase = value; NotifyPropertyChanged("SendIRDsToTheUltimateIRDDatabase"); } + } + /// Username + public string Username + { + get { return _Username; } + set { _Username = value; NotifyPropertyChanged("Username"); } + } + /// Password + public string Password + { + get { return _Password; } + set { _Password = value; NotifyPropertyChanged("Password"); } + } + + #endregion + + #region GUI Methods + + /// + /// Sets the application title. + /// + /// + public void UpdateTitle(string strTitle = "") + { + // Update the application title. + this.Text = AppName + " v" + AppVersion + strTitle; + } + + /// + /// Updates the progress status message label. + /// + /// + private void UpdateStatusMessageLabel(string strMsg) + { + // Update the progress status message label. + tsslStatusMessage.Text = strMsg; + } + + /// + /// Resets the progress bars. + /// + private void ResetProgressBars() + { + tspbTaskProgress.ProgressBar.Value = 0; + tspbOverallProgress.ProgressBar.Value = 0; + } + + /// + /// Change the state of the forum, basicially "this.Enable = enable;". + /// + /// + public void ChangeState(bool boolIsEnabled) + { + txtPathRedumpSQLiteDBFile.Enabled = boolIsEnabled; + txtPathRedumpPS3ROMsDir.Enabled = boolIsEnabled; + txtPathRedumpPS3IRDsDir.Enabled = boolIsEnabled; + txtPathTempExtractionDir.Enabled = boolIsEnabled; + txtUsername.Enabled = boolIsEnabled; + txtPassword.Enabled = boolIsEnabled; + chkSkipExistingIRDs.Enabled = boolIsEnabled; + chkSendIRDsToAutomatedRedump2IRDDatabase.Enabled = boolIsEnabled; + tsbBuildIRDs.Enabled = boolIsEnabled; + tsbSaveLog.Enabled = boolIsEnabled; + tsmiBuildIRDs.Enabled = boolIsEnabled; + tsmiSaveLog.Enabled = boolIsEnabled; + tsbCancel.Enabled = !boolIsEnabled; + btnLoadIRDsDB.Enabled = boolIsEnabled; + btnSaveIRDsDB.Enabled = boolIsEnabled; + btnLoadISOsDB.Enabled = boolIsEnabled; + btnSaveISOsDB.Enabled = boolIsEnabled; + dgvPS3IRDs.Enabled = boolIsEnabled; + dgvPS3ISOs.Enabled = boolIsEnabled; + } + + /// + /// Enables all buttons. + /// + private void EnableAllButtons() + { + txtPathRedumpSQLiteDBFile.Enabled = true; + txtPathRedumpPS3ROMsDir.Enabled = true; + txtPathRedumpPS3IRDsDir.Enabled = true; + txtPathTempExtractionDir.Enabled = true; + txtUsername.Enabled = true; + txtPassword.Enabled = true; + chkSkipExistingIRDs.Enabled = true; + chkSendIRDsToAutomatedRedump2IRDDatabase.Enabled = true; + tsbBuildIRDs.Enabled = true; + tsbSaveLog.Enabled = true; + tsmiBuildIRDs.Enabled = true; + tsmiSaveLog.Enabled = true; + btnLoadIRDsDB.Enabled = true; + btnSaveIRDsDB.Enabled = true; + btnLoadISOsDB.Enabled = true; + btnSaveISOsDB.Enabled = true; + dgvPS3IRDs.Enabled = true; + dgvPS3ISOs.Enabled = true; + } + + /// + /// Disables all buttons. + /// + private void DisableAllButtons() + { + txtPathRedumpSQLiteDBFile.Enabled = false; + txtPathRedumpPS3ROMsDir.Enabled = false; + txtPathRedumpPS3IRDsDir.Enabled = false; + txtPathTempExtractionDir.Enabled = false; + txtUsername.Enabled = false; + txtPassword.Enabled = false; + chkSkipExistingIRDs.Enabled = false; + chkSendIRDsToAutomatedRedump2IRDDatabase.Enabled = false; + tsbBuildIRDs.Enabled = false; + tsbSaveLog.Enabled = false; + tsmiBuildIRDs.Enabled = false; + tsmiSaveLog.Enabled = false; + btnLoadIRDsDB.Enabled = false; + btnSaveIRDsDB.Enabled = false; + btnLoadISOsDB.Enabled = false; + btnSaveISOsDB.Enabled = false; + dgvPS3IRDs.Enabled = false; + dgvPS3ISOs.Enabled = false; + } + + /// + /// Decrypts a Disc ID. + /// + /// + /// + private string DecryptDiscID(string strDiscIDEnc) + { + // Declarations + string strDiscIDDec = String.Empty; + string d2_enc_hexstring = strDiscIDEnc.Replace("-", "").Replace(" ", "").Replace(",", ""); + + // Check the Disc ID. + if (String.IsNullOrEmpty(d2_enc_hexstring) || d2_enc_hexstring.Length != 32 || !IsHex(d2_enc_hexstring)) + { + strDiscIDDec = String.Empty; + return strDiscIDDec; + } + + // Convert the inputed D2 (encrypted) data to a byte[], and decrypt it. + byte[] d2_enc = HexStringToByteArray(d2_enc_hexstring); + if (d2_enc.Length > 0) + { + int? nullable = null; + ODD.AESDecrypt(Utilities.D2_KEY, Utilities.D2_IV, d2_enc, 0, d2_enc.Length, d2_enc, 0, nullable); + if (d2_enc.Length > 0) + { + strDiscIDDec = ByteArrayToHexString(d2_enc); + return strDiscIDDec; + } + } + + return strDiscIDDec; + } + + /// + /// Encrypts a Disc ID. + /// + /// + /// + private string EncryptDiscID(string strDiscIDDec) + { + // Declarations + string strDiscIDEnc = String.Empty; + // Note: D1 redump has some special logic, the XXXXXXXX gets converted to ?? 00000001 ??. + string d2_dec_hexstring = strDiscIDDec.Replace("-", "").Replace(" ", "").Replace(",", "").Replace("XXXXXXXX", "00000001"); + + // Check the Disc ID. + if (String.IsNullOrEmpty(d2_dec_hexstring) || d2_dec_hexstring.Length != 32 || !IsHex(d2_dec_hexstring)) + { + strDiscIDEnc = String.Empty; + return strDiscIDEnc; + } + + // Convert the inputed D2 (decrypted) data to a byte[], and encrypt it. + byte[] d2_dec = HexStringToByteArray(d2_dec_hexstring); + if (d2_dec.Length > 0) + { + int? nullable = null; + ODD.AESEncrypt(Utilities.D2_KEY, Utilities.D2_IV, d2_dec, 0, d2_dec.Length, d2_dec, 0, nullable); + if (d2_dec.Length > 0) + { + strDiscIDEnc = ByteArrayToHexString(d2_dec); + return strDiscIDEnc; + } + } + + return strDiscIDEnc; + } + + /// + /// Decrypts a Disc Key. + /// + /// + /// + private string DecryptDiscKey(string strDiscKeyEnc) + { + // Declarations + string strDiscKeyDec = String.Empty; + string d1_enc_hexstring = strDiscKeyEnc.Replace("-", "").Replace(" ", "").Replace(",", ""); + + // Check the Disc ID. + if (String.IsNullOrEmpty(d1_enc_hexstring) || d1_enc_hexstring.Length != 32 || !IsHex(d1_enc_hexstring)) + { + strDiscKeyDec = String.Empty; + return strDiscKeyDec; + } + + // Convert the inputed D1 (encrypted) data to a byte[], and decrypt it. + byte[] d1_enc = HexStringToByteArray(d1_enc_hexstring); + if (d1_enc.Length > 0) + { + int? nullable = null; + ODD.AESDecrypt(D1_KEY, D1_IV, d1_enc, 0, d1_enc.Length, d1_enc, 0, nullable); + if (d1_enc.Length > 0) + { + strDiscKeyDec = ByteArrayToHexString(d1_enc); + return strDiscKeyDec; + } + } + + return strDiscKeyDec; + } + + /// + /// Encrypts a Disc Key. + /// + /// + /// + private string EncryptDiscKey(string strDiscKeyDec) + { + // Declarations + string strDiscKeyEnc = String.Empty; + string d1_dec_hexstring = strDiscKeyDec.Replace("-", "").Replace(" ", "").Replace(",", ""); + + // Check the DIsc Key. + if (String.IsNullOrEmpty(d1_dec_hexstring) || d1_dec_hexstring.Length != 32 || !IsHex(d1_dec_hexstring)) + { + strDiscKeyEnc = String.Empty; + return strDiscKeyEnc; + } + + // Convert the inputed D1 (decrypted) data to a byte[], and encrypt it. + byte[] d1_dec = HexStringToByteArray(d1_dec_hexstring); + if (d1_dec.Length > 0) + { + int? nullable = null; + ODD.AESEncrypt(D1_KEY, D1_IV, d1_dec, 0, d1_dec.Length, d1_dec, 0, nullable); + if (d1_dec.Length > 0) + { + strDiscKeyEnc = ByteArrayToHexString(d1_dec); + return strDiscKeyEnc; + } + } + + return strDiscKeyEnc; + } + + /// + /// Converts valid byte array to valid hex. + /// + /// + /// + private static string ByteArrayToHexString(byte[] bytes) + { + char[] c = new char[bytes.Length * 2]; + for (int i = 0, b; i < bytes.Length; i++) + { + b = bytes[i] >> 4; + c[i * 2] = (char)(55 + b + (((b - 10) >> 31) & -7)); + b = bytes[i] & 0xF; + c[i * 2 + 1] = (char)(55 + b + (((b - 10) >> 31) & -7)); + } + return new string(c); + } + + /// + /// Converts valid hex to valid byte array. + /// + /// + /// + private static byte[] HexStringToByteArray(string Hex) + { + byte[] Bytes = new byte[Hex.Length / 2]; + int[] HexValue = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; + + for (int x = 0, i = 0; i < Hex.Length; i += 2, x += 1) + Bytes[x] = (byte)(HexValue[Char.ToUpper(Hex[i + 0]) - '0'] << 4 | HexValue[Char.ToUpper(Hex[i + 1]) - '0']); + return Bytes; + } + + /// + /// Checks to see if the input string is all valid hex. + /// + /// + /// + private bool IsHex(IEnumerable chars) + { + bool isHex; + foreach (var c in chars) + { + isHex = ((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F')); + if (!isHex) + return false; + } + return true; + } + + #endregion + + #region DB Methods + + /// + /// Load the data from the database. + /// + /// + /// + private void LoadIRDsDB_Click(object sender, EventArgs e) + { + GetPS3IRDsDataTable(); + } + + /// + /// Save the data from to database. + /// + /// + /// + private void SaveIRDsDB_Click(object sender, EventArgs e) + { + SetPS3IRDsDataTable(); + } + + /// + /// Load the data from the database. + /// + /// + /// + private void LoadISOsDB_Click(object sender, EventArgs e) + { + GetPS3ISOsDataTable(); + } + + /// + /// Save the data from to database. + /// + /// + /// + private void SaveISOsDB_Click(object sender, EventArgs e) + { + SetPS3ISOsDataTable(); + } + + /// + /// Get the data from the database. + /// + private void GetPS3IRDsDataTable() + { + try + { + if (File.Exists(PathRedumpSQLiteDBFile)) + { + DatabaseSQLite database = new DatabaseSQLite(PathRedumpSQLiteDBFile); + + // Bind the PS3 IRDs data connector to the PS3 IRDs table. + bsPS3IRDs.DataSource = database.SelectAllPS3IRDsDataTable(); + + MessageBox.Show("Database was loaded."); + } + else + { + MessageBox.Show("Database does not exist."); + } + } + catch (Exception ex) + { + MessageBox.Show("Getting data from database failed with error: " + ex.Message); + } + } + + /// + /// Get the data from the database. + /// + private void GetPS3ISOsDataTable() + { + try + { + if (File.Exists(PathRedumpSQLiteDBFile)) + { + DatabaseSQLite database = new DatabaseSQLite(PathRedumpSQLiteDBFile); + + // Bind the PS3 ISOs data connector to the PS3 ISOs table. + bsPS3ISOs.DataSource = database.SelectAllPS3ISOsDataTable(); + + MessageBox.Show("Database was loaded."); + } + else + { + MessageBox.Show("Database does not exist."); + } + } + catch (Exception ex) + { + MessageBox.Show("Getting data from database failed with error: " + ex.Message); + } + } + + /// + /// Update the database. + /// + private void SetPS3IRDsDataTable() + { + try + { + if (bsPS3IRDs != null && bsPS3IRDs.DataSource != null) + { + DatabaseSQLite database = new DatabaseSQLite(PathRedumpSQLiteDBFile); + database.UpdatePS3IRDs((DataTable)bsPS3IRDs.DataSource); + + MessageBox.Show("The database was updated."); + } + else + { + MessageBox.Show("There is nothing to update."); + } + } + catch (Exception ex) + { + MessageBox.Show("Updating the database failed with error: " + ex.Message + " \nStackTrace: " + ex.StackTrace); + } + } + + /// + /// Update the database. + /// + private void SetPS3ISOsDataTable() + { + try + { + if (bsPS3ISOs != null && bsPS3ISOs.DataSource != null) + { + DatabaseSQLite database = new DatabaseSQLite(PathRedumpSQLiteDBFile); + database.UpdatePS3ISOs((DataTable)bsPS3ISOs.DataSource); + + MessageBox.Show("The database was updated."); + } + else + { + MessageBox.Show("There is nothing to update."); + } + } + catch (Exception ex) + { + MessageBox.Show("Updating the database failed with error: " + ex.Message + " \nStackTrace: " + ex.StackTrace); + } + } + + #endregion + + #region Form Events + + /// + /// Form Load Event. + /// + /// + /// + private void Form_Load(object sender, EventArgs e) + { + // Bind the DataGridView controls to the BindingSource + // components and load the data from the database. + dgvPS3IRDs.DataSource = bsPS3IRDs; + dgvPS3ISOs.DataSource = bsPS3ISOs; + // GetPS3IRDsDataTable(); + // GetPS3ISOsDataTable(); + + // Resize the DataGridView columns to fit the newly loaded data. + // dgvPS3IRDs.AutoResizeColumns(); + // dgvPS3ISOs.AutoResizeColumns(); + } + + /// + /// Form Shown Event. + /// + /// + /// + private void Form_Shown(object sender, EventArgs e) + { + // Perform the application startup tasks. + bgwStartupTasks.RunWorkerAsync(); + } + + /// + /// Form FormClosing Event. + /// + /// + /// + private void Form_FormClosing(object sender, FormClosingEventArgs e) + { + // Check if the builder is running. + if (bgwBuildIRDs.IsBusy && bgwBuildIRDs.WorkerSupportsCancellation) + { + // Display a messageBox. + if (MessageBox.Show("The builder is currently running. Are you sure you want to exit now? Exiting now may cause corrupt or incomplete files!", "Confirm Exit", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) + { + e.Cancel = true; + } + } + } + + #endregion + + #region GUI Click Events + + /// + /// Adds the PS3 IRD Info to the database. + /// + /// + /// + private void AddInfo_Click(object sender, EventArgs e) + { + + } + + /// + /// Deletes the PS3 IRD Info from the database. + /// + /// + /// + private void DeleteInfo_Click(object sender, EventArgs e) + { + + } + + /// + /// Saves the log to a text file. + /// + /// + /// + private void SaveLog_Click(object sender, EventArgs e) + { + try + { + // Disable all buttons. + DisableAllButtons(); + + // Create and initialize a SaveFileDialog for the log file. + SaveFileDialog sfdLog = new SaveFileDialog + { + DefaultExt = "*.txt", + Filter = "TXT Files|*.txt", + FileName = "AutomatedRedump2IRD-Log-" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt", + Title = "Please enter a path to the log file: ", + InitialDirectory = Path.Combine(Application.StartupPath, "Logs") + }; + + // Determine if the user selected a log filename. + if (sfdLog.ShowDialog() == DialogResult.OK && sfdLog.FileName.Length > 0) + { + // Get the log file info and directory name. + FileInfo fi = new FileInfo(sfdLog.FileName); + + // Create log file directory if it doesn't exist. + if (Directory.Exists(fi.DirectoryName) == false) Directory.CreateDirectory(fi.DirectoryName); + + // Save the contents of the log to a text file. + File.WriteAllLines(sfdLog.FileName, rtbLog.Lines); + + // Print to screen + OutputLine("Info: Log file saved (" + sfdLog.FileName + ")"); + OutputLine("Info: Ready"); + OutputLine(""); + } + + // Dispose of the SaveFileDialog. + sfdLog.Dispose(); + + // Enable all buttons. + EnableAllButtons(); + } + catch (Exception ex) + { + // Print to screen + OutputLine("Error: Saving log file failed"); + OutputLine("Error: " + ex.Message); + OutputLine("Info: Ready"); + OutputLine(""); + } + } + + private void PathRedumpSQLiteDBFile_Click(object sender, EventArgs e) + { + // Disable all buttons. + DisableAllButtons(); + + // Create and initialize an OpenFileDialog for the options file. + OpenFileDialog ofdOptions = new OpenFileDialog + { + DefaultExt = "*.db", + Filter = "DB Files|*.db", + Title = "Please enter a path to the Redump SQLite DB file: ", + InitialDirectory = Path.Combine(Application.StartupPath, "DB") + }; + + // Determine if the user selected a file name from the OpenFileDialog. + if (ofdOptions.ShowDialog() == DialogResult.OK && ofdOptions.FileName.Length > 0) + { + // Set the file path. + PathRedumpSQLiteDBFile = ofdOptions.FileName; + } + + // Enable all buttons. + EnableAllButtons(); + } + + private void PathRedumpPS3ROMsDir_Click(object sender, EventArgs e) + { + // Disable all buttons. + DisableAllButtons(); + + // Create and initialize a FolderBrowserDialog for the directory. + FolderBrowserDialog fbdSelectDir = new FolderBrowserDialog + { + ShowNewFolderButton = true, + Description = "Please enter a path to the Redump PS3 ROMs directory: ", + SelectedPath = PathRedumpPS3ROMsDir + }; + + // Determine if the user selected OK from the FolderBrowserDialog. + if (fbdSelectDir.ShowDialog() == DialogResult.OK) + { + // Set the variable. + PathRedumpPS3ROMsDir = fbdSelectDir.SelectedPath; + } + + // Dispose of the FolderBrowserDialog. + fbdSelectDir.Dispose(); + + // Enable all buttons. + EnableAllButtons(); + } + + private void PathRedumpPS3IRDsDir_Click(object sender, EventArgs e) + { + // Disable all buttons. + DisableAllButtons(); + + // Create and initialize a FolderBrowserDialog for the directory. + FolderBrowserDialog fbdSelectDir = new FolderBrowserDialog + { + ShowNewFolderButton = true, + Description = "Please enter a path to the Redump PS3 IRDs directory: ", + SelectedPath = PathRedumpPS3IRDsDir + }; + + // Determine if the user selected OK from the FolderBrowserDialog. + if (fbdSelectDir.ShowDialog() == DialogResult.OK) + { + // Set the variable. + PathRedumpPS3IRDsDir = fbdSelectDir.SelectedPath; + } + + // Dispose of the FolderBrowserDialog. + fbdSelectDir.Dispose(); + + // Enable all buttons. + EnableAllButtons(); + } + + private void PathTempExtractionDir_Click(object sender, EventArgs e) + { + // Disable all buttons. + DisableAllButtons(); + + // Create and initialize a FolderBrowserDialog for the directory. + FolderBrowserDialog fbdSelectDir = new FolderBrowserDialog + { + ShowNewFolderButton = true, + Description = "Please enter a path to the temp extraction directory: ", + SelectedPath = PathTempExtractionDir + }; + + // Determine if the user selected OK from the FolderBrowserDialog. + if (fbdSelectDir.ShowDialog() == DialogResult.OK) + { + // Set the variable. + PathTempExtractionDir = fbdSelectDir.SelectedPath; + } + + // Dispose of the FolderBrowserDialog. + fbdSelectDir.Dispose(); + + // Enable all buttons. + EnableAllButtons(); + } + + private void BuildIRDs_Click(object sender, EventArgs e) + { + // Select the Log tab. + if (tcMain.TabPages.Contains(tabLog)) { tcMain.SelectTab(tabLog); } + + // Change the form's enabled state. + ChangeState(false); + + // Print to screen + OutputLine(""); + OutputLine("Info: Building IRDs started ..."); + + // Update the status message label. + UpdateStatusMessageLabel("Building IRDs ..."); + + // Build IRDs. + bgwBuildIRDs.RunWorkerAsync(); + } + + private void Cancel_Click(object sender, EventArgs e) + { + // Disable the cancel button. + tsbCancel.Enabled = false; + + // Print to screen + OutputLine("Info: Cancellation pending after current operation ..."); + + // Update the status message label. + UpdateStatusMessageLabel("Cancellation Pending ..."); + + // Cancel the tasks. + cancellation_.Cancel(); + } + + private void Exit_Click(object sender, EventArgs e) + { + // Exit the application. + Application.Exit(); + } + + #endregion + + #region View Click Events + + /// + /// Toggles the visibility of the log. + /// + /// + /// + private void ViewLog_Click(object sender, EventArgs e) + { + if (tsmiViewLog.Checked) + { + tsmiViewLog.Checked = false; + tsmiViewLog.CheckState = CheckState.Unchecked; + tcMain.TabPages.Remove(tabLog); + } + else + { + tsmiViewLog.Checked = true; + tsmiViewLog.CheckState = CheckState.Checked; + tcMain.TabPages.Add(tabLog); + tcMain.SelectTab(tabLog); + } + } + + /// + /// Toggles the visibility of the options. + /// + /// + /// + private void ViewOptions_Click(object sender, EventArgs e) + { + if (tsmiViewOptions.Checked) + { + tsmiViewOptions.Checked = false; + tsmiViewOptions.CheckState = CheckState.Unchecked; + tcMain.TabPages.Remove(tabOptions); + } + else + { + tsmiViewOptions.Checked = true; + tsmiViewOptions.CheckState = CheckState.Checked; + tcMain.TabPages.Add(tabOptions); + tcMain.SelectTab(tabOptions); + } + } + + /// + /// Toggles the visibility of the Database. + /// + /// + /// + private void ViewDatabase_Click(object sender, EventArgs e) + { + if (tsmiViewDatabase.Checked) + { + tsmiViewDatabase.Checked = false; + tsmiViewDatabase.CheckState = CheckState.Unchecked; + tcMain.TabPages.Remove(tabDatabase); + } + else + { + tsmiViewDatabase.Checked = true; + tsmiViewDatabase.CheckState = CheckState.Checked; + tcMain.TabPages.Add(tabDatabase); + tcMain.SelectTab(tabDatabase); + } + } + + /// + /// Toggles the visibility of the help. + /// + /// + /// + private void ViewHelp_Click(object sender, EventArgs e) + { + if (tsmiViewHelp.Checked) + { + tsmiViewHelp.Checked = false; + tsmiViewHelp.CheckState = CheckState.Unchecked; + tcMain.TabPages.Remove(tabHelp); + } + else + { + tsmiViewHelp.Checked = true; + tsmiViewHelp.CheckState = CheckState.Checked; + tcMain.TabPages.Add(tabHelp); + tcMain.SelectTab(tabHelp); + } + } + + /// + /// Toggles the visibility of the license. + /// + /// + /// + private void ViewLicense_Click(object sender, EventArgs e) + { + if (tsmiViewLicense.Checked) + { + tsmiViewLicense.Checked = false; + tsmiViewLicense.CheckState = CheckState.Unchecked; + tcMain.TabPages.Remove(tabLicense); + } + else + { + tsmiViewLicense.Checked = true; + tsmiViewLicense.CheckState = CheckState.Checked; + tcMain.TabPages.Add(tabLicense); + tcMain.SelectTab(tabLicense); + } + } + + /// + /// Toggles the visibility of the toolbar. + /// + /// + /// + private void ViewToolbar_Click(object sender, EventArgs e) + { + if (tsMain.Visible) + { + tsMain.Visible = false; + tsmiViewToolbar.Checked = false; + tsmiViewToolbar.CheckState = CheckState.Unchecked; + } + else + { + tsMain.Visible = true; + tsmiViewToolbar.Checked = true; + tsmiViewToolbar.CheckState = CheckState.Checked; + } + } + + #endregion + + #region Zip Event Handlers + + private void UnzipFile_ExtractProgress(object sender, ExtractProgressEventArgs e) + { + if (e.TotalBytesToTransfer > 0) + { + tspbTaskProgress.ProgressBar.Invoke(new MethodInvoker(delegate { + tspbTaskProgress.ProgressBar.Maximum = 100; + tspbTaskProgress.ProgressBar.Value = Convert.ToInt32(100 * e.BytesTransferred / e.TotalBytesToTransfer); + tspbTaskProgress.ProgressBar.Update(); + })); + } + } + + #endregion + + #region Startup Tasks Background Worker + + /// + /// StartupTasks DoWork + /// + /// + /// + private void StartupTasks_DoWork(object sender, DoWorkEventArgs e) + { + // + } + + /// + /// StartupTasks RunWorkerCompleted + /// + /// + /// + private void StartupTasks_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + if (e.Cancelled) + { + // Print to screen. + OutputLine("Info: Startup tasks canceled"); + } + else if (e.Error != null) + { + // Print to screen. + OutputLine("Error: Startup tasks failed"); + OutputLine("Error: " + e.Error.Message); + } + else + { + // + } + + // Update the status message label. + UpdateStatusMessageLabel("Ready"); + + // Print to screen. + OutputLine("Info: Ready"); + + // Enable all buttons. + EnableAllButtons(); + } + + #endregion + + #region Build IRDs Background Worker + + private void BuildIRDs_DoWork(object sender, DoWorkEventArgs e) + { + // Check the IRDs directory path. + if (!Directory.Exists(PathRedumpPS3IRDsDir)) + { + OutputLine("Info: Redump PS3 IRDs directory does not exist"); + e.Cancel = true; + return; + } + + // Check the DB file path. + if (!File.Exists(PathRedumpSQLiteDBFile)) + { + OutputLine("Info: " + "Redump SQLite DB file does not exist"); + e.Cancel = true; + return; + } + + // Check the ROMs directory path. + if (!Directory.Exists(PathRedumpPS3ROMsDir)) + { + OutputLine("Info: Redump PS3 ROMs directory does not exist"); + e.Cancel = true; + return; + } + + // Get the DB ISOs array. + DatabaseSQLite database = new DatabaseSQLite(PathRedumpSQLiteDBFile); + DataTable arrDBISOs = database.SelectAllPS3ISOsDataTable(); + + // Get the filesystem ISOs array and the filesystem zips array. + string[] arrFilesystemISOs = Directory.GetFiles(PathRedumpPS3ROMsDir, "*.iso", SearchOption.AllDirectories); + string[] arrFilesystemZips = Directory.GetFiles(PathRedumpPS3ROMsDir, "*.zip", SearchOption.AllDirectories); + List arrListFilesystemROMs = new List(); + arrListFilesystemROMs.AddRange(arrFilesystemISOs); + arrListFilesystemROMs.AddRange(arrFilesystemZips); + string[] arrFilesystemROMs = arrListFilesystemROMs.ToArray(); + + // Print to screen + OutputLine("Info: Redump DB ISOs: " + arrDBISOs.Rows.Count); + OutputLine("Info: Filesystem ISOs: " + arrFilesystemISOs.Length); + OutputLine("Info: Filesystem Zips: " + arrFilesystemZips.Length); + + // Declarations + BackgroundWorker worker = sender as BackgroundWorker; + + // Cancellation declaration + if (cancellation_ != null && !cancellation_.IsCancellationRequested) + cancellation_.Cancel(); + if (cancellation_ != null) + cancellation_.Dispose(); + cancellation_ = new CancellationTokenSource(); + + // Loop through the filesystem ISOs. + for (int i = 0; i < arrFilesystemROMs.Length; i++) + { + if (cancellation_.IsCancellationRequested) + { + break; + } + + // Declarations + string strGameDKey = ""; + string strGameDID = ""; + string strGamePIC = ""; + string strPathIRDFileName = ""; + // string strPathIRDFileName = Path.Combine(PathRedumpPS3IRDsDir, Path.GetFileNameWithoutExtension(arrFilesystemROMs[i]) + ".ird"); + string strPathISOFileName = arrFilesystemROMs[i]; + + // Print to screen + OutputLine("Info: Building IRD for: " + Path.GetFileName(strPathISOFileName)); + + // Get the Redump PS3 disc info. + foreach (DataRow row in arrDBISOs.Rows) + { + // Check if DB filename matches the filesystem filename. + if (row.Field("ps3_iso_filename") == Path.GetFileName(strPathISOFileName).Replace(".zip", ".iso")) + { + strGameDKey = row.Field("disc_dkey"); + strGameDID = row.Field("disc_did"); + strGamePIC = row.Field("disc_dpic"); + strPathIRDFileName = Path.Combine(PathRedumpPS3IRDsDir, Path.GetFileNameWithoutExtension(row.Field("ps3_iso_md5")) + ".ird"); + // OutputLine("Info: Found: " + strPathISOGameName); + // OutputLine("Info: Row disc_dkey: " + row["disc_dkey"]); + // OutputLine("Info: Row disc_did: " + row["disc_did"]); + // OutputLine("Info: Row disc_dpic: " + row["disc_dpic"]); + // OutputLine("Info: Row ps3_iso_md5: " + row["ps3_iso_md5"]); + break; + } + } + + // Check if the IRD already exists. + if (!String.IsNullOrEmpty(strPathIRDFileName) && File.Exists(strPathIRDFileName) && SkipExistingIRDs) + { + OutputLine("Info: IRD already exists (" + Path.GetFileName(strPathIRDFileName) + ") - Skipping"); + worker.ReportProgress((int)(((decimal)(i + 1)) * 100) / arrFilesystemROMs.Length); + continue; + } + + // Redump's Disc ID must be encrypted and Redump's Disc Key must be decrypted. + string strGameDKeyDec = DecryptDiscKey(strGameDKey); + string strGameDIDEnc = EncryptDiscID(strGameDID); + + // Prepare the DiscID/DiscKey/DiscPIC data in string form. + string d1_dec_hexstring = strGameDKeyDec.Replace("-", "").Replace(" ", "").Replace(",", ""); + string d2_enc_hexstring = strGameDIDEnc.Replace("-", "").Replace(" ", "").Replace(",", ""); + string pic_hexstring = strGamePIC.Replace("-", "").Replace(" ", "").Replace(",", "").Replace("\r", "").Replace("\n", "").Replace("
", ""); + + // OutputLine("Info: ID: " + d1_dec_hexstring); + // OutputLine("Info: DKey: " + d2_enc_hexstring); + // OutputLine("Info: PIC: " + pic_hexstring); + + // Check the required data to build the IRD. + if (String.IsNullOrEmpty(d1_dec_hexstring) || String.IsNullOrEmpty(d2_enc_hexstring) || String.IsNullOrEmpty(pic_hexstring)) + { + OutputLine("Info: The required DB data to build the IRD does not exist"); + worker.ReportProgress((int)(((decimal)(i + 1)) * 100) / arrFilesystemROMs.Length); + continue; + } + + // Check the required data to build the IRD. + if (d1_dec_hexstring.Length != 16 * 2 || d2_enc_hexstring.Length != 16 * 2 || pic_hexstring.Length < 115 * 2) + { + OutputLine("Info: The required DB data to build the IRD is corrupt"); + worker.ReportProgress((int)(((decimal)(i + 1)) * 100) / arrFilesystemROMs.Length); + continue; + } + + // Redump PIC is larger than 3k3y PIC, truncate if needed. + pic_hexstring = pic_hexstring.Substring(0, 115 * 2); + + // Prepare the DiscID/DiscKey/DiscPIC data in byte array form. + byte[] d1 = HexStringToByteArray(d1_dec_hexstring); + byte[] d2 = HexStringToByteArray(d2_enc_hexstring); + byte[] pic = HexStringToByteArray(pic_hexstring); + + // Check the required data to build the IRD. + if (d1.Length != 16 || d2.Length != 16 || pic.Length != 115) + { + OutputLine("Info: The required DB data to build the IRD cannot be converted"); + worker.ReportProgress((int)(((decimal)(i + 1)) * 100) / arrFilesystemROMs.Length); + continue; + } + + if (strPathISOFileName.EndsWith(".zip")) + { + // Print to screen + // OutputLine("Info: ROM FileName: " + strPathISOFileName); + OutputLine("Info: Extracting zipped ROM ..."); + + // Unzip the file. + using (ZipFile zip = ZipFile.Read(strPathISOFileName)) + { + zip.ExtractProgress += new EventHandler(UnzipFile_ExtractProgress); + zip.ExtractAll(PathTempExtractionDir); + } + + // Report the overall progress. + worker.ReportProgress((int)(((decimal)(i + .5)) * 100) / arrFilesystemROMs.Length); + + // Set the extracted ROM path. + strPathISOFileName = Path.Combine(PathTempExtractionDir, Path.GetFileNameWithoutExtension(strPathISOFileName) + ".iso"); + } + + try + { + // Interaction.Instance + Interaction.SetInteraction(new RedumpInteraction(tspbTaskProgress.ProgressBar, rtbLog, strPathIRDFileName, strPathISOFileName)); + + // Build the IRD. + Task result = new IrdCreateRedumpFile(false, true, d1, d2, pic).CreateIRD(cancellation_.Token); + result.Wait(); + if (result.IsCanceled || result.IsFaulted) + { + OutputLine("Info: IrdCreateRedumpFile failed or cancelled"); + } + } + catch (Exception ex) + { + // Print to screen + OutputLine("Error: " + ex.Message); + OutputLine("Error: " + ex.InnerException.Message); + OutputLine("Error: Building IRD failed"); + } + + // Delete any temp file. + if (File.Exists(Path.Combine(PathTempExtractionDir, Path.GetFileNameWithoutExtension(strPathISOFileName) + ".iso"))) + { + File.Delete(Path.Combine(PathTempExtractionDir, Path.GetFileNameWithoutExtension(strPathISOFileName) + ".iso")); + } + + // Report the overall progress. + worker.ReportProgress((int)(((decimal)(i + 1)) * 100) / arrFilesystemROMs.Length); + } + + // Send IRDs to Automated Redump 2 IRD database. + if (SendIRDsToTheUltimateIRDDatabase) + { + OutputLine("Info: Sending IRDs to Automated Redump 2 IRD database - Disabled"); + } + } + + private void BuildIRDs_ProgressChanged(object sender, ProgressChangedEventArgs e) + { + // Update the overall progressbar. + tspbOverallProgress.ProgressBar.Value = e.ProgressPercentage; + } + + private void BuildIRDs_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + if (e.Cancelled) + { + // Print to screen + OutputLine("Info: Building IRDs cancelled"); + OutputLine("Info: Ready"); + } + else if (e.Error != null) + { + // Print to screen + OutputLine("Error: Building IRDs failed"); + OutputLine("Error: " + e.Error.Message); + OutputLine("Info: Ready"); + } + else + { + // Print to screen + OutputLine("Info: Building IRDs completed"); + OutputLine("Info: Ready"); + } + + // Reset the progress bars. + ResetProgressBars(); + + // Update the status message label. + UpdateStatusMessageLabel("Ready"); + + // Change the form's enabled state. + ChangeState(true); + } + + #endregion + + #region Printers + + /// + /// Prints the version and copyright notice texts. + /// + public void PrintVersion() + { + // Print to screen + OutputLine("------------------------------------------------------------------------------"); + OutputLine(AppName + " v" + AppVersion); + OutputLine(AppCopyright); + OutputLine("------------------------------------------------------------------------------"); + } + + /// + /// Outputs a line of text. + /// + /// + private void OutputLine(string strMsg) + { + if (this.InvokeRequired && !this.IsDisposed) + { + Invoke(new MethodInvoker(delegate () + { + // Add the line of text to the log. + this.rtbLog.AppendText(strMsg + Environment.NewLine); + + // Scroll the log to the caret. + this.rtbLog.ScrollToCaret(); + })); + } + else if (!this.IsDisposed) + { + // Add the line of text to the log. + this.rtbLog.AppendText(strMsg + Environment.NewLine); + + // Scroll the log to the caret. + this.rtbLog.ScrollToCaret(); + } + } + + #endregion + } +} diff --git a/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.resx b/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.resx new file mode 100644 index 0000000..9e626d6 --- /dev/null +++ b/AutomatedRedump2IRD/FrmAutomatedRedump2IRD.resx @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 112, 17 + + + 200, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKhSURBVDhPlZJdSNNhFMZPQgRFF95kIIS1jCzSbroJu1OL + LgoqpBtTQ52rTd3K6bKJfWh103dRlxUZkqZz6ubUmTOXEGlR1jS1ufyYfeg2m18ZT+f9/6dEdFEv/HgP + 55zneT9J7fSpNe1+X+5zP/L+EdGrcfqnNE6fgVLNI9PZljFobV5orGMSIv4bv9dVrEk1v12gg/f7kFkx + iPRH/dCbh1DU8Alp5f3IfjwIZQgRi1xhnQeGeo8UC82hB32g3de7kXznDdTlvfAG5jERXIDqoQuJV7uw + 7/ZriaRr3Th6791SXVvxQdLsudENii91IvFiJ5JvdcHrn4MYw5NzOHDzJWKNDmwvbsfeKy8w8GVaqk0E + fyDl7isksGZXmRMUa7Ajjtl4oglJlzrg+TYjNY5MznJTB3aecaB/PCjlxgNz2H+5EwqdTdLEGVpA63Ms + EGzIsyAi24z4kla4v8qriblv7LsUi90llDmwhntEr6xrAEVkmSChlFmdVoVt+Y1wjU5JQjHcvP0dRU1Y + lVq11CfrakDhGdUIz6hBeKbMiiOVUGgb0DMcCMmBgc9BbNVbsTylcqlP0rCWViprIaGqxbL0aigKbHB5 + 5W27+T56Q+cXx9lyuhmU9kTqlXUmUNixOggo04R1p5rxPiQe4kvcZGxBpJ4NQyaDbBJdbAdlmBB2XOjM + INLwRbBBlNGOgdALuFkcc7YNlFULUpqlmouPIYbHx7VzXFPxopp6NsizcmBBpLEVPd4gRvmpNp93yA1a + rglU9YgqeYqPEzMYn5pHTGk7SM0L82sQ6ZpA/Aco14q1JW1QXHgmGdLJUF4gYs6JWjT/DcphU5HXNbJB + fsssAypgFkUi1v+ByC0ailhoDjf/JCq066jQFiD+Wf+Fzh6kAnvxLyFRu/khQA4QAAAAAElFTkSuQmCC + + + + 435, 17 + + + 291, 17 + + + 47 + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAC2aQAAt2oASrhqAMO4agDruGoA7bhqAO24agDtuGoA7bhqAO24agDtuGoA7bhqAO24agDtuGoA7bhq + AO24agDtuGoA7bhqAO24agDtuGoA7bhqAO24agDtuGoA7bhqAO24agDtuGoA7bhqAO24agDtuGoA6rhq + AMK3agBIt2kAALZoAEa2aAD8tmgA/7ZoAP+2aAD/tmgA/7ZoAP+2aAD/tmgA/7ZoAP+2aAD/tmgA/7Zo + AP+2aAD/tmgA/7ZoAP+2aAD/tmgA/7ZoAP+2aAD/tmgA/7ZoAP+2aAD/tmgA/7ZoAP+2aAD/tmgA/7Zo + AP+2aAD/tmgA/7ZoAPu2aQBDtWcAxbRnAP+0ZgD/tGYA/7RnAP+0ZwD/tGcA/7RnAP+0ZwD/tGcA/7Rn + AP+1ZwD/tGYA/7JiAP+wXgD/sF4A/7BeAP+zZAD/tWcA/7RnAP+0ZwD/tGcA/7RnAP+0ZwD/tGcA/7Rn + AP+0ZwD/tGcA/7RnAP+0ZwD/tGcA/7VnAMGzZQDts2QA/7NlAf+yYQD/r10A/7JjAP+zZQD/s2UA/7Nl + AP+zZQD/smIA/69cAP+xXwD/vnsn/9Ola//fvpP/0aFj/7ZqDf+uWwD/s2MA/7NlAP+zZQD/s2UA/7Nl + AP+zZQD/s2UA/7NlAP+zZQD/s2UA/7NlAP+zZQD/s2UA6rJjAO6yYgD/smMD/968kf/Nmlv/smMF/61Z + AP+vXQD/rlwA/61ZAP+0aA3/zJhZ/+nStv/8+vb/////////////////8+fY/86dYf+wYAH/rlwA/7Jj + AP+yYwD/smMA/7JjAP+yYwD/smMA/7JjAP+yYwD/smMA/7JjAP+yYwDrsGEA7bBgAP+vXgD/8OLP//// + ///w4dD/1Kh1/758L//Bgzn/2rSI//Tp3P///////////////////////////////////////////+rV + vP++fTL/q1cA/69fAP+wYgD/sGEA/7BhAP+wYQD/sGEA/7BhAP+wYQD/sGEA/7BhAOqvXwDtr14A/65c + AP/t28X//////////////////v79//////////////////////////////////////////////////// + //////////////z59v/WrX7/r2AH/6tYAP+vYAD/r2AA/69fAP+vXwD/r18A/69fAP+vXwD/r18A6q1e + AO2tXQD/rFsA/+zbxf////////////////////////////////////////////////////////////// + ///////////////////////////////////t3Mf/vHw0/6hTAP+sXAD/rV4A/61eAP+tXgD/rV4A/61e + AP+tXgDqrFwB7axbAP+qWQD/7+DP//////////////////////////////////////////////////// + //////////////Lm2P/s2sn/7t3L/+7fzf/v4M//8OLU///////8+fb/0aZ2/6pYAf+pVgD/rFwB/6xc + Af+sXAH/rFwB/6xcAeqqWgPtqlkC/6dUAP/Qo3T///////////////////////////////////////// + ////////////////////////5s60/9q2k//buZP/2riR/9q3kP/Vrob/1a2C///+/v//////59C3/7Rs + I/+lUAD/qlkC/6paA/+qWgP/qloD6qlYBO2pWAT/qVcE/6RPAP/Ejlb/9/Do//////////////////// + ///////////////////////////////////////////////////////////////////VrYT/+PHp//// + ////////9+/n/8SOVv+mUgD/qVgE/6lYBP+pWATqqFYE7ahWBP+oVwT/p1YD/6JNAP+xaiP/38Kl//38 + +v///////////////////////////////////////////////////////////////////////////8eU + YP/TqoL//v38/////////////////8qZaP+jTgD/qFYE/6hWBOqmVAPtplQD/6ZUA/+mVAP/plUD/6NP + AP+jTgD/tnIw/8mYZ//Vr4n/17GM/9Sshf/SqYD/0KV7/86hdf/Lm2z/yJZk/8aSX//GkFz/xY9Z/8OL + VP++g0j/p1YG/6FKAP+5eT3/6NTA////////////0qh//6FLAP+mVAP/plQD6qVTA+2lUwP/pVMD/6VT + A/+lUwP/pVMD/6VSAv+iTQD/oEkA/6BIAP+gSQD/n0gA/59HAP+bQAD/m0EA/6NPAP+pWw7/qVoN/6JO + AP+cQQD/nEMA/6FKAP+kUgH/pVMC/6FKAP+kUQT/yplq/9Gnf/+nVwv/pFEB/6VTA/+lUwPqpFEC7aRR + Av+kUQL/pFEC/6RRAv+kUQL/pFEC/6RRAv+kUQL/pFEC/6RRAv+iTAD/oUsA/72ASf/gw6n/8+nf//r2 + 8v/69fH/8uba/9y8nv+4dzz/oEgA/6JOAP+kUQL/pFEC/6NPAP+fSAD/n0cA/6NPAP+kUQL/pFEC/6RR + AuqiTwHtok8B/6JPAf+iTwH/ok8B/6JPAf+iTwH/ok8B/6JPAf+jTwH/n0kA/6dXEv/fwqj///////// + ///////////////////////////////+/v/YtJP/o1AH/6BLAP+jTwH/ok8B/6JPAf+iTwD/ok8B/6JP + Af+iTwH/ok8B6qNQAu2jUAL/o1AC/6NQAv+jUAL/o1AC/6NQAv+jUAL/o1AD/6FMAP+mVhH/6tfF//// + ///////////////////////////////////////////////////iyK//o08H/6JOAP+jUAP/o1AC/6NQ + Av+jUAL/o1AC/6NQAv+jUALqplUI7aZVCP+mVQj/plUI/6ZVCP+mVQj/plUI/6ZVCP+mVAf/ok0B/96/ + of/////////////////////////////////////////////////////////////////TqoP/oUsA/6ZV + CP+mVQj/plUI/6ZVCP+mVQj/plUI/6ZVCOqqWgvtqloL/6paC/+qWgv/qloL/6paC/+qWgv/qloL/6dU + Av+8fT////////////////////////////////////////////////////////////////////////v4 + 9P+0bSf/qFYF/6paC/+qWgv/qloL/6paC/+qWgv/qloL6q5gCe2uYAn/rmAJ/65gCf+uYAn/rmAJ/65g + Cf+uYAn/qlcA/928mP/////////////////////////////////z6Nv/9ezh//////////////////// + /////////////9KoeP+pVwD/rmAJ/65gCf+uYAn/rmAJ/65gCf+uYAnqs2cH7bNnB/+zZgb/s2cH/7Nn + B/+zZwf/s2cH/7JmBf+yZQX/79/M////////////////////////////27aI/7JlCf+0aRD/4sWg//// + ////////////////////////5s6v/7BgAP+zZwf/s2cH/7NnB/+zZgb/s2cH/7NnB+q4bgntuW8P/7lx + FP+3bQf/uG4K/7huCv+4bgr/t2wH/7pyEv/27N7///////////////////////r17/+7dBX/tWgB/7Rm + AP/Cgi3//v38///////////////////////u3cb/tmoE/7htCf+4bgr/t20H/7lxE/+5bw//uG4J6r12 + Fe2+eBz/w4E7/796I/+9dRX/vXUU/712Fv+8dBP/vngb//Xq2////////////////////////Pr2/8eL + O/+4agP/t2kA/8+aVP///v7//////////////////////+7cxP+7cQ7/vXUT/711FP+/eiL/w4E6/754 + HP+9dhXqwn4j7cN/KP/Jikb/yYtI/8eHPP/EgS7/wn4m/8J9Iv/AeRv/7tvD//////////////////// + ////////8+bU/9SkZP/WqW7/9+3h////////////////////////////5sum/793Gf/EgS3/x4Y7/8mL + R//JikX/w38o/8J+I+rHhi/tyIc0/86STv/Okk//zpNR/86TUP/NkUv/zI5F/8iFM//hvpL///////// + ///////////////////////////////////////////////////////////////////cs4H/y4tB/86S + UP/Ok1H/zpJP/86RTf/IhzT/x4Yv6s2ONu3OkDv/1JpW/9SaV//Umlf/1JpY/9SbWP/Um1n/1JlW/9eh + ZP/79vD/////////////////////////////////////////////////////////////////9+3h/9Wc + Wv/Umlf/1JpY/9SaV//Umlj/1JpW/86PPP/Njjbq1Jg97dWZQ//Zo1//2aNg/9mjYP/Zo2D/2aNg/9mj + YP/Zo2D/151X/+fEmP////////////////////////////////////////////////////////////79 + /P/juof/2J5Y/9mjYP/Zo2D/2aNg/9mjYf/Zo17/1ZlD/9SYPeraoUru2qJM/96qZv/eq2n/3qto/96r + aP/eq2j/3qto/96raP/eq2j/3Kdg/+3Srf////////////////////////////////////////////// + ///+/Pv/6sme/9ymX//eq2j/3qto/96raP/eq2j/3qtp/96qZf/aokz/2qFK6+CrWezgqlj/4a9k/+O0 + cv/jtHD/47Rw/+O0cP/jtHD/47Rw/+O0cP/js2//4q9p/+zKmv/68OP///////////////////////// + ////////+e3c/+rEkP/ir2j/47Nw/+O0cP/jtHD/47Rw/+O0cf/jtHH/4a9k/+CqWP/gq1np5rRjvea0 + Y//mtGL/57ht/+i7dv/ovHf/6Lx3/+i8d//ovHf/6Lx3/+m8d//ovHf/57hv/+m8eP/vzpv/9N67//fm + zP/35sv/89y4/+7Mlv/ou3X/57hw/+m8d//ovHf/6Lx3/+i8d//ovHf/6Lt2/+e4bf/mtGL/5rRj/+a0 + Y7rrvm077L9u9ey/bv/rv23/7L9v/+y/b//sv2//7L9v/+y/b//sv2//7L9v/+y/b//sv3D/679u/+q8 + af/qu2f/6rxp/+q8aP/qu2f/67xq/+u/bv/sv3D/7L9v/+y/b//sv2//7L9v/+y/b//sv27/679t/+y/ + bv/sv2/z675uOO3BcADvxnY68cl6s/LKeuXyyXrr8sl56/LJeevyyXnr8sl56/LJeevyyXnr8sl56/LJ + eevyyXnr8sl56/LJeevyyXnr8sl56/LJeevyyXnr8sl56/LJeevyyXnr8sl56/LJeevyyXnr8sl56/LJ + euvyynrl8cl5su/GdTjtwXAAgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAE= + + + \ No newline at end of file diff --git a/AutomatedRedump2IRD/IsoTools/IrdCreateRedumpFile.cs b/AutomatedRedump2IRD/IsoTools/IrdCreateRedumpFile.cs new file mode 100644 index 0000000..205ddfe --- /dev/null +++ b/AutomatedRedump2IRD/IsoTools/IrdCreateRedumpFile.cs @@ -0,0 +1,106 @@ +using DiscUtils.Udf; +using IsoTools.Common.Properties; +using IsoTools.Iso9660; +using AutomatedRedump2IRD.IsoTools; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace IsoTools +{ + /// + /// + /// + public class IrdCreateRedumpFile : IrdCreateFile { + private readonly byte[] header_3k3y = Encoding.ASCII.GetBytes("Encrypted 3K ISO"); + private readonly byte[] sector_3k3y = new byte[16 + 16 + 16 + 115]; + + /// + /// + /// + /// + /// + /// + /// + /// + public IrdCreateRedumpFile(bool decrypted, bool createIrdFile, byte[] d1, byte[] d2, byte[] pic) : base(decrypted, createIrdFile) { + System.Diagnostics.Debug.Assert(header_3k3y.Length == 16, "Unexpected header_3k3y size."); + System.Diagnostics.Debug.Assert(d1.Length == 16, "Unexpected d1 size."); + System.Diagnostics.Debug.Assert(d2.Length == 16, "Unexpected d2 size."); + System.Diagnostics.Debug.Assert(pic.Length == 115, "Unexpected pic size."); + + // Write the generic 3k3y header inforatmion. + Array.Copy(header_3k3y, sector_3k3y, header_3k3y.Length); + + // Write the dynamic 3k3y information. + Array.Copy(d1, 0, sector_3k3y, 16, d1.Length); + Array.Copy(d2, 0, sector_3k3y, 32, d2.Length); + Array.Copy(pic, 0, sector_3k3y, 48, pic.Length); + } + + /// + /// + /// + /// + protected override async Task CheckIfValid() { + // Get the ps3 header from the iso. + byte[] ps3_header = null; + using (Stream iso_stream = this.Open()) { + long ps3_header_size = 0; + PS3CDReader ps3_cd_reader = new PS3CDReader(iso_stream); + ICollection members = ps3_cd_reader.Members; + List list = ( + from d in members + where d.IsFile + select d).Distinct().ToList(); + ps3_header_size = list.First().StartSector * 2048; + + // Note: The full ps3_header_size isn't needed, the IRD's "Header" seems to always be smaller than 0>StartSector, but can't find why (from code seems to write all, so why IrdViewer is missing some)... + if (ps3_header_size == 0) + return false; + ps3_header = new byte[ps3_header_size]; + iso_stream.Seek(0, SeekOrigin.Begin); + if (iso_stream.Read(ps3_header, 0, (int)ps3_header_size) != ps3_header_size) + return false; + } + + // Modify the header with the d1/d2/key information at the 3k3y location (0xF70), and write it to the temporary Redump2IRD.exe.header file. + string tmp_header_info_file = new Uri(System.Reflection.Assembly.GetEntryAssembly().GetName().CodeBase + ".ps3-header-only.iso").LocalPath; + if (File.Exists(tmp_header_info_file)) + File.Delete(tmp_header_info_file); + Array.Copy(sector_3k3y, 0, ps3_header, 0xF70, sector_3k3y.Length); + File.WriteAllBytes(tmp_header_info_file, ps3_header); + + // Analayze the "header" file above so we can get correct information. + IsoCryptoClass isoCryptoClass = new IsoCryptoClass(); + if (await isoCryptoClass.AnalyseISO(tmp_header_info_file) && isoCryptoClass.IsEncrypted) { + FileInfo fileInfo = new FileInfo(base.Path); + base.Regions = isoCryptoClass.Regions; + base.EndOfDataSector = (long)base.Regions.Last().End; + base.TotalSectors = (long)((uint)(fileInfo.Length / (long)2048)); + + File.Delete(tmp_header_info_file); + this.IsValid = true; + return true; + } + + File.Delete(tmp_header_info_file); + this.IsValid = false; + return false; + } + + /// + /// + /// + /// + protected override Stream Open() { + return new RedumpFileStream(base.Path, FileMode.Open, FileAccess.Read, sector_3k3y); + } + } +} \ No newline at end of file diff --git a/AutomatedRedump2IRD/IsoTools/RedumpFileStream.cs b/AutomatedRedump2IRD/IsoTools/RedumpFileStream.cs new file mode 100644 index 0000000..2ad3167 --- /dev/null +++ b/AutomatedRedump2IRD/IsoTools/RedumpFileStream.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace AutomatedRedump2IRD.IsoTools { + /// + /// + /// + public class RedumpFileStream : FileStream { + private const long size_3k3y_ = 16 + 16 + 16 + 115; + private const long start_3k3y_ = 0xF70; + private const long end_3k3y_ = start_3k3y_ + size_3k3y_; + private byte[] sec_3k3y_; + + /// + /// + /// + /// + /// + /// + /// + public RedumpFileStream(string path, FileMode mode, FileAccess access, byte[] sec_3k3y) : base(path, mode, access) { + System.Diagnostics.Debug.Assert(sec_3k3y.Length == size_3k3y_, "Unexpected sec3k3y size."); + sec_3k3y_ = sec_3k3y; + } + + /// + /// + /// + /// + /// + /// + /// + public override int Read(byte[] array, int offset, int count) { + int ret = base.Read(array, offset, count); + + // Check if the read has data inside our 3k3y sector, if so copy the memory over. + if (base.Position >= start_3k3y_ && base.Position - ret <= end_3k3y_) { + long start_position_of_read = base.Position - ret; + long offset_of_3k3y_sector = start_position_of_read <= start_3k3y_ ? 0 : start_position_of_read - start_3k3y_; + long offset_of_3k3y_in_array = offset + (start_position_of_read >= start_3k3y_ ? 0 : start_3k3y_ - start_position_of_read); + Array.Copy(sec_3k3y_, offset_of_3k3y_sector, array, offset_of_3k3y_in_array, Math.Min(array.Length - offset_of_3k3y_in_array, size_3k3y_ - offset_of_3k3y_sector)); + + // TODO: array.Length - offset_of_3k3y_in_array is over-estimate, we can copy less... + // Could be some off-by-1 errors above for edge cases? + } + return ret; + } + } +} diff --git a/AutomatedRedump2IRD/IsoTools/RedumpInteraction.cs b/AutomatedRedump2IRD/IsoTools/RedumpInteraction.cs new file mode 100644 index 0000000..d210574 --- /dev/null +++ b/AutomatedRedump2IRD/IsoTools/RedumpInteraction.cs @@ -0,0 +1,76 @@ +using IsoTools; +using System; +using System.IO; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace AutomatedRedump2IRD { + internal class RedumpInteraction : EmptyInteraction { + private readonly Timer progress_timer_ = null; + private readonly ProgressBar progress_bar_ = null; + private readonly RichTextBox output_ = null; + private int progress_ = 0; + public string pathIRDFileName_ = String.Empty; + public string pathISOFileName_ = String.Empty; + + public RedumpInteraction(ProgressBar progress_bar, RichTextBox output, string pathIRDFileName, string pathISOFileName) { + progress_bar_ = progress_bar; + output_ = output; + pathIRDFileName_ = pathIRDFileName; + pathISOFileName_ = pathISOFileName; + progress_timer_ = new Timer(); + progress_timer_.Interval = 200; + progress_timer_.Tick += new EventHandler(ProgressTimerTick); + progress_timer_.Start(); + } + + private string ird_output_inital_dir_ = String.Empty; + public override Task GetIrdOutputFile(string inputFile) + { + ird_output_inital_dir_ = Path.GetDirectoryName(pathIRDFileName_); + return TaskEx.FromResult(pathIRDFileName_); + } + + private string iso_file_inital_dir_ = String.Empty; + public override Task GetIsoFile(bool verify = false, bool multiple = true) + { + iso_file_inital_dir_ = Path.GetDirectoryName(pathISOFileName_); + return TaskEx.FromResult(new string[] { pathISOFileName_ }); + } + + public override void ReportMessage(string message, ReportType reportType) { + if (output_ != null) + output_.Invoke((Action)(() => { output_.AppendText("Info: " + message + Environment.NewLine); })); + } + + public override void ReportProgress(int progress) { + if (progress != -1) + progress_ = progress; + if (progress_bar_ != null) + progress_bar_.Invoke((Action)(() => { progress_bar_.Value = progress_; })); + } + + public override void SetProgressMaximum(int max) { + if (progress_bar_ != null) + progress_bar_.Invoke((Action)(() => { progress_bar_.Maximum = max; })); + } + + public override void TaskBegin(TaskType taskType) { + progress_ = 0; + if (progress_timer_ != null) + progress_timer_.Start(); + if (progress_bar_ != null) + progress_bar_.Invoke((Action)(() => { progress_bar_.Value = progress_; })); + } + + public override void TaskComplete() { + if (progress_timer_ != null) + progress_timer_.Stop(); + } + + private void ProgressTimerTick(object sender, EventArgs e) { + if (progress_bar_ != null) + progress_bar_.Value = progress_; + } + } +} \ No newline at end of file diff --git a/AutomatedRedump2IRD/Program.cs b/AutomatedRedump2IRD/Program.cs new file mode 100644 index 0000000..d1f9200 --- /dev/null +++ b/AutomatedRedump2IRD/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Windows.Forms; + +namespace AutomatedRedump2IRD +{ + /// + /// The main Program class. + /// + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FrmAutomatedRedump2IRD()); + } + } +} diff --git a/AutomatedRedump2IRD/Properties/AssemblyInfo.cs b/AutomatedRedump2IRD/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5ca3db3 --- /dev/null +++ b/AutomatedRedump2IRD/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Automated Redump 2 IRD")] +[assembly: AssemblyDescription("The Original Automated IRD Builder")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Automated Redump 2 IRD")] +[assembly: AssemblyProduct("Automated Redump 2 IRD")] +[assembly: AssemblyCopyright("Copyright (c) 2016-2025 Automated Redump 2 IRD - All Rights Reserved")] +[assembly: AssemblyTrademark("Automated Redump 2 IRD - The Original Automated IRD Builder")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4535930b-6f1d-43c5-b661-3cb8a8332f07")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.0.8")] +[assembly: AssemblyFileVersion("0.0.8")] diff --git a/AutomatedRedump2IRD/Properties/Resources.Designer.cs b/AutomatedRedump2IRD/Properties/Resources.Designer.cs new file mode 100644 index 0000000..1daf28b --- /dev/null +++ b/AutomatedRedump2IRD/Properties/Resources.Designer.cs @@ -0,0 +1,213 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AutomatedRedump2IRD.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AutomatedRedump2IRD.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to ------------------------------------------------------------------ + ///Automated Redump 2 IRD - Help version 20240906 + ///Copyright (c) 2016-2024 Automated Redump 2 IRD - All Rights Reserved + ///------------------------------------------------------------------ + /// + ///[I] About + ///[II] Requirements + ///[III] Installation + ///[IV] How To Build IRDs + ///[V] FAQ + ///[VI] Contributing + ///[VII] Contact + ///[VIII] Disclaimers + /// + ///[I] About + ///---------- + ///Automated Redump 2 IRD, or AR2I is The Original Automated IRD Builder. + /// + ///Automated Redump 2 I [rest of string was truncated]";. + /// + internal static string AutomatedRedump2IRD_HELP { + get { + return ResourceManager.GetString("AutomatedRedump2IRD_HELP", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to *************************************************************** + ///Automated Redump 2 IRD - License version 20240906 + ///Copyright (c) 2016-2024 Automated Redump 2 IRD + ///All Rights Reserved + ///*************************************************************** + /// + ///TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + /// + ///1. Redistributions in any form are not permitted whatsoever, + /// under any conditions. + /// + ///2. This software may not be reverse engineered, decompiled, + /// or disassembled. + /// + ///3. Automated Redump [rest of string was truncated]";. + /// + internal static string AutomatedRedump2IRD_LICENSE { + get { + return ResourceManager.GetString("AutomatedRedump2IRD_LICENSE", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap BuildIRDs_32x32 { + get { + object obj = ResourceManager.GetObject("BuildIRDs_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Cancel_16x16 { + get { + object obj = ResourceManager.GetObject("Cancel_16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap DB_32x32 { + get { + object obj = ResourceManager.GetObject("DB_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Exit_32x32 { + get { + object obj = ResourceManager.GetObject("Exit_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Help_32x32 { + get { + object obj = ResourceManager.GetObject("Help_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap License_32x32 { + get { + object obj = ResourceManager.GetObject("License_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Log_32x32 { + get { + object obj = ResourceManager.GetObject("Log_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Options_32x32 { + get { + object obj = ResourceManager.GetObject("Options_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SaveLog_32x32 { + get { + object obj = ResourceManager.GetObject("SaveLog_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Toolbar_32x32 { + get { + object obj = ResourceManager.GetObject("Toolbar_32x32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/AutomatedRedump2IRD/Properties/Resources.resx b/AutomatedRedump2IRD/Properties/Resources.resx new file mode 100644 index 0000000..0d18b49 --- /dev/null +++ b/AutomatedRedump2IRD/Properties/Resources.resx @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Docs\AutomatedRedump2IRD-HELP.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\Docs\AutomatedRedump2IRD-LICENSE.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\Images\BuildIRDs_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\Cancel_16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\DB_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\Exit_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\Help_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\License_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\Log_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\Options_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\SaveLog_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Images\Toolbar_32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/AutomatedRedump2IRD/Resources/DB/ps3.redump.sqlite.db b/AutomatedRedump2IRD/Resources/DB/ps3.redump.sqlite.db new file mode 100644 index 0000000..7d629e2 Binary files /dev/null and b/AutomatedRedump2IRD/Resources/DB/ps3.redump.sqlite.db differ diff --git a/AutomatedRedump2IRD/Resources/DB/put your databases in this directory.txt b/AutomatedRedump2IRD/Resources/DB/put your databases in this directory.txt new file mode 100644 index 0000000..6d78808 --- /dev/null +++ b/AutomatedRedump2IRD/Resources/DB/put your databases in this directory.txt @@ -0,0 +1 @@ +This file can be deleted. \ No newline at end of file diff --git a/AutomatedRedump2IRD/Resources/Docs/AutomatedRedump2IRD-HELP.txt b/AutomatedRedump2IRD/Resources/Docs/AutomatedRedump2IRD-HELP.txt new file mode 100644 index 0000000..c7b9c39 --- /dev/null +++ b/AutomatedRedump2IRD/Resources/Docs/AutomatedRedump2IRD-HELP.txt @@ -0,0 +1,105 @@ +------------------------------------------------------------------ +Automated Redump 2 IRD - Help version 20250731 +Copyright (c) 2016-2025 Automated Redump 2 IRD - All Rights Reserved +------------------------------------------------------------------ + +[I] About +[II] Requirements +[III] Installation +[IV] How To Build IRDs +[V] FAQ +[VI] Contributing +[VII] Contact +[VIII] Disclaimers + +[I] About +---------- +Automated Redump 2 IRD, or AR2I is The Original Automated IRD Builder. + +Automated Redump 2 IRD builds all the IRDs for all of the ISO files and Zipped ISO files in a directory recursively, using information from an SQLite DB. + +The SQLite database can be viewed and edited directly from the app, allowing you to add IRDs and ISOs to the database. + +IRDs cannot be built for ROMs with nonmatching titles. Please use a ROM manager to rename your ROMs to match the correct title in the DB. + +IRDs are named using the MD5 hash value of the Redump ISO, enabling you to colect the IRDs in the IRDs folder. + +[II] Requirements +------------------ +This app does not ship with the following necessary IsoTools Libraries, which are distributed with IsoTools. +* DiscUtils.dll +* Ionic.Zip.dll +* IsoTools.Common.dll +* Microsoft.CompilerServices.AsyncTargetingPack.Net4.dll + +Place these libraries in the program folder with the AutomatedRedump2IRD.exe file. + +IsoTools appears to have been discontinued. We do not know where to find the necessary libraries. + +[III] Installation +----------------- +Download and unzip the program to any new location that you wish to use. However, this software should be installed as close to the drive's root directory as possible. + +Place the IsoTools libraries into the program folder with the AutomatedRedump2IRD.exe file. + +I like to put my installation in a directory called AR2I on my C:\ drive. My installation layout looks like this: + +C:\AR2I\DB\ +C:\AR2I\IRDs\ +C:\AR2I\Logs\ +C:\AR2I\ROMs\ +C:\AR2I\Tmp\ +C:\AR2I\AutomatedRedump2IRD.exe +C:\AR2I\DiscUtils.dll +C:\AR2I\Ionic.Zip.dll +C:\AR2I\IsoTools.Common.dll +C:\AR2I\Microsoft.CompilerServices.AsyncTargetingPack.Net4.dll + +[IV] How to Build IRDs +-------------------------------- +* If you have an account at Automated Redump 2 IRD, set your username and password by editing the Options from the GUI. This will allow you to send IRDs to the database. +* Rename your ROMs using a ROM manager to match the Redump DB you are using. +* Place your Redump DB file in the DB directory, or set the path to it. +* Set the other paths and options as needed. +* Click one of the Build IRDs buttons. + +[V] FAQ +--------- +Q1) I didn't read or follow the instructions in the help file and I can't get this software to work properly. Can you help? +A1) No. + +Q2) Why do I keep getting errors about path and file lengths? +A2) Obviously, you chose an installation path that is too long. This won't happen if you follow the installation instructions. Please read the Installation Section again and this time follow the instructions. + +Q3) I appear to be blocked from some or all databases, or appear to be blocked from using this software. What gives? +A3) There are way too many reasons why this may or may not be happening. One example might be that you are using a blacklisted or abusive host, which may be blocked by some networks. In many cases, the network filtering may also be completely out of anyone's control. + +Q4) Why can't this software find matches based on ROM hashes? My ROMs are not named according to the Redump datafile that corresponds to the matching SQLite DB. +A4) This software is designed to be used specifically for the Redump database. Finding matches using this info takes a fraction of a second. Finding matches based on hash values could take many days to find a SINGLE match and build a SINGLE IRD. Using hash values to find matches would defy all common sense. + +[VI] Contributing +---------------- +Let's work better together. We are looking to collaborate with like-minded people who want to contribute in any capacity. Collaboration is open to everyone and we need your help if you are a: +* Collector +* Database Administrator +* Datter +* Developer +* Dumper +* Graphic Artist +* Translator +* Player +* Tester + +Feel free to: +* Fork the repository +* Create an issue +* Branch your repository with the issue number and a meaningful name related to the changes you are making +* Create a pull request + +[VII] Contact +---------------- +GitEmAll: https://gitemall.devemall.int.eu.org/TommySalami/AutomatedRedump2IRD + +[VIII] Disclaimers +---------------- +We do not upload, share, distribute or provide links to anything illegal, including ROMs or patches. diff --git a/AutomatedRedump2IRD/Resources/Docs/AutomatedRedump2IRD-LICENSE.txt b/AutomatedRedump2IRD/Resources/Docs/AutomatedRedump2IRD-LICENSE.txt new file mode 100644 index 0000000..b69f11e --- /dev/null +++ b/AutomatedRedump2IRD/Resources/Docs/AutomatedRedump2IRD-LICENSE.txt @@ -0,0 +1,40 @@ +*************************************************************** +Automated Redump 2 IRD - License version 20250731 +Copyright (c) 2016-2025 Automated Redump 2 IRD +All Rights Reserved +*************************************************************** + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Redistributions in any form are not permitted whatsoever, + under any conditions. + +2. This software may not be reverse engineered, decompiled, + or disassembled. + +3. Automated Redump 2 IRD may publish revised and/or new + versions of the license from time to time. Each version + will be given a distinguishing version number. No one other + than Automated Redump 2 IRD has the right to modify the + terms applicable to covered code created under this + License. + +4. It is your responsibility to use this software in accordance + with all applicable laws. + +*************************************************************** + +THIS SOFTWARE IS PROVIDED BY THE AUTOMATED REDUMP 2 IRD +DEVELOPMENT TEAM 'AS IS' AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTOMATED REDUMP +2 IRD DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. diff --git a/AutomatedRedump2IRD/Resources/IRDs/put your irds in this directory.txt b/AutomatedRedump2IRD/Resources/IRDs/put your irds in this directory.txt new file mode 100644 index 0000000..6d78808 --- /dev/null +++ b/AutomatedRedump2IRD/Resources/IRDs/put your irds in this directory.txt @@ -0,0 +1 @@ +This file can be deleted. \ No newline at end of file diff --git a/AutomatedRedump2IRD/Resources/Icons/App.ico b/AutomatedRedump2IRD/Resources/Icons/App.ico new file mode 100644 index 0000000..5a1eaee Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Icons/App.ico differ diff --git a/AutomatedRedump2IRD/Resources/Images/BuildIRDs_32x32.png b/AutomatedRedump2IRD/Resources/Images/BuildIRDs_32x32.png new file mode 100644 index 0000000..13db89c Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/BuildIRDs_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/Cancel_16x16.png b/AutomatedRedump2IRD/Resources/Images/Cancel_16x16.png new file mode 100644 index 0000000..40c4bdb Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/Cancel_16x16.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/DB_32x32.png b/AutomatedRedump2IRD/Resources/Images/DB_32x32.png new file mode 100644 index 0000000..136bbc6 Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/DB_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/Exit_32x32.png b/AutomatedRedump2IRD/Resources/Images/Exit_32x32.png new file mode 100644 index 0000000..ccc6e14 Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/Exit_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/Help_32x32.png b/AutomatedRedump2IRD/Resources/Images/Help_32x32.png new file mode 100644 index 0000000..3b3bae3 Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/Help_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/License_32x32.png b/AutomatedRedump2IRD/Resources/Images/License_32x32.png new file mode 100644 index 0000000..854ed97 Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/License_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/Log_32x32.png b/AutomatedRedump2IRD/Resources/Images/Log_32x32.png new file mode 100644 index 0000000..c202c5a Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/Log_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/Options_32x32.png b/AutomatedRedump2IRD/Resources/Images/Options_32x32.png new file mode 100644 index 0000000..1500302 Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/Options_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/SaveLog_32x32.png b/AutomatedRedump2IRD/Resources/Images/SaveLog_32x32.png new file mode 100644 index 0000000..9a7c79b Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/SaveLog_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/Images/Toolbar_32x32.png b/AutomatedRedump2IRD/Resources/Images/Toolbar_32x32.png new file mode 100644 index 0000000..114c907 Binary files /dev/null and b/AutomatedRedump2IRD/Resources/Images/Toolbar_32x32.png differ diff --git a/AutomatedRedump2IRD/Resources/ROMs/put your roms in this directory.txt b/AutomatedRedump2IRD/Resources/ROMs/put your roms in this directory.txt new file mode 100644 index 0000000..6d78808 --- /dev/null +++ b/AutomatedRedump2IRD/Resources/ROMs/put your roms in this directory.txt @@ -0,0 +1 @@ +This file can be deleted. \ No newline at end of file diff --git a/AutomatedRedump2IRD/Resources/Reports/put your reports in this directory.txt b/AutomatedRedump2IRD/Resources/Reports/put your reports in this directory.txt new file mode 100644 index 0000000..6d78808 --- /dev/null +++ b/AutomatedRedump2IRD/Resources/Reports/put your reports in this directory.txt @@ -0,0 +1 @@ +This file can be deleted. \ No newline at end of file diff --git a/AutomatedRedump2IRD/Resources/Tmp/put your tmp files in this directory.txt b/AutomatedRedump2IRD/Resources/Tmp/put your tmp files in this directory.txt new file mode 100644 index 0000000..6d78808 --- /dev/null +++ b/AutomatedRedump2IRD/Resources/Tmp/put your tmp files in this directory.txt @@ -0,0 +1 @@ +This file can be deleted. \ No newline at end of file diff --git a/AutomatedRedump2IRD/Resources/redump.ps3.sqlite.db b/AutomatedRedump2IRD/Resources/redump.ps3.sqlite.db new file mode 100644 index 0000000..48a08f7 Binary files /dev/null and b/AutomatedRedump2IRD/Resources/redump.ps3.sqlite.db differ diff --git a/AutomatedRedump2IRD/packages.config b/AutomatedRedump2IRD/packages.config new file mode 100644 index 0000000..64d58aa --- /dev/null +++ b/AutomatedRedump2IRD/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a5e1165 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,29 @@ +Version 0.0.8 - 2025-07-31 + +* Update repository info and related URLs +* Minor changes + +Version 0.0.7 - 2024-09-06 + +* New repository created and URLs fixed +* Minor changes + +Version 0.0.6 - 2023-06-12 + +* Add SQLite DB browser + +Version 0.0.5 - 2023-05-27 + +* Fix GUI SQLite DB file selector +* Fix some cross threading issues with 2 way data binding +* Update all documentation +* Minor code changes + +Version 0.0.4 - 2023-04-30 + +* Add CHANGELOG file + +Version 0.0.3 - 2023-00-00 + +* Update to .NET Framework 4.8 +* Initial release diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..41dd9eb --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,127 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..1c424d4 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,25 @@ +# @AutomatedRedump2IRD +### The Original Automated IRD Builder +## Contributing +Let's work better together. We are looking to collaborate with like-minded people who want to contribute in any capacity. Collaboration is open to everyone and we need your help if you are a: +* Collector +* Database Administrator +* Datter +* Developer +* Dumper +* Graphic Artist +* Translator +* Player +* Tester + +Feel free to: +* Fork the repository +* Create an issue +* Branch your repository with the issue number and a meaningful name related to the changes you are making +* Create a pull request + +## Contact +GitEmAll: [https://gitemall.devemall.int.eu.org/TommySalami/AutomatedRedump2IRD](https://gitemall.devemall.int.eu.org/TommySalami/AutomatedRedump2IRD "GitEmAll") + +--- +###### Copyright (c) 2016-2025 Automated Redump 2 IRD - All Rights Reserved v2025-07-31-00 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b69f11e --- /dev/null +++ b/LICENSE @@ -0,0 +1,40 @@ +*************************************************************** +Automated Redump 2 IRD - License version 20250731 +Copyright (c) 2016-2025 Automated Redump 2 IRD +All Rights Reserved +*************************************************************** + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Redistributions in any form are not permitted whatsoever, + under any conditions. + +2. This software may not be reverse engineered, decompiled, + or disassembled. + +3. Automated Redump 2 IRD may publish revised and/or new + versions of the license from time to time. Each version + will be given a distinguishing version number. No one other + than Automated Redump 2 IRD has the right to modify the + terms applicable to covered code created under this + License. + +4. It is your responsibility to use this software in accordance + with all applicable laws. + +*************************************************************** + +THIS SOFTWARE IS PROVIDED BY THE AUTOMATED REDUMP 2 IRD +DEVELOPMENT TEAM 'AS IS' AND ANY EXPRESSED OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTOMATED REDUMP +2 IRD DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6a9fca1 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# @AutomatedRedump2IRD +### The Original Automated IRD Builder +## About +Automated Redump 2 IRD, or AR2I is The Original Automated IRD Builder. + +Automated Redump 2 IRD builds all the IRDs for all of the ISO files and Zipped ISO files in a directory recursively, using information from an SQLite DB. + +The SQLite database can be viewed and edited directly from the app, allowing you to add IRDs and ISOs to the database. + +IRDs cannot be built for ROMs with nonmatching titles. Please use a ROM manager to rename your ROMs to match the correct title in the DB. + +IRDs are named using the MD5 hash value of the Redump ISO, enabling you to collect the IRDs in the IRDs folder. +## Dependencies +.NET Framework 4 + +The following NuGet Packages are required to build a Debug and/or Release version of this app: +* System.Data.SQLite.Core + +This app does not ship with the following necessary IsoTools Libraries, which are distributed with IsoTools. +* DiscUtils.dll +* Ionic.Zip.dll +* IsoTools.Common.dll +* Microsoft.CompilerServices.AsyncTargetingPack.Net4.dll + +Place these libraries in the AutomatedRedump2IRD/Resources/Libs/IsoTools.1.34.9 project folder. + +IsoTools appears to have been discontinued. We do not know where to find the necessary libraries. +## Projects +* AutomatedRedump2IRD - Windows Forms App +* AutomatedRedump2IRD-Release - Release Project +## How to Build IRDs +* If you have an account at Automated Redump 2 IRD, set your username and password by editing the Options from the GUI. This will allow you to send IRDs to the database. +* Rename your ROMs using a ROM manager to match the Redump DB you are using. +* Place your Redump DB file in the DB directory, or set the path to it. +* Set the other paths and options as needed. +* Click one of the Build IRDs buttons. +## Contributing +Let's work better together. We are looking to collaborate with like-minded people who want to contribute in any capacity. Collaboration is open to everyone and we need your help if you are a: +* Collector +* Database Administrator +* Datter +* Developer +* Dumper +* Graphic Artist +* Translator +* Player +* Tester + +Feel free to: +* Fork the repository +* Create an issue +* Branch your repository with the issue number and a meaningful name related to the changes you are making +* Create a pull request + +## Contact +GitEmAll: [https://gitemall.devemall.int.eu.org/TommySalami/AutomatedRedump2IRD](https://gitemall.devemall.int.eu.org/TommySalami/AutomatedRedump2IRD "GitEmAll") + +--- +###### Copyright (c) 2016-2025 Automated Redump 2 IRD - All Rights Reserved v2025-07-31-00 diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..a38578c --- /dev/null +++ b/TODO.md @@ -0,0 +1,5 @@ +### To Do +* Nothing to do + +### Completed Tasks +* Develop initial release