Major Update:
- FunctionCore
- Replace Channel->Ready with Channel->State (off/waiting/ready)
- Add Function reference to Handle
- SelectableBare/Core:
- Implement async address resolve with event handling
- Create ResolveHandler() signal handler (friend) function
- Change Create/Remove/DestroyHandle() methods to virtual methods
- Move socket specific code to SelectableCore
- Rename ChangeState() to virtual HandleState()
- Move ClearHandle() from SelectableBare -> SelectableCore
- Implement new/delete from THandle
- Set max TCP SYN count on connect
This commit is contained in:
@@ -94,7 +94,7 @@ THandle * CSelectableBare::CreateHandle( const char * HandleName, bool CreateCh
|
||||
if (!*Handle)
|
||||
{
|
||||
// Create File handle at end of list
|
||||
*Handle = (THandle*)calloc( 1, sizeof(THandle) );
|
||||
*Handle = new THandle;
|
||||
|
||||
// Set name
|
||||
if (HandleName) {
|
||||
@@ -103,7 +103,8 @@ THandle * CSelectableBare::CreateHandle( const char * HandleName, bool CreateCh
|
||||
}
|
||||
|
||||
// Set File Descriptor
|
||||
(*Handle)->FD = -1;
|
||||
(*Handle)->Function = this;
|
||||
(*Handle)->FD = -1;
|
||||
|
||||
// Log event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Created",
|
||||
@@ -112,7 +113,7 @@ THandle * CSelectableBare::CreateHandle( const char * HandleName, bool CreateCh
|
||||
|
||||
// Create Matching Channel
|
||||
if (CreateChannel) {
|
||||
(*Handle)->Channel = AddChannel( HandleName, false );
|
||||
(*Handle)->Channel = AddChannel( HandleName, CH_off );
|
||||
}
|
||||
|
||||
return *Handle;
|
||||
@@ -159,68 +160,16 @@ bool CSelectableBare::DestroyHandle( THandle * Handle )
|
||||
free( Handle->Name );
|
||||
if (Handle->Path)
|
||||
free( Handle->Path );
|
||||
if (Handle->HostName)
|
||||
free( Handle->HostName );
|
||||
if (Handle->PortName)
|
||||
free( Handle->PortName );
|
||||
if (Handle->AddressInfo)
|
||||
freeaddrinfo( Handle->AddressList );
|
||||
|
||||
// Destroy Buffers
|
||||
if (Handle->InBuffer)
|
||||
delete Handle->InBuffer;
|
||||
if (Handle->OutBuffer)
|
||||
delete Handle->OutBuffer;
|
||||
|
||||
// Clear Input Markers
|
||||
if (Handle->InMarker)
|
||||
free( Handle->InMarker );
|
||||
|
||||
// Destroy Pointer
|
||||
free( Handle );
|
||||
delete Handle;
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CSelectableBare::ClearHandle( THandle * Handle )
|
||||
bool CSelectableBare::HandleState( THandle * Handle, EConnectState State )
|
||||
{
|
||||
// Validate
|
||||
if (!Handle) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Reset Type related parameters
|
||||
if (Handle->Path) {
|
||||
free( Handle->Path );
|
||||
Handle->Path = NULL;
|
||||
}
|
||||
if (Handle->HostName) {
|
||||
free( Handle->HostName );
|
||||
Handle->HostName = NULL;
|
||||
}
|
||||
if (Handle->PortName) {
|
||||
free( Handle->PortName );
|
||||
Handle->PortName = NULL;
|
||||
}
|
||||
if (Handle->AddressList) {
|
||||
freeaddrinfo( Handle->AddressList );
|
||||
Handle->AddressList = NULL;
|
||||
Handle->AddressInfo = NULL;
|
||||
}
|
||||
|
||||
// Reset Parameters
|
||||
Handle->Type = ctNone;
|
||||
|
||||
// Log event
|
||||
if (Log) Log->Message( LogLevel, dlMedium, "%s/%s: Handle '%s' - Set as None",
|
||||
ProcessName, Name, Handle->Name );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
bool CSelectableBare::ChangeState( THandle * Handle, EConnectState State )
|
||||
{
|
||||
bool Ready;
|
||||
EChannelState ChannelState = CH_off;
|
||||
|
||||
// Validate
|
||||
if (!Handle || (Handle->State == State))
|
||||
@@ -235,9 +184,14 @@ bool CSelectableBare::ChangeState( THandle * Handle, EConnectState State )
|
||||
|
||||
// Update Channel
|
||||
if (Handle->Channel) {
|
||||
Ready = ((Handle->State == csOpen) || (Handle->State == csDataWaiting));
|
||||
if (Handle->Channel->Ready != Ready)
|
||||
SetChannelState( Handle->Channel, Ready );
|
||||
if ((Handle->State == csOpenRequest) || (Handle->State == csWaitingtoOpen))
|
||||
ChannelState = CH_wait;
|
||||
else if ((Handle->State == csOpen) || (Handle->State == csDataWaiting))
|
||||
ChannelState = CH_ready;
|
||||
else
|
||||
ChannelState = CH_off;
|
||||
if (Handle->Channel->State != ChannelState)
|
||||
SetChannelState( Handle->Channel, ChannelState );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -421,7 +375,7 @@ int CSelectableBare::Open( THandle * Handle, bool DelayResolve )
|
||||
SetStartTime( &Handle->LastAction );
|
||||
|
||||
// Set state
|
||||
ChangeState( Handle, csOpen );
|
||||
HandleState( Handle, csOpen );
|
||||
return (NewHandle)? NewHandle->FD : -1;
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -459,7 +413,7 @@ bool CSelectableBare::Close( THandle * Handle, bool QuickReopen )
|
||||
ProcessName, Name, Handle->Name, ((Fail)? "failed" : "closed") );
|
||||
|
||||
// Set State
|
||||
ChangeState( Handle, ((Fail)? csFailed : csClosed) );
|
||||
HandleState( Handle, ((Fail)? csFailed : csClosed) );
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -723,7 +677,7 @@ int CSelectableBare::Input( const char * ChannelName, const char * SourceRef, co
|
||||
ProcessName, Name, ((SourceRef && *SourceRef)? SourceRef : "(Any)"), ChannelName );
|
||||
return 0;
|
||||
}
|
||||
else if (!Channel->Ready) {
|
||||
else if (Channel->State != CH_ready) {
|
||||
// Channel disabled
|
||||
if (Log) Log->Message( LogLevel, dlHigh, "%s/%s: Channel '%s'->'%s' - Input rejected, Channel not Ready",
|
||||
ProcessName, Name, ((SourceRef && *SourceRef)? SourceRef : "(Any)"), ChannelName );
|
||||
|
||||
Reference in New Issue
Block a user