IO: fixes in ZipWriteStream

master
Martin Gerhardy 2022-01-27 23:29:35 +01:00
parent 6f39da1343
commit d3bc3aede8
2 changed files with 23 additions and 4 deletions

View File

@ -27,6 +27,7 @@ int ZipWriteStream::write(const void *buf, size_t size) {
_stream->next_in = (unsigned char *)buf;
_stream->avail_in = static_cast<unsigned int>(size);
uint32_t writtenBytes = 0;
while (_stream->avail_in > 0) {
_stream->avail_out = sizeof(_out);
_stream->next_out = _out;
@ -38,13 +39,14 @@ int ZipWriteStream::write(const void *buf, size_t size) {
const uint32_t written = sizeof(_out) - _stream->avail_out;
if (written != 0u) {
if (_outStream.write(_out, written) == -1) {
if (_outStream.write(_out, written) != (int)written) {
return -1;
}
writtenBytes += written;
_pos += written;
}
}
_pos += (int64_t)size;
return (int)size;
return (int)writtenBytes;
}
bool ZipWriteStream::flush() {
@ -58,7 +60,9 @@ bool ZipWriteStream::flush() {
}
size_t remaining = sizeof(_out) - _stream->avail_out;
return _outStream.write(_out, remaining) != -1;
const int written = _outStream.write(_out, remaining);
_pos += written;
return written == (int)remaining;
}
} // namespace io

View File

@ -22,7 +22,18 @@ public:
virtual ~ZipWriteStream();
int write(const void *buf, size_t size) override;
/**
* @brief Returns the compressed written bytes that went into the given output stream
*/
int64_t pos() const;
/**
* @brief Returns the compressed written bytes that went into the given output stream
*/
int64_t size() const;
/**
* @note This method is automatically called in the destructor
*/
bool flush();
};
@ -30,4 +41,8 @@ inline int64_t ZipWriteStream::pos() const {
return _pos;
}
inline int64_t ZipWriteStream::size() const {
return _pos;
}
} // namespace io