2015-07-01 23:17:14 -04:00
using System ;
using System.Collections.Generic ;
2015-12-27 22:05:45 -05:00
using System.Diagnostics ;
2016-01-16 22:40:41 -05:00
using System.IO ;
2015-07-01 23:17:14 -04:00
using System.Linq ;
2019-05-11 21:59:29 -04:00
using System.Net ;
2016-05-22 14:43:07 -04:00
using System.Reflection ;
2016-01-17 11:11:53 -05:00
using System.Runtime.ExceptionServices ;
2015-12-27 22:05:45 -05:00
using System.Runtime.InteropServices ;
using System.Threading ;
2015-07-01 23:17:14 -04:00
using System.Threading.Tasks ;
using System.Windows.Forms ;
2017-08-13 17:17:14 -04:00
using System.Xml.Serialization ;
2016-01-16 22:40:41 -05:00
using Mesen.GUI.Config ;
2016-02-19 13:05:04 -05:00
using Mesen.GUI.Forms ;
2015-07-01 23:17:14 -04:00
namespace Mesen.GUI
{
static class Program
{
2015-12-27 22:05:45 -05:00
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetForegroundWindow ( IntPtr hWnd ) ;
2016-12-11 10:56:23 -05:00
public static bool IsMono { get ; private set ; }
2016-12-20 22:44:43 -05:00
public static string OriginalFolder { get ; private set ; }
2016-12-11 10:56:23 -05:00
2016-01-16 22:40:41 -05:00
private static void Application_ThreadException ( object sender , ThreadExceptionEventArgs e )
{
2016-02-19 13:05:04 -05:00
MesenMsgBox . Show ( "UnexpectedError" , MessageBoxButtons . OK , MessageBoxIcon . Error , e . Exception . ToString ( ) ) ;
2016-01-16 22:40:41 -05:00
}
2016-09-05 12:12:57 -04:00
2016-01-17 11:11:53 -05:00
private static void CurrentDomain_UnhandledException ( object sender , UnhandledExceptionEventArgs e )
{
2016-02-19 13:05:04 -05:00
MesenMsgBox . Show ( "UnexpectedError" , MessageBoxButtons . OK , MessageBoxIcon . Error , e . ExceptionObject . ToString ( ) ) ;
2016-01-17 11:11:53 -05:00
}
2016-01-16 22:40:41 -05:00
2016-05-22 14:43:07 -04:00
[DebuggerNonUserCode]
private static Assembly LoadAssemblies ( object sender , ResolveEventArgs e )
{
//Allow assemblies to be loaded from subfolders in the home folder (used for Google Drive API dlls)
string assemblyFile = e . Name . Contains ( ',' ) ? e . Name . Substring ( 0 , e . Name . IndexOf ( ',' ) ) : e . Name ;
assemblyFile + = ".dll" ;
string absoluteFolder = new FileInfo ( ( new System . Uri ( Assembly . GetExecutingAssembly ( ) . CodeBase ) ) . LocalPath ) . Directory . FullName ;
string targetPath = Path . Combine ( ConfigManager . HomeFolder , "GoogleDrive" , assemblyFile ) ;
2019-01-31 22:26:24 -05:00
if ( ResourceManager . GoogleDlls . Contains ( assemblyFile ) ) {
ResourceManager . ExtractGoogleDriveResources ( ) ;
}
2016-05-22 14:43:07 -04:00
try {
if ( File . Exists ( targetPath ) ) {
return Assembly . LoadFile ( targetPath ) ;
}
} catch ( Exception ) {
return null ;
}
return null ;
}
2015-07-01 23:17:14 -04:00
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
2016-01-17 11:11:53 -05:00
[HandleProcessCorruptedStateExceptions]
2016-01-16 22:40:41 -05:00
private static void Main ( string [ ] args )
2015-07-01 23:17:14 -04:00
{
2016-01-17 11:11:53 -05:00
try {
2017-08-13 17:17:14 -04:00
Task . Run ( ( ) = > {
//Cache deserializers in another thread
2018-06-11 19:27:35 -04:00
new XmlSerializer ( typeof ( Configuration ) ) ;
new XmlSerializer ( typeof ( DebugWorkspace ) ) ;
2017-08-13 17:17:14 -04:00
} ) ;
2016-12-11 10:56:23 -05:00
if ( Type . GetType ( "Mono.Runtime" ) ! = null ) {
Program . IsMono = true ;
}
2016-12-20 22:44:43 -05:00
Program . OriginalFolder = Directory . GetCurrentDirectory ( ) ;
2016-12-11 10:56:23 -05:00
2016-01-17 11:11:53 -05:00
Application . SetUnhandledExceptionMode ( UnhandledExceptionMode . CatchException ) ;
Application . ThreadException + = Application_ThreadException ;
AppDomain . CurrentDomain . UnhandledException + = CurrentDomain_UnhandledException ;
2016-01-16 22:40:41 -05:00
2019-05-11 21:59:29 -04:00
//Enable TLS 1.0/1.1/1.2 support
ServicePointManager . SecurityProtocol = SecurityProtocolType . Tls | SecurityProtocolType . Tls11 | SecurityProtocolType . Tls12 ;
2017-08-11 22:20:07 -04:00
Application . EnableVisualStyles ( ) ;
Application . SetCompatibleTextRenderingDefault ( false ) ;
if ( ConfigManager . GetConfigFile ( ) = = null ) {
//Show config wizard
2017-08-12 00:23:42 -04:00
ResourceHelper . LoadResources ( Language . SystemDefault ) ;
2017-08-11 22:20:07 -04:00
Application . Run ( new frmConfigWizard ( ) ) ;
if ( ConfigManager . GetConfigFile ( ) = = null ) {
return ;
}
}
AppDomain . CurrentDomain . AssemblyResolve + = LoadAssemblies ;
2016-01-17 11:11:53 -05:00
Directory . CreateDirectory ( ConfigManager . HomeFolder ) ;
Directory . SetCurrentDirectory ( ConfigManager . HomeFolder ) ;
2016-05-02 20:22:17 -04:00
try {
2016-12-18 12:43:20 -05:00
if ( ! ResourceManager . ExtractResources ( ) ) {
return ;
}
2017-09-08 15:06:06 -04:00
} catch ( FileNotFoundException e ) {
2016-07-24 13:38:24 -04:00
string message = "The Microsoft .NET Framework 4.5 could not be found. Please download and install the latest version of the .NET Framework from Microsoft's website and try again." ;
switch ( ResourceHelper . GetCurrentLanguage ( ) ) {
case Language . French : message = "Le .NET Framework 4.5 de Microsoft n'a pas été trouvé. Veuillez télécharger la plus récente version du .NET Framework à partir du site de Microsoft et essayer à nouveau." ; break ;
case Language . Japanese : message = "Microsoft .NET Framework 4.5はインストールされていないため、Mesenは起動できません。Microsoft .NET Frameworkの最新版をMicrosoftのサイトからダウンロードして、インストールしてください。" ; break ;
case Language . Russian : message = "Microsoft .NET Framework 4.5 не найден. Пожалуйста загрузите и установите последнюю версию .NET Framework с сайта Microsoft и попробуйте снова." ; break ;
2016-09-05 12:12:57 -04:00
case Language . Spanish : message = "Microsoft .NET Framework 4.5 no se ha encontrado. Por favor, descargue la versión más reciente de .NET Framework desde el sitio de Microsoft y vuelva a intentarlo." ; break ;
2016-09-02 20:10:24 -04:00
case Language . Ukrainian : message = "Microsoft .NET Framework 4.5 не знайдений. Будь ласка завантажте і встановіть останню версію .NET Framework з сайту Microsoft і спробуйте знову." ; break ;
2016-12-20 23:04:20 -05:00
case Language . Portuguese : message = "Microsoft .NET Framework 4.5 não foi encontrado. Por favor, baixe a versão mais recente de .NET Framework do site da Microsoft e tente novamente." ; break ;
2019-02-02 13:18:46 +08:00
case Language . Chinese : message = "找不到 Microsoft .NET Framework 4.5,请访问 Microsoft 官网下载安装之后再试。" ; break ;
2020-07-16 23:23:19 +02:00
case Language . Italian : message = "Impossibile trovare Microsoft .NET Framework 4.5. Scaricare e installare la versione più recente di .NET Framework dal sito Web di Microsoft e riprovare." ; break ;
2020-09-10 21:34:09 +02:00
case Language . Polish : message = "Nie można znaleźć programu Microsoft .NET Framework 4.5. Pobierz i zainstaluj najnowszą wersję .NET Framework z witryny firmy Microsoft i spróbuj ponownie." ; break ;
2016-07-24 13:38:24 -04:00
}
2017-09-08 15:06:06 -04:00
MessageBox . Show ( message + Environment . NewLine + Environment . NewLine + e . ToString ( ) , "Mesen" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
2016-05-02 20:22:17 -04:00
return ;
2016-07-24 13:38:24 -04:00
} catch ( Exception e ) {
string message = "An unexpected error has occurred.\n\nError details:\n{0}" ;
switch ( ResourceHelper . GetCurrentLanguage ( ) ) {
case Language . French : message = "Une erreur inattendue s'est produite.\n\nDétails de l'erreur :\n{0}" ; break ;
case Language . Japanese : message = "予期しないエラーが発生しました。\n\nエラーの詳細:\n{0}" ; break ;
case Language . Russian : message = "Неизвестная ошибка.

Подробно:
{0}" ; break ;
case Language . Spanish : message = "Se ha producido un error inesperado.

Detalles del error:
{0}" ; break ;
2016-09-02 20:10:24 -04:00
case Language . Ukrainian : message = "Невідома помилка.

Детально:
{0}" ; break ;
2016-12-20 23:04:20 -05:00
case Language . Portuguese : message = "Houve um erro inesperado.

Detalhes do erro:
{0}" ; break ;
2019-02-02 13:18:46 +08:00
case Language . Chinese : message = "发生意外错误。\n\n详情:\n{0}" ; break ;
2020-07-16 23:23:19 +02:00
case Language . Italian : message = "Si è verificato un errore imprevisto.\n\nDettagli dell'errore:\n{0}" ; break ;
2020-09-10 21:34:09 +02:00
case Language . Polish : message = "Wystąpił nieoczekiwany błąd.\n\nSzczegóły błędu:\n{0}" ; break ;
2016-07-24 13:38:24 -04:00
}
MessageBox . Show ( string . Format ( message , e . ToString ( ) ) , "Mesen" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
2016-05-02 20:22:17 -04:00
}
2016-01-16 22:40:41 -05:00
2016-01-17 11:11:53 -05:00
if ( ! RuntimeChecker . TestDll ( ) ) {
return ;
}
2016-01-16 19:33:10 -05:00
2018-04-14 21:53:52 -04:00
if ( CommandLineHelper . PreprocessCommandLineArguments ( args , true ) . Contains ( "/testrunner" ) ) {
Environment . ExitCode = TestRunner . Run ( args ) ;
return ;
}
2016-12-13 20:31:44 -05:00
using ( SingleInstance singleInstance = new SingleInstance ( ) ) {
2017-08-13 17:17:14 -04:00
if ( singleInstance . FirstInstance | | ! ConfigManager . Config . PreferenceInfo . SingleInstance ) {
2017-08-11 22:20:07 -04:00
frmMain frmMain = new frmMain ( args ) ;
2015-12-27 22:05:45 -05:00
2017-08-13 17:17:14 -04:00
singleInstance . ListenForArgumentsFromSuccessiveInstances ( ) ;
singleInstance . ArgumentsReceived + = ( object sender , ArgumentsReceivedEventArgs e ) = > {
2018-02-06 19:50:14 -05:00
if ( frmMain . IsHandleCreated ) {
frmMain . BeginInvoke ( ( MethodInvoker ) ( ( ) = > {
2018-04-14 21:53:52 -04:00
frmMain . ProcessCommandLineArguments ( CommandLineHelper . PreprocessCommandLineArguments ( e . Args , true ) , false ) ;
frmMain . LoadGameFromCommandLine ( CommandLineHelper . PreprocessCommandLineArguments ( e . Args , false ) ) ;
2018-02-06 19:51:00 -05:00
} ) ) ;
2018-02-06 19:50:14 -05:00
}
2017-08-13 17:17:14 -04:00
} ;
2015-12-27 22:05:45 -05:00
2016-01-17 11:11:53 -05:00
Application . Run ( frmMain ) ;
} else {
if ( singleInstance . PassArgumentsToFirstInstance ( args ) ) {
Process current = Process . GetCurrentProcess ( ) ;
foreach ( Process process in Process . GetProcessesByName ( current . ProcessName ) ) {
if ( process . Id ! = current . Id ) {
Program . SetForegroundWindow ( process . MainWindowHandle ) ;
break ;
}
2015-12-27 22:05:45 -05:00
}
2016-01-17 11:11:53 -05:00
} else {
2017-08-11 22:20:07 -04:00
Application . Run ( new frmMain ( args ) ) ;
2015-12-27 22:05:45 -05:00
}
}
}
2016-01-17 11:11:53 -05:00
} catch ( Exception e ) {
2016-02-19 13:05:04 -05:00
MesenMsgBox . Show ( "UnexpectedError" , MessageBoxButtons . OK , MessageBoxIcon . Error , e . ToString ( ) ) ;
2015-12-27 22:05:45 -05:00
}
2015-07-01 23:17:14 -04:00
}
}
}