Minor Update:

- BufferCore:
  - Method WriteToFD should ignore EAGAIN
- LogCore:
  - Add OUT_COUNT output bit (show total output bytes)
- SelectableCore:
  - Add Force param on WriteToFD, ignore EAGAIN if !Force
This commit is contained in:
Charl Wentzel
2016-07-27 13:42:50 +02:00
parent 1a9f825b25
commit eaace97ec9
6 changed files with 44 additions and 23 deletions

View File

@@ -356,7 +356,7 @@ int CBuffer::WriteToFD( int Handle, int MaxLen )
// Read from file descriptor // Read from file descriptor
BufRemain = BufSize - ReadPos; BufRemain = BufSize - ReadPos;
BytesWritten = write( Handle, &Buffer[ReadPos], ((BufRemain > DataRemain)? DataRemain : BufRemain) ); BytesWritten = write( Handle, &Buffer[ReadPos], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
if ((BytesWritten <= 0) && (errno != EAGAIN)) { if (BytesWritten <= 0) {
break; break;
} }

View File

@@ -68,8 +68,8 @@ protected:
return LocalIO; return LocalIO;
} }
// Low Level Local IO interfaces // Manual Data Input/Output
virtual int Output( const TLocalIO * LocalIO, const char * Data, int Len ); virtual int Output( const TLocalIO * LocalIO, const char * Data, int Len );
public: public:
// Life cycle // Life cycle

View File

