2016-01-07 08:17:16 -05:00
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
2014-03-14 14:13:41 -04:00
/*=============================================================================
FileServerCommandlet . cpp : Implements the UFileServerCommandlet class .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
# include "UnrealEd.h"
# include "DirectoryWatcherModule.h"
# include "Messaging.h"
# include "NetworkFileSystem.h"
# include "UnrealEdMessages.h"
DEFINE_LOG_CATEGORY_STATIC ( LogFileServerCommandlet , Log , All ) ;
/* UFileServerCommandlet structors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-10-14 10:29:11 -04:00
UFileServerCommandlet : : UFileServerCommandlet ( const FObjectInitializer & ObjectInitializer )
: Super ( ObjectInitializer )
2014-03-14 14:13:41 -04:00
{
IsClient = false ;
IsEditor = false ;
IsServer = false ;
LogToConsole = false ;
}
/* UFileServerCommandlet interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int32 UFileServerCommandlet : : Main ( const FString & Params )
{
GIsRequestingExit = false ;
GIsRunning = true ;
//@todo abstract properly or delete
# if PLATFORM_WINDOWS // Windows only
// Used by the .com wrapper to notify that the Ctrl-C handler was triggered.
// This shared event is checked each tick so that the log file can be cleanly flushed.
2015-01-28 07:31:10 -05:00
FEvent * ComWrapperShutdownEvent = FPlatformProcess : : GetSynchEventFromPool ( true ) ;
2014-03-14 14:13:41 -04:00
# endif
// parse instance identifier
FString InstanceIdString ;
if ( FParse : : Value ( * Params , TEXT ( " InstanceId= " ) , InstanceIdString ) )
{
if ( ! FGuid : : Parse ( InstanceIdString , InstanceId ) )
{
UE_LOG ( LogFileServerCommandlet , Warning , TEXT ( " Invalid InstanceId on command line: %s " ) , * InstanceIdString ) ;
}
}
// start the listening thread
INetworkFileServer * NetworkFileServer = FModuleManager : : LoadModuleChecked < INetworkFileSystemModule > ( " NetworkFileSystem " )
2014-09-08 11:51:08 -04:00
. CreateNetworkFileServer ( true , InstanceId . IsValid ( ) ? 0 : - 1 ) ;
2014-03-14 14:13:41 -04:00
TArray < TSharedPtr < FInternetAddr > > AddressList ;
if ( ( NetworkFileServer = = NULL ) | | ! NetworkFileServer - > GetAddressList ( AddressList ) )
{
UE_LOG ( LogFileServerCommandlet , Error , TEXT ( " Failed to create network file server " ) ) ;
return - 1 ;
}
// broadcast our presence
if ( InstanceId . IsValid ( ) )
{
TArray < FString > AddressStringList ;
for ( int32 AddressIndex = 0 ; AddressIndex < AddressList . Num ( ) ; + + AddressIndex )
{
AddressStringList . Add ( AddressList [ AddressIndex ] - > ToString ( true ) ) ;
}
FMessageEndpointPtr MessageEndpoint = FMessageEndpoint : : Builder ( " UFileServerCommandlet " ) . Build ( ) ;
if ( MessageEndpoint . IsValid ( ) )
{
MessageEndpoint - > Publish ( new FFileServerReady ( AddressStringList , InstanceId ) , EMessageScope : : Network ) ;
}
}
// main loop
FDateTime LastConnectionTime = FDateTime : : UtcNow ( ) ;
while ( GIsRunning & & ! GIsRequestingExit )
{
GEngine - > UpdateTimeAndHandleMaxTickRate ( ) ;
2014-04-23 18:12:58 -04:00
GEngine - > Tick ( FApp : : GetDeltaTime ( ) , false ) ;
2014-03-14 14:13:41 -04:00
// tick the directory watcher
FDirectoryWatcherModule & DirectoryWatcherModule = FModuleManager : : Get ( ) . LoadModuleChecked < FDirectoryWatcherModule > ( TEXT ( " DirectoryWatcher " ) ) ;
2014-04-23 18:12:58 -04:00
DirectoryWatcherModule . Get ( ) - > Tick ( FApp : : GetDeltaTime ( ) ) ;
2014-03-14 14:13:41 -04:00
// update task graph
FTaskGraphInterface : : Get ( ) . ProcessThreadUntilIdle ( ENamedThreads : : GameThread ) ;
// execute deferred commands
for ( int32 DeferredCommandsIndex = 0 ; DeferredCommandsIndex < GEngine - > DeferredCommands . Num ( ) ; DeferredCommandsIndex + + )
{
GEngine - > Exec ( GWorld , * GEngine - > DeferredCommands [ DeferredCommandsIndex ] , * GLog ) ;
}
GEngine - > DeferredCommands . Empty ( ) ;
// handle server timeout
if ( InstanceId . IsValid ( ) )
{
if ( NetworkFileServer - > NumConnections ( ) > 0 )
{
LastConnectionTime = FDateTime : : UtcNow ( ) ;
}
if ( ( FDateTime : : UtcNow ( ) - LastConnectionTime ) > FTimespan : : FromMinutes ( 3.0 ) )
{
uint32 Result = FMessageDialog : : Open ( EAppMsgType : : YesNo , NSLOCTEXT ( " UnrealEd " , " FileServerIdle " , " The file server did not receive any connections in the past 3 minutes. Would you like to shut it down? " ) ) ;
if ( Result = = EAppReturnType : : No )
{
LastConnectionTime = FDateTime : : UtcNow ( ) ;
}
else
{
break ;
}
}
}
// flush log
GLog - > FlushThreadedLogs ( ) ;
# if PLATFORM_WINDOWS
if ( ComWrapperShutdownEvent - > Wait ( 0 ) )
{
GIsRequestingExit = true ;
}
# endif
}
// shutdown the server
NetworkFileServer - > Shutdown ( ) ;
delete NetworkFileServer ;
//@todo abstract properly or delete
# if PLATFORM_WINDOWS
2015-01-28 07:31:10 -05:00
FPlatformProcess : : ReturnSynchEventToPool ( ComWrapperShutdownEvent ) ;
ComWrapperShutdownEvent = nullptr ;
2014-03-14 14:13:41 -04:00
# endif
GIsRunning = false ;
return 0 ;
}