2014-12-07 19:09:38 -05:00
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
2014-03-14 14:13:41 -04:00
# include "TargetDeviceServicesPrivatePCH.h"
/* FTargetDeviceServiceManager structors
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-10-08 16:57:50 -04:00
FTargetDeviceServiceManager : : FTargetDeviceServiceManager ( )
2014-03-14 14:13:41 -04:00
{
IMessageBusPtr MessageBus = IMessagingModule : : Get ( ) . GetDefaultBus ( ) ;
if ( MessageBus . IsValid ( ) )
{
MessageBus - > OnShutdown ( ) . AddRaw ( this , & FTargetDeviceServiceManager : : HandleMessageBusShutdown ) ;
MessageBusPtr = MessageBus ;
}
LoadSettings ( ) ;
InitializeTargetPlatforms ( ) ;
}
2014-10-08 16:57:50 -04:00
FTargetDeviceServiceManager : : ~ FTargetDeviceServiceManager ( )
2014-03-14 14:13:41 -04:00
{
ShutdownTargetPlatforms ( ) ;
FScopeLock Lock ( & CriticalSection ) ;
{
SaveSettings ( ) ;
}
IMessageBusPtr MessageBus = MessageBusPtr . Pin ( ) ;
if ( MessageBus . IsValid ( ) )
{
MessageBus - > OnShutdown ( ) . RemoveAll ( this ) ;
}
}
/* ITargetDeviceServiceManager interface
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-09-09 12:20:43 -04:00
bool FTargetDeviceServiceManager : : AddStartupService ( const FString & DeviceName )
2014-03-14 14:13:41 -04:00
{
FScopeLock Lock ( & CriticalSection ) ;
{
2014-09-09 12:20:43 -04:00
StartupServices . Add ( DeviceName , false ) ;
2014-03-14 14:13:41 -04:00
2014-09-09 12:20:43 -04:00
return AddService ( DeviceName ) . IsValid ( ) ;
2014-03-14 14:13:41 -04:00
}
}
int32 FTargetDeviceServiceManager : : GetServices ( TArray < ITargetDeviceServicePtr > & OutServices )
{
FScopeLock Lock ( & CriticalSection ) ;
{
DeviceServices . GenerateValueArray ( OutServices ) ;
}
return OutServices . Num ( ) ;
}
2014-09-09 12:20:43 -04:00
void FTargetDeviceServiceManager : : RemoveStartupService ( const FString & DeviceName )
2014-03-14 14:13:41 -04:00
{
FScopeLock Lock ( & CriticalSection ) ;
{
2014-09-09 12:20:43 -04:00
if ( StartupServices . Remove ( DeviceName ) > 0 )
2014-03-14 14:13:41 -04:00
{
2014-09-09 12:20:43 -04:00
RemoveService ( DeviceName ) ;
2014-03-14 14:13:41 -04:00
}
}
}
/* FTargetDeviceServiceManager implementation
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-09-09 12:20:43 -04:00
ITargetDeviceServicePtr FTargetDeviceServiceManager : : AddService ( const FString & DeviceName )
2014-03-14 14:13:41 -04:00
{
IMessageBusPtr MessageBus = MessageBusPtr . Pin ( ) ;
if ( ! MessageBus . IsValid ( ) )
{
2014-09-09 12:20:43 -04:00
return nullptr ;
2014-03-14 14:13:41 -04:00
}
2014-09-09 12:20:43 -04:00
ITargetDeviceServicePtr DeviceService = DeviceServices . FindRef ( DeviceName ) ;
2014-03-14 14:13:41 -04:00
// create service if needed
if ( ! DeviceService . IsValid ( ) )
{
2014-09-09 12:20:43 -04:00
DeviceService = MakeShareable ( new FTargetDeviceService ( DeviceName , MessageBus . ToSharedRef ( ) ) ) ;
DeviceServices . Add ( DeviceName , DeviceService ) ;
2014-03-14 14:13:41 -04:00
ServiceAddedDelegate . Broadcast ( DeviceService . ToSharedRef ( ) ) ;
}
// share service if desired
2014-09-09 12:20:43 -04:00
const bool * Shared = StartupServices . Find ( DeviceName ) ;
2014-03-14 14:13:41 -04:00
if ( Shared ! = nullptr )
{
DeviceService - > SetShared ( * Shared ) ;
2014-09-09 12:20:43 -04:00
DeviceService - > Start ( ) ;
2014-03-14 14:13:41 -04:00
}
2014-09-09 12:20:43 -04:00
return DeviceService ;
}
2014-03-14 14:13:41 -04:00
2014-09-09 12:20:43 -04:00
bool FTargetDeviceServiceManager : : AddTargetDevice ( ITargetDevicePtr InDevice )
{
2015-01-19 17:54:43 -05:00
FScopeLock Lock ( & CriticalSection ) ;
2014-09-09 12:20:43 -04:00
IMessageBusPtr MessageBus = MessageBusPtr . Pin ( ) ;
if ( ! MessageBus . IsValid ( ) )
2014-03-14 14:13:41 -04:00
{
2014-09-09 12:20:43 -04:00
return false ;
}
const FString & DeviceName = InDevice - > GetName ( ) ;
ITargetDeviceServicePtr DeviceService = AddService ( DeviceName ) ;
if ( DeviceService . IsValid ( ) )
{
DeviceService - > AddTargetDevice ( InDevice ) ;
if ( InDevice . IsValid ( ) & & InDevice - > IsDefault ( ) )
{
DeviceService - > Start ( ) ;
}
2014-03-14 14:13:41 -04:00
}
return true ;
}
2014-10-08 16:57:50 -04:00
void FTargetDeviceServiceManager : : InitializeTargetPlatforms ( )
2014-03-14 14:13:41 -04:00
{
TArray < ITargetPlatform * > Platforms = GetTargetPlatformManager ( ) - > GetTargetPlatforms ( ) ;
for ( int32 PlatformIndex = 0 ; PlatformIndex < Platforms . Num ( ) ; + + PlatformIndex )
{
// set up target platform callbacks
ITargetPlatform * Platform = Platforms [ PlatformIndex ] ;
Platform - > OnDeviceDiscovered ( ) . AddRaw ( this , & FTargetDeviceServiceManager : : HandleTargetPlatformDeviceDiscovered ) ;
Platform - > OnDeviceLost ( ) . AddRaw ( this , & FTargetDeviceServiceManager : : HandleTargetPlatformDeviceLost ) ;
// add services for existing devices
TArray < ITargetDevicePtr > Devices ;
Platform - > GetAllDevices ( Devices ) ;
for ( int32 DeviceIndex = 0 ; DeviceIndex < Devices . Num ( ) ; + + DeviceIndex )
{
ITargetDevicePtr & Device = Devices [ DeviceIndex ] ;
if ( Device . IsValid ( ) )
{
2014-09-09 12:20:43 -04:00
AddTargetDevice ( Device ) ;
2014-03-14 14:13:41 -04:00
}
}
}
}
2014-10-08 16:57:50 -04:00
void FTargetDeviceServiceManager : : LoadSettings ( )
2014-03-14 14:13:41 -04:00
{
if ( GConfig = = nullptr )
{
return ;
}
FConfigSection * OwnedDevices = GConfig - > GetSectionPrivate ( TEXT ( " TargetDeviceServices " ) , false , true , GEngineIni ) ;
if ( OwnedDevices = = nullptr )
{
return ;
}
// for each entry in the INI file...
for ( FConfigSection : : TIterator It ( * OwnedDevices ) ; It ; + + It )
{
if ( It . Key ( ) ! = TEXT ( " StartupServices " ) )
{
continue ;
}
const FString & ServiceString = * It . Value ( ) ;
// ... parse device identifier...
2014-09-09 12:20:43 -04:00
FString DeviceName ;
2014-03-14 14:13:41 -04:00
2014-09-09 12:20:43 -04:00
if ( ! FParse : : Value ( * ServiceString , TEXT ( " DeviceName= " ) , DeviceName ) )
2014-03-14 14:13:41 -04:00
{
2014-09-09 12:20:43 -04:00
UE_LOG ( TargetDeviceServicesLog , Warning , TEXT ( " [TargetDeviceServices] failed to parse DeviceName in configuration setting: StartupServices=%s " ) , * ServiceString ) ;
2014-03-14 14:13:41 -04:00
continue ;
}
2014-09-09 12:20:43 -04:00
if ( DeviceServices . Contains ( DeviceName ) )
2014-03-14 14:13:41 -04:00
{
UE_LOG ( TargetDeviceServicesLog , Warning , TEXT ( " [TargetDeviceServices] duplicate entry for : StartupServices=%s " ) , * ServiceString ) ;
continue ;
}
// ... parse sharing state...
bool Shared ;
if ( FParse : : Bool ( * ServiceString , TEXT ( " Shared= " ) , Shared ) )
{
Shared = false ;
}
2014-09-09 12:20:43 -04:00
StartupServices . Add ( DeviceName , Shared ) ;
2014-03-14 14:13:41 -04:00
// ... create and start device service
ITargetDeviceServicePtr DeviceService ;
2014-09-09 12:20:43 -04:00
if ( ! AddService ( DeviceName ) . IsValid ( ) )
2014-03-14 14:13:41 -04:00
{
UE_LOG ( TargetDeviceServicesLog , Warning , TEXT ( " [TargetDeviceServices] failed to create service for: StartupServices=%s " ) , * ServiceString ) ;
}
}
}
2014-09-09 12:20:43 -04:00
void FTargetDeviceServiceManager : : RemoveService ( const FString & DeviceName )
2014-03-14 14:13:41 -04:00
{
2014-09-09 12:20:43 -04:00
ITargetDeviceServicePtr DeviceService = DeviceServices . FindRef ( DeviceName ) ;
2014-03-14 14:13:41 -04:00
if ( ! DeviceService . IsValid ( ) )
{
return ;
}
DeviceService - > Stop ( ) ;
// only truly remove if not startup device or physical device not available
2014-09-09 12:20:43 -04:00
if ( ! StartupServices . Contains ( DeviceName ) & & ! DeviceService - > GetDevice ( ) . IsValid ( ) )
2014-03-14 14:13:41 -04:00
{
2014-09-09 12:20:43 -04:00
DeviceServices . Remove ( DeviceName ) ;
2014-03-14 14:13:41 -04:00
ServiceRemovedDelegate . Broadcast ( DeviceService . ToSharedRef ( ) ) ;
}
}
2014-09-09 12:20:43 -04:00
void FTargetDeviceServiceManager : : RemoveTargetDevice ( ITargetDevicePtr InDevice )
{
2015-01-19 17:54:43 -05:00
FScopeLock Lock ( & CriticalSection ) ;
2014-09-09 12:20:43 -04:00
ITargetDeviceServicePtr DeviceService = DeviceServices . FindRef ( InDevice - > GetName ( ) ) ;
if ( ! DeviceService . IsValid ( ) )
{
return ;
}
DeviceService - > RemoveTargetDevice ( InDevice ) ;
if ( DeviceService - > NumTargetDevices ( ) < = 0 )
{
RemoveService ( InDevice - > GetName ( ) ) ;
}
return ;
}
2014-03-14 14:13:41 -04:00
2014-10-08 16:57:50 -04:00
void FTargetDeviceServiceManager : : SaveSettings ( )
2014-03-14 14:13:41 -04:00
{
if ( GConfig = = nullptr )
{
return ;
}
GConfig - > EmptySection ( TEXT ( " TargetDeviceServices " ) , GEngineIni ) ;
TArray < FString > ServiceStrings ;
// for each device service...
2014-09-09 12:20:43 -04:00
for ( TMap < FString , ITargetDeviceServicePtr > : : TConstIterator It ( DeviceServices ) ; It ; + + It )
2014-03-14 14:13:41 -04:00
{
2014-09-09 12:20:43 -04:00
const FString & DeviceName = It . Key ( ) ;
2014-03-14 14:13:41 -04:00
const ITargetDeviceServicePtr & DeviceService = It . Value ( ) ;
// ... that is not managing a default device...
ITargetDevicePtr TargetDevice = DeviceService - > GetDevice ( ) ;
if ( TargetDevice . IsValid ( ) & & TargetDevice - > IsDefault ( ) )
{
continue ;
}
// ... that should be automatically restarted next time...
2014-09-09 12:20:43 -04:00
const bool * Shared = StartupServices . Find ( DeviceName ) ;
2014-03-14 14:13:41 -04:00
if ( ( Shared ! = nullptr ) | | DeviceService - > IsRunning ( ) )
{
// ... generate an entry in the INI file
2014-09-09 12:20:43 -04:00
FString ServiceString = FString : : Printf ( TEXT ( " DeviceName= \" %s \" ,Shared=%s " ) ,
* DeviceName ,
2014-03-14 14:13:41 -04:00
( ( Shared ! = nullptr ) & & * Shared ) ? TEXT ( " true " ) : TEXT ( " false " )
) ;
ServiceStrings . Add ( ServiceString ) ;
}
}
// save configuration
GConfig - > SetArray ( TEXT ( " TargetDeviceServices " ) , TEXT ( " StartupServices " ) , ServiceStrings , GEngineIni ) ;
GConfig - > Flush ( false , GEngineIni ) ;
}
2014-10-08 16:57:50 -04:00
void FTargetDeviceServiceManager : : ShutdownTargetPlatforms ( )
2014-03-14 14:13:41 -04:00
{
2014-06-20 09:46:38 -04:00
ITargetPlatformManagerModule * Module = FModuleManager : : GetModulePtr < ITargetPlatformManagerModule > ( " TargetPlatform " ) ;
if ( Module )
2014-03-14 14:13:41 -04:00
{
2014-06-20 09:46:38 -04:00
TArray < ITargetPlatform * > Platforms = Module - > GetTargetPlatforms ( ) ;
for ( int32 PlatformIndex = 0 ; PlatformIndex < Platforms . Num ( ) ; + + PlatformIndex )
{
// set up target platform callbacks
ITargetPlatform * Platform = Platforms [ PlatformIndex ] ;
Platform - > OnDeviceDiscovered ( ) . RemoveAll ( this ) ;
Platform - > OnDeviceLost ( ) . RemoveAll ( this ) ;
}
2014-03-14 14:13:41 -04:00
}
}
/* FTargetDeviceServiceManager callbacks
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-10-08 16:57:50 -04:00
void FTargetDeviceServiceManager : : HandleMessageBusShutdown ( )
2014-03-14 14:13:41 -04:00
{
MessageBusPtr . Reset ( ) ;
}
2014-09-09 12:20:43 -04:00
void FTargetDeviceServiceManager : : HandleTargetPlatformDeviceDiscovered ( ITargetDeviceRef DiscoveredDevice )
2014-03-14 14:13:41 -04:00
{
2015-01-19 17:54:43 -05:00
AddTargetDevice ( DiscoveredDevice ) ;
2014-03-14 14:13:41 -04:00
}
2014-09-09 12:20:43 -04:00
void FTargetDeviceServiceManager : : HandleTargetPlatformDeviceLost ( ITargetDeviceRef LostDevice )
2014-03-14 14:13:41 -04:00
{
2015-01-19 17:54:43 -05:00
RemoveTargetDevice ( LostDevice ) ;
2014-03-14 14:13:41 -04:00
}