Importnant update:
- Add callback functions for change in socket states
This commit is contained in:
@@ -259,6 +259,19 @@ bool CSelectableCore::ClearHandle( THandle * Handle )
|
|||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool CSelectableCore::SetCallback( THandle * Handle, EConnectState pState, FHandleCallback pCallback )
|
||||||
|
{
|
||||||
|
// Validate
|
||||||
|
if (!Handle) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set callback
|
||||||
|
Handle->StateCallback[ (int)pState ] = pCallback;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool CSelectableCore::SetAutoManage( THandle * Handle, bool AutoManage, int ReopenTime )
|
bool CSelectableCore::SetAutoManage( THandle * Handle, bool AutoManage, int ReopenTime )
|
||||||
{
|
{
|
||||||
// Validate
|
// Validate
|
||||||
@@ -348,7 +361,7 @@ int CSelectableCore::OpenPort( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
Handle->State = csOpen;
|
ChangeState( Handle, csOpen );
|
||||||
return Handle->FD;
|
return Handle->FD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,7 +453,7 @@ int CSelectableCore::OpenForkPipe( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
Handle->State = csOpen;
|
ChangeState( Handle, csOpen );
|
||||||
return Handle->FD;
|
return Handle->FD;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,7 +493,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
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( DebugLevel, 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
|
||||||
Handle->State = csFailed;
|
ChangeState( Handle, csFailed );
|
||||||
return -1;
|
return -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -492,7 +505,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
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( DebugLevel, 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
|
||||||
Handle->State = csFailed;
|
ChangeState( Handle, csFailed );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,7 +520,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
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( DebugLevel, 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
|
||||||
Handle->State = csFailed;
|
ChangeState( Handle, csFailed );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -524,7 +537,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
// Set state
|
// Set state
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
Handle->FD = -1;
|
Handle->FD = -1;
|
||||||
Handle->State = csFailed;
|
ChangeState( Handle, csFailed );
|
||||||
return -1;
|
return -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -537,7 +550,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
// Set state
|
// Set state
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
Handle->FD = -1;
|
Handle->FD = -1;
|
||||||
Handle->State = csFailed;
|
ChangeState( Handle, csFailed );
|
||||||
return -1;
|
return -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -550,7 +563,7 @@ int CSelectableCore::OpenServerSocket( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set state
|
// Set state
|
||||||
Handle->State = csOpen;
|
ChangeState( Handle, csOpen );
|
||||||
return Handle->FD;
|
return Handle->FD;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -639,7 +652,7 @@ int CSelectableCore::OpenRemoteClientSocket( THandle * Handle )
|
|||||||
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Remote Client connection open [%s]", Name, Handle->Name, Handle->Address );
|
if (Log) Log->Message( DebugLevel, dlMedium, "%s: Handle '%s' - Remote Client connection open [%s]", Name, Handle->Name, Handle->Address );
|
||||||
|
|
||||||
// Update state
|
// Update state
|
||||||
Handle->State = csOpen;
|
ChangeState( Handle, csOpen );
|
||||||
return Handle->FD;
|
return Handle->FD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -673,7 +686,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
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( DebugLevel, 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
|
||||||
Handle->State = csFailed;
|
ChangeState( Handle, csFailed );
|
||||||
return -1;
|
return -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -694,7 +707,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
// Set State
|
// Set State
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
Handle->FD = -1;
|
Handle->FD = -1;
|
||||||
Handle->State = csFailed;
|
ChangeState( Handle, csFailed );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -715,7 +728,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set status
|
// Set status
|
||||||
Handle->State = csOpen;
|
ChangeState( Handle, csOpen );
|
||||||
return Handle->FD;
|
return Handle->FD;
|
||||||
}
|
}
|
||||||
else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY))
|
else if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EALREADY))
|
||||||
@@ -729,7 +742,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set status
|
// Set status
|
||||||
Handle->State = csWaitingtoOpen;
|
ChangeState( Handle, csWaitingtoOpen );
|
||||||
return Handle->FD;
|
return Handle->FD;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -744,7 +757,7 @@ int CSelectableCore::OpenClientSocket( THandle * Handle )
|
|||||||
|
|
||||||
// Close socket
|
// Close socket
|
||||||
close( Handle->FD );
|
close( Handle->FD );
|
||||||
Handle->State = csFailed;
|
ChangeState( Handle, csFailed );
|
||||||
|
|
||||||
// Start re-open timer
|
// Start re-open timer
|
||||||
SetStartTime( &(Handle->ReopenStart) );
|
SetStartTime( &(Handle->ReopenStart) );
|
||||||
@@ -821,7 +834,7 @@ bool CSelectableCore::Close( THandle * Handle, bool CloseChildren )
|
|||||||
|
|
||||||
// Close Handle
|
// Close Handle
|
||||||
Fail = (close( Handle->FD ))? true : false;
|
Fail = (close( Handle->FD ))? true : false;
|
||||||
Handle->State = ((Fail)? csFailed : csClosed);
|
ChangeState( Handle, ((Fail)? csFailed : csClosed) );
|
||||||
|
|
||||||
// Start re-open timer
|
// Start re-open timer
|
||||||
SetStartTime( &(Handle->ReopenStart) );
|
SetStartTime( &(Handle->ReopenStart) );
|
||||||
|
|||||||
@@ -47,6 +47,9 @@ typedef struct SHandle THandle;
|
|||||||
class CSelect;
|
class CSelect;
|
||||||
class CSelectableCore;
|
class CSelectableCore;
|
||||||
|
|
||||||
|
// Callback function for handle events
|
||||||
|
typedef void (*FHandleCallback)( CSelectableCore * Function, THandle * Handle, EConnectState State );
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
// List of Handles for Select Object
|
// List of Handles for Select Object
|
||||||
@@ -71,6 +74,14 @@ struct SHandle {
|
|||||||
char * Name;
|
char * Name;
|
||||||
EConnectType Type;
|
EConnectType Type;
|
||||||
|
|
||||||
|
// State
|
||||||
|
int FD;
|
||||||
|
EConnectState State;
|
||||||
|
bool Auto;
|
||||||
|
|
||||||
|
// Callback functions
|
||||||
|
FHandleCallback StateCallback[ 6 ];
|
||||||
|
|
||||||
// Type specific parameters
|
// Type specific parameters
|
||||||
char * Path; // Port (file)name or Exec path
|
char * Path; // Port (file)name or Exec path
|
||||||
|
|
||||||
@@ -80,11 +91,6 @@ struct SHandle {
|
|||||||
int PortNo; // Socket port no
|
int PortNo; // Socket port no
|
||||||
bool KeepAlive; // Socket keep alive
|
bool KeepAlive; // Socket keep alive
|
||||||
|
|
||||||
// State
|
|
||||||
int FD;
|
|
||||||
EConnectState State;
|
|
||||||
bool Auto;
|
|
||||||
|
|
||||||
// Buffers
|
// Buffers
|
||||||
CBuffer * InBuffer;
|
CBuffer * InBuffer;
|
||||||
CBuffer * OutBuffer;
|
CBuffer * OutBuffer;
|
||||||
@@ -174,6 +180,15 @@ protected:
|
|||||||
return ((Handle)? Handle->State : csNone);
|
return ((Handle)? Handle->State : csNone);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// General fucntions
|
||||||
|
inline bool ChangeState( THandle * Handle, EConnectState State ) {
|
||||||
|
if (!Handle || (Handle->State == State)) return false;
|
||||||
|
if (Handle->StateCallback[ (int)State ])
|
||||||
|
(Handle->StateCallback[ (int)State ])( this, Handle, State );
|
||||||
|
Handle->State = State;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Port Operations
|
// Port Operations
|
||||||
virtual int OpenPort( THandle * Handle );
|
virtual int OpenPort( THandle * Handle );
|
||||||
|
|
||||||
@@ -220,6 +235,7 @@ public:
|
|||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
THandle * CreateHandle( const char * HandleName, bool CreateChannel );
|
THandle * CreateHandle( const char * HandleName, bool CreateChannel );
|
||||||
|
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 );
|
||||||
bool SetBuffers( THandle * Handle, int InBufSize, int OutBufSize, int InTimeout, const char * InMarker, int InMarkerLen );
|
bool SetBuffers( THandle * Handle, int InBufSize, int OutBufSize, int InTimeout, const char * InMarker, int InMarkerLen );
|
||||||
bool SerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait );
|
bool SerialConfig( THandle * Handle, int Baud, short DataBits, short StopBits, short Parity, short FlowCtrl, int Wait );
|
||||||
|
|||||||
Reference in New Issue
Block a user