diff --git a/DataTreeCore.cpp b/DataTreeCore.cpp index 7dc8146..be8f3db 100644 --- a/DataTreeCore.cpp +++ b/DataTreeCore.cpp @@ -269,7 +269,7 @@ TDataMember * CDataTree::GetMember( TDataMember * BaseMember, const char * Path // Get Child Member = GetMemberPtr( BaseMember, Path, Create ); - return *Member; + return ((Member)? *Member : NULL); } //--------------------------------------------------------------------------- diff --git a/DeviceCore.cpp b/DeviceCore.cpp index 174d4dc..04245d2 100644 --- a/DeviceCore.cpp +++ b/DeviceCore.cpp @@ -23,8 +23,8 @@ //--------------------------------------------------------------------------- -CDeviceCore::CDeviceCore( const char * Name, CLogCore * pLog, EDebugLevel DebugLevel, int pOutputDisplay ) : - CFunctionCore( Name, pLog, DebugLevel, pOutputDisplay ) +CDeviceCore::CDeviceCore( const char * pName, CLogCore * pLog ) : + CFunctionCore( pName, pLog ) { // Clear Parameters FirstDevice = NULL; @@ -94,7 +94,7 @@ bool CDeviceCore::DeviceOnline( TDevice * Device, bool Online ) // Log Event 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; } //--------------------------------------------------------------------------- @@ -120,11 +120,11 @@ bool CDeviceCore::CheckReplyTimeout( int TimeoutPollStep ) // Handle No Reply / Retry if (PollRetry < MaxRetries) { // 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 { // 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 DeviceOnline( ActiveDevice, false ); @@ -163,7 +163,7 @@ TDevice * CDeviceCore::AddDevice( const char * DeviceName ) } // 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; } @@ -316,7 +316,7 @@ TDeviceParam * CDeviceCore::AddDeviceParam( TDevice * Device, const char * Param (*Param)->Changed = true; // 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; } @@ -387,7 +387,7 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val // Mark change & log event 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; @@ -399,7 +399,7 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val // Mark change & log event 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; @@ -411,7 +411,7 @@ bool CDeviceCore::UpdateUnsignedValue( TDeviceParam * Param, const u_int32_t Val // Mark change & log event 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; @@ -446,7 +446,7 @@ bool CDeviceCore::UpdateSignedValue( TDeviceParam * Param, const int32_t Value, // Mark change & log event 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; @@ -458,7 +458,7 @@ bool CDeviceCore::UpdateSignedValue( TDeviceParam * Param, const int32_t Value, // Mark change & log event 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; @@ -493,7 +493,7 @@ bool CDeviceCore::UpdateFloatValue( TDeviceParam * Param, const float Value, boo // Mark change & log event 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; @@ -538,7 +538,7 @@ bool CDeviceCore::UpdateStringValue( TDeviceParam * Param, const char * Value, c // Mark Change 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; diff --git a/DeviceCore.h b/DeviceCore.h index e54938f..798b15a 100644 --- a/DeviceCore.h +++ b/DeviceCore.h @@ -168,8 +168,8 @@ protected: public: // Life cycle - CDeviceCore( const char * Name, CLogCore * pLog, EDebugLevel DebugLevel, int pOuputDisplay ); - ~CDeviceCore(); + CDeviceCore( const char * pName, CLogCore * pLog ); + virtual ~CDeviceCore(); // Generate events bool SetPollParam( int pPollInterval ); diff --git a/FileCore.cpp b/FileCore.cpp index 31a49f1..2f973bc 100644 --- a/FileCore.cpp +++ b/FileCore.cpp @@ -27,8 +27,8 @@ const float PI = 3.1415927; //--------------------------------------------------------------------------- -CFileCore::CFileCore( const char * Name, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay ) : - CFunctionCore( Name, pLog, pDebugLevel, pOuputDisplay ) +CFileCore::CFileCore( const char * pName, CLogCore * pLog ) : + CFunctionCore( pName, pLog ) { FirstFile = NULL; } @@ -145,7 +145,7 @@ bool CFileCore::OpenFile( TFileHandle * FileHandle ) SetStartTime( &(FileHandle->PersistTime) ); // 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)) { // 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; } @@ -177,9 +177,9 @@ bool CFileCore::CloseFile( TFileHandle * FileHandle ) // Report result 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 { - 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; @@ -262,12 +262,12 @@ int CFileCore::Input( const char * ChannelName, const char * Data, int MaxLen ) if (!(FileHandle = GetFile( ChannelName ))) { // 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; } // 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 if (!OpenFile( FileHandle )) { diff --git a/FileCore.h b/FileCore.h index 3336b9c..1fdc763 100644 --- a/FileCore.h +++ b/FileCore.h @@ -60,8 +60,8 @@ private: public: // Life cycle - CFileCore( const char * Name, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay ); - ~CFileCore(); + CFileCore( const char * pName, CLogCore * pLog ); + virtual ~CFileCore(); // Manage files virtual TFileHandle * AddFile( const char * Name, const char * Path, bool Append = true, bool CreateChannel = true ); diff --git a/FunctionCore.cpp b/FunctionCore.cpp index 467c91d..c485cbe 100644 --- a/FunctionCore.cpp +++ b/FunctionCore.cpp @@ -22,12 +22,12 @@ extern char * ProcessName; //--------------------------------------------------------------------------- // Life cycle -CFunctionCore::CFunctionCore( const char * FunctionName, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay ) +CFunctionCore::CFunctionCore( const char * pName, CLogCore * pLog ) { // Set name - if (FunctionName) { - Name = (char*)malloc( strlen(FunctionName)+1 ); - strcpy( Name, FunctionName ); + if (pName) { + Name = (char*)malloc( strlen(pName)+1 ); + strcpy( Name, pName ); } else { Name = NULL; @@ -35,17 +35,15 @@ CFunctionCore::CFunctionCore( const char * FunctionName, CLogCore * pLog, EDebug // Data Tree DataTree = NULL; + BaseMember = NULL; // Channels FirstChannel = NULL; // Output Log = pLog; - OutputDisplay = pOuputDisplay; - DebugLevel = pDebugLevel; - - // Report status - if (Log) Log->Message( DebugLevel, dlLow, "%s: Function '%s' - Created", ProcessName, FunctionName ); + LogLevel = dlNone; + LogOutput = OUT_NORMAL; } //--------------------------------------------------------------------------- @@ -89,7 +87,7 @@ CFunctionCore::~CFunctionCore() } // 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 if (Name) { @@ -100,20 +98,107 @@ CFunctionCore::~CFunctionCore() bool CFunctionCore::LoadConfig( CDataTree * pDataTree, const char * pBasePath ) { - TDataMember * BaseMember; - // Validate - if (!(DataTree = pDataTree) || - !(BaseMember = DataTree->GetMember( NULL, pBasePath, true ))) + if (!(DataTree = pDataTree) || !(BaseMember = DataTree->GetMember( NULL, pBasePath, true ))) 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; } //--------------------------------------------------------------------------- bool CFunctionCore::SetDebugLevel( EDebugLevel pDebugLevel ) { - DebugLevel = pDebugLevel; + LogLevel = pDebugLevel; return true; } //--------------------------------------------------------------------------- @@ -144,7 +229,7 @@ TChannel * CFunctionCore::AddChannel( const char * ChannelName, const bool pInpu strcpy( (*Channel)->Name, ChannelName ); // 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 @@ -185,7 +270,7 @@ bool CFunctionCore::LinkInputChannel( const char * ChannelName, CFunctionCore * strcpy( (*LinkedChannel)->Name, OutChannelName ); // 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 @@ -226,7 +311,7 @@ bool CFunctionCore::LinkOutputChannel( const char * ChannelName, CFunctionCore * strcpy( (*LinkedChannel)->Name, InChannelName ); // 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 @@ -251,12 +336,12 @@ int CFunctionCore::Input( const char * ChannelName, const char * Data, int MaxLe // Get Channel if (!(Channel = GetChannel( ChannelName ))) { // 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; } else if (!Channel->InputEnabled) { // 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; } else { @@ -264,7 +349,7 @@ int CFunctionCore::Input( const char * ChannelName, const char * Data, int MaxLe if (MaxLen == -1) { 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; } } @@ -281,7 +366,7 @@ int CFunctionCore::Output( const char * ChannelName, const char * Data, int Len // Get Channel 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; } else { @@ -302,12 +387,12 @@ int CFunctionCore::Output( const TChannel * Channel, const char * Data, int Len // Check if enabled 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; } // 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 if (Len == -1) { diff --git a/FunctionCore.h b/FunctionCore.h index 38931a1..3ad6be3 100644 --- a/FunctionCore.h +++ b/FunctionCore.h @@ -58,14 +58,15 @@ protected: // Configuration CDataTree * DataTree; + TDataMember * BaseMember; // Channels TChannel * FirstChannel; // Output CLogCore * Log; - EDebugLevel DebugLevel; - int OutputDisplay; + EDebugLevel LogLevel; + int LogOutput; // Manage Channel inline TChannel * GetChannel( const char * Name ) { @@ -76,16 +77,23 @@ protected: return Channel; } + // Load configuraiton + virtual bool LoadConfigData(); + // Manual Data Input/Output virtual int Output( const TChannel * Channel, const char * Data, int Len ); public: // Life cycle - CFunctionCore( const char * FunctionName, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay ); + CFunctionCore( const char * pName, CLogCore * pLog ); virtual ~CFunctionCore(); - // Configuration - virtual bool LoadConfig( CDataTree * DataTree, const char * BasePath ); + // Load Configuration + 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 ); // Miscellaneous diff --git a/SelectCore.cpp b/SelectCore.cpp index 5759701..769261b 100644 --- a/SelectCore.cpp +++ b/SelectCore.cpp @@ -40,10 +40,10 @@ CSelect::CSelect( long SelectTimeout, CLogCore * pLog, EDebugLevel pDebugLevel ) // Output Log = pLog; - DebugLevel = pDebugLevel; + LogLevel = pDebugLevel; // 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 - if (Log) Log->Message( DebugLevel, dlLow, "%s: Select - Destroyed", ProcessName ); + if (Log) Log->Message( LogLevel, dlLow, "%s: Select - Destroyed", ProcessName ); return; } //--------------------------------------------------------------------------- bool CSelect::SetDebugLevel( EDebugLevel pDebugLevel ) { - DebugLevel = pDebugLevel; + LogLevel = pDebugLevel; return true; } //--------------------------------------------------------------------------- @@ -113,7 +113,7 @@ void CSelect::Add( int FD, bool Read, bool Write, CSelectableCore * Function ) FD_SET( FD, &ReadTestFDS ); // 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 @@ -122,7 +122,7 @@ void CSelect::Add( int FD, bool Read, bool Write, CSelectableCore * Function ) FD_SET( FD, &WriteTestFDS ); // 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 @@ -150,7 +150,7 @@ void CSelect::Remove( int FD, bool Read, bool Write ) FD_CLR( FD, &ReadTestFDS); // 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 @@ -159,7 +159,7 @@ void CSelect::Remove( int FD, bool Read, bool Write ) FD_CLR( FD, &WriteTestFDS); // 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 } @@ -181,7 +181,7 @@ bool CSelect::Test() Events = select( MaxFD, &ReadFDS, &WriteFDS, (fd_set*)NULL, &STimeout ); 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; } diff --git a/SelectableCore.cpp b/SelectableCore.cpp index a8b3e29..455c9a0 100644 --- a/SelectableCore.cpp +++ b/SelectableCore.cpp @@ -30,14 +30,14 @@ //--------------------------------------------------------------------------- -CSelectableCore::CSelectableCore( const char * Name, CSelect * Selector, CLogCore * pLog, EDebugLevel pDebugLevel, int pOutputDisplay ) : - CFunctionCore( Name, pLog, pDebugLevel, pOutputDisplay ) +CSelectableCore::CSelectableCore( const char * pName, CSelect * pSelect, CLogCore * pLog ) : + CFunctionCore( pName, pLog ) { // Handles FirstHandle = NULL; // 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 ** Handle = NULL; @@ -85,7 +165,7 @@ THandle * CSelectableCore::CreateHandle( const char * HandleName, bool CreateCh (*Handle)->FD = -1; // 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 @@ -117,7 +197,7 @@ bool CSelectableCore::RemoveHandle( THandle * Handle ) } // 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 DestroyHandle( Handle ); @@ -175,7 +255,7 @@ bool CSelectableCore::SetPortHandle( THandle * Handle, const char * FileName ) strcpy( Handle->Path, FileName ); // 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; } //--------------------------------------------------------------------------- @@ -200,7 +280,7 @@ bool CSelectableCore::SetForkPipeHandle( THandle * Handle, const char * ExecPath strcpy( Handle->Path, ExecPath ); // 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; } //--------------------------------------------------------------------------- @@ -227,7 +307,7 @@ bool CSelectableCore::SetSocketHandle( THandle * Handle, EConnectType Type, con Handle->PortNo = PortNo; // 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; } //--------------------------------------------------------------------------- @@ -254,7 +334,7 @@ bool CSelectableCore::ClearHandle( THandle * Handle ) Handle->Type = ctNone; // 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; } //--------------------------------------------------------------------------- @@ -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 if (!Handle) { @@ -280,8 +360,8 @@ bool CSelectableCore::SetAutoManage( THandle * Handle, bool AutoManage, int Reop } // Set params - Handle->Auto = AutoManage; - Handle->ReopenTimeout = ReopenTime; + Handle->AutoManage = AutoManage; + Handle->ReopenDelay = ReopenDelay; return true; } //--------------------------------------------------------------------------- @@ -339,7 +419,7 @@ int CSelectableCore::OpenPort( THandle * Handle ) if (access( Handle->Path, F_OK ) != 0) { // 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; } @@ -348,12 +428,12 @@ int CSelectableCore::OpenPort( THandle * Handle ) if (Handle->FD == -1) { // 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; } // 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 if (Select) { @@ -384,7 +464,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle ) if (!Handle->Path || !*(Handle->Path)) { // 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; } @@ -393,7 +473,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle ) if ((pipefd[0] == -1) || (pipefd[1] == -1)) { // 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; } @@ -408,7 +488,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle ) Handle->FD = -1; // 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; } else if (Handle->ChildPID > 0) @@ -419,7 +499,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle ) Handle->FD = pipefd[1]; // 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 { @@ -443,7 +523,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle ) execvp( Args[0], Args ); // 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); } @@ -490,7 +570,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if ((Handle->FD = socket(AF_INET, SOCK_STREAM, 0)) < 0) { // 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 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)) { // 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 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) )) { // 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 ChangeState( Handle, csFailed ); @@ -532,7 +612,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if (bind( Handle->FD, (struct sockaddr *)&address, addr_len ) < 0) { // 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 close( Handle->FD ); @@ -545,7 +625,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) if (listen( Handle->FD, 5 ) < 0) { // 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 close( Handle->FD ); @@ -555,7 +635,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle ) }; // 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 if (Select) { @@ -592,10 +672,10 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) { // Log Event 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 { - 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; } @@ -629,7 +709,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) (*RemoteClient)->State = csWaitingtoOpen; // 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 if (Select) { @@ -649,7 +729,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle ) else if (Handle->State == csWaitingtoOpen) { // 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 ChangeState( Handle, csOpen ); @@ -683,7 +763,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) if ((Handle->FD = socket( AF_INET, SOCK_STREAM, 0 )) < 0) { // 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 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) )) { // 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 close( Handle->FD ); @@ -720,7 +800,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) 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 if (Select) { @@ -734,7 +814,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY)) { // 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 if (Select) { @@ -748,7 +828,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle ) else { // 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 if (Select) { @@ -844,29 +924,29 @@ bool CSelectableCore::Close( THandle * Handle, bool CloseChildren ) { case ctPort: // 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; case ctForkPipe: // 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; 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; 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; 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; case ctNone: 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; }; @@ -894,7 +974,7 @@ bool CSelectableCore::Read( THandle * Handle ) } // 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 if (Handle->Type == ctServer) @@ -970,7 +1050,7 @@ bool CSelectableCore::Write( THandle * Handle ) } // 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) { @@ -994,10 +1074,10 @@ bool CSelectableCore::Write( THandle * Handle ) // Write to FD directly from output buffer if ((BytesWritten = Handle->OutBuffer->WriteToFD( Handle->FD ))) { - if (DebugLevel >= dlHigh) { + if (LogLevel >= dlHigh) { // Show event 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 @@ -1042,7 +1122,7 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force ) { // Show Packet 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 if (Handle->Type == ctRemoteClient) { @@ -1061,7 +1141,7 @@ bool CSelectableCore::ProcessBuffer( THandle * Handle, bool Force ) { // Show Packet 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 if (Handle->Type == ctRemoteClient) { @@ -1150,22 +1230,22 @@ int CSelectableCore::Input( const char * ChannelName, const char * Data, int Len // Get File handle if (!(Handle = GetHandle( ChannelName ))) { // 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; } else if (Handle->Channel && !Handle->Channel->InputEnabled) { // 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; } else if (Handle->State != csOpen) { // 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; } // 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 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 ); // 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 @@ -1224,7 +1304,7 @@ int CSelectableCore::Input( const char * ChannelName, const char * Data, int Len else { // 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 BytesWritten = WriteToFD( Handle->FD, Data, Len, true ); @@ -1244,10 +1324,10 @@ bool CSelectableCore::Process() while (Handle) { // 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 - if (Timeout( Handle->ReopenStart, Handle->ReopenTimeout )) + if (Timeout( Handle->ReopenStart, Handle->ReopenDelay )) { // Complete opening process if (Open( Handle ) == -1) @@ -1412,13 +1492,13 @@ bool CSelectableCore::SerialConfig( THandle * Handle, int Baud, short DataBits, if (tcsetattr( Handle->FD, TCSANOW, &newtio ) != 0) { // 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; } // Port configured // 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; } //--------------------------------------------------------------------------- diff --git a/SelectableCore.h b/SelectableCore.h index a8170f5..ed20a24 100644 --- a/SelectableCore.h +++ b/SelectableCore.h @@ -77,7 +77,7 @@ struct SHandle { // State int FD; EConnectState State; - bool Auto; + bool AutoManage; // Callback functions FHandleCallback StateCallback[ 6 ]; @@ -105,7 +105,7 @@ struct SHandle { // Reopen Timer timeval ReopenStart; - long ReopenTimeout; // millisecs + long ReopenDelay; // millisecs // List / Tree TChannel * Channel; @@ -134,11 +134,11 @@ protected: // Output CLogCore * Log; - EDebugLevel DebugLevel; + EDebugLevel LogLevel; public: // Life Cycle - CSelect( long SelectTimeout, CLogCore * pLog, EDebugLevel DebugLevel ); + CSelect( long SelectTimeout, CLogCore * pLog, EDebugLevel pLogLevel ); ~CSelect(); // Parameters @@ -165,6 +165,9 @@ protected: // Select interface CSelect * Select; + // Configuration + virtual bool LoadConfigData(); + // Managing File Handles bool RemoveHandle( THandle * Handle ); bool DestroyHandle( THandle * Handle ); @@ -207,8 +210,8 @@ protected: public: // Life Cycle - CSelectableCore( const char * Name, CSelect * Selector, CLogCore * pLog, EDebugLevel pDebugLevel, int pOuputDisplay ); - ~CSelectableCore(); + CSelectableCore( const char * Name, CSelect * pSelect, CLogCore * pLog ); + virtual ~CSelectableCore(); // Finding Handles inline THandle * GetHandle( const char * HandleName ) @@ -228,7 +231,6 @@ public: return Handle; } - // Configuration THandle * CreateHandle( const char * HandleName, bool CreateChannel ); bool SetCallback( THandle * Handle, EConnectState pState, FHandleCallback pCallback ); bool SetAutoManage( THandle * Handle, bool AutoManage, int ReopenTime = 0 ); diff --git a/WatchdogCore.cpp b/WatchdogCore.cpp index 1608b64..ed21395 100644 --- a/WatchdogCore.cpp +++ b/WatchdogCore.cpp @@ -23,19 +23,19 @@ extern char * ProcessName; //--------------------------------------------------------------------------- -CWatchdogCore::CWatchdogCore( const char * WatchdogName, const int pInterval, CLogCore * pLog, EDebugLevel pDebugLevel ) : - CFunctionCore( WatchdogName, pLog, pDebugLevel, OUT_NORMAL ) +CWatchdogCore::CWatchdogCore( const char * pName, CSelect * pSelect, CLogCore * pLog ) : + CSelectableCore( pName, pSelect, pLog ) { // Create protocol Protocol = new CLiteProtocol( 50, '\x01', '\x02', '\x00' ); - Protocol->CreateCommand( ProcessName, WatchdogName, "ping" ); + Protocol->CreateCommand( ProcessName, pName, "ping" ); // Start timer - PingTimeout = 500; + PingInterval = 500; SetStartTime( &PingTimer ); - // Create Channel - Ping = AddChannel( "Ping" ); + // Create handle + Ping = CreateHandle( "Ping", true ); } //--------------------------------------------------------------------------- @@ -47,12 +47,19 @@ CWatchdogCore::~CWatchdogCore() } //--------------------------------------------------------------------------- +bool CWatchdogCore::SetInterval( int pPingInterval ) +{ + PingInterval = pPingInterval; + return true; +} +//--------------------------------------------------------------------------- + bool CWatchdogCore::Process() { - if (Timeout( PingTimer, PingTimeout )) + if (Timeout( PingTimer, PingInterval )) { // Send command - Output( Ping, Protocol->GetCommandStr(), Protocol->GetCommandLen() ); + Input( Ping->Name, Protocol->GetCommandStr(), Protocol->GetCommandLen() ); // Reset timer SetStartTime( &PingTimer ); diff --git a/WatchdogCore.h b/WatchdogCore.h index a4ddbb8..e013f81 100644 --- a/WatchdogCore.h +++ b/WatchdogCore.h @@ -9,7 +9,7 @@ #define REDACORE_WATCHDOGCORE_H_ // redA Libraries -#include "FunctionCore.h" +#include "SelectableCore.h" #include "LiteProtocolCore.h" // Standard C/C++ Libraries @@ -17,7 +17,7 @@ //--------------------------------------------------------------------------- -class CWatchdogCore : public CFunctionCore +class CWatchdogCore : public CSelectableCore { private: // Command @@ -25,15 +25,20 @@ private: // Timing timeval PingTimer; - int PingTimeout; + int PingInterval; - // Channel - TChannel * Ping; + // Handle + THandle * Ping; public: - CWatchdogCore( const char * WatchdogName, const int pInterval, CLogCore * pLog, EDebugLevel pDebugLevel ); + // Life Cycle + CWatchdogCore( const char * pName, CSelect * pSelect, CLogCore * pLog ); virtual ~CWatchdogCore(); + // Configuration + bool SetInterval( int pPingInterval ); + + // Process virtual bool Process(); }; //---------------------------------------------------------------------------