Important Update:
- ItemBufferCore:
- New Class for storing items in a FIFO style buffer
- FunctionCore:
- Implemented pulled input:
- Function creates static output: StoredOutput & StoredOutputLen
- Other Function pulls static output from input linked functions
- FunctionCore-ChannelBuffer:
- Tried to create a processing buffer
- Abandoned for now
This commit is contained in:
107
FunctionCore.cpp
107
FunctionCore.cpp
@@ -42,7 +42,7 @@ CFunctionCore::CFunctionCore( const char * pName, const char * pType )
|
||||
}
|
||||
|
||||
// Channels
|
||||
FirstChannel = NULL;
|
||||
FirstChannel = NULL;
|
||||
|
||||
// List
|
||||
Application->AddFunction( this );
|
||||
@@ -52,10 +52,14 @@ CFunctionCore::CFunctionCore( const char * pName, const char * pType )
|
||||
ConfigMember = NULL;
|
||||
LinkConfigMember = NULL;
|
||||
|
||||
// Output
|
||||
// Logging
|
||||
Log = Application->Log;
|
||||
LogLevel = dlNone;
|
||||
LogOutput = OUT_NORMAL;
|
||||
|
||||
// Stored output
|
||||
StoredOutput = NULL;
|
||||
StoredOutputLen = 0;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -411,7 +415,7 @@ bool CFunctionCore::LinkOutputChannel( const char * ChannelName, const char * In
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
// Manual Data Input/Output
|
||||
int CFunctionCore::Input( const char * ChannelName, const char * Data, int MaxLen )
|
||||
int CFunctionCore::Input( const char * ChannelName, const char * Data, int Len )
|
||||
{
|
||||
TChannel * Channel = NULL;
|
||||
|
||||
@@ -433,11 +437,11 @@ int CFunctionCore::Input( const char * ChannelName, const char * Data, int MaxLe
|
||||
}
|
||||
else {
|
||||
// Return processed bytes
|
||||
if (MaxLen == -1) {
|
||||
MaxLen = strlen( Data );
|
||||
if (Len == -1) {
|
||||
Len = strlen( Data );
|
||||
}
|
||||
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, MaxLen, "%s: Channel '%s' - IN:", Name, ChannelName );
|
||||
return MaxLen;
|
||||
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, Data, Len, "%s: Channel '%s' - IN:", Name, ChannelName );
|
||||
return Len;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -495,3 +499,92 @@ int CFunctionCore::Output( const TChannel * Channel, const char * Data, int Len
|
||||
return Len;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CFunctionCore::PullInput( const char * ChannelName )
|
||||
{
|
||||
TChannel * Channel = NULL;
|
||||
|
||||
// Validate
|
||||
if (!ChannelName) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get Channel
|
||||
if (!(Channel = GetChannel( ChannelName ))) {
|
||||
// Channel not found
|
||||
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input failed, Channel not found", Name, ChannelName );
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
// Return success
|
||||
return PullInput( Channel );
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CFunctionCore::PullInput( TChannel * Channel )
|
||||
{
|
||||
TChannelLink * InChannel = NULL;
|
||||
char ** Data = NULL;
|
||||
int * Len = NULL;
|
||||
|
||||
// Validate
|
||||
if (!Channel) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if enabled
|
||||
if (!Channel->InputEnabled) {
|
||||
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Input failed, Channel input disabled", Name, Channel->Name );
|
||||
return false;
|
||||
}
|
||||
|
||||
// Pass output to all linked inputs
|
||||
InChannel = Channel->FirstInput;
|
||||
while (InChannel)
|
||||
{
|
||||
// Pull Output from Channel
|
||||
if (InChannel->Function->PullOutput( InChannel->Name, Data, Len ))
|
||||
{
|
||||
// Use input
|
||||
Input( Channel->Name, *Data, ((*Len)? *Len : -1) );
|
||||
}
|
||||
InChannel = InChannel->Next;
|
||||
}
|
||||
|
||||
// Return success
|
||||
return Len;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CFunctionCore::PullOutput( const char * ChannelName, char ** Data, int * Len )
|
||||
{
|
||||
TChannel * Channel = NULL;
|
||||
int TempLen = 0;
|
||||
|
||||
// Validate
|
||||
if (!ChannelName || !Data) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get Channel
|
||||
if (!(Channel = GetChannel( ChannelName ))) {
|
||||
// Channel not found
|
||||
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output failed, Channel not found", Name, ChannelName );
|
||||
return 0;
|
||||
}
|
||||
else if (!Channel->InputEnabled) {
|
||||
// Channel disabled
|
||||
if (Log) Log->Message( LogLevel, dlHigh, "%s: Channel '%s' - Output failed, Channel output disabled", Name, ChannelName );
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
// Return processed bytes
|
||||
*Data = StoredOutput;
|
||||
TempLen = (*Data)? strlen(*Data) : 0;
|
||||
if (Len) *Len = TempLen;
|
||||
if (Log) Log->Output( LogLevel, dlHigh, LogOutput, ((*Data)? *Data : "(NULL)"), TempLen, "%s: Channel '%s' - IN:", Name, ChannelName );
|
||||
return Len;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user