85 lines
1.4 KiB
C++
85 lines
1.4 KiB
C++
|
|
#include "ChunkPrinter.h"
|
|
|
|
ChunkPrinter::ChunkPrinter(PsychicResponse *response, uint8_t *buffer, size_t len) :
|
|
_response(response),
|
|
_buffer(buffer),
|
|
_length(len),
|
|
_pos(0)
|
|
{}
|
|
|
|
ChunkPrinter::~ChunkPrinter()
|
|
{
|
|
flush();
|
|
}
|
|
|
|
size_t ChunkPrinter::write(uint8_t c)
|
|
{
|
|
esp_err_t err;
|
|
|
|
//if we're full, send a chunk
|
|
if (_pos == _length)
|
|
{
|
|
_pos = 0;
|
|
err = _response->sendChunk(_buffer, _length);
|
|
|
|
if (err != ESP_OK)
|
|
return 0;
|
|
}
|
|
|
|
_buffer[_pos] = c;
|
|
_pos++;
|
|
return 1;
|
|
}
|
|
|
|
size_t ChunkPrinter::write(const uint8_t *buffer, size_t size)
|
|
{
|
|
size_t written = 0;
|
|
|
|
while (written < size)
|
|
{
|
|
size_t space = _length - _pos;
|
|
size_t blockSize = std::min(space, size - written);
|
|
|
|
memcpy(_buffer + _pos, buffer + written, blockSize);
|
|
_pos += blockSize;
|
|
|
|
if (_pos == _length)
|
|
{
|
|
_pos = 0;
|
|
|
|
if (_response->sendChunk(_buffer, _length) != ESP_OK)
|
|
return written;
|
|
}
|
|
written += blockSize; //Update if sent correctly.
|
|
}
|
|
return written;
|
|
}
|
|
|
|
void ChunkPrinter::flush()
|
|
{
|
|
if (_pos)
|
|
{
|
|
_response->sendChunk(_buffer, _pos);
|
|
_pos = 0;
|
|
}
|
|
}
|
|
|
|
size_t ChunkPrinter::copyFrom(Stream &stream)
|
|
{
|
|
size_t count = 0;
|
|
|
|
while (stream.available()){
|
|
|
|
if (_pos == _length)
|
|
{
|
|
_response->sendChunk(_buffer, _length);
|
|
_pos = 0;
|
|
}
|
|
|
|
size_t readBytes = stream.readBytes(_buffer + _pos, _length - _pos);
|
|
_pos += readBytes;
|
|
count += readBytes;
|
|
}
|
|
return count;
|
|
} |