From 6ac6a3051696fa82799cc41f9b9700da7d21c025 Mon Sep 17 00:00:00 2001 From: givememystuffplease Date: Sat, 10 Jul 2010 03:32:53 +0000 Subject: [PATCH] Database scripts now located and added. --- NUS Downloader/Database.cs | 43 ++++ NUS Downloader/Form1.Designer.cs | 265 ++++++++++------------- NUS Downloader/Form1.cs | 72 +++--- NUS Downloader/Latest/NUS Downloader.exe | Bin 425472 -> 422912 bytes NUS Downloader/NUS Downloader.csproj | 1 - NUS Downloader/WADPacker.cs | 225 ------------------- 6 files changed, 198 insertions(+), 408 deletions(-) delete mode 100644 NUS Downloader/WADPacker.cs diff --git a/NUS Downloader/Database.cs b/NUS Downloader/Database.cs index c7a4471..44a7f25 100644 --- a/NUS Downloader/Database.cs +++ b/NUS Downloader/Database.cs @@ -19,6 +19,7 @@ namespace NUS_Downloader private string IosTag = "IOS"; private string VcTag = "VC"; private string WwTag = "WW"; + private string UpdateTag = "UPD"; private string[] VcConsoles = new string[11] { "C64", "GEN", "MSX", "N64", "NEO", "NES", "SMS", "SNES", "TG16", "TGCD", "ARC" }; @@ -574,5 +575,47 @@ namespace NUS_Downloader return regionItems; } + + public ToolStripMenuItem[] LoadScripts() + { + if (databaseString.Length < 1) + { + throw new Exception("Load the database into a memory stream first!"); + } + + XmlDocument xDoc = new XmlDocument(); + xDoc.LoadXml(databaseString); + + XmlNodeList ScriptXMLNodes = xDoc.GetElementsByTagName(UpdateTag); + + ToolStripMenuItem[] scriptCollection = new ToolStripMenuItem[ScriptXMLNodes.Count]; + + for (int x = 0; x < ScriptXMLNodes.Count; x++) + { + ToolStripMenuItem XMLToolStripItem = new ToolStripMenuItem(); + XmlAttributeCollection XMLAttributes = ScriptXMLNodes[x].Attributes; + XmlNodeList ChildrenOfTheNode = ScriptXMLNodes[x].ChildNodes; + + for (int z = 0; z < ChildrenOfTheNode.Count; z++) + { + switch (ChildrenOfTheNode[z].Name) + { + case "name": + XMLToolStripItem.Text = ChildrenOfTheNode[z].InnerText; + break; + case "script": + XMLToolStripItem.ToolTipText = ChildrenOfTheNode[z].InnerText; + break; + default: + break; + } + XMLToolStripItem.Image = Properties.Resources.script_start; + + } + scriptCollection[x] = XMLToolStripItem; + } + + return scriptCollection; + } } } diff --git a/NUS Downloader/Form1.Designer.cs b/NUS Downloader/Form1.Designer.cs index 34fc003..08cc985 100644 --- a/NUS Downloader/Form1.Designer.cs +++ b/NUS Downloader/Form1.Designer.cs @@ -63,14 +63,19 @@ namespace NUS_Downloader this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.RegionCodesList = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.updateDatabaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.extrasStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.loadInfoFromTMDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.proxySettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutNUSDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.proxyBox = new System.Windows.Forms.GroupBox(); this.label13 = new System.Windows.Forms.Label(); this.label12 = new System.Windows.Forms.Label(); this.ProxyUser = new System.Windows.Forms.TextBox(); this.SaveProxyBtn = new System.Windows.Forms.Button(); + this.ProxyAssistBtn = new System.Windows.Forms.Button(); this.ProxyURL = new System.Windows.Forms.TextBox(); this.ProxyVerifyBox = new System.Windows.Forms.GroupBox(); this.SaveProxyPwdPermanentBtn = new System.Windows.Forms.Button(); @@ -81,7 +86,15 @@ namespace NUS_Downloader this.consoleCBox = new System.Windows.Forms.ComboBox(); this.scriptsbutton = new System.Windows.Forms.Button(); this.scriptsStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.scriptsLocalMenuEntry = new System.Windows.Forms.ToolStripMenuItem(); + this.scriptsDatabaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.loadNUSScriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.emulateUpdate = new System.Windows.Forms.ToolStripMenuItem(); + this.uSANTSCToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.europePALToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.japanNTSCJToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.koreaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.iosPatchGroupBox = new System.Windows.Forms.GroupBox(); this.label2 = new System.Windows.Forms.Label(); this.iosPatchesListBox = new System.Windows.Forms.CheckedListBox(); @@ -89,28 +102,12 @@ namespace NUS_Downloader this.richPanel = new System.Windows.Forms.Panel(); this.saveaswadbtn = new System.Windows.Forms.Button(); this.iosPatchCheckbox = new System.Windows.Forms.CheckBox(); - this.ProxyAssistBtn = new System.Windows.Forms.Button(); this.databaseButton = new System.Windows.Forms.Button(); this.keepenccontents = new System.Windows.Forms.CheckBox(); this.clearButton = new System.Windows.Forms.Button(); this.packbox = new System.Windows.Forms.CheckBox(); this.decryptbox = new System.Windows.Forms.CheckBox(); this.localuse = new System.Windows.Forms.CheckBox(); - this.updateDatabaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.loadInfoFromTMDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.proxySettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.aboutNUSDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.scriptsLocalMenuEntry = new System.Windows.Forms.ToolStripMenuItem(); - this.scriptsDatabaseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PALMassUpdate = new System.Windows.Forms.ToolStripMenuItem(); - this.NTSCMassUpdate = new System.Windows.Forms.ToolStripMenuItem(); - this.KoreaMassUpdate = new System.Windows.Forms.ToolStripMenuItem(); - this.loadNUSScriptToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.emulateUpdate = new System.Windows.Forms.ToolStripMenuItem(); - this.uSANTSCToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.europePALToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.japanNTSCJToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.koreaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.titleversion = new wmgCMS.WaterMarkTextBox(); this.titleidbox = new wmgCMS.WaterMarkTextBox(); this.dlprogress = new wyDay.Controls.Windows7ProgressBar(); @@ -324,6 +321,14 @@ namespace NUS_Downloader this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Size = new System.Drawing.Size(160, 6); // + // updateDatabaseToolStripMenuItem + // + this.updateDatabaseToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.database_save; + this.updateDatabaseToolStripMenuItem.Name = "updateDatabaseToolStripMenuItem"; + this.updateDatabaseToolStripMenuItem.Size = new System.Drawing.Size(163, 22); + this.updateDatabaseToolStripMenuItem.Text = "Update Database"; + this.updateDatabaseToolStripMenuItem.Click += new System.EventHandler(this.updateDatabaseToolStripMenuItem_Click); + // // extrasStrip // this.extrasStrip.AllowMerge = false; @@ -336,16 +341,40 @@ namespace NUS_Downloader this.extrasStrip.Name = "extrasStrip"; this.extrasStrip.Size = new System.Drawing.Size(183, 82); // + // loadInfoFromTMDToolStripMenuItem + // + this.loadInfoFromTMDToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.page_white_magnify; + this.loadInfoFromTMDToolStripMenuItem.Name = "loadInfoFromTMDToolStripMenuItem"; + this.loadInfoFromTMDToolStripMenuItem.Size = new System.Drawing.Size(182, 22); + this.loadInfoFromTMDToolStripMenuItem.Text = "Load Info from TMD"; + this.loadInfoFromTMDToolStripMenuItem.Click += new System.EventHandler(this.loadInfoFromTMDToolStripMenuItem_Click); + // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; this.toolStripSeparator3.Size = new System.Drawing.Size(179, 6); // + // proxySettingsToolStripMenuItem + // + this.proxySettingsToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.server_link; + this.proxySettingsToolStripMenuItem.Name = "proxySettingsToolStripMenuItem"; + this.proxySettingsToolStripMenuItem.Size = new System.Drawing.Size(182, 22); + this.proxySettingsToolStripMenuItem.Text = "Proxy Settings"; + this.proxySettingsToolStripMenuItem.Click += new System.EventHandler(this.proxySettingsToolStripMenuItem_Click); + // // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; this.toolStripSeparator6.Size = new System.Drawing.Size(179, 6); // + // aboutNUSDToolStripMenuItem + // + this.aboutNUSDToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.information; + this.aboutNUSDToolStripMenuItem.Name = "aboutNUSDToolStripMenuItem"; + this.aboutNUSDToolStripMenuItem.Size = new System.Drawing.Size(182, 22); + this.aboutNUSDToolStripMenuItem.Text = "About NUSD"; + this.aboutNUSDToolStripMenuItem.Click += new System.EventHandler(this.aboutNUSDToolStripMenuItem_Click); + // // proxyBox // this.proxyBox.BackColor = System.Drawing.Color.White; @@ -400,6 +429,17 @@ namespace NUS_Downloader this.SaveProxyBtn.UseVisualStyleBackColor = true; this.SaveProxyBtn.Click += new System.EventHandler(this.SaveProxyBtn_Click); // + // ProxyAssistBtn + // + this.ProxyAssistBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.ProxyAssistBtn.Image = global::NUS_Downloader.Properties.Resources.help; + this.ProxyAssistBtn.Location = new System.Drawing.Point(177, 79); + this.ProxyAssistBtn.Name = "ProxyAssistBtn"; + this.ProxyAssistBtn.Size = new System.Drawing.Size(29, 26); + this.ProxyAssistBtn.TabIndex = 28; + this.ProxyAssistBtn.UseVisualStyleBackColor = true; + this.ProxyAssistBtn.Click += new System.EventHandler(this.ProxyAssistBtn_Click); + // // ProxyURL // this.ProxyURL.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; @@ -514,11 +554,72 @@ namespace NUS_Downloader this.scriptsStrip.ShowItemToolTips = false; this.scriptsStrip.Size = new System.Drawing.Size(220, 98); // + // scriptsLocalMenuEntry + // + this.scriptsLocalMenuEntry.Enabled = false; + this.scriptsLocalMenuEntry.Image = global::NUS_Downloader.Properties.Resources.script_code; + this.scriptsLocalMenuEntry.Name = "scriptsLocalMenuEntry"; + this.scriptsLocalMenuEntry.Size = new System.Drawing.Size(219, 22); + this.scriptsLocalMenuEntry.Text = "Scripts (Local)"; + // + // scriptsDatabaseToolStripMenuItem + // + this.scriptsDatabaseToolStripMenuItem.Enabled = false; + this.scriptsDatabaseToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.script_code_red; + this.scriptsDatabaseToolStripMenuItem.Name = "scriptsDatabaseToolStripMenuItem"; + this.scriptsDatabaseToolStripMenuItem.Size = new System.Drawing.Size(219, 22); + this.scriptsDatabaseToolStripMenuItem.Text = "Scripts (Database)"; + // + // loadNUSScriptToolStripMenuItem + // + this.loadNUSScriptToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.script_go; + this.loadNUSScriptToolStripMenuItem.Name = "loadNUSScriptToolStripMenuItem"; + this.loadNUSScriptToolStripMenuItem.Size = new System.Drawing.Size(219, 22); + this.loadNUSScriptToolStripMenuItem.Text = "Load NUS Script"; + this.loadNUSScriptToolStripMenuItem.Click += new System.EventHandler(this.loadNUSScriptToolStripMenuItem_Click); + // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(216, 6); // + // emulateUpdate + // + this.emulateUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.uSANTSCToolStripMenuItem, + this.europePALToolStripMenuItem, + this.japanNTSCJToolStripMenuItem, + this.koreaToolStripMenuItem}); + this.emulateUpdate.Image = global::NUS_Downloader.Properties.Resources.server_connect; + this.emulateUpdate.Name = "emulateUpdate"; + this.emulateUpdate.Size = new System.Drawing.Size(219, 22); + this.emulateUpdate.Text = "Emulate Wii System Update"; + this.emulateUpdate.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.emulateUpdate_DropDownItemClicked); + // + // uSANTSCToolStripMenuItem + // + this.uSANTSCToolStripMenuItem.Name = "uSANTSCToolStripMenuItem"; + this.uSANTSCToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.uSANTSCToolStripMenuItem.Text = "USA"; + // + // europePALToolStripMenuItem + // + this.europePALToolStripMenuItem.Name = "europePALToolStripMenuItem"; + this.europePALToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.europePALToolStripMenuItem.Text = "EUROPE"; + // + // japanNTSCJToolStripMenuItem + // + this.japanNTSCJToolStripMenuItem.Name = "japanNTSCJToolStripMenuItem"; + this.japanNTSCJToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.japanNTSCJToolStripMenuItem.Text = "JAPAN"; + // + // koreaToolStripMenuItem + // + this.koreaToolStripMenuItem.Name = "koreaToolStripMenuItem"; + this.koreaToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.koreaToolStripMenuItem.Text = "KOREA"; + // // iosPatchGroupBox // this.iosPatchGroupBox.Controls.Add(this.label2); @@ -612,17 +713,6 @@ namespace NUS_Downloader this.iosPatchCheckbox.UseVisualStyleBackColor = true; this.iosPatchCheckbox.CheckedChanged += new System.EventHandler(this.iosPatchCheckbox_CheckedChanged); // - // ProxyAssistBtn - // - this.ProxyAssistBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.ProxyAssistBtn.Image = global::NUS_Downloader.Properties.Resources.help; - this.ProxyAssistBtn.Location = new System.Drawing.Point(177, 79); - this.ProxyAssistBtn.Name = "ProxyAssistBtn"; - this.ProxyAssistBtn.Size = new System.Drawing.Size(29, 26); - this.ProxyAssistBtn.TabIndex = 28; - this.ProxyAssistBtn.UseVisualStyleBackColor = true; - this.ProxyAssistBtn.Click += new System.EventHandler(this.ProxyAssistBtn_Click); - // // databaseButton // this.databaseButton.FlatStyle = System.Windows.Forms.FlatStyle.Popup; @@ -713,124 +803,6 @@ namespace NUS_Downloader this.localuse.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; this.localuse.UseVisualStyleBackColor = true; // - // updateDatabaseToolStripMenuItem - // - this.updateDatabaseToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.database_save; - this.updateDatabaseToolStripMenuItem.Name = "updateDatabaseToolStripMenuItem"; - this.updateDatabaseToolStripMenuItem.Size = new System.Drawing.Size(163, 22); - this.updateDatabaseToolStripMenuItem.Text = "Update Database"; - this.updateDatabaseToolStripMenuItem.Click += new System.EventHandler(this.updateDatabaseToolStripMenuItem_Click); - // - // loadInfoFromTMDToolStripMenuItem - // - this.loadInfoFromTMDToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.page_white_magnify; - this.loadInfoFromTMDToolStripMenuItem.Name = "loadInfoFromTMDToolStripMenuItem"; - this.loadInfoFromTMDToolStripMenuItem.Size = new System.Drawing.Size(182, 22); - this.loadInfoFromTMDToolStripMenuItem.Text = "Load Info from TMD"; - this.loadInfoFromTMDToolStripMenuItem.Click += new System.EventHandler(this.loadInfoFromTMDToolStripMenuItem_Click); - // - // proxySettingsToolStripMenuItem - // - this.proxySettingsToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.server_link; - this.proxySettingsToolStripMenuItem.Name = "proxySettingsToolStripMenuItem"; - this.proxySettingsToolStripMenuItem.Size = new System.Drawing.Size(182, 22); - this.proxySettingsToolStripMenuItem.Text = "Proxy Settings"; - this.proxySettingsToolStripMenuItem.Click += new System.EventHandler(this.proxySettingsToolStripMenuItem_Click); - // - // aboutNUSDToolStripMenuItem - // - this.aboutNUSDToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.information; - this.aboutNUSDToolStripMenuItem.Name = "aboutNUSDToolStripMenuItem"; - this.aboutNUSDToolStripMenuItem.Size = new System.Drawing.Size(182, 22); - this.aboutNUSDToolStripMenuItem.Text = "About NUSD"; - this.aboutNUSDToolStripMenuItem.Click += new System.EventHandler(this.aboutNUSDToolStripMenuItem_Click); - // - // scriptsLocalMenuEntry - // - this.scriptsLocalMenuEntry.Enabled = false; - this.scriptsLocalMenuEntry.Image = global::NUS_Downloader.Properties.Resources.script_code; - this.scriptsLocalMenuEntry.Name = "scriptsLocalMenuEntry"; - this.scriptsLocalMenuEntry.Size = new System.Drawing.Size(219, 22); - this.scriptsLocalMenuEntry.Text = "Scripts (Local)"; - // - // scriptsDatabaseToolStripMenuItem - // - this.scriptsDatabaseToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.PALMassUpdate, - this.NTSCMassUpdate, - this.KoreaMassUpdate}); - this.scriptsDatabaseToolStripMenuItem.Enabled = false; - this.scriptsDatabaseToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.script_code_red; - this.scriptsDatabaseToolStripMenuItem.Name = "scriptsDatabaseToolStripMenuItem"; - this.scriptsDatabaseToolStripMenuItem.Size = new System.Drawing.Size(219, 22); - this.scriptsDatabaseToolStripMenuItem.Text = "Scripts (Database)"; - // - // PALMassUpdate - // - this.PALMassUpdate.Enabled = false; - this.PALMassUpdate.Name = "PALMassUpdate"; - this.PALMassUpdate.Size = new System.Drawing.Size(104, 22); - this.PALMassUpdate.Text = "PAL"; - // - // NTSCMassUpdate - // - this.NTSCMassUpdate.Enabled = false; - this.NTSCMassUpdate.Name = "NTSCMassUpdate"; - this.NTSCMassUpdate.Size = new System.Drawing.Size(104, 22); - this.NTSCMassUpdate.Text = "NTSC"; - // - // KoreaMassUpdate - // - this.KoreaMassUpdate.Enabled = false; - this.KoreaMassUpdate.Name = "KoreaMassUpdate"; - this.KoreaMassUpdate.Size = new System.Drawing.Size(104, 22); - this.KoreaMassUpdate.Text = "Korea"; - // - // loadNUSScriptToolStripMenuItem - // - this.loadNUSScriptToolStripMenuItem.Image = global::NUS_Downloader.Properties.Resources.script_go; - this.loadNUSScriptToolStripMenuItem.Name = "loadNUSScriptToolStripMenuItem"; - this.loadNUSScriptToolStripMenuItem.Size = new System.Drawing.Size(219, 22); - this.loadNUSScriptToolStripMenuItem.Text = "Load NUS Script"; - this.loadNUSScriptToolStripMenuItem.Click += new System.EventHandler(this.loadNUSScriptToolStripMenuItem_Click); - // - // emulateUpdate - // - this.emulateUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.uSANTSCToolStripMenuItem, - this.europePALToolStripMenuItem, - this.japanNTSCJToolStripMenuItem, - this.koreaToolStripMenuItem}); - this.emulateUpdate.Image = global::NUS_Downloader.Properties.Resources.server_connect; - this.emulateUpdate.Name = "emulateUpdate"; - this.emulateUpdate.Size = new System.Drawing.Size(219, 22); - this.emulateUpdate.Text = "Emulate Wii System Update"; - this.emulateUpdate.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.emulateUpdate_DropDownItemClicked); - // - // uSANTSCToolStripMenuItem - // - this.uSANTSCToolStripMenuItem.Name = "uSANTSCToolStripMenuItem"; - this.uSANTSCToolStripMenuItem.Size = new System.Drawing.Size(117, 22); - this.uSANTSCToolStripMenuItem.Text = "USA"; - // - // europePALToolStripMenuItem - // - this.europePALToolStripMenuItem.Name = "europePALToolStripMenuItem"; - this.europePALToolStripMenuItem.Size = new System.Drawing.Size(117, 22); - this.europePALToolStripMenuItem.Text = "EUROPE"; - // - // japanNTSCJToolStripMenuItem - // - this.japanNTSCJToolStripMenuItem.Name = "japanNTSCJToolStripMenuItem"; - this.japanNTSCJToolStripMenuItem.Size = new System.Drawing.Size(117, 22); - this.japanNTSCJToolStripMenuItem.Text = "JAPAN"; - // - // koreaToolStripMenuItem - // - this.koreaToolStripMenuItem.Name = "koreaToolStripMenuItem"; - this.koreaToolStripMenuItem.Size = new System.Drawing.Size(117, 22); - this.koreaToolStripMenuItem.Text = "KOREA"; - // // titleversion // this.titleversion.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -977,9 +949,6 @@ namespace NUS_Downloader private System.Windows.Forms.ToolStripMenuItem scriptsLocalMenuEntry; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripMenuItem scriptsDatabaseToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem PALMassUpdate; - private System.Windows.Forms.ToolStripMenuItem NTSCMassUpdate; - private System.Windows.Forms.ToolStripMenuItem KoreaMassUpdate; private System.Windows.Forms.ToolStripMenuItem aboutNUSDToolStripMenuItem; private System.Windows.Forms.CheckBox checkBox1; private System.Windows.Forms.Button SaveProxyPwdPermanentBtn; diff --git a/NUS Downloader/Form1.cs b/NUS Downloader/Form1.cs index 83891f5..21b1417 100644 --- a/NUS Downloader/Form1.cs +++ b/NUS Downloader/Form1.cs @@ -38,7 +38,7 @@ using System.Diagnostics; namespace NUS_Downloader { - public partial class Form1 : Form + partial class Form1 : Form { private readonly string CURRENT_DIR = Directory.GetCurrentDirectory(); @@ -115,9 +115,10 @@ namespace NUS_Downloader WriteStatus("REMEMBER TO CHANGE TO THE RELEASE CONFIGURATION AND CHANGE VERSION NUMBER BEFORE BUILDING!", warningcolor); WriteStatus("\r\n"); } + /* KoreaMassUpdate.DropDownItemClicked += new ToolStripItemClickedEventHandler(upditem_itemclicked); NTSCMassUpdate.DropDownItemClicked += new ToolStripItemClickedEventHandler(upditem_itemclicked); - PALMassUpdate.DropDownItemClicked += new ToolStripItemClickedEventHandler(upditem_itemclicked); + PALMassUpdate.DropDownItemClicked += new ToolStripItemClickedEventHandler(upditem_itemclicked);*/ // Database BGLoader this.fds = new BackgroundWorker(); @@ -251,6 +252,7 @@ namespace NUS_Downloader ClearDatabaseStrip(); FillDatabaseStrip(worker); LoadRegionCodes(); + FillDatabaseScripts(); ShowInnerToolTips(false); } @@ -259,10 +261,11 @@ namespace NUS_Downloader //this.databaseButton.Enabled = true; this.databaseButton.Text = "Database..."; this.databaseButton.Image = null; + /* if (this.KoreaMassUpdate.HasDropDownItems || this.PALMassUpdate.HasDropDownItems || this.NTSCMassUpdate.HasDropDownItems) { this.scriptsbutton.Enabled = true; - } + }*/ } private void DoAllDatabaseyStuff_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) @@ -1375,7 +1378,6 @@ namespace NUS_Downloader // TODO: make this check InvokeRequired... if (this.InvokeRequired) { - Debug.Write("TOLDYOUSO!"); BootChecksCallback bcc = new BootChecksCallback(LoadRegionCodes); this.Invoke(bcc); return; @@ -1468,6 +1470,18 @@ namespace NUS_Downloader // Do nothing, some objects will not cast. } } + foreach (ToolStripItem item in scriptsStrip.Items) + { + try + { + ToolStripMenuItem menuitem = (ToolStripMenuItem)item; + menuitem.DropDown.ShowItemToolTips = false; + } + catch (Exception) + { + // Do nothing, some objects will not cast. + } + } } /// @@ -1561,36 +1575,6 @@ namespace NUS_Downloader return resultArray; } - /* - /// - /// Does byte[] contain byte[]? - /// - /// The large byte[]. - /// Small byte[] which may be in large one. - /// messed up int[] with offsets. - private int[] ByteArrayContainsByteArray(byte[] bigboy, byte[] littleman) - { - // bigboy.Contains(littleman); - // returns offset { cnt , ofst }; - int[] offset = new int[5]; - for (int a = 0; a < (bigboy.Length - littleman.Length); a++) - { - int matches = 0; - for (int b = 0; b < littleman.Length; b++) - { - if (bigboy[a + b] == littleman[b]) - matches += 1; - } - if (matches == littleman.Length) - { - offset[offset[0] + 1] = a; - offset[0] += 1; - } - } - - return offset; - }*/ - private WebClient ConfigureWithProxy(WebClient client) { // Proxy @@ -2422,5 +2406,25 @@ namespace NUS_Downloader iosPatchCheckbox.Checked = false; //packbox.Enabled = false; } + + private void FillDatabaseScripts() + { + Database databaseObj = new Database(); + databaseObj.LoadDatabaseToStream(Path.Combine(CURRENT_DIR, "database.xml")); + + ToolStripMenuItem[] scriptItems = databaseObj.LoadScripts(); + for (int a = 0; a < scriptItems.Length; a++) + { + scriptItems[a].DropDownItemClicked += new ToolStripItemClickedEventHandler(ScriptItem_Clicked); + + AddToolStripItemToStrip(scriptsDatabaseToolStripMenuItem, scriptItems[a]); + //SystemMenuList.DropDownItems.Add(systemItems[a]); + } + SetPropertyThreadSafe(scriptsDatabaseToolStripMenuItem, true, "Enabled"); + SetPropertyThreadSafe(scriptsDatabaseToolStripMenuItem, true, "Visible"); + } + + public void ScriptItem_Clicked(object sender, ToolStripItemClickedEventArgs e) + { } } } \ No newline at end of file diff --git a/NUS Downloader/Latest/NUS Downloader.exe b/NUS Downloader/Latest/NUS Downloader.exe index c287ba378b78f107de69f2110143bb9bd19ebc91..b12248eaab509be4db46d8072cf516cf724158d4 100644 GIT binary patch delta 60206 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

