Important Update:

- SelectableCore:
  - Finish UDP implementation
    - Change UDPsock to UDPserver/client/remote
    - Add OpenUDPserver/client/remote methods
    - Add ReadFrom/WriteToUDP() methods (cannot write to FD)
    - ReadFrom/WriteToFD():
      - return negative bytes on error
      - small delay between consecutive reads/writes
  - Set address correctly on resolve (for UDP or TCP)
  - Improve ReadFrom/WriteToFD() methods (improved timing & error)
  - Improve error reporting on Input/OutputHandle() methods
- CharBufferCore:
  - Standardise ReadFrom/WriteToFD() method
  - Bug fix: Peek/PeekCopy error if Data param not passed
- FileCore
  - Standardise ReadFrom/WriteToFD() method
This commit is contained in:
Charl Wentzel
2018-11-19 19:52:39 +02:00
parent 1e74b9cd60
commit 278198171d
4 changed files with 420 additions and 129 deletions

View File

@@ -182,7 +182,7 @@ int CRollingBuffer::Peek( char ** Data, int PeekPos, int MaxLen )
// Validate
if (!BufSize || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) {
*Data = NULL;
if (Data) *Data = NULL;
return 0;
}
@@ -227,7 +227,7 @@ int CRollingBuffer::PeekCopy( char ** Data, int PeekPos, int MaxLen )
// Check if any data
if (!BufSize || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) {
if (*Data) (*Data)[0] = 0;
if (Data && *Data) (*Data)[0] = 0;
return 0;
}
@@ -410,6 +410,7 @@ int CRollingBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
int TotalRead = 0;
int BufRemain = 0;
int DataRemain = 0;
bool Error = false;
// Check if buffer created
if (!BufSize) {
@@ -426,6 +427,8 @@ int CRollingBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
BufRemain = BufSize - BufEnd;
BytesRead = read( Handle, &Buffer[BufEnd], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
if (BytesRead <= 0) {
Error = true;
errno = (!BytesRead)? 0 : errno; // No error if no bytes written
break;
}
@@ -443,8 +446,12 @@ int CRollingBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
BufLen = BufSize;
BufStart = BufEnd;
}
if (DataRemain) {
usleep( 500 );
}
}
return TotalRead;
return (Error)? -TotalRead : TotalRead; // Report negative total on error
}
//---------------------------------------------------------------------------
@@ -454,8 +461,9 @@ int CRollingBuffer::WriteToFD( int Handle, int MaxLen )
int BytesWritten = 0;
int TotalWritten = 0;
int BufRemain = 0;
int DataRemain = 0;
int ReadPos = 0;
int DataRemain = (MaxLen == -1)? BufLen : MaxLen;;
int ReadPos = BufStart;
bool Error = false;
// Check if buffer created
if (!BufSize) {
@@ -463,14 +471,14 @@ int CRollingBuffer::WriteToFD( int Handle, int MaxLen )
}
// Read Data into buffer
ReadPos = BufStart;
DataRemain = (MaxLen == -1)? BufLen : MaxLen;
while (DataRemain)
{
// Read from file descriptor
BufRemain = BufSize - ReadPos;
BytesWritten = write( Handle, &Buffer[ReadPos], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
if (BytesWritten <= 0) {
Error = true;
errno = (!BytesWritten)? 0 : errno; // No error if no bytes written
break;
}
@@ -483,9 +491,13 @@ int CRollingBuffer::WriteToFD( int Handle, int MaxLen )
if (ReadPos >= BufSize) {
ReadPos = 0; // Rolling over end of buffer, start at beginning
}
if (DataRemain) {
usleep( 500 );
}
}
return TotalWritten;
return (Error)? -TotalWritten : TotalWritten; // Report negative total on error
}
//---------------------------------------------------------------------------
@@ -534,7 +546,7 @@ int CShiftBuffer::Peek( char ** Data, int PeekPos, int MaxLen )
// Validate
if (!BufSize || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) {
*Data = NULL;
if (Data) *Data = NULL;
return 0;
}
@@ -563,7 +575,7 @@ int CShiftBuffer::PeekCopy( char ** Data, int PeekPos, int MaxLen )
// Check if any data
if (!BufSize || !Data || !MaxLen || (PeekPos < 0) || (PeekPos > BufLen)) {
if (*Data) (*Data)[0] = 0;
if (Data && *Data) (*Data)[0] = 0;
return 0;
}
@@ -727,7 +739,8 @@ int CShiftBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
{
int BytesRead = 0;
int TotalRead = 0;
int DataRemain = 0;
int DataRemain = MaxRead;
bool Error = false;
// Check if buffer created
if (!BufSize) {
@@ -743,6 +756,8 @@ int CShiftBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
// Read from file descriptor
BytesRead = read( Handle, &Buffer[BufLen], DataRemain );
if (BytesRead <= 0) {
Error = true;
errno = (!BytesRead)? 0 : errno; // No error if no bytes written
break;
}
@@ -753,8 +768,12 @@ int CShiftBuffer::ReadFromFD( int Handle, int MaxRead, bool Overwrite )
// Zero terminate
Buffer[BufLen] = 0;
if (DataRemain) {
usleep( 500 );
}
}
return TotalRead;
return (Error)? -TotalRead : TotalRead; // Report negative total on error
}
//---------------------------------------------------------------------------
@@ -764,8 +783,9 @@ int CShiftBuffer::WriteToFD( int Handle, int MaxLen )
int BytesWritten = 0;
int TotalWritten = 0;
int BufRemain = 0;
int DataRemain = 0;
int DataRemain = ((MaxLen == -1) || (MaxLen > BufLen))? BufLen : MaxLen;
int ReadPos = 0;
bool Error = false;
// Check if buffer created
if (!BufSize) {
@@ -773,14 +793,14 @@ int CShiftBuffer::WriteToFD( int Handle, int MaxLen )
}
// Read Data into buffer
ReadPos = 0;
DataRemain = ((MaxLen == -1) || (MaxLen > BufLen))? BufLen : MaxLen;
while (DataRemain)
{
// Read from file descriptor
BufRemain = BufSize - ReadPos;
BytesWritten = write( Handle, &Buffer[ReadPos], ((BufRemain > DataRemain)? DataRemain : BufRemain) );
if (BytesWritten <= 0) {
Error = true;
errno = (!BytesWritten)? 0 : errno; // No error if no bytes written
break;
}
@@ -793,9 +813,13 @@ int CShiftBuffer::WriteToFD( int Handle, int MaxLen )
if (ReadPos >= BufSize) {
ReadPos = 0; // Rolling over end of buffer, start at beginning
}
if (DataRemain) {
usleep( 500 );
}
}
return TotalWritten;
return (Error)? -TotalWritten : TotalWritten; // Report negative total on error
}
//---------------------------------------------------------------------------