From 01a4d09ef6e1fae0d9b9ab924e7f3fed001ad8c8 Mon Sep 17 00:00:00 2001 From: Robin Burchell Date: Wed, 15 Mar 2017 17:51:03 +0100 Subject: QMovie: Make sure to pass on QImageReader errors when they occur If a file cannot be opened for some reason (like running out of FDs), emit the error signal. Change-Id: I9586dda34b2f2cef73593c6dcb855b29d63c2dbc Reviewed-by: Gunnar Sletta --- src/gui/image/qmovie.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'src/gui') diff --git a/src/gui/image/qmovie.cpp b/src/gui/image/qmovie.cpp index 55ddd839b7..2f02a33b09 100644 --- a/src/gui/image/qmovie.cpp +++ b/src/gui/image/qmovie.cpp @@ -330,6 +330,8 @@ int QMoviePrivate::speedAdjustedDelay(int delay) const */ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber) { + Q_Q(QMovie); + if (frameNumber < 0) return QFrameInfo(); // Invalid @@ -358,7 +360,8 @@ QFrameInfo QMoviePrivate::infoForFrame(int frameNumber) reader = new QImageReader(device, format); else reader = new QImageReader(absoluteFilePath, format); - (void)reader->canRead(); // Provoke a device->open() call + if (!reader->canRead()) // Provoke a device->open() call + emit q->error(reader->error()); reader->device()->seek(initialDevicePos); reader->setBackgroundColor(bgColor); reader->setScaledSize(scaledSize); @@ -525,8 +528,20 @@ void QMoviePrivate::_q_loadNextFrame(bool starting) */ bool QMoviePrivate::isValid() const { - return (greatestFrameNumber >= 0) // have we seen valid data - || reader->canRead(); // or does the reader see valid data + Q_Q(const QMovie); + + if (greatestFrameNumber >= 0) + return true; // have we seen valid data + bool canRead = reader->canRead(); + if (!canRead) { + // let the consumer know it's broken + // + // ### the const_cast here is ugly, but 'const' of this method is + // technically wrong right now, since it may cause the underlying device + // to open. + emit const_cast(q)->error(reader->error()); + } + return canRead; } /*! -- cgit v1.2.3