9#include <aws/core/Core_EXPORTS.h>
10#include <aws/core/utils/Array.h>
28 using WriterFunc = std::function<bool(
char* dst, uint64_t dstSz, uint64_t& read)>;
32 uint64_t totalRead = 0;
37 bool bufferPresent = pBufferCasted && pBufferCasted->pptr() && (pBufferCasted->pptr() < pBufferCasted->epptr());
43 success = WriteDirectlyToPtr(pBufferCasted, writerFunc, read);
49 success = WriteWithHelperBuffer(ioStream, writerFunc, read);
57 if (pBufferCasted && pBufferCasted->pptr() && (pBufferCasted->pptr() >= pBufferCasted->epptr()))
59 if(!ForceOverflow(ioStream, writerFunc))
74 if (writerFunc(&dstChar, 1, read) && read > 0)
76 ioStream.write(&dstChar, 1);
77 if (ioStream.fail()) {
78 AWS_LOGSTREAM_ERROR(
"StreamBufProtectedWriter",
"Failed to write 1 byte (eof: "
79 << ioStream.eof() <<
", bad: " << ioStream.bad() <<
")");
90 uint64_t tmpBufSz =
sizeof(tmpBuf);
92 if(writerFunc(tmpBuf, tmpBufSz, read) && read > 0)
94 ioStream.write(tmpBuf, read);
95 if (ioStream.fail()) {
96 AWS_LOGSTREAM_ERROR(
"StreamBufProtectedWriter",
"Failed to write " << tmpBufSz
97 <<
" (eof: " << ioStream.eof() <<
", bad: " << ioStream.bad() <<
")");
107 auto dstBegin = pBuffer->pptr();
108 uint64_t dstSz = pBuffer->epptr() - dstBegin;
109 if(writerFunc(dstBegin, dstSz, read) && read > 0)
111 assert(read <= dstSz);
112 pBuffer->pbump((
int) read);
static uint64_t WriteWithHelperBuffer(Aws::IOStream &ioStream, const WriterFunc &writerFunc, uint64_t &read)
StreamBufProtectedWriter()=delete
static uint64_t WriteDirectlyToPtr(StreamBufProtectedWriter *pBuffer, const WriterFunc &writerFunc, uint64_t &read)
std::function< bool(char *dst, uint64_t dstSz, uint64_t &read)> WriterFunc
static bool ForceOverflow(Aws::IOStream &ioStream, const WriterFunc &writerFunc)
static uint64_t WriteToBuffer(Aws::IOStream &ioStream, const WriterFunc &writerFunc)
std::basic_iostream< char, std::char_traits< char > > IOStream