Major update:
- DataTreeCore:
- Bug fix: GetMember() error if member not found
- FunctionCore: (affected: SelectableCore, FileCore, WatchdogCore)
- Made destructor virual
- Standardize method parameter naming, e.g. pName, pLog
- Renamed parameters: DebugLevel -> LogLevel, OutputDisplay -> LogOutput
- Reinstated parameter BaseMember
- Removed logging parameters from constructor
- Created method InitLoggging() (shows "Function Created" message)
- Split LoadConfig() method into parts:
- Implemented public LoadConfig() methods
- Implemented LoadConfigData() method, load parameters from DataTree
- WatchdogCore:
- Derive from CSelectableCore instead of CFunctionCore
- Rename parameter: PingTimeout -> PingInterval
- Replace Ping Channel with Handle only
- Add method SetInterval()
- Send command direct to handle with (channel) Input()
- SelectableCore:
- Rename parameters: Auto -> AutoManage, ReopenTimeout -> ReopenDelay
- Implemented own virtual LoadConfigData() method
- DeviceCore:
- Made all logging conditional: if (Log) Log->Message(...)
- SelectCore:
- Renamed parameters: DebugLevel -> LogLevel
This commit is contained in:
@@ -269,7 +269,7 @@ TDataMember * CDataTree::GetMember( TDataMember * BaseMember, const char * Path
|
|||||||
|
|
||||||
// Get Child
|
// Get Child
|
||||||
Member = GetMemberPtr( BaseMember, Path, Create );
|
Member = GetMemberPtr( BaseMember, Path, Create );
|
||||||
return *Member;
|
return ((Member)? *Member : NULL);
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -23,8 +23,8 @@
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
CDeviceCore::CDeviceCore( const char * Name, CLogCore * pLog, EDebugLevel DebugLevel, int pOutputDisplay ) :
|
CDeviceCore::CDeviceCore( const char * pName, CLogCore * pLog ) :
|
||||||
CFunctionCore( Name, pLog, DebugLevel, pOutputDisplay )
|
CFunctionCore( pName, pLog )
|
||||||
{
|
{
|
||||||
// Clear Parameters
|
// Clear Parameters
|
||||||
FirstDevice = NULL;
|
FirstDevice = NULL;
|
||||||
@@ -94,7 +94,7 @@ bool CDeviceCore::DeviceOnline( TDevice * Device, bool Online )
|
|||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
Device->Online = Online;
|
Device->Online = Online;
|
||||||
Log->Message( DebugLevel, dlHigh, "%s: Device '%s' %s", Name, Device->Name, ((Online)? "online" : "offline") );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Device '%s' %s", Name, Device->Name, ((Online)? "online" : "offline") );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -120,11 +120,11 @@ bool CDeviceCore::CheckReplyTimeout( int TimeoutPollStep )
|
|||||||
// Handle No Reply / Retry
|
// Handle No Reply / Retry
|
||||||
if (PollRetry < MaxRetries) {
|
if (PollRetry < MaxRetries) {
|
||||||
// Log Event
|
// Log Event
|
||||||
Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - %s timeout, retry [%d]", Name, DeviceChannel->Name, ActiveDevice->Name, PollRetry );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - %s timeout, retry [%d]", Name, DeviceChannel->Name, ActiveDevice->Name, PollRetry );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Log Event
|
// Log Event
|
||||||
Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - %s timeout, max [%d]", Name, DeviceChannel->Name, ActiveDevice->Name, PollRetry );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - %s timeout, max [%d]", Name, DeviceChannel->Name, ActiveDevice->Name, PollRetry );
|
||||||
|
|
||||||
// Set Device Offline
|
// Set Device Offline
|
||||||
DeviceOnline( ActiveDevice, false );
|
DeviceOnline( ActiveDevice, false );
|
||||||
@@ -163,7 +163,7 @@ TDevice * CDeviceCore::AddDevice( const char * DeviceName )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Report creation
|
// Report creation
|
||||||
Log->Message( DebugLevel, dlLow, "%s: Device added - '%s'", Name, DeviceName );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Device added - '%s'", Name, DeviceName );
|
||||||
|
|
||||||
return *Device;
|
return *Device;
|
||||||
}
|
}
|
||||||
@@ -316,7 +316,7 @@ TDeviceParam * CDeviceCore::AddDeviceParam( TDevice * Device, const char * Param
|
|||||||
(*Param)->Changed = true;
|
(*Param)->Changed = true;
|
||||||
|
|
||||||
// Report creation
|
// Report creation
|
||||||
Log->Message( DebugLevel, dlLow, "%s: Param added - '%s' (%s)", Name, ParamName, DataTypeName[DataType] );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Param added - '%s' (%s)", Name, ParamName, DataTypeName[DataType] );
|
||||||
|
|
||||||
return *Param;
|
return *Param;
|
||||||
}
|
}
|
||||||
@@ -387,7 +387,7 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val
|
|||||||
|
|
||||||
// Mark change & log event
|
// Mark change & log event
|
||||||
Changed = true;
|
Changed = true;
|
||||||
Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %u", Name, Param->Name, ((Init)? "initialised" : "changed"), *((u_int16_t*)Param->Value) );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %u", Name, Param->Name, ((Init)? "initialised" : "changed"), *((u_int16_t*)Param->Value) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -399,7 +399,7 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val
|
|||||||
|
|
||||||
// Mark change & log event
|
// Mark change & log event
|
||||||
Changed = true;
|
Changed = true;
|
||||||
Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %u", Name, Param->Name, ((Init)? "initialised" : "changed"), *((u_int32_t*)Param->Value) );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %u", Name, Param->Name, ((Init)? "initialised" : "changed"), *((u_int32_t*)Param->Value) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -411,7 +411,7 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val
|
|||||||
|
|
||||||
// Mark change & log event
|
// Mark change & log event
|
||||||
Changed = true;
|
Changed = true;
|
||||||
Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %f", Name, Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %f", Name, Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -446,7 +446,7 @@ bool CDeviceCore::UpdateSignedValue( TDeviceParam * Param, const int32_t Value,
|
|||||||
|
|
||||||
// Mark change & log event
|
// Mark change & log event
|
||||||
Changed = true;
|
Changed = true;
|
||||||
Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %d", Name, Param->Name, ((Init)? "initialised" : "changed"), *((int16_t*)Param->Value) );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %d", Name, Param->Name, ((Init)? "initialised" : "changed"), *((int16_t*)Param->Value) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -458,7 +458,7 @@ bool CDeviceCore::UpdateSignedValue( TDeviceParam * Param, const int32_t Value,
|
|||||||
|
|
||||||
// Mark change & log event
|
// Mark change & log event
|
||||||
Changed = true;
|
Changed = true;
|
||||||
Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %d", Name, Param->Name, ((Init)? "initialised" : "changed"), *((int32_t*)Param->Value) );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %d", Name, Param->Name, ((Init)? "initialised" : "changed"), *((int32_t*)Param->Value) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -493,7 +493,7 @@ bool CDeviceCore::UpdateFloatValue( TDeviceParam * Param, const float Value, boo
|
|||||||
|
|
||||||
// Mark change & log event
|
// Mark change & log event
|
||||||
Changed = true;
|
Changed = true;
|
||||||
Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %f", Name, Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %f", Name, Param->Name, ((Init)? "initialised" : "changed"), *((float*)Param->Value) );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -538,7 +538,7 @@ bool CDeviceCore::UpdateStringValue( TDeviceParam * Param, const char * Value, c
|
|||||||
|
|
||||||
// Mark Change
|
// Mark Change
|
||||||
Changed = true;
|
Changed = true;
|
||||||
Log->Message( DebugLevel, dlLow, "%s: '%s' %s - %s", Name, Param->Name, ((Init)? "initialised" : "changed"), (char*)Param->Value );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: '%s' %s - %s", Name, Param->Name, ((Init)? "initialised" : "changed"), (char*)Param->Value );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -168,8 +168,8 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Life cycle
|
// Life cycle
|
||||||
CDeviceCore( const char * Name, CLogCore * pLog, EDebugLevel DebugLevel, int pOuputDisplay );
|
CDeviceCore( const char * pName, CLogCore * pLog );
|
||||||
~CDeviceCore();
|
virtual ~CDeviceCore();
|
||||||
|
|
||||||
// Generate events
|
// Generate events
|
||||||
bool SetPollParam( int pPollInterval );
|
bool SetPollParam( int pPollInterval );
|
||||||
|
|||||||
16
FileCore.cpp
16
FileCore.cpp
@@ -27,8 +27,8 @@ const float PI = 3.1415927;
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
CFileCore::CFileCore( const char * Name, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay ) :
|
CFileCore::CFileCore( const char * pName, CLogCore * pLog ) :
|
||||||
CFunctionCore( Name, pLog, pDebugLevel, pOuputDisplay )
|
CFunctionCore( pName, pLog )
|
||||||
{
|
{
|
||||||
FirstFile = NULL;
|
FirstFile = NULL;
|
||||||
}
|
}
|
||||||
@@ -145,7 +145,7 @@ bool CFileCore::OpenFile( TFileHandle * FileHandle )
|
|||||||
SetStartTime( &(FileHandle->PersistTime) );
|
SetStartTime( &(FileHandle->PersistTime) );
|
||||||
|
|
||||||
// Report result
|
// Report result
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: File '%s' - Opened", Name, FileHandle->Name );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: File '%s' - Opened", Name, FileHandle->Name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@ bool CFileCore::OpenFile( TFileHandle * FileHandle )
|
|||||||
if (!isOpen(FileHandle))
|
if (!isOpen(FileHandle))
|
||||||
{
|
{
|
||||||
// Report result
|
// Report result
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: File '%s' - Could not open (%d) %s", Name, FileHandle->Name, errno, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: File '%s' - Could not open (%d) %s", Name, FileHandle->Name, errno, strerror(errno) );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,9 +177,9 @@ bool CFileCore::CloseFile( TFileHandle * FileHandle )
|
|||||||
|
|
||||||
// Report result
|
// Report result
|
||||||
if (!isOpen(FileHandle)) {
|
if (!isOpen(FileHandle)) {
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: File '%s' - Closed", Name, FileHandle->Name );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: File '%s' - Closed", Name, FileHandle->Name );
|
||||||
} else {
|
} else {
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: File '%s' - Could not close", Name, FileHandle->Name );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: File '%s' - Could not close", Name, FileHandle->Name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -262,12 +262,12 @@ int CFileCore::Input( const char * ChannelName, const char * Data, int MaxLen )
|
|||||||
if (!(FileHandle = GetFile( ChannelName )))
|
if (!(FileHandle = GetFile( ChannelName )))
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel not found", Name, ChannelName );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel not found", Name, ChannelName );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, MaxLen, "%s: Channel '%s' - IN:", Name, ChannelName );
|
Log->Output( LogLevel, dlHigh, LogOutput, Data, MaxLen, "%s: Channel '%s' - IN:", Name, ChannelName );
|
||||||
|
|
||||||
// Open file
|
// Open file
|
||||||
if (!OpenFile( FileHandle )) {
|
if (!OpenFile( FileHandle )) {
|
||||||
|
|||||||
@@ -60,8 +60,8 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Life cycle
|
// Life cycle
|
||||||
CFileCore( const char * Name, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay );
|
CFileCore( const char * pName, CLogCore * pLog );
|
||||||
~CFileCore();
|
virtual ~CFileCore();
|
||||||
|
|
||||||
// Manage files
|
// Manage files
|
||||||
virtual TFileHandle * AddFile( const char * Name, const char * Path, bool Append = true, bool CreateChannel = true );
|
virtual TFileHandle * AddFile( const char * Name, const char * Path, bool Append = true, bool CreateChannel = true );
|
||||||
|
|||||||
133
FunctionCore.cpp
133
FunctionCore.cpp
@@ -22,12 +22,12 @@ extern char * ProcessName;
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
// Life cycle
|
// Life cycle
|
||||||
CFunctionCore::CFunctionCore( const char * FunctionName, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay )
|
CFunctionCore::CFunctionCore( const char * pName, CLogCore * pLog )
|
||||||
{
|
{
|
||||||
// Set name
|
// Set name
|
||||||
if (FunctionName) {
|
if (pName) {
|
||||||
Name = (char*)malloc( strlen(FunctionName)+1 );
|
Name = (char*)malloc( strlen(pName)+1 );
|
||||||
strcpy( Name, FunctionName );
|
strcpy( Name, pName );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Name = NULL;
|
Name = NULL;
|
||||||
@@ -35,17 +35,15 @@ CFunctionCore::CFunctionCore( const char * FunctionName, CLogCore * pLog, EDebug
|
|||||||
|
|
||||||
// Data Tree
|
// Data Tree
|
||||||
DataTree = NULL;
|
DataTree = NULL;
|
||||||
|
BaseMember = NULL;
|
||||||
|
|
||||||
// Channels
|
// Channels
|
||||||
FirstChannel = NULL;
|
FirstChannel = NULL;
|
||||||
|
|
||||||
// Output
|
// Output
|
||||||
Log = pLog;
|
Log = pLog;
|
||||||
OutputDisplay = pOuputDisplay;
|
LogLevel = dlNone;
|
||||||
DebugLevel = pDebugLevel;
|
LogOutput = OUT_NORMAL;
|
||||||
|
|
||||||
// Report status
|
|
||||||
if (Log) Log->Message( DebugLevel, dlLow, "%s: Function '%s' - Created", ProcessName, FunctionName );
|
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -89,7 +87,7 @@ CFunctionCore::~CFunctionCore()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Report status
|
// Report status
|
||||||
if (Log) Log->Message( DebugLevel, dlLow, "%s: Function '%s' - Destroyed", ProcessName, Name );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Function '%s' - Destroyed", ProcessName, Name );
|
||||||
|
|
||||||
// Destroy Name
|
// Destroy Name
|
||||||
if (Name) {
|
if (Name) {
|
||||||
@@ -100,20 +98,107 @@ CFunctionCore::~CFunctionCore()
|
|||||||
|
|
||||||
bool CFunctionCore::LoadConfig( CDataTree * pDataTree, const char * pBasePath )
|
bool CFunctionCore::LoadConfig( CDataTree * pDataTree, const char * pBasePath )
|
||||||
{
|
{
|
||||||
TDataMember * BaseMember;
|
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
if (!(DataTree = pDataTree) ||
|
if (!(DataTree = pDataTree) || !(BaseMember = DataTree->GetMember( NULL, pBasePath, true )))
|
||||||
!(BaseMember = DataTree->GetMember( NULL, pBasePath, true )))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Load configuration
|
||||||
|
LoadConfigData();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool CFunctionCore::LoadConfig( CDataTree * pDataTree, TDataMember * pBaseMember )
|
||||||
|
{
|
||||||
|
// Validate
|
||||||
|
if (!(DataTree = pDataTree) || !(BaseMember = pBaseMember ))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Load configuration
|
||||||
|
LoadConfigData();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool CFunctionCore::LoadConfigData()
|
||||||
|
{
|
||||||
|
TDataMember * TempMember;
|
||||||
|
char * TempStr;
|
||||||
|
|
||||||
|
// Set Name
|
||||||
|
Name = (char*)malloc( strlen(BaseMember->Name)+1 );
|
||||||
|
strcpy( Name, BaseMember->Name );
|
||||||
|
|
||||||
|
// Get debug level
|
||||||
|
LogLevel = dlNone;
|
||||||
|
TempStr = (char*)DataTree->GetStr( BaseMember, "Log/Level", "Medium", true );
|
||||||
|
if (!strcasecmp( TempStr, "Low" ))
|
||||||
|
LogLevel = dlLow;
|
||||||
|
else if (!strcasecmp( TempStr, "Medium" ))
|
||||||
|
LogLevel = dlMedium;
|
||||||
|
else if (!strcasecmp( TempStr, "High" ))
|
||||||
|
LogLevel = dlHigh;
|
||||||
|
|
||||||
|
// Set debug output
|
||||||
|
LogOutput = 0;
|
||||||
|
TempMember = DataTree->GetMember( BaseMember, "Log/Output[0]", true );
|
||||||
|
while (TempMember)
|
||||||
|
{
|
||||||
|
if (!strcasecmp( TempMember->Value, "Normal"))
|
||||||
|
LogOutput |= OUT_NORMAL;
|
||||||
|
else if (!strcasecmp( TempMember->Value, "Bin"))
|
||||||
|
LogOutput |= OUT_BIN;
|
||||||
|
else if (!strcasecmp( TempMember->Value, "Hex"))
|
||||||
|
LogOutput |= OUT_HEX;
|
||||||
|
else if (!strcasecmp( TempMember->Value, "Count"))
|
||||||
|
LogOutput |= OUT_COUNT;
|
||||||
|
else if (!strcasecmp( TempMember->Value, "AsIs"))
|
||||||
|
LogOutput |= OUT_ASIS;
|
||||||
|
else if (!strcasecmp( TempMember->Value, "CRLF"))
|
||||||
|
LogOutput |= OUT_CRLF;
|
||||||
|
|
||||||
|
// Next
|
||||||
|
TempMember = DataTree->GetNextChild( TempMember );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Logging
|
||||||
|
InitLogging( LogLevel, LogOutput );
|
||||||
|
|
||||||
|
// Set debug output
|
||||||
|
FirstChannel = NULL;
|
||||||
|
TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Channels", true ) );
|
||||||
|
while (TempMember)
|
||||||
|
{
|
||||||
|
AddChannel( DataTree->GetStr( TempMember, "Name" ),
|
||||||
|
DataTree->GetBool( TempMember, "InputEnabled", true, true ),
|
||||||
|
DataTree->GetBool( TempMember, "OutputEnabled", false, true ));
|
||||||
|
|
||||||
|
// Next
|
||||||
|
TempMember = DataTree->GetNextChild( TempMember );
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool CFunctionCore::InitLogging( EDebugLevel pDebugLevel, int pOutputDisplay )
|
||||||
|
{
|
||||||
|
// Output
|
||||||
|
LogLevel = pDebugLevel;
|
||||||
|
LogOutput = pOutputDisplay;
|
||||||
|
|
||||||
|
// Report status
|
||||||
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Function '%s' - Created", ProcessName, Name );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CFunctionCore::SetDebugLevel( EDebugLevel pDebugLevel )
|
bool CFunctionCore::SetDebugLevel( EDebugLevel pDebugLevel )
|
||||||
{
|
{
|
||||||
DebugLevel = pDebugLevel;
|
LogLevel = pDebugLevel;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -144,7 +229,7 @@ TChannel * CFunctionCore::AddChannel( const char * ChannelName, const bool pInpu
|
|||||||
strcpy( (*Channel)->Name, ChannelName );
|
strcpy( (*Channel)->Name, ChannelName );
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlLow, "%s: Channel '%s' - Created", Name, ChannelName );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Channel '%s' - Created", Name, ChannelName );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set parameters
|
// Set parameters
|
||||||
@@ -185,7 +270,7 @@ bool CFunctionCore::LinkInputChannel( const char * ChannelName, CFunctionCore *
|
|||||||
strcpy( (*LinkedChannel)->Name, OutChannelName );
|
strcpy( (*LinkedChannel)->Name, OutChannelName );
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlLow, "%s: Input Linked - '%s'/'%s' <-- '%s'/'%s'", Name, Name, ChannelName, OutFunction->GetName(), OutChannelName );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Input Linked - '%s'/'%s' <-- '%s'/'%s'", Name, Name, ChannelName, OutFunction->GetName(), OutChannelName );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link Return direction as well
|
// Link Return direction as well
|
||||||
@@ -226,7 +311,7 @@ bool CFunctionCore::LinkOutputChannel( const char * ChannelName, CFunctionCore *
|
|||||||
strcpy( (*LinkedChannel)->Name, InChannelName );
|
strcpy( (*LinkedChannel)->Name, InChannelName );
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlLow, "%s: Output Linked - '%s'/'%s' --> '%s'/'%s'", Name, Name, ChannelName, InFunction->GetName(), InChannelName );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Output Linked - '%s'/'%s' --> '%s'/'%s'", Name, Name, ChannelName, InFunction->GetName(), InChannelName );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link return direction as well
|
// Link return direction as well
|
||||||
@@ -251,12 +336,12 @@ int CFunctionCore::Input( const char * ChannelName, const char * Data, int MaxLe
|
|||||||
// Get Channel
|
// Get Channel
|
||||||
if (!(Channel = GetChannel( ChannelName ))) {
|
if (!(Channel = GetChannel( ChannelName ))) {
|
||||||
// Channel not found
|
// Channel not found
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel not found", Name, ChannelName );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel not found", Name, ChannelName );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (!Channel->InputEnabled) {
|
else if (!Channel->InputEnabled) {
|
||||||
// Channel disabled
|
// Channel disabled
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel input disabled", Name, ChannelName );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel input disabled", Name, ChannelName );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -264,7 +349,7 @@ int CFunctionCore::Input( const char * ChannelName, const char * Data, int MaxLe
|
|||||||
if (MaxLen == -1) {
|
if (MaxLen == -1) {
|
||||||
MaxLen = strlen( Data );
|
MaxLen = strlen( Data );
|
||||||
}
|
}
|
||||||
if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, MaxLen, "%s: Channel '%s' - IN:", Name, ChannelName );
|
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, MaxLen, "%s: Channel '%s' - IN:", Name, ChannelName );
|
||||||
return MaxLen;
|
return MaxLen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -281,7 +366,7 @@ int CFunctionCore::Output( const char * ChannelName, const char * Data, int Len
|
|||||||
|
|
||||||
// Get Channel
|
// Get Channel
|
||||||
if (!(Channel = GetChannel( ChannelName ))) {
|
if (!(Channel = GetChannel( ChannelName ))) {
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - Output rejected, Channel not found", Name, ChannelName );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output rejected, Channel not found", Name, ChannelName );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -302,12 +387,12 @@ int CFunctionCore::Output( const TChannel * Channel, const char * Data, int Len
|
|||||||
|
|
||||||
// Check if enabled
|
// Check if enabled
|
||||||
if (!Channel->OutputEnabled) {
|
if (!Channel->OutputEnabled) {
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - Output rejected, Channel output disabled", Name, Channel->Name );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output rejected, Channel output disabled", Name, Channel->Name );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Channel '%s' - OUT:", Name, Channel->Name );
|
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Channel '%s' - OUT:", Name, Channel->Name );
|
||||||
|
|
||||||
// Pass output to all linked inputs
|
// Pass output to all linked inputs
|
||||||
if (Len == -1) {
|
if (Len == -1) {
|
||||||
|
|||||||
@@ -58,14 +58,15 @@ protected:
|
|||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
CDataTree * DataTree;
|
CDataTree * DataTree;
|
||||||
|
TDataMember * BaseMember;
|
||||||
|
|
||||||
// Channels
|
// Channels
|
||||||
TChannel * FirstChannel;
|
TChannel * FirstChannel;
|
||||||
|
|
||||||
// Output
|
// Output
|
||||||
CLogCore * Log;
|
CLogCore * Log;
|
||||||
EDebugLevel DebugLevel;
|
EDebugLevel LogLevel;
|
||||||
int OutputDisplay;
|
int LogOutput;
|
||||||
|
|
||||||
// Manage Channel
|
// Manage Channel
|
||||||
inline TChannel * GetChannel( const char * Name ) {
|
inline TChannel * GetChannel( const char * Name ) {
|
||||||
@@ -76,16 +77,23 @@ protected:
|
|||||||
return Channel;
|
return Channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load configuraiton
|
||||||
|
virtual bool LoadConfigData();
|
||||||
|
|
||||||
// Manual Data Input/Output
|
// Manual Data Input/Output
|
||||||
virtual int Output( const TChannel * Channel, const char * Data, int Len );
|
virtual int Output( const TChannel * Channel, const char * Data, int Len );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Life cycle
|
// Life cycle
|
||||||
CFunctionCore( const char * FunctionName, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay );
|
CFunctionCore( const char * pName, CLogCore * pLog );
|
||||||
virtual ~CFunctionCore();
|
virtual ~CFunctionCore();
|
||||||
|
|
||||||
// Configuration
|
// Load Configuration
|
||||||
virtual bool LoadConfig( CDataTree * DataTree, const char * BasePath );
|
virtual bool LoadConfig( CDataTree * pDataTree, const char * pBasePath );
|
||||||
|
virtual bool LoadConfig( CDataTree * pDataTree, TDataMember * pBaseMember );
|
||||||
|
|
||||||
|
// Set Parameters Manually
|
||||||
|
bool InitLogging( EDebugLevel pDebugLevel, int pOutputDisplay );
|
||||||
bool SetDebugLevel( EDebugLevel pDebugLevel );
|
bool SetDebugLevel( EDebugLevel pDebugLevel );
|
||||||
|
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ CSelect::CSelect( long SelectTimeout, CLogCore * pLog, EDebugLevel pDebugLevel )
|
|||||||
|
|
||||||
// Output
|
// Output
|
||||||
Log = pLog;
|
Log = pLog;
|
||||||
DebugLevel = pDebugLevel;
|
LogLevel = pDebugLevel;
|
||||||
|
|
||||||
// Show status
|
// Show status
|
||||||
if (Log) Log->Message( DebugLevel, dlLow, "%s: Select - Created", ProcessName );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Select - Created", ProcessName );
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -61,14 +61,14 @@ CSelect::~CSelect()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show status
|
// Show status
|
||||||
if (Log) Log->Message( DebugLevel, dlLow, "%s: Select - Destroyed", ProcessName );
|
if (Log) Log->Message( LogLevel, dlLow, "%s: Select - Destroyed", ProcessName );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CSelect::SetDebugLevel( EDebugLevel pDebugLevel )
|
bool CSelect::SetDebugLevel( EDebugLevel pDebugLevel )
|
||||||
{
|
{
|
||||||
DebugLevel = pDebugLevel;
|
LogLevel = pDebugLevel;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -113,7 +113,7 @@ void CSelect::Add( int FD, bool Read, bool Write, CSelectableCore * Function )
|
|||||||
FD_SET( FD, &ReadTestFDS );
|
FD_SET( FD, &ReadTestFDS );
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "Select: FD [%d] - Add Read", FD );
|
if (Log) Log->Message( LogLevel, dlHigh, "Select: FD [%d] - Add Read", FD );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add Write Select
|
// Add Write Select
|
||||||
@@ -122,7 +122,7 @@ void CSelect::Add( int FD, bool Read, bool Write, CSelectableCore * Function )
|
|||||||
FD_SET( FD, &WriteTestFDS );
|
FD_SET( FD, &WriteTestFDS );
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "Select: FD [%d] - Add Write", FD );
|
if (Log) Log->Message( LogLevel, dlHigh, "Select: FD [%d] - Add Write", FD );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check Maximum File Handle
|
// Check Maximum File Handle
|
||||||
@@ -150,7 +150,7 @@ void CSelect::Remove( int FD, bool Read, bool Write )
|
|||||||
FD_CLR( FD, &ReadTestFDS);
|
FD_CLR( FD, &ReadTestFDS);
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "Select: FD [%d] - Remove Read", FD );
|
if (Log) Log->Message( LogLevel, dlHigh, "Select: FD [%d] - Remove Read", FD );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove from set for select write check
|
// Remove from set for select write check
|
||||||
@@ -159,7 +159,7 @@ void CSelect::Remove( int FD, bool Read, bool Write )
|
|||||||
FD_CLR( FD, &WriteTestFDS);
|
FD_CLR( FD, &WriteTestFDS);
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "Select: FD [%d] - Remove Write", FD );
|
if (Log) Log->Message( LogLevel, dlHigh, "Select: FD [%d] - Remove Write", FD );
|
||||||
}
|
}
|
||||||
// Handle will be removed in Test() if both Read & Write flags are false
|
// Handle will be removed in Test() if both Read & Write flags are false
|
||||||
}
|
}
|
||||||
@@ -181,7 +181,7 @@ bool CSelect::Test()
|
|||||||
Events = select( MaxFD, &ReadFDS, &WriteFDS, (fd_set*)NULL, &STimeout );
|
Events = select( MaxFD, &ReadFDS, &WriteFDS, (fd_set*)NULL, &STimeout );
|
||||||
if (Events < 0)
|
if (Events < 0)
|
||||||
{
|
{
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "Select: Select operation failed" );
|
if (Log) Log->Message( LogLevel, dlHigh, "Select: Select operation failed" );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,14 +30,14 @@
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
CSelectableCore::CSelectableCore( const char * Name, CSelect * Selector, CLogCore * pLog, EDebugLevel pDebugLevel, int pOutputDisplay ) :
|
CSelectableCore::CSelectableCore( const char * pName, CSelect * pSelect, CLogCore * pLog ) :
|
||||||
CFunctionCore( Name, pLog, pDebugLevel, pOutputDisplay )
|
CFunctionCore( pName, pLog )
|
||||||
{
|
{
|
||||||
// Handles
|
// Handles
|
||||||
FirstHandle = NULL;
|
FirstHandle = NULL;
|
||||||
|
|
||||||
// Select
|
// Select
|
||||||
Select = Selector;
|
Select = pSelect;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -60,6 +60,86 @@ CSelectableCore::~CSelectableCore()
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool CSelectableCore::LoadConfigData()
|
||||||
|
{
|
||||||
|
TDataMember * TempMember;
|
||||||
|
THandle * Handle;
|
||||||
|
char * Type;
|
||||||
|
char * Name;
|
||||||
|
char Path[100];
|
||||||
|
char * Address;
|
||||||
|
long Port;
|
||||||
|
|
||||||
|
// Call Previous load config
|
||||||
|
CFunctionCore::LoadConfigData();
|
||||||
|
|
||||||
|
// Set debug output
|
||||||
|
FirstHandle = NULL;
|
||||||
|
TempMember = DataTree->GetFirstChild( DataTree->GetMember( BaseMember, "Handles", true ) );
|
||||||
|
while (TempMember)
|
||||||
|
{
|
||||||
|
// Create Handle and channel link
|
||||||
|
Handle = CreateHandle( DataTree->GetStr( TempMember, "Name" ), false );
|
||||||
|
Handle->Channel = GetChannel( DataTree->GetStr( TempMember, "Name" ) );
|
||||||
|
|
||||||
|
Type = (char*)DataTree->GetStr( TempMember, "Type", "TCPclient", true );
|
||||||
|
if (!strcasecmp( Type, "Port" ))
|
||||||
|
{
|
||||||
|
Address = (char*)DataTree->GetStr( TempMember, "Port/Address", NULL, true ); // Get default value
|
||||||
|
if ((Name = (char*)DataTree->GetStr( TempMember, "Port/Name", NULL, true ))) {
|
||||||
|
sprintf( Path, "Address/%s/Address", Name );
|
||||||
|
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get address list value
|
||||||
|
}
|
||||||
|
SetPortHandle( Handle, Address ); // Assign values
|
||||||
|
}
|
||||||
|
else if (!strcasecmp( Type, "TCPserver" ))
|
||||||
|
{
|
||||||
|
Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL, true ); // Get default Address value
|
||||||
|
Port = DataTree->GetInt( TempMember, "Socket/Port", 0, true ); // Get default Port value
|
||||||
|
if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL, true ))) {
|
||||||
|
sprintf( Path, "Address/%s/Address", Name );
|
||||||
|
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value
|
||||||
|
sprintf( Path, "Address/%s/Port", Name );
|
||||||
|
Port = DataTree->GetInt( NULL, Path, Port, true ); // Get AddressList Port value
|
||||||
|
}
|
||||||
|
SetSocketHandle( Handle, ctServer, Address, Port, true ); // Assign values
|
||||||
|
}
|
||||||
|
else if (!strcasecmp( Type, "TCPclient" ))
|
||||||
|
{
|
||||||
|
Address = (char*)DataTree->GetStr( TempMember, "Socket/Address", NULL, true ); // Get default Address value
|
||||||
|
Port = DataTree->GetInt( TempMember, "Socket/Port", 0, true ); // Get default Port value
|
||||||
|
if ((Name = (char*)DataTree->GetStr( TempMember, "Socket/Name", NULL, true ))) {
|
||||||
|
sprintf( Path, "Address/%s/Address", Name );
|
||||||
|
Address = (char*)DataTree->GetStr( NULL, Path, Address, true ); // Get AddressList Address value
|
||||||
|
sprintf( Path, "Address/%s/Port", Name );
|
||||||
|
Port = DataTree->GetInt( NULL, Path, Port, true ); // Get AddressList Port value
|
||||||
|
}
|
||||||
|
SetSocketHandle( Handle, ctClient, Address, Port, true ); // Assign values
|
||||||
|
}
|
||||||
|
else if (!strcasecmp( Type, "ForkPipe" )) {
|
||||||
|
Address = (char*)DataTree->GetStr( TempMember, "Fork/ExecPath", NULL, true ); // Get default value
|
||||||
|
SetForkPipeHandle( Handle, Address );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Auto Mange
|
||||||
|
SetAutoManage( Handle, DataTree->GetBool( TempMember, "AutoManage/Enabled", true, true ),
|
||||||
|
DataTree->GetInt( TempMember, "AutoManage/ReopenDelay", 2000, true ) );
|
||||||
|
|
||||||
|
// Input buffer
|
||||||
|
SetBuffers( Handle, DataTree->GetInt( TempMember, "InputBuffer/Size", 100, true ),
|
||||||
|
DataTree->GetInt( TempMember, "OutputBuffer/Size", 0, true ),
|
||||||
|
DataTree->GetInt( TempMember, "InputBuffer/Timeout", 200, true ),
|
||||||
|
DataTree->GetStr( TempMember, "InputBuffer/Marker", "\n", true ),
|
||||||
|
DataTree->GetInt( TempMember, "InputBuffer/MarkerLen", 1, true ) );
|
||||||
|
|
||||||
|
// Next
|
||||||
|
TempMember = DataTree->GetNextChild( TempMember );
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
THandle * CSelectableCore::CreateHandle( const char * HandleName, bool CreateChannel )
|
THandle * CSelectableCore::CreateHandle( const char * HandleName, bool CreateChannel )
|
||||||
{
|
{
|
||||||
THandle ** Handle = NULL;
|
THandle ** Handle = NULL;
|
||||||
@@ -85,7 +165,7 @@ THandle * CSelectableCore::CreateHandle( const char * HandleName, bool CreateCh
|
|||||||
(*Handle)->FD = -1;
|
(*Handle)->FD = -1;
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Created", Name, HandleName );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Created", Name, HandleName );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create Matching Channel
|
// Create Matching Channel
|
||||||
@@ -117,7 +197,7 @@ bool CSelectableCore::RemoveHandle( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Removed", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Removed", Name, Handle->Name );
|
||||||
|
|
||||||
// Destroy Child handle
|
// Destroy Child handle
|
||||||
DestroyHandle( Handle );
|
DestroyHandle( Handle );
|
||||||
@@ -175,7 +255,7 @@ bool CSelectableCore::SetPortHandle( THandle * Handle, const char * FileName )
|
|||||||
strcpy( Handle->Path, FileName );
|
strcpy( Handle->Path, FileName );
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Set as Port [%s]", Name, Handle->Name, FileName );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Set as Port [%s]", Name, Handle->Name, FileName );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -200,7 +280,7 @@ bool CSelectableCore::SetForkPipeHandle( THandle * Handle, const char * ExecPath
|
|||||||
strcpy( Handle->Path, ExecPath );
|
strcpy( Handle->Path, ExecPath );
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Set as ForkPipe [%s]", Name, Handle->Name, ExecPath );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Set as ForkPipe [%s]", Name, Handle->Name, ExecPath );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -227,7 +307,7 @@ bool CSelectableCore::SetSocketHandle( THandle * Handle, EConnectType Type, con
|
|||||||
Handle->PortNo = PortNo;
|
Handle->PortNo = PortNo;
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Set as %s [%s:%d]", Name, Handle->Name, ConnectTypeName[Type], Address, PortNo );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Set as %s [%s:%d]", Name, Handle->Name, ConnectTypeName[Type], Address, PortNo );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -254,7 +334,7 @@ bool CSelectableCore::ClearHandle( THandle * Handle )
|
|||||||
Handle->Type = ctNone;
|
Handle->Type = ctNone;
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Set as None", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Set as None", Name, Handle->Name );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -272,7 +352,7 @@ bool CSelectableCore::SetCallback( THandle * Handle, EConnectState pState, FHand
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CSelectableCore::SetAutoManage( THandle * Handle, bool AutoManage, int ReopenTime )
|
bool CSelectableCore::SetAutoManage( THandle * Handle, bool AutoManage, int ReopenDelay )
|
||||||
{
|
{
|
||||||
// Validate
|
// Validate
|
||||||
if (!Handle) {
|
if (!Handle) {
|
||||||
@@ -280,8 +360,8 @@ bool CSelectableCore::SetAutoManage( THandle * Handle, bool AutoManage, int Reop
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set params
|
// Set params
|
||||||
Handle->Auto = AutoManage;
|
Handle->AutoManage = AutoManage;
|
||||||
Handle->ReopenTimeout = ReopenTime;
|
Handle->ReopenDelay = ReopenDelay;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -339,7 +419,7 @@ int CSelectableCore::OpenPort( THandle * Handle )
|
|||||||
if (access( Handle->Path, F_OK ) != 0)
|
if (access( Handle->Path, F_OK ) != 0)
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Port not found [%s]", Name, Handle->Name, Handle->Path );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Port not found [%s]", Name, Handle->Name, Handle->Path );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,12 +428,12 @@ int CSelectableCore::OpenPort( THandle * Handle )
|
|||||||
if (Handle->FD == -1)
|
if (Handle->FD == -1)
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Could not open Port [%s]", Name, Handle->Name, Handle->Path );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Could not open Port [%s]", Name, Handle->Name, Handle->Path );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Port opened [%s]", Name, Handle->Name, Handle->Path );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Port opened [%s]", Name, Handle->Name, Handle->Path );
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -384,7 +464,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle )
|
|||||||
if (!Handle->Path || !*(Handle->Path))
|
if (!Handle->Path || !*(Handle->Path))
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Invalid path for Exec", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Invalid path for Exec", Name, Handle->Name );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,7 +473,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle )
|
|||||||
if ((pipefd[0] == -1) || (pipefd[1] == -1))
|
if ((pipefd[0] == -1) || (pipefd[1] == -1))
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Could not open Pipe", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Could not open Pipe", Name, Handle->Name );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,7 +488,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle )
|
|||||||
Handle->FD = -1;
|
Handle->FD = -1;
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Could not Fork process", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Could not Fork process", Name, Handle->Name );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if (Handle->ChildPID > 0)
|
else if (Handle->ChildPID > 0)
|
||||||
@@ -419,7 +499,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle )
|
|||||||
Handle->FD = pipefd[1];
|
Handle->FD = pipefd[1];
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Process forked successfully", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Process forked successfully", Name, Handle->Name );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -443,7 +523,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle )
|
|||||||
execvp( Args[0], Args );
|
execvp( Args[0], Args );
|
||||||
|
|
||||||
// Replace failed, exit immediately
|
// Replace failed, exit immediately
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Exec on forked process failed", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Exec on forked process failed", Name, Handle->Name );
|
||||||
exit(127);
|
exit(127);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -490,7 +570,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
if ((Handle->FD = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
if ((Handle->FD = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Failed to create Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
ChangeState( Handle, csFailed );
|
ChangeState( Handle, csFailed );
|
||||||
@@ -502,7 +582,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
(setsockopt( Handle->FD, SOL_SOCKET, SO_REUSEADDR, &Reuse_opt, sizeof(Reuse_opt)) == -1))
|
(setsockopt( Handle->FD, SOL_SOCKET, SO_REUSEADDR, &Reuse_opt, sizeof(Reuse_opt)) == -1))
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Could not set socket options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Could not set socket options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
ChangeState( Handle, csFailed );
|
ChangeState( Handle, csFailed );
|
||||||
@@ -517,7 +597,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ))
|
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ))
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Could not set KeepAlive options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Could not set KeepAlive options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
ChangeState( Handle, csFailed );
|
ChangeState( Handle, csFailed );
|
||||||
@@ -532,7 +612,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
if (bind( Handle->FD, (struct sockaddr *)&address, addr_len ) < 0)
|
if (bind( Handle->FD, (struct sockaddr *)&address, addr_len ) < 0)
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Failed to bind Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to bind Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
@@ -545,7 +625,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
if (listen( Handle->FD, 5 ) < 0)
|
if (listen( Handle->FD, 5 ) < 0)
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Failed to listen on Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to listen on Server socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
@@ -555,7 +635,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Server binded and listening [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server binded and listening [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -592,10 +672,10 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
|||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
|
if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Server failed to accept blocking connection (%s)", Name, Handle->Name, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server failed to accept blocking connection (%s)", Name, Handle->Name, strerror(errno) );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Server failed to accept connection (%s)", Name, Handle->Name, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server failed to accept connection (%s)", Name, Handle->Name, strerror(errno) );
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -629,7 +709,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
|||||||
(*RemoteClient)->State = csWaitingtoOpen;
|
(*RemoteClient)->State = csWaitingtoOpen;
|
||||||
|
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Server accepted Remote Client connection [%s]", Name, Handle->Name, ClientAddress );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server accepted Remote Client connection [%s]", Name, Handle->Name, ClientAddress );
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -649,7 +729,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
|||||||
else if (Handle->State == csWaitingtoOpen)
|
else if (Handle->State == csWaitingtoOpen)
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Remote Client connection open [%s]", Name, Handle->Name, Handle->Address );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote Client connection open [%s]", Name, Handle->Name, Handle->Address );
|
||||||
|
|
||||||
// Update state
|
// Update state
|
||||||
ChangeState( Handle, csOpen );
|
ChangeState( Handle, csOpen );
|
||||||
@@ -683,7 +763,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
if ((Handle->FD = socket( AF_INET, SOCK_STREAM, 0 )) < 0)
|
if ((Handle->FD = socket( AF_INET, SOCK_STREAM, 0 )) < 0)
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Failed to create Client socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Failed to create Client socket [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Set Status
|
// Set Status
|
||||||
ChangeState( Handle, csFailed );
|
ChangeState( Handle, csFailed );
|
||||||
@@ -702,7 +782,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ))
|
(setsockopt( Handle->FD, SOL_TCP, TCP_KEEPINTVL, &TCPint_opt, sizeof(TCPint_opt)) == -1) ))
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Could not set KeepAlive options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Could not set KeepAlive options [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Set State
|
// Set State
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
@@ -720,7 +800,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
|
|
||||||
if (!connect( Handle->FD, (struct sockaddr *)&address, addr_len ))
|
if (!connect( Handle->FD, (struct sockaddr *)&address, addr_len ))
|
||||||
{
|
{
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Client connected [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client connected [%s:%d]", Name, Handle->Name, Handle->Address, Handle->PortNo );
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -734,7 +814,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY))
|
else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY))
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Client waiting to connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client waiting to connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Add to Select Lists
|
// Add to Select Lists
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -748,7 +828,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Client could not connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client could not connect [%s:%d] (%s)", Name, Handle->Name, Handle->Address, Handle->PortNo, strerror(errno) );
|
||||||
|
|
||||||
// Remove from Select List
|
// Remove from Select List
|
||||||
if (Select) {
|
if (Select) {
|
||||||
@@ -844,29 +924,29 @@ bool CSelectableCore::Close( THandle * Handle, bool CloseChildren )
|
|||||||
{
|
{
|
||||||
case ctPort:
|
case ctPort:
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Port %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Path );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Port %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Path );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctForkPipe:
|
case ctForkPipe:
|
||||||
// Log Event
|
// Log Event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Forked Pipe %s", Name, Handle->Name, ((Fail)? "failed" : "closed"));
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Forked Pipe %s", Name, Handle->Name, ((Fail)? "failed" : "closed"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctServer:
|
case ctServer:
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Server %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Server %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctRemoteClient:
|
case ctRemoteClient:
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Remote Client connection %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Remote Client connection %s [%s]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctClient:
|
case ctClient:
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Client connection %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Client connection %s [%s:%d]", Name, Handle->Name, ((Fail)? "failed" : "closed"), Handle->Address, Handle->PortNo );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ctNone:
|
case ctNone:
|
||||||
default:
|
default:
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - %s, invalid Handle type", Name, Handle->Name, ((Fail)? "failed" : "closed") );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - %s, invalid Handle type", Name, Handle->Name, ((Fail)? "failed" : "closed") );
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -894,7 +974,7 @@ bool CSelectableCore::Read( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log Read Event
|
// Log Read Event
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Handle '%s' - Read Event", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Read Event", Name, Handle->Name );
|
||||||
|
|
||||||
// Check for closing/opening event on Socket
|
// Check for closing/opening event on Socket
|
||||||
if (Handle->Type == ctServer)
|
if (Handle->Type == ctServer)
|
||||||
@@ -970,7 +1050,7 @@ bool CSelectableCore::Write( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log Ready for Write Event
|
// Log Ready for Write Event
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Handle '%s' - Write Event", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Handle '%s' - Write Event", Name, Handle->Name );
|
||||||
|
|
||||||
if (Handle->State == csWaitingtoOpen)
|
if (Handle->State == csWaitingtoOpen)
|
||||||
{
|
{
|
||||||
@@ -994,10 +1074,10 @@ bool CSelectableCore::Write( THandle * Handle )
|
|||||||
// Write to FD directly from output buffer
|
// Write to FD directly from output buffer
|
||||||
if ((BytesWritten = Handle->OutBuffer->WriteToFD( Handle->FD )))
|
if ((BytesWritten = Handle->OutBuffer->WriteToFD( Handle->FD )))
|
||||||
{
|
{
|
||||||
if (DebugLevel >= dlHigh) {
|
if (LogLevel >= dlHigh) {
|
||||||
// Show event
|
// Show event
|
||||||
Len = Handle->OutBuffer->Peek( &Data );
|
Len = Handle->OutBuffer->Peek( &Data );
|
||||||
if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update Buffer
|
// Update Buffer
|
||||||
@@ -1042,7 +1122,7 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force )
|
|||||||
{
|
{
|
||||||
// Show Packet
|
// Show Packet
|
||||||
Len = Handle->InBuffer->Peek( &Data );
|
Len = Handle->InBuffer->Peek( &Data );
|
||||||
if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - IN-T:", Name, Handle->Name );
|
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Handle '%s' - IN-T:", Name, Handle->Name );
|
||||||
|
|
||||||
// Write buffer to Outputs
|
// Write buffer to Outputs
|
||||||
if (Handle->Type == ctRemoteClient) {
|
if (Handle->Type == ctRemoteClient) {
|
||||||
@@ -1061,7 +1141,7 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force )
|
|||||||
{
|
{
|
||||||
// Show Packet
|
// Show Packet
|
||||||
Len = Handle->InBuffer->Peek( &Data, 0, Pos+Handle->InMarkerLen );
|
Len = Handle->InBuffer->Peek( &Data, 0, Pos+Handle->InMarkerLen );
|
||||||
if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - IN-M:", Name, Handle->Name );
|
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Handle '%s' - IN-M:", Name, Handle->Name );
|
||||||
|
|
||||||
// Write buffer to Outputs
|
// Write buffer to Outputs
|
||||||
if (Handle->Type == ctRemoteClient) {
|
if (Handle->Type == ctRemoteClient) {
|
||||||
@@ -1150,22 +1230,22 @@ int CSelectableCore::Input( const char * ChannelName, const char * Data, int Len
|
|||||||
// Get File handle
|
// Get File handle
|
||||||
if (!(Handle = GetHandle( ChannelName ))) {
|
if (!(Handle = GetHandle( ChannelName ))) {
|
||||||
// Handle not found
|
// Handle not found
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - Input rejected, Handle not found", Name, ChannelName );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Handle not found", Name, ChannelName );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (Handle->Channel && !Handle->Channel->InputEnabled) {
|
else if (Handle->Channel && !Handle->Channel->InputEnabled) {
|
||||||
// Handle is not open
|
// Handle is not open
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel input disabled", Name, ChannelName );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Channel input disabled", Name, ChannelName );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (Handle->State != csOpen) {
|
else if (Handle->State != csOpen) {
|
||||||
// Handle is not open
|
// Handle is not open
|
||||||
if (Log) Log->Message( DebugLevel, dlHigh, "%s: Channel '%s' - Input rejected, Handle not Open", Name, ChannelName );
|
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input rejected, Handle not Open", Name, ChannelName );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Channel '%s' - IN:", Name, ChannelName );
|
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Channel '%s' - IN:", Name, ChannelName );
|
||||||
|
|
||||||
// Check packet length
|
// Check packet length
|
||||||
if (Len == -1) {
|
if (Len == -1) {
|
||||||
@@ -1198,7 +1278,7 @@ int CSelectableCore::Input( const char * ChannelName, const char * Data, int Len
|
|||||||
BytesWritten = WriteToFD( ChildHandle->FD, Data, Len, true );
|
BytesWritten = WriteToFD( ChildHandle->FD, Data, Len, true );
|
||||||
|
|
||||||
// Show event
|
// Show event
|
||||||
if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - OUT:", Name, ChildHandle->Name );
|
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Handle '%s' - OUT:", Name, ChildHandle->Name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Next
|
// Next
|
||||||
@@ -1224,7 +1304,7 @@ int CSelectableCore::Input( const char * ChannelName, const char * Data, int Len
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Show event
|
// Show event
|
||||||
if (Log) Log->Output( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name );
|
||||||
|
|
||||||
// Write directly to handle
|
// Write directly to handle
|
||||||
BytesWritten = WriteToFD( Handle->FD, Data, Len, true );
|
BytesWritten = WriteToFD( Handle->FD, Data, Len, true );
|
||||||
@@ -1244,10 +1324,10 @@ bool CSelectableCore::Process()
|
|||||||
while (Handle)
|
while (Handle)
|
||||||
{
|
{
|
||||||
// Auto manage handles
|
// Auto manage handles
|
||||||
if (Handle->Auto && ((Handle->State == csNone) || (Handle->State == csFailed) || (Handle->State == csClosed)))
|
if (Handle->AutoManage && ((Handle->State == csNone) || (Handle->State == csFailed) || (Handle->State == csClosed)))
|
||||||
{
|
{
|
||||||
// Check duration since last PortIn
|
// Check duration since last PortIn
|
||||||
if (Timeout( Handle->ReopenStart, Handle->ReopenTimeout ))
|
if (Timeout( Handle->ReopenStart, Handle->ReopenDelay ))
|
||||||
{
|
{
|
||||||
// Complete opening process
|
// Complete opening process
|
||||||
if (Open( Handle ) == -1)
|
if (Open( Handle ) == -1)
|
||||||
@@ -1412,13 +1492,13 @@ bool CSelectableCore::SerialConfig( THandle * Handle, int Baud, short DataBits,
|
|||||||
if (tcsetattr( Handle->FD, TCSANOW, &newtio ) != 0)
|
if (tcsetattr( Handle->FD, TCSANOW, &newtio ) != 0)
|
||||||
{
|
{
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Port not configured", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Port not configured", Name, Handle->Name );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Port configured
|
// Port configured
|
||||||
// Log event
|
// Log event
|
||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Port configured", Name, Handle->Name );
|
if (Log) Log->Message( LogLevel, dlMedium, "%s: Handle '%s' - Port configured", Name, Handle->Name );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ struct SHandle {
|
|||||||
// State
|
// State
|
||||||
int FD;
|
int FD;
|
||||||
EConnectState State;
|
EConnectState State;
|
||||||
bool Auto;
|
bool AutoManage;
|
||||||
|
|
||||||
// Callback functions
|
// Callback functions
|
||||||
FHandleCallback StateCallback[ 6 ];
|
FHandleCallback StateCallback[ 6 ];
|
||||||
@@ -105,7 +105,7 @@ struct SHandle {
|
|||||||
|
|
||||||
// Reopen Timer
|
// Reopen Timer
|
||||||
timeval ReopenStart;
|
timeval ReopenStart;
|
||||||
long ReopenTimeout; // millisecs
|
long ReopenDelay; // millisecs
|
||||||
|
|
||||||
// List / Tree
|
// List / Tree
|
||||||
TChannel * Channel;
|
TChannel * Channel;
|
||||||
@@ -134,11 +134,11 @@ protected:
|
|||||||
|
|
||||||
// Output
|
// Output
|
||||||
CLogCore * Log;
|
CLogCore * Log;
|
||||||
EDebugLevel DebugLevel;
|
EDebugLevel LogLevel;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Life Cycle
|
// Life Cycle
|
||||||
CSelect( long SelectTimeout, CLogCore * pLog, EDebugLevel DebugLevel );
|
CSelect( long SelectTimeout, CLogCore * pLog, EDebugLevel pLogLevel );
|
||||||
~CSelect();
|
~CSelect();
|
||||||
|
|
||||||
// Parameters
|
// Parameters
|
||||||
@@ -165,6 +165,9 @@ protected:
|
|||||||
// Select interface
|
// Select interface
|
||||||
CSelect * Select;
|
CSelect * Select;
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
virtual bool LoadConfigData();
|
||||||
|
|
||||||
// Managing File Handles
|
// Managing File Handles
|
||||||
bool RemoveHandle( THandle * Handle );
|
bool RemoveHandle( THandle * Handle );
|
||||||
bool DestroyHandle( THandle * Handle );
|
bool DestroyHandle( THandle * Handle );
|
||||||
@@ -207,8 +210,8 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Life Cycle
|
// Life Cycle
|
||||||
CSelectableCore( const char * Name, CSelect * Selector, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay );
|
CSelectableCore( const char * Name, CSelect * pSelect, CLogCore * pLog );
|
||||||
~CSelectableCore();
|
virtual ~CSelectableCore();
|
||||||
|
|
||||||
// Finding Handles
|
// Finding Handles
|
||||||
inline THandle * GetHandle( const char * HandleName )
|
inline THandle * GetHandle( const char * HandleName )
|
||||||
@@ -228,7 +231,6 @@ public:
|
|||||||
return Handle;
|
return Handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configuration
|
|
||||||
THandle * CreateHandle( const char * HandleName, bool CreateChannel );
|
THandle * CreateHandle( const char * HandleName, bool CreateChannel );
|
||||||
bool SetCallback( THandle * Handle, EConnectState pState, FHandleCallback pCallback );
|
bool SetCallback( THandle * Handle, EConnectState pState, FHandleCallback pCallback );
|
||||||
bool SetAutoManage( THandle * Handle, bool AutoManage, int ReopenTime = 0 );
|
bool SetAutoManage( THandle * Handle, bool AutoManage, int ReopenTime = 0 );
|
||||||
|
|||||||
@@ -23,19 +23,19 @@ extern char * ProcessName;
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
CWatchdogCore::CWatchdogCore( const char * WatchdogName, const int pInterval, CLogCore * pLog, EDebugLevel pDebugLevel ) :
|
CWatchdogCore::CWatchdogCore( const char * pName, CSelect * pSelect, CLogCore * pLog ) :
|
||||||
CFunctionCore( WatchdogName, pLog, pDebugLevel, OUT_NORMAL )
|
CSelectableCore( pName, pSelect, pLog )
|
||||||
{
|
{
|
||||||
// Create protocol
|
// Create protocol
|
||||||
Protocol = new CLiteProtocol( 50, '\x01', '\x02', '\x00' );
|
Protocol = new CLiteProtocol( 50, '\x01', '\x02', '\x00' );
|
||||||
Protocol->CreateCommand( ProcessName, WatchdogName, "ping" );
|
Protocol->CreateCommand( ProcessName, pName, "ping" );
|
||||||
|
|
||||||
// Start timer
|
// Start timer
|
||||||
PingTimeout = 500;
|
PingInterval = 500;
|
||||||
SetStartTime( &PingTimer );
|
SetStartTime( &PingTimer );
|
||||||
|
|
||||||
// Create Channel
|
// Create handle
|
||||||
Ping = AddChannel( "Ping" );
|
Ping = CreateHandle( "Ping", true );
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -47,12 +47,19 @@ CWatchdogCore::~CWatchdogCore()
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool CWatchdogCore::SetInterval( int pPingInterval )
|
||||||
|
{
|
||||||
|
PingInterval = pPingInterval;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CWatchdogCore::Process()
|
bool CWatchdogCore::Process()
|
||||||
{
|
{
|
||||||
if (Timeout( PingTimer, PingTimeout ))
|
if (Timeout( PingTimer, PingInterval ))
|
||||||
{
|
{
|
||||||
// Send command
|
// Send command
|
||||||
Output( Ping, Protocol->GetCommandStr(), Protocol->GetCommandLen() );
|
Input( Ping->Name, Protocol->GetCommandStr(), Protocol->GetCommandLen() );
|
||||||
|
|
||||||
// Reset timer
|
// Reset timer
|
||||||
SetStartTime( &PingTimer );
|
SetStartTime( &PingTimer );
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#define REDACORE_WATCHDOGCORE_H_
|
#define REDACORE_WATCHDOGCORE_H_
|
||||||
|
|
||||||
// redA Libraries
|
// redA Libraries
|
||||||
#include "FunctionCore.h"
|
#include "SelectableCore.h"
|
||||||
#include "LiteProtocolCore.h"
|
#include "LiteProtocolCore.h"
|
||||||
|
|
||||||
// Standard C/C++ Libraries
|
// Standard C/C++ Libraries
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
class CWatchdogCore : public CFunctionCore
|
class CWatchdogCore : public CSelectableCore
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
// Command
|
// Command
|
||||||
@@ -25,15 +25,20 @@ private:
|
|||||||
|
|
||||||
// Timing
|
// Timing
|
||||||
timeval PingTimer;
|
timeval PingTimer;
|
||||||
int PingTimeout;
|
int PingInterval;
|
||||||
|
|
||||||
// Channel
|
// Handle
|
||||||
TChannel * Ping;
|
THandle * Ping;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CWatchdogCore( const char * WatchdogName, const int pInterval, CLogCore * pLog, EDebugLevel pDebugLevel );
|
// Life Cycle
|
||||||
|
CWatchdogCore( const char * pName, CSelect * pSelect, CLogCore * pLog );
|
||||||
virtual ~CWatchdogCore();
|
virtual ~CWatchdogCore();
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
bool SetInterval( int pPingInterval );
|
||||||
|
|
||||||
|
// Process
|
||||||
virtual bool Process();
|
virtual bool Process();
|
||||||
};
|
};
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user