2019-12-26 23:06:02 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
2019-01-10 17:26:53 -05:00
2021-01-20 12:01:55 -04:00
# include "Logging/LogMacros.h"
2019-01-10 17:26:53 -05:00
# include "RequiredProgramMainCPPInclude.h"
2021-03-05 19:27:14 -04:00
# include "UnrealMultiUserServerRun.h"
# include "RequiredProgramMainCPPInclude.h"
2021-01-20 12:01:55 -04:00
DEFINE_LOG_CATEGORY_STATIC ( LogMultiUserServer , Log , All )
2019-01-10 17:26:53 -05:00
IMPLEMENT_APPLICATION ( UnrealMultiUserServer , " UnrealMultiUserServer " ) ;
2019-10-04 13:11:45 -04:00
# if PLATFORM_MAC // On Mac, to get a properly logging console that play nice, we need to build a mac application (.app) rather than a console application.
class CommandLineArguments
{
public :
CommandLineArguments ( ) : ArgC ( 0 ) , ArgV ( nullptr ) { }
CommandLineArguments ( int InArgC , char * InUtf8ArgV [ ] ) { Init ( InArgC , InUtf8ArgV ) ; }
void Init ( int InArgC , char * InUtf8ArgV [ ] )
{
ArgC = InArgC ;
ArgV = new TCHAR * [ ArgC ] ;
for ( int32 a = 0 ; a < ArgC ; a + + )
{
FUTF8ToTCHAR ConvertFromUtf8 ( InUtf8ArgV [ a ] ) ;
ArgV [ a ] = new TCHAR [ ConvertFromUtf8 . Length ( ) + 1 ] ;
FCString : : Strcpy ( ArgV [ a ] , ConvertFromUtf8 . Length ( ) + 1 , ConvertFromUtf8 . Get ( ) ) ;
}
}
~ CommandLineArguments ( )
{
for ( int32 a = 0 ; a < ArgC ; a + + )
{
delete [ ] ArgV [ a ] ;
}
delete [ ] ArgV ;
}
int ArgC ;
TCHAR * * ArgV ;
} ;
2021-01-20 12:01:55 -04:00
# import <Foundation / NSAppleEventDescriptor.h>
# import <Carbon / Carbon.h>
2019-10-04 13:11:45 -04:00
# include "Mac/CocoaThread.h"
static CommandLineArguments GSavedCommandLine ;
2021-03-31 06:40:14 -04:00
@ interface UEAppDelegate : NSObject < NSApplicationDelegate >
2019-10-04 13:11:45 -04:00
@ end
2021-03-31 06:40:14 -04:00
@ implementation UEAppDelegate
2019-10-04 13:11:45 -04:00
//handler for the quit apple event used by the Dock menu
- ( void ) handleQuitEvent : ( NSAppleEventDescriptor * ) Event withReplyEvent : ( NSAppleEventDescriptor * ) ReplyEvent
{
[ NSApp terminate : self ] ;
}
2021-01-20 12:01:55 -04:00
- ( void ) runGameThread : ( id ) Arg
2019-10-04 13:11:45 -04:00
{
FPlatformMisc : : SetGracefulTerminationHandler ( ) ;
FPlatformMisc : : SetCrashHandler ( nullptr ) ;
2020-01-23 16:28:59 -05:00
RunUnrealMultiUserServer ( GSavedCommandLine . ArgC , GSavedCommandLine . ArgV ) ;
2019-10-04 13:11:45 -04:00
}
2021-01-20 12:01:55 -04:00
- ( BOOL ) applicationShouldTerminateAfterLastWindowClosed : ( NSApplication * ) Sender
{
return true ;
}
- ( NSApplicationTerminateReply ) applicationShouldTerminate : ( NSApplication * ) Sender
2019-10-04 13:11:45 -04:00
{
if ( ! IsEngineExitRequested ( ) | | ( [ NSThread gameThread ] & & [ NSThread gameThread ] ! = [ NSThread mainThread ] ) )
{
2021-01-20 12:01:55 -04:00
FString Reason ;
NSAppleEventDescriptor * AppleEventDesc = [ [ NSAppleEventManager sharedAppleEventManager ] currentAppleEvent ] ;
NSAppleEventDescriptor * WhyDesc = [ AppleEventDesc attributeDescriptorForKeyword : kEventParamReason ] ;
OSType Why = [ WhyDesc typeCodeValue ] ;
if ( Why = = kAEShutDown )
{
Reason = TEXT ( " System Shutting Down " ) ;
}
else if ( Why = = kAERestart )
{
Reason = TEXT ( " System Restarting " ) ;
}
else if ( Why = = kAEReallyLogOut )
{
Reason = TEXT ( " User Logging Out " ) ;
}
else
{
Reason = TEXT ( " User Quitting (CMD-Q/Quit Menu) " ) ;
}
2021-11-24 10:41:59 -05:00
UE_LOG ( LogMultiUserServer , Warning , TEXT ( " *** INTERRUPTED *** : SHUTTING DOWN " ) ) ;
2021-01-20 12:01:55 -04:00
UE_LOG ( LogMultiUserServer , Warning , TEXT ( " *** INTERRUPTED *** : %s " ) , * Reason ) ;
RequestEngineExit ( * FString : : Printf ( TEXT ( " UnrealMultiUserServer Requesting Exit: %s " ) , * Reason ) ) ;
2019-10-04 13:11:45 -04:00
return NSTerminateLater ;
}
else
{
return NSTerminateNow ;
}
}
- ( void ) applicationDidFinishLaunching : ( NSNotification * ) Notification
{
//install the custom quit event handler
NSAppleEventManager * appleEventManager = [ NSAppleEventManager sharedAppleEventManager ] ;
[ appleEventManager setEventHandler : self andSelector : @ selector ( handleQuitEvent : withReplyEvent : ) forEventClass : kCoreEventClass andEventID : kAEQuitApplication ] ;
2019-12-19 18:07:47 -05:00
// Add a menu bar to the application.
id menubar = [ [ NSMenu new ] autorelease ] ;
id appMenuItem = [ [ NSMenuItem new ] autorelease ] ;
[ menubar addItem : appMenuItem ] ;
[ NSApp setMainMenu : menubar ] ;
// Populate the menu bar.
id appMenu = [ [ NSMenu new ] autorelease ] ;
id quitMenuItem = [ [ [ NSMenuItem alloc ] initWithTitle : NSLOCTEXT ( " UMUS_Quit " , " QuitApp " , " Quit " ) . ToString ( ) . GetNSString ( ) action : @ selector ( terminate : ) keyEquivalent : @ " q " ] autorelease ] ;
[ appMenu addItem : quitMenuItem ] ;
[ appMenuItem setSubmenu : appMenu ] ;
2019-10-04 13:11:45 -04:00
RunGameThread ( self , @ selector ( runGameThread : ) ) ;
}
2021-01-20 12:01:55 -04:00
@ end
2019-10-04 13:11:45 -04:00
int main ( int argc , char * argv [ ] )
{
// Record the command line.
GSavedCommandLine . Init ( argc , argv ) ;
// Launch the application.
SCOPED_AUTORELEASE_POOL ;
[ NSApplication sharedApplication ] ;
2021-03-31 06:40:14 -04:00
[ NSApp setDelegate : [ UEAppDelegate new ] ] ;
2019-10-04 13:11:45 -04:00
[ NSApp run ] ;
return 0 ;
}
# else // Windows/Linux
INT32_MAIN_INT32_ARGC_TCHAR_ARGV ( )
{
2020-01-23 16:28:59 -05:00
return RunUnrealMultiUserServer ( ArgC , ArgV ) ;
2019-10-04 13:11:45 -04:00
}
# endif