- zero complete buffer

- increase buffer when reading more data than current capacity

svn path=/trunk/; revision=24663
This commit is contained in:
Johannes Anderwald 2006-10-30 12:58:35 +00:00
parent a1de6893f7
commit 48ffe89726

View file

@ -15,6 +15,8 @@
namespace System_ namespace System_
{ {
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
//--------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------
NamedPipeReader::NamedPipeReader() : h_Pipe(NULL) NamedPipeReader::NamedPipeReader() : h_Pipe(NULL)
{ {
@ -94,14 +96,15 @@ namespace System_
string::size_type NamedPipeReader::readPipe(string &Buffer) string::size_type NamedPipeReader::readPipe(string &Buffer)
{ {
TCHAR * buf = (TCHAR *)Buffer.c_str(); TCHAR * buf = (TCHAR *)Buffer.c_str();
string::size_type size = Buffer.capacity(); string::size_type buffer_size = Buffer.capacity();
string::size_type bytes_read = 0;
DWORD cbRead; DWORD cbRead;
BOOL fSuccess; BOOL fSuccess;
TCHAR * localbuf; TCHAR * localbuf;
DWORD localsize = 100; DWORD localsize = MIN(100, buffer_size);
//#ifdef NDEBUG //#ifdef NDEBUG
memset(buf, 0x0, sizeof(TCHAR) * size); memset(buf, 0x0, sizeof(TCHAR) * buffer_size);
//#endif //#endif
#ifdef __LINUX__ #ifdef __LINUX__
@ -115,7 +118,7 @@ namespace System_
{ {
do do
{ {
ZeroMemory(localbuf, sizeof(localsize) * sizeof(TCHAR)); ZeroMemory(localbuf, localsize * sizeof(TCHAR));
fSuccess = ReadFile( fSuccess = ReadFile(
h_Pipe, h_Pipe,
@ -127,7 +130,15 @@ namespace System_
if (! fSuccess && GetLastError() != ERROR_MORE_DATA) if (! fSuccess && GetLastError() != ERROR_MORE_DATA)
break; break;
_tcscat(buf, localbuf); if(bytes_read + cbRead > buffer_size)
{
Buffer.reserve(bytes_read + localsize * 3);
buf = (TCHAR *)Buffer.c_str();
buffer_size = Buffer.capacity();
}
memcpy(&buf[bytes_read], localbuf, cbRead);
bytes_read += cbRead;
} while (!fSuccess); // repeat loop if ERROR_MORE_DATA } while (!fSuccess); // repeat loop if ERROR_MORE_DATA
} while (localbuf[_tcslen(localbuf)-1] != '\n'); } while (localbuf[_tcslen(localbuf)-1] != '\n');