#include "CLauncher.h"
#include "ServerControl.h"
#include "DSCThread.h"
#include "PrivateTypes.h"
#include "CLog.h"
#include "CServerPlugin.h"
#include "PluginData.h"
#include "CPlugInList.h"
#include "CRefTable.h"
#include "CPlugInList.h"
#include "CServerPlugin.h"
#include "SharedConsts.h"
#include "CPluginConfig.h"
#include <CoreFoundation/CFRunLoop.h>
#include <servers/bootstrap.h>
#include <time.h>
extern CFRunLoopRef gServerRunLoop;
extern CPluginConfig *gPluginConfig;
CLauncher::CLauncher ( CServerPlugin *inPlugin ) : CInternalDispatchThread(kTSLauncherThread)
{
fThreadSignature = kTSLauncherThread;
if ( inPlugin == nil )
{
ERRORLOG( kLogApplication, "Launcher failed create with no plugin pointer provided" );
throw((sInt32)eParameterError);
}
fPlugin = inPlugin;
}
CLauncher::~CLauncher()
{
}
void CLauncher::StartThread ( void )
{
if ( this == nil )
{
ERRORLOG( kLogApplication, "Launcher StartThread failed with memory error on itself" );
throw((sInt32)eMemoryError);
}
this->Resume();
}
void CLauncher::StopThread ( void )
{
if ( this == nil )
{
ERRORLOG( kLogApplication, "Launcher StopThread failed with memory error on itself" );
throw((sInt32)eMemoryError);
}
SetThreadRunState( kThreadStop );
}
long CLauncher::ThreadMain ( void )
{
bool done = false;
sInt32 siResult = eDSNoErr;
uInt32 uiCntr = 0;
uInt32 uiAttempts = 100;
volatile uInt32 uiWaitTime = 1;
sHeader aHeader;
ePluginState pluginState = kUnknownState;
if ( gPlugins != nil )
{
while ( !done )
{
uiCntr++;
siResult = fPlugin->Initialize();
if ( ( siResult != eDSNoErr ) && ( uiCntr == 1 ) )
{
ERRORLOG3( kLogApplication, "Attempt #%l to initialize plug-in %s failed.\n Will retry initialization at most 100 times every %l second.", uiCntr, fPlugin->GetPluginName(), uiWaitTime );
}
if ( siResult == eDSNoErr )
{
DBGLOG2( kLogApplication, "Initialization of plug-in %s succeeded with #%l attempt.", fPlugin->GetPluginName(), uiCntr );
gPlugins->SetState( fPlugin->GetPluginName(), kInitialized );
if (gServerRunLoop != NULL)
{
aHeader.fType = kServerRunLoop;
aHeader.fResult = eDSNoErr;
aHeader.fContextData = (void *)gServerRunLoop;
siResult = fPlugin->ProcessRequest( (void*)&aHeader ); }
pluginState = gPluginConfig->GetPluginState( fPlugin->GetPluginName() );
if ( pluginState == kInactive )
{
siResult = fPlugin->SetPluginState( kInactive );
if ( siResult == eDSNoErr )
{
SRVRLOG1( kLogApplication, "Plug-in %s state is now inactive.", fPlugin->GetPluginName() );
gPlugins->SetState( fPlugin->GetPluginName(), kInactive );
}
else
{
ERRORLOG2( kLogApplication, "Unable to set %s plug-in state to inactive. Received error %l.", fPlugin->GetPluginName(), siResult );
}
}
else
{
siResult = fPlugin->SetPluginState( kActive );
if ( siResult == eDSNoErr )
{
SRVRLOG1( kLogApplication, "Plug-in %s state is now active.", fPlugin->GetPluginName() );
gPlugins->SetState( fPlugin->GetPluginName(), kActive );
}
else
{
ERRORLOG2( kLogApplication, "Unable to set %s plug-in state to active. Received error %l.", fPlugin->GetPluginName(), siResult );
}
}
done = true;
}
if ( !done )
{
if ( uiCntr == uiAttempts )
{
ERRORLOG2( kLogApplication, "%l attempts to initialize plug-in %s failed.\n Setting plug-in state to inactive.", uiCntr, fPlugin->GetPluginName() );
gPlugins->SetState( fPlugin->GetPluginName(), kInactive | kFailedToInit );
siResult = fPlugin->SetPluginState( kInactive );
done = true;
}
else
{
fWaitToInti.Wait( uiWaitTime * kMilliSecsPerSec );
}
}
}
}
return( 0 );
}