#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;
CLauncher::CLauncher ( CServerPlugin *inPlugin )
: DSCThread( kTSLauncherThread )
{
fThreadSignature = kTSLauncherThread;
if ( inPlugin == nil ) throw((sInt32)eParameterError);
fPlugin = inPlugin;
}
CLauncher::~CLauncher()
{
}
void CLauncher::StartThread ( void )
{
if ( this == nil ) throw((sInt32)eMemoryError);
this->Resume();
SetThreadRunState( kThreadRun );
}
void CLauncher::StopThread ( void )
{
if ( this == nil ) 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;
CPluginConfig pluginConfig;
if ( gPlugins != nil )
{
pluginConfig.Initialize();
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(), kInitalized );
if (gServerRunLoop != NULL)
{
aHeader.fType = kServerRunLoop;
aHeader.fResult = eDSNoErr;
aHeader.fContextData = (void *)gServerRunLoop;
siResult = fPlugin->ProcessRequest( (void*)&aHeader ); }
pluginState = pluginConfig.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 );
}