@@ -49,30 +49,46 @@ bool ShowOutput( EDebugLevel DebugLevel, EDebugLevel MsgLevel, const short Show,
va_list ArgPtr; va_list ArgPtr;
// Validate values // Validate values
if (!Buffer || !(Show & (OUT_NORMAL | OUT_HEX | OUT_BIN))) if (!Buffer || !(Show & (OUT_COUNT |OUT_NORMAL | OUT_HEX | OUT_BIN)))
return false; return false;
if (Len == -1)
Len = strlen( Buffer );
// Check debug level // Check debug level
if (MsgLevel > DebugLevel) { if (MsgLevel > DebugLevel) {
return true; return true;
} }
// Get length
if (Len == -1)
Len = strlen( Buffer );
// Show Lead // Show Lead
if (Format && *Format) { if (Format && *Format) {
va_start( ArgPtr, Format ); va_start( ArgPtr, Format );
vprintf( Format, ArgPtr ); vprintf( Format, ArgPtr );
va_end( ArgPtr ); va_end( ArgPtr );
} }
printf( "[%d] ", Len );
// Show byte count
if (Show & OUT_COUNT)
{
// Print byte count
printf( " [%d] ", Len );
// EOL if only count wanted
if (Show & OUT_COUNT) {
printf( "\n" );
}
}
// Show Normal output // Show Normal output
if (Show & OUT_NORMAL) { if (Show & OUT_NORMAL)
{
if (Show & OUT_ASIS) { if (Show & OUT_ASIS) {
// Print entire buffer as is (line feeds included)
printf( "%s", Buffer ); printf( "%s", Buffer );
} }
else { else {
// Ignore \r\n
for (int i=0; i<Len; i++) { for (int i=0; i<Len; i++) {
if ((Buffer[i] < 32) || (Buffer[i] > 126)) { if ((Buffer[i] < 32) || (Buffer[i] > 126)) {
if ((Show & OUT_CRLF) && ((Buffer[i] == '\r') || (Buffer[i] == '\n'))) if ((Show & OUT_CRLF) && ((Buffer[i] == '\r') || (Buffer[i] == '\n')))
@@ -85,13 +101,16 @@ bool ShowOutput( EDebugLevel DebugLevel, EDebugLevel MsgLevel, const short Show,
} }
} }
} }
// Add EOL if not present or ignored
if (!(Show & (OUT_ASIS | OUT_CRLF)) || (Buffer[Len-1] != '\n')) { if (!(Show & (OUT_ASIS | OUT_CRLF)) || (Buffer[Len-1] != '\n')) {
printf( "\n" ); printf( "\n" );
} }
} }
// Show Hex output // Show Hex output
if (Show & OUT_HEX) { if (Show & OUT_HEX)
{
// Print Hex values of individual bytes
for (int i=0; i<Len; i++) { for (int i=0; i<Len; i++) {
printf( "%02X ", (unsigned char)Buffer[i] ); printf( "%02X ", (unsigned char)Buffer[i] );
} }
@@ -100,6 +119,7 @@ bool ShowOutput( EDebugLevel DebugLevel, EDebugLevel MsgLevel, const short Show,
// Show Binary output // Show Binary output
if (Show & OUT_BIN) { if (Show & OUT_BIN) {
// Print each byte as 8-bit binary
for (int i=0; i<Len; i++) { for (int i=0; i<Len; i++) {
for (int j=0; j<8; j++) { for (int j=0; j<8; j++) {
printf( "%d", (bool)((Buffer[i] << j) & 0x80) ); printf( "%d", (bool)((Buffer[i] << j) & 0x80) );

View File

@@ -18,11 +18,12 @@
// Debug options // Debug options
const short const short
OUT_NORMAL = 1, OUT_COUNT = 1,
OUT_HEX = 2, OUT_NORMAL = 2,
OUT_BIN = 4, OUT_HEX = 4,
OUT_CRLF = 8, OUT_BIN = 8,
OUT_ASIS = 16; OUT_CRLF = 16,
OUT_ASIS = 32;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -851,7 +851,7 @@ bool CSelectableCore::Write( THandle * Handle )
{ {
if (Handle->OutBuffer) if (Handle->OutBuffer)
{ {
// Write to FD directly from 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 (DebugLevel >= dlHigh) {
@@ -874,7 +874,7 @@ bool CSelectableCore::Write( THandle * Handle )
} }
else else
{ {
// No Output buffer, so remove from Write list // No Output buffer to write from, so remove from Write list
if (Select) { if (Select) {
Select->Remove( Handle->FD, false, true ); Select->Remove( Handle->FD, false, true );
} }
@@ -967,7 +967,7 @@ int CSelectableCore::ReadFromFD( int FD, char * Data, int MaxLen )
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
int CSelectableCore::WriteToFD( int FD, const char * Data, int Len ) int CSelectableCore::WriteToFD( int FD, const char * Data, int Len, bool Force )
{ {
int BytesWritten = 0; int BytesWritten = 0;
int TotalWritten = 0; int TotalWritten = 0;
@@ -984,7 +984,7 @@ int CSelectableCore::WriteToFD( int FD, const char * Data, int Len )
{ {
// Read from file descriptor // Read from file descriptor
BytesWritten = write( FD, &Data[TotalWritten], DataRemain ); BytesWritten = write( FD, &Data[TotalWritten], DataRemain );
if ((BytesWritten <= 0) && (errno != EAGAIN)) { if ((BytesWritten <= 0) && (!Force || (errno != EAGAIN))) {
break; break;
} }
@@ -1050,11 +1050,11 @@ int CSelectableCore::Input( const char * IOName, const char * Data, int Len )
} }
else else
{ {
// Write directly to handle
BytesWritten = WriteToFD( ChildHandle->FD, Data, Len, true );
// Show event // Show event
ShowOutput( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - OUT:", Name, ChildHandle->Name ); ShowOutput( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - OUT:", Name, ChildHandle->Name );
// Write directly to handle
BytesWritten = WriteToFD( ChildHandle->FD, Data, Len );
} }
} }
// Next // Next
@@ -1083,7 +1083,7 @@ int CSelectableCore::Input( const char * IOName, const char * Data, int Len )
ShowOutput( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name ); ShowOutput( DebugLevel, dlHigh, OutputDisplay, Data, Len, "%s: Handle '%s' - OUT:", Name, Handle->Name );
// Write directly to handle // Write directly to handle
BytesWritten = WriteToFD( Handle->FD, Data, Len ); BytesWritten = WriteToFD( Handle->FD, Data, Len, true );
} }
} }

View File

@@ -182,7 +182,7 @@ protected:
virtual bool Write( THandle * Handle ); virtual bool Write( THandle * Handle );
int ReadFromFD( int FD, char * Data, int MaxLen ); int ReadFromFD( int FD, char * Data, int MaxLen );
int WriteToFD( int FD, const char * Data, int Len ); int WriteToFD( int FD, const char * Data, int Len, bool Force );
// Buffer operations // Buffer operations
virtual bool ProcessBuffer( THandle * Handle, bool Force ); virtual bool ProcessBuffer( THandle * Handle, bool Force );