1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.Linq; 5 using System.Net; 6 using System.Text; 7 using System.Threading.Tasks; 8 using System.Windows.Forms; 9 using System.Xml; 10 using Mesen.GUI.Config; 11 12 namespace Mesen.GUI.Forms 13 { 14 public partial class frmMain 15 { PerformUpgrade()16 void PerformUpgrade() 17 { 18 Version newVersion = new Version(InteropEmu.GetMesenVersion()); 19 Version oldVersion = new Version(ConfigManager.Config.MesenVersion); 20 if(oldVersion < newVersion) { 21 //Upgrade 22 if(oldVersion <= new Version("0.4.1")) { 23 //Version 0.4.1- 24 //Remove all old cheats (Game matching/CRC logic has been changed and no longer compatible) 25 ConfigManager.Config.Cheats = new List<CheatInfo>(); 26 } 27 28 if(oldVersion <= new Version("0.5.3")) { 29 //Version 0.5.3- 30 //Reduce sound latency if still using default 31 if(ConfigManager.Config.AudioInfo.AudioLatency == 100) { 32 //50ms is a fairly safe number - seems to work fine as low as 20ms (varies by computer) 33 ConfigManager.Config.AudioInfo.AudioLatency = 50; 34 } 35 } 36 37 if(oldVersion <= new Version("0.9.0")) { 38 //Version 0.9.0- 39 if(ConfigManager.Config.VideoInfo.AspectRatio == VideoAspectRatio.Auto) { 40 //0.9.0's "Auto" has been renamed to "NoStretching" 41 ConfigManager.Config.VideoInfo.AspectRatio = VideoAspectRatio.NoStretching; 42 } 43 44 ConfigManager.Config.RecentFiles.Clear(); 45 } 46 47 if(oldVersion <= new Version("0.9.1")) { 48 //Version 0.9.1- 49 //Remove all old cheats with a CRC value of 0 (bugged FDS cheats) 50 ConfigManager.Config.Cheats = ConfigManager.Config.Cheats.Where((cheat) => cheat.GameCrc != "00000000" && cheat.GameCrc.Length == 8).ToList(); 51 } 52 53 if(oldVersion <= new Version("0.9.4")) { 54 ShortcutKeyInfo oldLoadAutoSlot1 = ConfigManager.Config.PreferenceInfo.ShortcutKeys1.Where(o => o.Shortcut == EmulatorShortcut.LoadStateSlot8).FirstOrDefault(); 55 ShortcutKeyInfo oldLoadAutoSlot2 = ConfigManager.Config.PreferenceInfo.ShortcutKeys2.Where(o => o.Shortcut == EmulatorShortcut.LoadStateSlot8).FirstOrDefault(); 56 ShortcutKeyInfo newLoadAutoSlot1 = ConfigManager.Config.PreferenceInfo.ShortcutKeys1.Where(o => o.Shortcut == EmulatorShortcut.LoadStateSlotAuto).FirstOrDefault(); 57 ShortcutKeyInfo newLoadAutoSlot2 = ConfigManager.Config.PreferenceInfo.ShortcutKeys2.Where(o => o.Shortcut == EmulatorShortcut.LoadStateSlotAuto).FirstOrDefault(); 58 59 //Copy old "Load State - Slot 8" shortcut to "Load State - Auto Save Slot" 60 if(oldLoadAutoSlot1 != null && !oldLoadAutoSlot1.KeyCombination.IsEmpty && newLoadAutoSlot1 == null) { 61 ConfigManager.Config.PreferenceInfo.ShortcutKeys1.Add(new ShortcutKeyInfo(EmulatorShortcut.LoadStateSlotAuto, oldLoadAutoSlot1.KeyCombination)); 62 oldLoadAutoSlot1.KeyCombination = new KeyCombination(); 63 } 64 if(oldLoadAutoSlot2 != null && !oldLoadAutoSlot2.KeyCombination.IsEmpty && newLoadAutoSlot2 == null) { 65 ConfigManager.Config.PreferenceInfo.ShortcutKeys2.Add(new ShortcutKeyInfo(EmulatorShortcut.LoadStateSlotAuto, oldLoadAutoSlot2.KeyCombination)); 66 oldLoadAutoSlot2.KeyCombination = new KeyCombination(); 67 } 68 } 69 70 if(oldVersion <= new Version("0.9.5")) { 71 //Version 0.9.5- 72 //Reset the default keys for the new controller types (to reduce settings.xml size) 73 KeyPresets presets = new KeyPresets(); 74 if(ConfigManager.Config.InputInfo.Controllers.Count > 0 && ConfigManager.Config.InputInfo.Controllers[0].Keys.Count > 0) { 75 ConfigManager.Config.InputInfo.Controllers[0].Keys[0].ExcitingBoxingButtons = presets.ExcitingBoxing.ExcitingBoxingButtons; 76 ConfigManager.Config.InputInfo.Controllers[0].Keys[0].FamilyBasicKeyboardButtons = presets.FamilyBasic.FamilyBasicKeyboardButtons; 77 ConfigManager.Config.InputInfo.Controllers[0].Keys[0].JissenMahjongButtons = presets.JissenMahjong.JissenMahjongButtons; 78 ConfigManager.Config.InputInfo.Controllers[0].Keys[0].PachinkoButtons = presets.Pachinko.PachinkoButtons; 79 ConfigManager.Config.InputInfo.Controllers[0].Keys[0].PartyTapButtons = presets.PartyTap.PartyTapButtons; 80 ConfigManager.Config.InputInfo.Controllers[0].Keys[0].PowerPadButtons = presets.PowerPad.PowerPadButtons; 81 if(ConfigManager.Config.InputInfo.Controllers.Count > 1 && ConfigManager.Config.InputInfo.Controllers[1].Keys.Count > 0) { 82 ConfigManager.Config.InputInfo.Controllers[1].Keys[0].PowerPadButtons = presets.PowerPad.PowerPadButtons; 83 } 84 ConfigManager.Config.InputInfo.Controllers[0].Keys[0].SuborKeyboardButtons = presets.SuborKeyboard.SuborKeyboardButtons; 85 ConfigManager.Config.InputInfo.Controllers[0].Keys[0].BandaiMicrophoneButtons = presets.BandaiMicrophone.BandaiMicrophoneButtons; 86 } 87 88 //Set the audio latency setting back to a sane default (since the way the code uses the value has changed) 89 if(ConfigManager.Config.AudioInfo.AudioLatency < 60) { 90 ConfigManager.Config.AudioInfo.AudioLatency = 60; 91 } 92 93 //No reason to keep this disabled by default - enabling it by default makes it easier for new users to install/use HD packs 94 ConfigManager.Config.VideoInfo.UseHdPacks = true; 95 } 96 97 ConfigManager.Config.MesenVersion = InteropEmu.GetMesenVersion(); 98 ConfigManager.ApplyChanges(); 99 100 _showUpgradeMessage = true; 101 } 102 } 103 CheckForUpdates(bool displayResult)104 private void CheckForUpdates(bool displayResult) 105 { 106 Task.Run(() => { 107 try { 108 using(var client = new WebClient()) { 109 XmlDocument xmlDoc = new XmlDocument(); 110 111 string platform = Program.IsMono ? "linux" : "win"; 112 xmlDoc.LoadXml(client.DownloadString("http://www.mesen.ca/Services/GetLatestVersion.php?v=" + InteropEmu.GetMesenVersion() + "&p=" + platform + "&l=" + ResourceHelper.GetLanguageCode())); 113 Version currentVersion = new Version(InteropEmu.GetMesenVersion()); 114 Version latestVersion = new Version(xmlDoc.SelectSingleNode("VersionInfo/LatestVersion").InnerText); 115 string changeLog = xmlDoc.SelectSingleNode("VersionInfo/ChangeLog").InnerText; 116 string fileHash = xmlDoc.SelectSingleNode("VersionInfo/Sha1Hash").InnerText; 117 string donateText = xmlDoc.SelectSingleNode("VersionInfo/DonateText")?.InnerText; 118 119 if(latestVersion > currentVersion) { 120 this.BeginInvoke((MethodInvoker)(() => { 121 using(frmUpdatePrompt frmUpdate = new frmUpdatePrompt(currentVersion, latestVersion, changeLog, fileHash, donateText)) { 122 if(frmUpdate.ShowDialog(null, this) == DialogResult.OK) { 123 Application.Exit(); 124 } 125 } 126 })); 127 } else if(displayResult) { 128 MesenMsgBox.Show("MesenUpToDate", MessageBoxButtons.OK, MessageBoxIcon.Information); 129 } 130 } 131 } catch(Exception ex) { 132 if(displayResult) { 133 MesenMsgBox.Show("ErrorWhileCheckingUpdates", MessageBoxButtons.OK, MessageBoxIcon.Error, ex.ToString()); 134 } 135 } 136 }); 137 } 138 mnuAbout_Click(object sender, EventArgs e)139 private void mnuAbout_Click(object sender, EventArgs e) 140 { 141 using(frmAbout frm = new frmAbout()) { 142 frm.ShowDialog(this); 143 } 144 } 145 mnuCheckForUpdates_Click(object sender, EventArgs e)146 private void mnuCheckForUpdates_Click(object sender, EventArgs e) 147 { 148 CheckForUpdates(true); 149 } 150 mnuOnlineHelp_Click(object sender, EventArgs e)151 private void mnuOnlineHelp_Click(object sender, EventArgs e) 152 { 153 string platform = Program.IsMono ? "linux" : "win"; 154 Process.Start("http://www.mesen.ca/docs/?v=" + InteropEmu.GetMesenVersion() + "&p=" + platform + "&l=" + ResourceHelper.GetLanguageCode()); 155 } 156 mnuReportBug_Click(object sender, EventArgs e)157 private void mnuReportBug_Click(object sender, EventArgs e) 158 { 159 Process.Start("http://www.mesen.ca/ReportBug.php"); 160 } 161 mnuHelpWindow_Click(object sender, EventArgs e)162 private void mnuHelpWindow_Click(object sender, EventArgs e) 163 { 164 using(frmHelp frm = new frmHelp()) { 165 frm.ShowDialog(sender, this); 166 } 167 } 168 } 169 } 170