From e770c154584be2fdec18c3e0f778cf1292e7fc91 Mon Sep 17 00:00:00 2001 From: givememystuffplease Date: Thu, 9 Jul 2009 02:11:22 +0000 Subject: [PATCH] Small Changes. Images in the database display. Beta2 of v1.2 --- NUS Downloader/Form1.Designer.cs | 75 +++++----- NUS Downloader/Form1.cs | 137 +++++++++++++++--- NUS Downloader/NUS Downloader.csproj | 7 +- .../Properties/Resources.Designer.cs | 37 ++++- NUS Downloader/Properties/Resources.resx | 15 ++ NUS Downloader/Resources/bullet_green.png | Bin 0 -> 295 bytes NUS Downloader/Resources/bullet_orange.png | Bin 0 -> 283 bytes NUS Downloader/Resources/bullet_red.png | Bin 0 -> 287 bytes NUS Downloader/Resources/bullet_redgreen.png | Bin 0 -> 3107 bytes NUS Downloader/Resources/bullet_redorange.png | Bin 0 -> 3086 bytes 10 files changed, 213 insertions(+), 58 deletions(-) create mode 100644 NUS Downloader/Resources/bullet_green.png create mode 100644 NUS Downloader/Resources/bullet_orange.png create mode 100644 NUS Downloader/Resources/bullet_red.png create mode 100644 NUS Downloader/Resources/bullet_redgreen.png create mode 100644 NUS Downloader/Resources/bullet_redorange.png diff --git a/NUS Downloader/Form1.Designer.cs b/NUS Downloader/Form1.Designer.cs index 1064fa5..b7ea77c 100644 --- a/NUS Downloader/Form1.Designer.cs +++ b/NUS Downloader/Form1.Designer.cs @@ -41,8 +41,6 @@ this.titleversion = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); - this.radioButton2 = new System.Windows.Forms.RadioButton(); - this.radioButton1 = new System.Windows.Forms.RadioButton(); this.button2 = new System.Windows.Forms.Button(); this.getcerts = new System.Windows.Forms.Button(); this.wadnamebox = new System.Windows.Forms.TextBox(); @@ -96,6 +94,8 @@ this.label12 = new System.Windows.Forms.Label(); this.shamelessvariablelabel = new System.Windows.Forms.Label(); this.button3 = new System.Windows.Forms.Button(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); this.databaseStrip.SuspendLayout(); this.tmdgpbox.SuspendLayout(); this.ticketgpbox.SuspendLayout(); @@ -210,30 +210,6 @@ this.label2.TabIndex = 11; this.label2.Text = "Enter a Title ID Below:"; // - // radioButton2 - // - this.radioButton2.Image = global::NUS_Downloader.Properties.Resources.dsi; - this.radioButton2.ImageAlign = System.Drawing.ContentAlignment.TopCenter; - this.radioButton2.Location = new System.Drawing.Point(78, 385); - this.radioButton2.Name = "radioButton2"; - this.radioButton2.Size = new System.Drawing.Size(74, 31); - this.radioButton2.TabIndex = 13; - this.radioButton2.UseVisualStyleBackColor = true; - this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged); - // - // radioButton1 - // - this.radioButton1.BackColor = System.Drawing.Color.Transparent; - this.radioButton1.Checked = true; - this.radioButton1.Image = global::NUS_Downloader.Properties.Resources.wilolgoi; - this.radioButton1.Location = new System.Drawing.Point(12, 385); - this.radioButton1.Name = "radioButton1"; - this.radioButton1.Size = new System.Drawing.Size(60, 31); - this.radioButton1.TabIndex = 12; - this.radioButton1.TabStop = true; - this.radioButton1.UseVisualStyleBackColor = false; - this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged); - // // button2 // this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Popup; @@ -309,7 +285,8 @@ this.toolStripSeparator1, this.RegionCodesList}); this.databaseStrip.Name = "databaseStrip"; - this.databaseStrip.Size = new System.Drawing.Size(155, 120); + this.databaseStrip.ShowItemToolTips = false; + this.databaseStrip.Size = new System.Drawing.Size(155, 142); // // SystemMenuList // @@ -328,16 +305,16 @@ // this.VCMenuList.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.C64MenuList, + this.GenesisMenuList, + this.MSXMenuList, + this.N64MenuList, this.NeoGeoMenuList, this.NESMenuList, - this.SNESMenuList, - this.N64MenuList, - this.MSXMenuList, - this.TurboGrafx16MenuList, this.SegaMSMenuList, - this.GenesisMenuList, - this.VCArcadeMenuList, - this.TurboGrafxCDMenuList}); + this.SNESMenuList, + this.TurboGrafx16MenuList, + this.TurboGrafxCDMenuList, + this.VCArcadeMenuList}); this.VCMenuList.Name = "VCMenuList"; this.VCMenuList.Size = new System.Drawing.Size(154, 22); this.VCMenuList.Text = "Virtual Console"; @@ -533,9 +510,9 @@ // this.timelimitsecs.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.timelimitsecs.Location = new System.Drawing.Point(95, 99); - this.timelimitsecs.MaxLength = 200; + this.timelimitsecs.MaxLength = 10; this.timelimitsecs.Name = "timelimitsecs"; - this.timelimitsecs.Size = new System.Drawing.Size(62, 20); + this.timelimitsecs.Size = new System.Drawing.Size(148, 20); this.timelimitsecs.TabIndex = 15; this.timelimitsecs.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; // @@ -594,7 +571,7 @@ this.dlcamntbox.Location = new System.Drawing.Point(95, 19); this.dlcamntbox.MaxLength = 6; this.dlcamntbox.Name = "dlcamntbox"; - this.dlcamntbox.Size = new System.Drawing.Size(62, 20); + this.dlcamntbox.Size = new System.Drawing.Size(148, 20); this.dlcamntbox.TabIndex = 9; this.dlcamntbox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; // @@ -735,6 +712,30 @@ this.button3.UseVisualStyleBackColor = true; this.button3.Click += new System.EventHandler(this.button3_Click_1); // + // radioButton1 + // + this.radioButton1.BackColor = System.Drawing.Color.Transparent; + this.radioButton1.Checked = true; + this.radioButton1.Image = global::NUS_Downloader.Properties.Resources.wilolgoi; + this.radioButton1.Location = new System.Drawing.Point(12, 385); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(60, 31); + this.radioButton1.TabIndex = 12; + this.radioButton1.TabStop = true; + this.radioButton1.UseVisualStyleBackColor = false; + this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged); + // + // radioButton2 + // + this.radioButton2.Image = global::NUS_Downloader.Properties.Resources.dsi; + this.radioButton2.ImageAlign = System.Drawing.ContentAlignment.TopCenter; + this.radioButton2.Location = new System.Drawing.Point(78, 385); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(74, 31); + this.radioButton2.TabIndex = 13; + this.radioButton2.UseVisualStyleBackColor = true; + this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged); + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/NUS Downloader/Form1.cs b/NUS Downloader/Form1.cs index bef8cc5..e2758f4 100644 --- a/NUS Downloader/Form1.cs +++ b/NUS Downloader/Form1.cs @@ -4,6 +4,7 @@ using System.IO; using System.Net; using System.Security.Cryptography; using System.Xml; +using System.Drawing; namespace NUS_Downloader { @@ -11,11 +12,19 @@ namespace NUS_Downloader { const string NUSURL = "http://nus.cdn.shop.wii.com/ccs/download/"; const string DSiNUSURL = "http://nus.cdn.t.shop.nintendowifi.net/ccs/download/"; + // TODO: Always remember to change version! string version = "v1.2 Beta"; WebClient generalWC = new WebClient(); static RijndaelManaged rijndaelCipher; static bool dsidecrypt = false; + // Images do not compare unless globalized... + Image green = Properties.Resources.bullet_green; + Image orange = Properties.Resources.bullet_orange; + Image redorb = Properties.Resources.bullet_red; + Image redgreen = Properties.Resources.bullet_redgreen; + Image redorange = Properties.Resources.bullet_redorange; + public struct WADHeader { public int HeaderSize; @@ -196,7 +205,7 @@ namespace NUS_Downloader } // Check for DSi common key bin file... - if (File.Exists(currentdir + "dskey.bin") == false) + if (File.Exists(currentdir + "dsikey.bin") == false) { // Do not pester about DSi key } @@ -228,6 +237,7 @@ namespace NUS_Downloader ClearDatabaseStrip(); FillDatabaseStrip(); LoadRegionCodes(); + ShowInnerToolTips(false); } return result; @@ -544,6 +554,10 @@ namespace NUS_Downloader WriteStatus("Please enter SOME info..."); return; } + else + { + statusbox.Text = " --- " + titleidbox.Text + " ---"; + } // Running Downloads in background so no form freezing NUSDownloader.RunWorkerAsync(); @@ -662,7 +676,7 @@ namespace NUS_Downloader // Standard/Korea bool koreankey = false; - WriteStatus("0x01F1: " + Convert.ToString(cetkbuf[0x01F1])); + //WriteStatus("0x01F1: " + Convert.ToString(cetkbuf[0x01F1])); if (cetkbuf[0x01F1] == 0x01) { WriteStatus("Key Type: Korean"); @@ -683,7 +697,7 @@ namespace NUS_Downloader keyBytes = LoadCommonKey(@"\key.bin"); } else - keyBytes = LoadCommonKey(@"\dskey.bin"); + keyBytes = LoadCommonKey(@"\dsikey.bin"); initCrypt(iv, keyBytes); @@ -704,6 +718,16 @@ namespace NUS_Downloader } titleversion.Text = Convert.ToString(int.Parse(tmdversion, System.Globalization.NumberStyles.HexNumber)); + // Read System Version (Needed IOS) + string sysversion = ""; + for (int i = 0; i < 8; i++) + { + sysversion += MakeProperLength(ConvertToHex(Convert.ToString(tmd[0x184 + i]))); + } + sysversion = Convert.ToString(int.Parse(sysversion.Substring(14, 2), System.Globalization.NumberStyles.HexNumber)); + if (sysversion != "0") + WriteStatus("Requires: IOS" + sysversion); + // Renaming would be ideal, but gives too many errors... /*if ((currentdir + titleid + "v" + titleversion.Text + @"\") != titledirectory) { @@ -1232,9 +1256,9 @@ namespace NUS_Downloader WriteStatus("Wii Korea Decryption: OK"); } - if (File.Exists(currentdir + "dskey.bin") == false) + if (File.Exists(currentdir + "dsikey.bin") == false) { - WriteStatus("DSi Decryption: Need (dskey.bin)"); + WriteStatus("DSi Decryption: Need (dsikey.bin)"); } else { @@ -1255,7 +1279,9 @@ namespace NUS_Downloader WriteStatus(" * Crediar for his wadmaker tool + source, and for the advice!"); WriteStatus(" * SquidMan/Galaxy/comex/Xuzz for advice/sources."); WriteStatus(" * Pasta for database compilation assistance."); - WriteStatus(" * #WiiDev for general assistance whenever I had questions."); + WriteStatus(" * #WiiDev for answering the tough questions."); + WriteStatus(" * Anyone who helped beta test on GBATemp!"); + WriteStatus(" * Famfamfam for the Silk Icon Set."); } private void getcerts_Click(object sender, EventArgs e) @@ -1557,7 +1583,9 @@ namespace NUS_Downloader string titleID = ""; string descname = ""; string stticket = ""; - + bool dangerous = false; + bool ticket = true; + // Lol. XmlNodeList ChildrenOfTheNode = XMLSpecificNodeTypeList[x].ChildNodes; @@ -1604,15 +1632,21 @@ namespace NUS_Downloader default: break; case "ticket": - bool ticket = Convert.ToBoolean(ChildrenOfTheNode[z].InnerText); - if (!ticket) + ticket = Convert.ToBoolean(ChildrenOfTheNode[z].InnerText); + /*if (!ticket) stticket += "(-)"; else - stticket += "(+)"; + stticket += "(+)"; */ + break; + case "danger": + dangerous = true; + string dangertext = ChildrenOfTheNode[z].InnerText; + XMLToolStripItem.ToolTipText = dangertext; break; } + XMLToolStripItem.Image = SelectItemImage(ticket, dangerous); XMLToolStripItem.Text = titleID + " " + stticket + " " + descname; - XMLToolStripItem.Text = String.Format("{0} {1} {2}", titleID, stticket, descname); + XMLToolStripItem.Text = String.Format("{0} - {1}", titleID, descname); } AddToolStripItemToStrip(i, XMLToolStripItem, XMLAttributes); } @@ -1626,10 +1660,10 @@ namespace NUS_Downloader { switch (attributes[0].Value) { - case "Commodore 64": + case "C64": C64MenuList.DropDownItems.Add(additionitem); break; - case "NeoGeo": + case "NEO": NeoGeoMenuList.DropDownItems.Add(additionitem); break; case "NES": @@ -1641,10 +1675,10 @@ namespace NUS_Downloader case "N64": N64MenuList.DropDownItems.Add(additionitem); break; - case "TurboGrafx16": + case "TG16": TurboGrafx16MenuList.DropDownItems.Add(additionitem); break; - case "TurboGrafxCD": + case "TGCD": TurboGrafxCDMenuList.DropDownItems.Add(additionitem); break; case "MSX": @@ -1653,10 +1687,10 @@ namespace NUS_Downloader case "SMS": SegaMSMenuList.DropDownItems.Add(additionitem); break; - case "Genesis": + case "GEN": GenesisMenuList.DropDownItems.Add(additionitem); break; - case "VCArcade": + case "ARC": VCArcadeMenuList.DropDownItems.Add(additionitem); break; default: @@ -1690,7 +1724,12 @@ namespace NUS_Downloader titleidbox.Text = e.ClickedItem.OwnerItem.Text.Substring(0, 16); titleversion.Text = ""; titleidbox.Text = titleidbox.Text.Replace("XX", e.ClickedItem.Text.Substring(0, 2)); - if (e.ClickedItem.OwnerItem.Text.Contains("(-)")) + + // Prepare StatusBox... + statusbox.Text = " --- " + e.ClickedItem.OwnerItem.Text.Substring(19, (e.ClickedItem.OwnerItem.Text.Length - 19)) + " ---"; + + // Check if a ticket is present... + if ((e.ClickedItem.OwnerItem.Image) == (orange) || (e.ClickedItem.OwnerItem.Image) == (redorange)) { ignoreticket.Checked = true; WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); @@ -1701,6 +1740,12 @@ namespace NUS_Downloader { ignoreticket.Checked = false; } + + // Check for danger item + if ((e.ClickedItem.OwnerItem.Image) == (redgreen) || (e.ClickedItem.OwnerItem.Image) == (redorange)) + { + WriteStatus("\r\n" + e.ClickedItem.OwnerItem.ToolTipText); + } } void sysitem_versionclicked(object sender, ToolStripItemClickedEventArgs e) @@ -1725,7 +1770,11 @@ namespace NUS_Downloader { titleversion.Text = ""; } - if (e.ClickedItem.OwnerItem.Text.Contains("(-)")) + + // Prepare StatusBox... + statusbox.Text = " --- " + e.ClickedItem.OwnerItem.Text.Substring(19, (e.ClickedItem.OwnerItem.Text.Length - 19)) + " ---"; + + if ((e.ClickedItem.OwnerItem.Image) == (orange) || (e.ClickedItem.OwnerItem.Image) == (redorange)) { ignoreticket.Checked = true; WriteStatus("Note: This title has no ticket and cannot be packed/decrypted!"); @@ -1736,6 +1785,12 @@ namespace NUS_Downloader { ignoreticket.Checked = false; } + + // Check for danger item + if ((e.ClickedItem.OwnerItem.Image) == (redgreen) || (e.ClickedItem.OwnerItem.Image) == (redorange)) + { + WriteStatus("\n" + e.ClickedItem.OwnerItem.ToolTipText); + } } void HandleMismatch(int contentsize, int actualsize) @@ -2085,12 +2140,56 @@ namespace NUS_Downloader private void SetEnableforDownload(bool enabled) { + // Disable things the user should not mess with during download... downloadstartbtn.Enabled = enabled; titleidbox.Enabled = enabled; titleversion.Enabled = enabled; TMDButton.Enabled = enabled; databaseButton.Enabled = enabled; + packbox.Enabled = enabled; + localuse.Enabled = enabled; + ignoreticket.Enabled = enabled; + truchabox.Enabled = enabled; + decryptbox.Enabled = enabled; } + private void ShowInnerToolTips(bool enabled) + { + // Force tooltips to GTFO in sub menus... + foreach (ToolStripItem item in databaseStrip.Items) + { + try + { + ToolStripMenuItem menuitem = (ToolStripMenuItem)item; + menuitem.DropDown.ShowItemToolTips = false; + } + catch (Exception) + { + // Do nothing, some objects will not cast. + } + + } + } + + private System.Drawing.Image SelectItemImage(bool ticket, bool danger) + { + // All is good, go green... + if ((ticket) && (!danger)) + return green; + + // There's no ticket, but danger is clear... + if ((!ticket) && (!danger)) + return orange; + + // DANGER WILL ROBINSON... + if ((ticket) && (danger)) + return redgreen; + + // Double bad... + if ((!ticket) && (danger)) + return redorange; + + return null; + } } } diff --git a/NUS Downloader/NUS Downloader.csproj b/NUS Downloader/NUS Downloader.csproj index e3685bd..cf67e5c 100644 --- a/NUS Downloader/NUS Downloader.csproj +++ b/NUS Downloader/NUS Downloader.csproj @@ -30,7 +30,7 @@ false false true - 5 + 6 1.0.0.%2a false true @@ -102,6 +102,11 @@ + + + + + diff --git a/NUS Downloader/Properties/Resources.Designer.cs b/NUS Downloader/Properties/Resources.Designer.cs index c4b5c1e..2286bbc 100644 --- a/NUS Downloader/Properties/Resources.Designer.cs +++ b/NUS Downloader/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:2.0.50727.3506 +// Runtime Version:2.0.50727.4918 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -60,6 +60,41 @@ namespace NUS_Downloader.Properties { } } + internal static System.Drawing.Bitmap bullet_green { + get { + object obj = ResourceManager.GetObject("bullet_green", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap bullet_orange { + get { + object obj = ResourceManager.GetObject("bullet_orange", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap bullet_red { + get { + object obj = ResourceManager.GetObject("bullet_red", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap bullet_redgreen { + get { + object obj = ResourceManager.GetObject("bullet_redgreen", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap bullet_redorange { + get { + object obj = ResourceManager.GetObject("bullet_redorange", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + internal static System.Drawing.Bitmap dsi { get { object obj = ResourceManager.GetObject("dsi", resourceCulture); diff --git a/NUS Downloader/Properties/Resources.resx b/NUS Downloader/Properties/Resources.resx index 7750e12..3757dc4 100644 --- a/NUS Downloader/Properties/Resources.resx +++ b/NUS Downloader/Properties/Resources.resx @@ -124,4 +124,19 @@ ..\Resources\dsi.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\bullet_red.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bullet_green.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bullet_orange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bullet_redorange.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bullet_redgreen.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/NUS Downloader/Resources/bullet_green.png b/NUS Downloader/Resources/bullet_green.png new file mode 100644 index 0000000000000000000000000000000000000000..058ad261f520490be9d3fc2e322392fdedfd1cbd GIT binary patch literal 295 zcmV+?0oeYDP)ef43{&%10 z`rmr0`TyJtv;LcOX%laN^>UMjsi!CYUwmcZ|JfI2{-1ED=f8fLD)C;hoM$LyFlFzu{izqk|8%^q0F(5@h6w@ zuSbE=i9QOwKvPc#-iPCap~BwXFHIr_gU^WCH%x0(Cm8h3e{9o}5`YUO%{ zPiLR-*D%CfK42<(c~V-?1q(}8{p2N#A`c~!wa4X-$LfsZ0%WH-1^Zy?%r3<3e~Rbycg=S_Egdz d?>~Yc*m~Z+JF!m3&mHJ+22WQ%mvv4FO#s^$Z2kZM literal 0 HcmV?d00001 diff --git a/NUS Downloader/Resources/bullet_red.png b/NUS Downloader/Resources/bullet_red.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd803115831933aa171497cfe9c1af983035f86 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=8^mK6yu{izqk}mh50EX6wkMFui zZg|fh<-*g%H9O|;u|DY#DW^u;K&o-|vHe`x?xbw1zYx$2><(A#;6QU!sSfhO( ioL~suuJh6Vfb_?jd)=>7iZy|bXYh3Ob6Mw<&;$Tq>~Ep~ literal 0 HcmV?d00001 diff --git a/NUS Downloader/Resources/bullet_redgreen.png b/NUS Downloader/Resources/bullet_redgreen.png new file mode 100644 index 0000000000000000000000000000000000000000..fb50ca83087319ac3407e2ab3c8f4c1e9d0bfb1e GIT binary patch literal 3107 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 literal 0 HcmV?d00001 diff --git a/NUS Downloader/Resources/bullet_redorange.png b/NUS Downloader/Resources/bullet_redorange.png new file mode 100644 index 0000000000000000000000000000000000000000..339d374d86c35a8cf3a90a8a4610e7a39ce49fe5 GIT binary patch literal 3086 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