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