4rGakXi!M+G>^S}{xZD(enM4B&4ax@bQLEJdlx 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 delta 63186 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 IRXqOx0BHUZtN;K2 diff --git a/NUS Downloader/NUS Downloader.csproj b/NUS Downloader/NUS Downloader.csproj index 8e93624..a7f6af2 100644 --- a/NUS Downloader/NUS Downloader.csproj +++ b/NUS Downloader/NUS Downloader.csproj @@ -121,7 +121,6 @@ - Component diff --git a/NUS Downloader/WADPacker.cs b/NUS Downloader/WADPacker.cs deleted file mode 100644 index 1e1f656..0000000 --- a/NUS Downloader/WADPacker.cs +++ /dev/null @@ -1,225 +0,0 @@ -/////////////////////////////////////////// -// NUS Downloader: WADPacker.cs // -// $Rev:: $ // -// $Author:: $ // -// $Date:: $ // -/////////////////////////////////////////// - -/////////////////////////////////////// -// Copyright (C) 2010 -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see -/////////////////////////////////////// - -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace NUS_Downloader -{ - ///

- /// Class for handling WAD Packaging. - /// - class WADPacker - { - // WAD Component Variables - private byte[] Certsys; - public byte[] Certs { get { return Certsys;} set { Certsys = value; CertChainSize = Certsys.Length; } } - private byte[] tmd; - public byte[] TMD { get { return tmd; } - set - { - tmd = value; - TMDContentCount = ContentCount(TMD); - TMDSize = 484 + (TMDContentCount * 36); - } } - public byte[] Ticket; - private int TMDContentCount; - - // WAD Contents - private byte[][] TMDContents; - public byte[][] Contents { get { return TMDContents; } - set { - TMDContents = value; - for (int a = 0; a < TMDContents.Length; a++) - { - DataSize += TMDContents[a].Length; - } - } } - - // WAD Saving Variables - public string Directory; - public string FileName; - - // TMD Informations - public string[] tmdnames; - public string[] tmdsizes; - - // WAD Header Variables - private const int HeaderSize = 0x20; - private int CertChainSize; - private const int TicketSize = 0x2A4; - private int TMDSize; - private int DataSize; - private byte[] WADMagic = new byte[8] { 0x00, 0x00, 0x00, 0x20, 0x49, 0x73, 0x00, 0x00 }; - private byte[] RESERVED_CONST = new byte[4] { 0x00, 0x00, 0x00, 0x00 }; - private byte[] TIKSIZE_CONST = new byte[4] { 0x00, 0x00, 0x02, 0xA4 }; - - // Report Status back in EventHandler - public delegate void StatusChangedEventHandler(string status); - public event StatusChangedEventHandler StatusChanged; - - - /// - /// Pads byte[]. - /// - /// The byte[] or binary to be padded. - /// How much to pad by. - /// Padded byte[] - private long PadToMultipleOf(long src, int pad) - { - long len = (src + pad - 1) / pad * pad; - return len; - } - - /// - /// Converts an integer into its equivilant byte array. - /// - /// The integer - /// Length you desire the byte[] to be. - /// - private byte[] ConvertInttoByteArray(int theInt, int arrayLen) - { - byte[] resultArray = new byte[arrayLen]; - for (int i = arrayLen - 1; i >= 0; i--) - { - resultArray[i] = (byte)((theInt >> (8 * i)) & 0xFF); - } - Array.Reverse(resultArray); - - // Fix duplication, rewrite extra to 0x00; - if (arrayLen > 4) - { - for (int i = 0; i < (arrayLen - 4); i++) - resultArray[i] = 0x00; - } - return resultArray; - } - - /// - /// Handles the size mismatch. - /// - /// The contentsize. - /// The actualsize. - void HandleMismatch(int contentsize, int actualsize) - { - if (contentsize != actualsize) - if ((contentsize - actualsize) > 16) - StatusChanged(String.Format(" (BAD Mismatch) (Dif: {0}", (contentsize - actualsize))); - //else - //statusbox.Text += " (Safe Mismatch)"; - } - - /// - /// Returns content count of TMD - /// - /// The TMD. - /// int Count of Contents - private int ContentCount(byte[] tmd) - { - return (tmd[0x1DE] * 256) + tmd[0x1DF]; - } - - /// - /// Packs the WAD file, saves it to specified location. - /// - public void PackWAD() - { - if ((String.IsNullOrEmpty(Directory)) || (String.IsNullOrEmpty(FileName))) - { - StatusChanged("ERROR: No Directory/FileName provided!"); - return; - } - - FileStream wadfs = new FileStream(Path.Combine(Directory, FileName), FileMode.Create); - - // Seek the beginning of the WAD... - wadfs.Seek(0, SeekOrigin.Begin); - - // Write initial part of header (WADType) - wadfs.Write(WADMagic, 0, WADMagic.Length); - - // Write CertChainLength - wadfs.Seek(0x08, SeekOrigin.Begin); - byte[] chainsize = ConvertInttoByteArray(CertChainSize, 4); - wadfs.Write(chainsize, 0, chainsize.Length); - - // Write res - wadfs.Seek(0x0C, SeekOrigin.Begin); - wadfs.Write(RESERVED_CONST, 0, RESERVED_CONST.Length); - - // Write ticketsize - wadfs.Seek(0x10, SeekOrigin.Begin); - wadfs.Write(TIKSIZE_CONST, 0, TIKSIZE_CONST.Length); - - // Write tmdsize - wadfs.Seek(0x14, SeekOrigin.Begin); - byte[] tmdsize = ConvertInttoByteArray(TMDSize, 4); - wadfs.Write(tmdsize, 0, tmdsize.Length); - - // Write data size - wadfs.Seek(0x18, SeekOrigin.Begin); - wadfs.Write(ConvertInttoByteArray(DataSize, 4), 0, 4); - StatusChanged(" - Header wrote (0x00)"); - - // Write cert[] to 0x40. - wadfs.Seek(0x40, SeekOrigin.Begin); - wadfs.Write(Certsys, 0, Certsys.Length); - StatusChanged(String.Format(" - Certs wrote (0x{0})", Convert.ToString(64, 16))); - - // Pad to next 64 byte boundary. - wadfs.Seek(2624, SeekOrigin.Begin); - - // Write ticket at this point... - wadfs.Write(Ticket, 0, TicketSize); - StatusChanged(String.Format(" - Ticket wrote (0x{0})", Convert.ToString((wadfs.Length - 0x2A4), 16))); - - // Pad to next 64 byte boundary. - wadfs.Seek(PadToMultipleOf(wadfs.Length, 64), SeekOrigin.Begin); - - // Write TMD at this point... - wadfs.Write(tmd, 0, TMDSize); - StatusChanged(String.Format(" - TMD wrote (0x{0})", Convert.ToString((wadfs.Length - TMDSize), 16))); - - // Add the individual contents - for (int a = 0; a < TMDContentCount; a++) - { - // Pad to next 64 byte boundary... - wadfs.Seek(PadToMultipleOf(wadfs.Length, 64), SeekOrigin.Begin); - - wadfs.Write(TMDContents[a], 0, Contents[a].Length); - - StatusChanged(String.Format(" - {0} wrote (0x{1})", tmdnames[a], Convert.ToString((wadfs.Length - TMDContents[a].Length), 16))); - HandleMismatch(int.Parse(tmdsizes[a], System.Globalization.NumberStyles.HexNumber), TMDContents[a].Length); - } - - // Close filesystem... - wadfs.Close(); - - // Finished. - StatusChanged("WAD Created: " + FileName); - } - } -}