#include #include #include #include #include Pl_Buffer::Members::Members() : ready(true), total_size(0) { } Pl_Buffer::Pl_Buffer(char const* identifier, Pipeline* next) : Pipeline(identifier, next), m(new Members()) { } Pl_Buffer::~Pl_Buffer() { // Must be explicit and not inline -- see QPDF_DLL_CLASS in // README-maintainer } void Pl_Buffer::write(unsigned char* buf, size_t len) { if (this->m->data.get() == 0) { this->m->data = std::make_shared(len); } size_t cur_size = this->m->data->getSize(); size_t left = cur_size - this->m->total_size; if (left < len) { size_t new_size = std::max(this->m->total_size + len, 2 * cur_size); auto b = std::make_shared(new_size); memcpy(b->getBuffer(), this->m->data->getBuffer(), this->m->total_size); this->m->data = b; } if (len) { memcpy(this->m->data->getBuffer() + this->m->total_size, buf, len); this->m->total_size += len; } this->m->ready = false; if (getNext(true)) { getNext()->write(buf, len); } } void Pl_Buffer::finish() { this->m->ready = true; if (getNext(true)) { getNext()->finish(); } } Buffer* Pl_Buffer::getBuffer() { if (!this->m->ready) { throw std::logic_error("Pl_Buffer::getBuffer() called when not ready"); } Buffer* b = new Buffer(this->m->total_size); if (this->m->total_size > 0) { unsigned char* p = b->getBuffer(); memcpy(p, this->m->data->getBuffer(), this->m->total_size); } this->m = std::shared_ptr(new Members()); return b; } std::shared_ptr Pl_Buffer::getBufferSharedPointer() { return std::shared_ptr(getBuffer()); } void Pl_Buffer::getMallocBuffer(unsigned char** buf, size_t* len) { if (!this->m->ready) { throw std::logic_error( "Pl_Buffer::getMallocBuffer() called when not ready"); } *len = this->m->total_size; if (this->m->total_size > 0) { *buf = reinterpret_cast(malloc(this->m->total_size)); memcpy(*buf, this->m->data->getBuffer(), this->m->total_size); } else { *buf = nullptr; } this->m = std::shared_ptr(new Members()); }