diff --git a/FModel/App.xaml.cs b/FModel/App.xaml.cs index f7652b44..b13666a4 100644 --- a/FModel/App.xaml.cs +++ b/FModel/App.xaml.cs @@ -1,4 +1,5 @@ using FModel.Methods.MessageBox; +using FModel.Methods.Utilities; using System.Windows; namespace FModel @@ -11,6 +12,7 @@ namespace FModel void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { string errorMessage = string.Format("An unhandled exception occurred: {0}", e.Exception.Message); + DebugHelper.WriteException(e.Exception, "thrown in App.xaml.cs by OnDispatcherUnhandledException"); DarkMessageBox.Show(errorMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error); e.Handled = true; } diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index e8728407..02b2ac90 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -346,11 +346,13 @@ + + diff --git a/FModel/FModel_Main.xaml b/FModel/FModel_Main.xaml index 18bb3a7b..82f938a4 100644 --- a/FModel/FModel_Main.xaml +++ b/FModel/FModel_Main.xaml @@ -19,7 +19,7 @@ WindowStartupLocation="CenterScreen" Icon="Logo.ico" Loaded="Window_Loaded" - UseLayoutRounding="True" Closed="Window_Closed"> + UseLayoutRounding="True"> diff --git a/FModel/FModel_Main.xaml.cs b/FModel/FModel_Main.xaml.cs index 166294a0..270a3f85 100644 --- a/FModel/FModel_Main.xaml.cs +++ b/FModel/FModel_Main.xaml.cs @@ -35,6 +35,7 @@ namespace FModel { FModelVersionLabel.Text += Assembly.GetExecutingAssembly().GetName().Version.ToString().Substring(0, 5); + DebugHelper.WriteLine("AutoUpdater: Checking for updates"); AutoUpdater.CheckForUpdateEvent += UIHelper.AutoUpdaterOnCheckForUpdateEvent; AutoUpdater.Start("https://dl.dropbox.com/s/3kv2pukqu6tj1r0/FModel.xml?dl=0"); @@ -44,6 +45,8 @@ namespace FModel FProp.Default.Upgrade(); FProp.Default.FUpdateSettings = false; FProp.Default.Save(); + + DebugHelper.WriteLine("User settings copied from previous version"); } await Task.Run(() => @@ -56,13 +59,10 @@ namespace FModel }).ContinueWith(TheTask => { TasksUtility.TaskCompleted(TheTask.Exception); + Dispatcher.InvokeAsync(() => AvalonEdit.SetAEConfig()); + Program.StartTimer.Stop(); + DebugHelper.WriteLine("Startup time: {0} ms", Program.StartTimer.ElapsedMilliseconds); }); - - AvalonEdit.SetAEConfig(); - } - private void Window_Closed(object sender, System.EventArgs e) - { - FProp.Default.Save(); } #region BUTTON EVENTS diff --git a/FModel/Methods/AESManager/DynamicKeysChecker.cs b/FModel/Methods/AESManager/DynamicKeysChecker.cs index 7193cb5a..7349919a 100644 --- a/FModel/Methods/AESManager/DynamicKeysChecker.cs +++ b/FModel/Methods/AESManager/DynamicKeysChecker.cs @@ -12,10 +12,11 @@ namespace FModel.Methods.AESManager private static readonly string AESManager_PATH = FProp.Default.FOutput_Path + "\\FAESManager.xml"; private static List _oldAESEntriesList; - public static void SetDynamicKeys(bool reaload = false) + public static void SetDynamicKeys(bool reload = false) { - if (FProp.Default.ReloadAES || reaload) + if (FProp.Default.ReloadAES || reload) { + DebugHelper.WriteLine("Loading AES keys"); if (!File.Exists(AESManager_PATH)) { AESEntries.AESEntriesList = new List(); @@ -76,7 +77,10 @@ namespace FModel.Methods.AESManager } } else + { + DebugHelper.WriteLine("AES keys not loaded, this isn't an error"); KeysManager.Deserialize(); + } FWindow.FMain.Dispatcher.InvokeAsync(() => { diff --git a/FModel/Methods/AESManager/KeysManager.cs b/FModel/Methods/AESManager/KeysManager.cs index fb305ae5..0e51ff87 100644 --- a/FModel/Methods/AESManager/KeysManager.cs +++ b/FModel/Methods/AESManager/KeysManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using FModel.Methods.Utilities; +using System.Collections.Generic; using System.IO; using System.Xml.Serialization; using FProp = FModel.Properties.Settings; @@ -12,6 +13,7 @@ namespace FModel.Methods.AESManager public static void Serialize(string PAKName, string PAKKey) { + DebugHelper.WriteLine("FAESManager: Serializing " + PAKName + " with " + PAKKey); AESEntries.AESEntriesList.Add(new AESInfosEntry { ThePAKName = PAKName, @@ -23,6 +25,7 @@ namespace FModel.Methods.AESManager { if (File.Exists(AESManager_PATH)) { + DebugHelper.WriteLine("FAESManager: Deserializing"); List outputList; using (var fileStream = new FileStream(AESManager_PATH, FileMode.Open)) { @@ -30,6 +33,8 @@ namespace FModel.Methods.AESManager } AESEntries.AESEntriesList = outputList; } + else + DebugHelper.WriteLine("FAESManager: Deserializing but " + AESManager_PATH + " not found"); } } } diff --git a/FModel/Methods/BackupsManager/RegisterDownloadedBackups.cs b/FModel/Methods/BackupsManager/RegisterDownloadedBackups.cs index ddcd2df7..fd56569d 100644 --- a/FModel/Methods/BackupsManager/RegisterDownloadedBackups.cs +++ b/FModel/Methods/BackupsManager/RegisterDownloadedBackups.cs @@ -1,6 +1,7 @@ using FModel.Methods.Utilities; using RestSharp; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Windows; @@ -41,6 +42,7 @@ namespace FModel.Methods.BackupsManager MenuItem ClickedBackup = sender as MenuItem; if (BackupsFromDropbox != null && BackupsFromDropbox.Any()) { + Stopwatch timer = Stopwatch.StartNew(); foreach (BackupInfosEntry Backup in BackupsFromDropbox) { string BackupFileName = Backup.TheFileName; @@ -59,11 +61,17 @@ namespace FModel.Methods.BackupsManager if (new FileInfo(path).Length > 0) //HENCE WE CHECK THE LENGTH { + timer.Stop(); + DebugHelper.WriteLine("Dropbox: Downloaded " + BackupFileName + " in " + timer.ElapsedMilliseconds + "ms"); + new UpdateMyProcessEvents($"\\Backups\\{BackupFileName} successfully downloaded", "Success").Update(); } else { File.Delete(path); //WE DELETE THE EMPTY FILE CREATED + + timer.Stop(); + DebugHelper.WriteLine("Dropbox: Error while downloading " + BackupFileName + ", spent " + timer.ElapsedMilliseconds + "ms"); new UpdateMyProcessEvents($"Error while downloading {BackupFileName}", "Error").Update(); } }); diff --git a/FModel/Methods/PAKs/RegisterFromPath.cs b/FModel/Methods/PAKs/RegisterFromPath.cs index fe59e4ce..4693b3d2 100644 --- a/FModel/Methods/PAKs/RegisterFromPath.cs +++ b/FModel/Methods/PAKs/RegisterFromPath.cs @@ -3,7 +3,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Windows; using System.Windows.Controls; using FProp = FModel.Properties.Settings; @@ -21,6 +20,7 @@ namespace FModel.Methods.PAKs string AutoPath = GetGameFiles(); if (!string.IsNullOrEmpty(AutoPath)) { + DebugHelper.WriteLine("Auto .PAK files detection at " + AutoPath); new UpdateMyConsole(".PAK files path detected at ", CColors.White).Append(); new UpdateMyConsole(AutoPath, CColors.Blue, true).Append(); @@ -38,9 +38,12 @@ namespace FModel.Methods.PAKs { if (!PAKsUtility.IsPAKLocked(new FileInfo(Pak))) { - if (PAKsUtility.GetPAKVersion(Pak) == 8) + uint pVersion = PAKsUtility.GetPAKVersion(Pak); + if (pVersion == 8) { string PAKGuid = PAKsUtility.GetPAKGuid(Pak); + DebugHelper.WriteLine("Registering " + Pak + " with GUID " + PAKGuid); + PAKEntries.PAKEntriesList.Add(new PAKInfosEntry(Pak, PAKGuid, string.Equals(PAKGuid, "0-0-0-0") ? false : true)); FWindow.FMain.Dispatcher.InvokeAsync(() => { @@ -51,10 +54,16 @@ namespace FModel.Methods.PAKs FWindow.FMain.MI_LoadOnePAK.Items.Add(MI_Pak); }); } - else { new UpdateMyProcessEvents($"Unsupported .PAK Version for {Path.GetFileName(Pak)}", "Error").Update(); } + else + { + DebugHelper.WriteLine(Path.GetFileName(Pak) + " file version is " + pVersion + " instead of 8"); + new UpdateMyProcessEvents($"Unsupported .PAK Version for {Path.GetFileName(Pak)}", "Error").Update(); + } } else { + DebugHelper.WriteLine(Path.GetFileName(Pak) + " is locked by another process."); + new UpdateMyConsole(Path.GetFileName(Pak), CColors.Blue).Append(); new UpdateMyConsole(" is locked by another process.", CColors.White, true).Append(); } @@ -81,7 +90,10 @@ namespace FModel.Methods.PAKs { if (DatFileExists()) { - string jsonData = File.ReadAllText($@"{GetEpicDirectory()}\UnrealEngineLauncher\LauncherInstalled.dat"); + string path = $@"{GetEpicDirectory()}\UnrealEngineLauncher\LauncherInstalled.dat"; + string jsonData = File.ReadAllText(path); + DebugHelper.WriteLine("EPIC .dat file at " + path); + if (AssetsUtility.IsValidJson(jsonData)) { JToken games = JsonConvert.DeserializeObject(jsonData); @@ -94,13 +106,16 @@ namespace FModel.Methods.PAKs { if (string.Equals(game["AppName"].Value(), "Fortnite")) { + DebugHelper.WriteLine(game["AppVersion"] + " found in .dat file"); return $@"{game["InstallLocation"].Value()}\FortniteGame\Content\Paks"; } } + DebugHelper.WriteLine("Fortnite not found in .dat file"); } } } } + DebugHelper.WriteLine("EPIC .dat file not found"); return string.Empty; } } diff --git a/FModel/Methods/Utilities/DebugHelper.cs b/FModel/Methods/Utilities/DebugHelper.cs new file mode 100644 index 00000000..45aa1b28 --- /dev/null +++ b/FModel/Methods/Utilities/DebugHelper.cs @@ -0,0 +1,49 @@ +using System; +using System.Diagnostics; + +namespace FModel.Methods.Utilities +{ + class DebugHelper + { + public static Logger Logger { get; private set; } + + public static void Init(string logFilePath) + { + Logger = new Logger(logFilePath); + } + + public static void WriteLine(string message = "") + { + if (Logger != null) + { + Logger.WriteLine(message); + } + else + { + Debug.WriteLine(message); + } + } + + public static void WriteLine(string format, params object[] args) + { + WriteLine(string.Format(format, args)); + } + + public static void WriteException(string exception, string message = "Exception") + { + if (Logger != null) + { + Logger.WriteException(exception, message); + } + else + { + Debug.WriteLine(exception); + } + } + + public static void WriteException(Exception exception, string message = "Exception") + { + WriteException(exception.ToString(), message); + } + } +} diff --git a/FModel/Methods/Utilities/EndpointsUtility.cs b/FModel/Methods/Utilities/EndpointsUtility.cs index f49b4820..571c8252 100644 --- a/FModel/Methods/Utilities/EndpointsUtility.cs +++ b/FModel/Methods/Utilities/EndpointsUtility.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json.Linq; using RestSharp; using System.Collections.Generic; -using System.Linq; +using System.Text; using FProp = FModel.Properties.Settings; namespace FModel.Methods.Utilities @@ -10,6 +10,8 @@ namespace FModel.Methods.Utilities { public static string GetEndpoint(string url) { + DebugHelper.WriteLine("Sending GET request to " + url); + RestClient EndpointClient = new RestClient(url); RestRequest EndpointRequest = new RestRequest(Method.GET); @@ -32,27 +34,39 @@ namespace FModel.Methods.Utilities JArray FGMessages = FData["Global_Messages"].Value(); if (!string.IsNullOrEmpty(FGMessages[0]["Message"].Value())) { + StringBuilder sb = new StringBuilder(); foreach (JToken t in FGMessages) { - new UpdateMyConsole(t["Message"].Value(), t["Color"].Value(), t["bNewLine"].Value()).Append(); + string text = t["Message"].Value(); + bool nl = t["bNewLine"].Value(); + new UpdateMyConsole(text, t["Color"].Value(), nl).Append(); + + if (nl) + sb.AppendLine(text); + else + sb.Append(text); } + DebugHelper.WriteLine("Dropbox: MOTD: " + sb.ToString().TrimEnd()); } //BACKUPS foreach (JProperty prop in FData["Backups"].Value().Properties()) { + DebugHelper.WriteLine("Dropbox: " + prop.Name + " available to download"); ListToReturn.Add(new BackupInfosEntry(prop.Name, prop.Value.Value())); } return ListToReturn; } else { + DebugHelper.WriteLine("Dropbox: Error while checking for backup files"); new UpdateMyConsole("Error while checking for backup files", CColors.Red, true).Append(); return null; } } else { + DebugHelper.WriteLine("Dropbox: Your internet connection is currently unavailable, can't check for backup files at the moment."); new UpdateMyConsole("Your internet connection is currently unavailable, can't check for backup files at the moment.", CColors.Blue, true).Append(); return null; } @@ -68,8 +82,15 @@ namespace FModel.Methods.Utilities if (string.IsNullOrEmpty(FProp.Default.FPak_MainAES)) { JToken mainKeyToken = JObject.Parse(EndpointContent).SelectToken("mainKey"); - FProp.Default.FPak_MainAES = mainKeyToken != null ? $"{mainKeyToken.Value().Substring(2).ToUpperInvariant()}" : ""; - FProp.Default.Save(); + if (mainKeyToken != null) + { + FProp.Default.FPak_MainAES = $"{mainKeyToken.Value().Substring(2).ToUpperInvariant()}"; + FProp.Default.Save(); + + DebugHelper.WriteLine("BenBotAPI: Main AES key set to " + mainKeyToken.Value()); + } + else + DebugHelper.WriteLine("BenBotAPI: Main AES key not found in endpoint response"); } JToken dynamicPaks = JObject.Parse(EndpointContent).SelectToken("additionalKeys"); @@ -77,14 +98,16 @@ namespace FModel.Methods.Utilities } else { + DebugHelper.WriteLine("BenBotAPI: Down or Rate Limit Exceeded"); new UpdateMyConsole("API Down or Rate Limit Exceeded", CColors.Blue, true).Append(); - return null; + return string.Empty; } } else { + DebugHelper.WriteLine("BenBotAPI: Your internet connection is currently unavailable, can't check for dynamic keys at the moment."); new UpdateMyConsole("Your internet connection is currently unavailable, can't check for dynamic keys at the moment.", CColors.Blue, true).Append(); - return null; + return string.Empty; } } } diff --git a/FModel/Methods/Utilities/FoldersUtility.cs b/FModel/Methods/Utilities/FoldersUtility.cs index adcf3b37..4e9b574a 100644 --- a/FModel/Methods/Utilities/FoldersUtility.cs +++ b/FModel/Methods/Utilities/FoldersUtility.cs @@ -62,8 +62,11 @@ namespace FModel.Methods.Utilities { if (string.IsNullOrEmpty(FProp.Default.FOutput_Path)) { - FProp.Default.FOutput_Path = AppDomain.CurrentDomain.BaseDirectory + "Output"; + string path = AppDomain.CurrentDomain.BaseDirectory + "Output"; + FProp.Default.FOutput_Path = path; FProp.Default.Save(); + + DebugHelper.WriteLine("No output path, auto set to " + path); } } @@ -72,7 +75,7 @@ namespace FModel.Methods.Utilities /// private static void CreateDefaultSubFolders() { - //THIS WILL STAY FOR INITIAL LAUNCH ONLY + //3.0- if (File.Exists(FProp.Default.FOutput_Path + "\\AESManager.xml")) { File.Delete(FProp.Default.FOutput_Path + "\\AESManager.xml"); } if (Directory.Exists(FProp.Default.FOutput_Path + "\\Backup\\")) { Directory.Delete(FProp.Default.FOutput_Path + "\\Backup\\", true); } if (Directory.Exists(FProp.Default.FOutput_Path + "\\Extracted\\")) { Directory.Delete(FProp.Default.FOutput_Path + "\\Extracted\\", true); } @@ -81,8 +84,11 @@ namespace FModel.Methods.Utilities Directory.CreateDirectory(FProp.Default.FOutput_Path + "\\Backups\\"); Directory.CreateDirectory(FProp.Default.FOutput_Path + "\\Exports\\"); Directory.CreateDirectory(FProp.Default.FOutput_Path + "\\Icons\\"); - Directory.CreateDirectory(FProp.Default.FOutput_Path + "\\Sounds\\"); Directory.CreateDirectory(FProp.Default.FOutput_Path + "\\JSONs\\"); + Directory.CreateDirectory(FProp.Default.FOutput_Path + "\\Sounds\\"); + Directory.CreateDirectory(FProp.Default.FOutput_Path + "\\Logs\\"); + + DebugHelper.WriteLine("Folders created if they didn't exist"); } public static string GetFullPathWithoutExtension(string path) @@ -100,12 +106,17 @@ namespace FModel.Methods.Utilities public static void CheckWatermark() { + bool bSave = false; + if (!string.IsNullOrEmpty(FProp.Default.FWatermarkFilePath) && !File.Exists(FProp.Default.FWatermarkFilePath)) { FProp.Default.FWatermarkFilePath = string.Empty; FProp.Default.FUseWatermark = false; + bSave = true; + new UpdateMyConsole("Watermark file not found, watermarking disabled.", CColors.Blue, true).Append(); + DebugHelper.WriteLine("Watermark file for icons not found, option disabled"); } if (!string.IsNullOrEmpty(FProp.Default.FBannerFilePath) && @@ -113,10 +124,14 @@ namespace FModel.Methods.Utilities { FProp.Default.FBannerFilePath = string.Empty; FProp.Default.FUseChallengeWatermark = false; + bSave = true; + new UpdateMyConsole("Banner file not found, challenges custom theme disabled.", CColors.Blue, true).Append(); + DebugHelper.WriteLine("Watermark file for banners not found, option disabled"); } - FProp.Default.Save(); + if (bSave) + FProp.Default.Save(); } } } diff --git a/FModel/Methods/Utilities/Logger.cs b/FModel/Methods/Utilities/Logger.cs new file mode 100644 index 00000000..147ba85c --- /dev/null +++ b/FModel/Methods/Utilities/Logger.cs @@ -0,0 +1,223 @@ +using FModel.Methods.MessageBox; +using Microsoft.Win32; +using System; +using System.Collections.Concurrent; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace FModel.Methods.Utilities +{ + class Logger + { + public delegate void MessageAddedEventHandler(string message); + + public event MessageAddedEventHandler MessageAdded; + + public string MessageFormat { get; set; } = "{0:yyyy-MM-dd HH:mm:ss.fff} - {1}"; + public bool AsyncWrite { get; set; } = true; + public bool DebugWrite { get; set; } = Program.Build == Program.FModelBuild.Debug; + public bool StringWrite { get; set; } = true; + public bool FileWrite { get; set; } = false; + public string LogFilePath { get; private set; } + + private readonly object loggerLock = new object(); + private ConcurrentQueue messageQueue = new ConcurrentQueue(); + private StringBuilder sbMessages = new StringBuilder(); + + public Logger() + { + } + + public Logger(string logFilePath) + { + FileWrite = true; + LogFilePath = logFilePath; + CreateDirectoryFromFilePath(LogFilePath); + } + + protected void OnMessageAdded(string message) + { + if (MessageAdded != null) + { + MessageAdded(message); + } + } + + private void ProcessMessageQueue() + { + lock (loggerLock) + { + while (messageQueue.TryDequeue(out string message)) + { + if (DebugWrite) + { + Debug.Write(message); + } + + if (StringWrite && sbMessages != null) + { + sbMessages.Append(message); + } + + if (FileWrite && !string.IsNullOrEmpty(LogFilePath)) + { + try + { + File.AppendAllText(LogFilePath, message, Encoding.UTF8); + } + catch (Exception e) + { + Debug.WriteLine(e); + } + } + + OnMessageAdded(message); + } + } + } + + public void Write(string message) + { + if (message != null) + { + message = string.Format(MessageFormat, DateTime.Now, message); + messageQueue.Enqueue(message); + + if (AsyncWrite) + { + Task.Run(() => ProcessMessageQueue()); + } + else + { + ProcessMessageQueue(); + } + } + } + + public void Write(string format, params object[] args) + { + Write(string.Format(format, args)); + } + + public void WriteLine(string message) + { + Write(message + Environment.NewLine); + } + + public void WriteLine(string format, params object[] args) + { + WriteLine(string.Format(format, args)); + } + + public void WriteException(string exception, string message = "Exception") + { + WriteLine($"{message}:{Environment.NewLine}{exception}"); + } + + public void WriteException(Exception exception, string message = "Exception") + { + WriteException(exception.ToString(), message); + } + + public void Clear() + { + lock (loggerLock) + { + if (sbMessages != null) + { + sbMessages.Clear(); + } + } + } + + public override string ToString() + { + lock (loggerLock) + { + if (sbMessages != null && sbMessages.Length > 0) + { + return sbMessages.ToString(); + } + + return null; + } + } + + public static void CreateDirectoryFromFilePath(string filePath) + { + if (!string.IsNullOrEmpty(filePath)) + { + string directoryPath = Path.GetDirectoryName(filePath); + CreateDirectoryFromDirectoryPath(directoryPath); + } + } + + public static void CreateDirectoryFromDirectoryPath(string directoryPath) + { + if (!string.IsNullOrEmpty(directoryPath) && !Directory.Exists(directoryPath)) + { + try + { + Directory.CreateDirectory(directoryPath); + } + catch (Exception e) + { + DebugHelper.WriteException(e); + DarkMessageBox.Show("Could not create directory.\r\n\r\n" + e, "FModel - Error", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + } + + public static string GetOperatingSystemProductName(bool includeBit = false) + { + string productName = null; + + try + { + productName = GetRegistryValue(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName", RegistryHive.LocalMachine); + } + catch + { + } + + if (string.IsNullOrEmpty(productName)) + { + productName = Environment.OSVersion.VersionString; + } + + if (includeBit) + { + string bit; + + if (Environment.Is64BitOperatingSystem) + { + bit = "64"; + } + else + { + bit = "32"; + } + + productName = $"{productName} ({bit}-bit)"; + } + + return productName; + } + + public static string GetRegistryValue(string path, string name = null, RegistryHive root = RegistryHive.CurrentUser) + { + using (RegistryKey rk = RegistryKey.OpenBaseKey(root, RegistryView.Default).OpenSubKey(path)) + { + if (rk != null) + { + return rk.GetValue(name, null) as string; + } + } + + return null; + } + } +} diff --git a/FModel/Methods/Utilities/TasksUtility.cs b/FModel/Methods/Utilities/TasksUtility.cs index 503b7bda..400109bb 100644 --- a/FModel/Methods/Utilities/TasksUtility.cs +++ b/FModel/Methods/Utilities/TasksUtility.cs @@ -12,6 +12,8 @@ namespace FModel.Methods.Utilities if (ex != null) { Exception innerEx = ex.InnerException; + DebugHelper.WriteException(innerEx, "thrown in TasksUtility.cs by TaskCompleted"); + if (innerEx is ArgumentOutOfRangeException) //aes key is too short { new UpdateMyProcessEvents((innerEx as ArgumentOutOfRangeException).ParamName, "Error").Update(); diff --git a/FModel/Methods/Utilities/UIUtility.cs b/FModel/Methods/Utilities/UIUtility.cs index f419e406..6a375423 100644 --- a/FModel/Methods/Utilities/UIUtility.cs +++ b/FModel/Methods/Utilities/UIUtility.cs @@ -213,6 +213,10 @@ namespace FModel.Methods.Utilities { if (args.IsUpdateAvailable) { + DebugHelper.WriteLine("AutoUpdater: Update available"); + DebugHelper.WriteLine("AutoUpdater: Installed version: " + args.InstalledVersion); + DebugHelper.WriteLine("AutoUpdater: Available version: " + args.CurrentVersion); + MessageBoxResult dialogResult; if (args.Mandatory) { @@ -236,6 +240,7 @@ namespace FModel.Methods.Utilities if (dialogResult == MessageBoxResult.Yes) { + DebugHelper.WriteLine("AutoUpdater: User is checking the changelog"); Process.Start(args.ChangelogURL); } @@ -244,22 +249,30 @@ namespace FModel.Methods.Utilities //ok if force update if (dialogResult == MessageBoxResult.Yes || dialogResult == MessageBoxResult.No || dialogResult == MessageBoxResult.OK) { + DebugHelper.WriteLine("AutoUpdater: Updating"); try { if (AutoUpdater.DownloadUpdate()) { - System.Windows.Application.Current.Shutdown(); + Application.Current.Shutdown(); } } catch (Exception exception) { + DebugHelper.WriteException(exception); DarkMessageBox.ShowOK(exception.Message, exception.GetType().ToString(), "OK", MessageBoxImage.Error); } } + else + DebugHelper.WriteLine("AutoUpdater: Do not wanna update"); } + else + DebugHelper.WriteLine("AutoUpdater: No update available"); } else { + DebugHelper.WriteLine("AutoUpdater: There is a problem reaching update server please check your internet connection and try again later."); + DarkMessageBox.ShowOK( "There is a problem reaching update server please check your internet connection and try again later.", "Update check failed", "OK", MessageBoxImage.Error); diff --git a/FModel/Program.cs b/FModel/Program.cs index 818747df..a95acc58 100644 --- a/FModel/Program.cs +++ b/FModel/Program.cs @@ -1,5 +1,7 @@ -using System; +using FModel.Methods.Utilities; +using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; @@ -8,9 +10,35 @@ namespace FModel { static class Program { + private static bool isClosing; + public enum FModelBuild + { + Debug, + Release, + Unknown + } + public const FModelBuild Build = +#if RELEASE + FModelBuild.Release; +#elif DEBUG + FModelBuild.Debug; +#else + FModelBuild.Unknown; +#endif + internal static Stopwatch StartTimer { get; private set; } + + [STAThreadAttribute] public static void Main() { + StartTimer = Stopwatch.StartNew(); + + DebugHelper.Init(LogsFilePath); + DebugHelper.WriteLine("FModel starting."); + DebugHelper.WriteLine("Version: " + Assembly.GetExecutingAssembly().GetName().Version.ToString()); + DebugHelper.WriteLine("Build: " + Build); + DebugHelper.WriteLine("OS: " + Logger.GetOperatingSystemProductName(true)); + Dictionary assemblies = new Dictionary(); Assembly executingAssembly = Assembly.GetExecutingAssembly(); IEnumerable resources = executingAssembly.GetManifestResourceNames().Where(n => n.EndsWith(".dll")); @@ -29,7 +57,7 @@ namespace FModel } catch (Exception ex) { - System.Diagnostics.Debug.Print(string.Format("Failed to load: {0}, Exception: {1}", resource, ex.Message)); + DebugHelper.WriteLine(string.Format("Failed to load: {0}, Exception: {1}", resource, ex.Message)); } } } @@ -47,6 +75,32 @@ namespace FModel return null; }; App.Main(); + + CloseWithLogs(); + } + + public static void CloseWithLogs() + { + if (!isClosing) + { + isClosing = true; + + DebugHelper.Logger.AsyncWrite = false; + DebugHelper.WriteLine("FModel closing."); + + Properties.Settings.Default.Save(); + + DebugHelper.WriteLine("FModel closed."); + } + } + + public static string LogsFilePath + { + get + { + string filename = string.Format("FModel-Log-{0:yyyy-MM-dd}.txt", DateTime.Now); + return Path.Combine(Properties.Settings.Default.FOutput_Path + "\\Logs", filename); + } } } }