From d1097fab599c15d4d3293e88f651f6bfaecd3ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20D=C3=ADaz=20M=C3=A1s?= Date: Thu, 24 Jan 2019 21:21:47 +0100 Subject: [PATCH] Factor our function to read PNG Chunk info --- src/pngimage.cpp | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/src/pngimage.cpp b/src/pngimage.cpp index 557cc551..58a93b1c 100644 --- a/src/pngimage.cpp +++ b/src/pngimage.cpp @@ -389,6 +389,17 @@ namespace Exiv2 { } } + void readChunk(DataBuf& buffer, BasicIo& io) + { + long bufRead = io.read(buffer.pData_, buffer.size_); + if (io.error()) { + throw Error(kerFailedToReadImageData); + } + if (bufRead != buffer.size_) { + throw Error(kerInputDataReadFailed); + } + } + void PngImage::readMetadata() { #ifdef DEBUG @@ -405,23 +416,15 @@ namespace Exiv2 { clearMetadata(); const long imgSize = (long) io_->size(); - DataBuf cheaderBuf(8); // Chunk header size : 4 bytes (data size) + 4 bytes (chunk type). + DataBuf cheaderBuf(8); // Chunk header: 4 bytes (data size) + 4 bytes (chunk type). while(!io_->eof()) { - // Read chunk header. - #ifdef DEBUG std::cout << "Exiv2::PngImage::readMetadata: Position: " << io_->tell() << std::endl; #endif std::memset(cheaderBuf.pData_, 0x0, cheaderBuf.size_); - long bufRead = io_->read(cheaderBuf.pData_, cheaderBuf.size_); - if (io_->error()) { - throw Error(kerFailedToReadImageData); - } - if (bufRead != cheaderBuf.size_) { - throw Error(kerInputDataReadFailed); - } + readChunk(cheaderBuf, *io_); // Read chunk header. // Decode chunk data length. uint32_t dataOffset = Exiv2::getULong(cheaderBuf.pData_, Exiv2::bigEndian); @@ -445,16 +448,8 @@ namespace Exiv2 { !memcmp(cheaderBuf.pData_ + 4, "iTXt", 4) || !memcmp(cheaderBuf.pData_ + 4, "iCCP", 4)) { - // Extract chunk data. - DataBuf cdataBuf(dataOffset); - bufRead = io_->read(cdataBuf.pData_, dataOffset); - if (io_->error()) { - throw Error(kerFailedToReadImageData); - } - if (bufRead != (long)dataOffset) { - throw Error(kerInputDataReadFailed); - } + readChunk(cdataBuf, *io_); // Extract chunk data. if (!memcmp(cheaderBuf.pData_ + 4, "IEND", 4)) {