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:
@@ -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
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user