using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Navigation;
using GameRes;
using Microsoft.Win32;
namespace GARbro.GUI
{
///
/// Interaction logic for TroubleShooting.xaml
///
public partial class TroubleShootingDialog : Window
{
public TroubleShootingDialog ()
{
InitializeComponent();
this.EnvironmentInfo.Text = GetEnvironmentReportText();
}
private void Hyperlink_RequestNavigate (object sender, RequestNavigateEventArgs e)
{
if (App.NavigateUri (e.Uri))
e.Handled = true;
}
private void Button_Copy (object sender, RoutedEventArgs e)
{
try
{
Clipboard.SetText (this.EnvironmentInfo.Text);
}
catch (Exception X)
{
System.Diagnostics.Trace.WriteLine (X.Message, "Clipboard error");
}
}
internal static string GetEnvironmentReportText ()
{
var gui = Assembly.GetExecutingAssembly();
var gui_path = Path.GetDirectoryName (gui.Location);
var report = new StringBuilder();
report.AppendFormat ("OS: {0}\n", GetOSVersion());
report.AppendFormat ("Framework version: {0}\n", Environment.Version);
report.AppendFormat ("Framework release: {0}\n", GetFrameWorkReleaseInfo());
report.AppendFormat ("{0}: {1}\n", App.Name, gui.GetName().Version);
report.AppendFormat ("Formats database version: {0}\n", FormatCatalog.Instance.CurrentSchemeVersion);
try
{
report.Append ("\nLoaded assemblies:\n");
var local_assemblies = AppDomain.CurrentDomain.GetAssemblies().Where (a => !a.IsDynamic && a.Location.StartsWith (gui_path));
foreach (var assembly in local_assemblies.Select (a => a.GetName()))
{
report.AppendFormat ("{0} {1}\n", assembly.Name, assembly.Version);
}
}
catch (Exception X)
{
report.AppendFormat ("Assemblies enumeration failed:\n{0}", X.Message);
}
return report.ToString();
}
internal static string GetOSVersion ()
{
string id = Registry.GetValue (@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName", "").ToString();
if (string.IsNullOrEmpty (id))
id = Environment.OSVersion.VersionString;
else
{
string sp = Environment.OSVersion.ServicePack;
if (!string.IsNullOrEmpty (sp))
id += ' '+sp;
}
return id;
}
static readonly SortedDictionary FrameworkReleases = new SortedDictionary {
{ 378389, "4.5" },
{ 378675, "4.5.1 from Windows 8.1" },
{ 378758, "4.5.1" },
{ 379893, "4.5.2" },
{ 393295, "4.6 from Windows 10" },
{ 393297, "4.6" },
{ 394254, "4.6.1 from Windows 10" },
{ 394271, "4.6.1" },
{ 394802, "4.6.2 from Windows 10 Anniversary Update" },
{ 394806, "4.6.2" },
{ 460798, "4.7 from Windows 10 Creators Update" },
{ 460805, "4.7" },
{ 461308, "4.7.1 from Windows 10 Fall Creators Update" },
{ 461310, "4.7.1+" },
};
internal static string GetFrameWorkReleaseInfo ()
{
int release = Convert.ToInt32 (Registry.GetValue (@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full", "Release", 0));
if (0 == release)
return "Unknown";
var version = FrameworkReleases.Reverse().Where (r => release >= r.Key).Select (r => r.Value).FirstOrDefault();
if (string.IsNullOrEmpty (version))
version = release.ToString();
else
version = string.Format ("{0} ({1})", release, version);
return version;
}
}
}