diff --git a/thumbnail/icoutils.h b/thumbnail/icoutils.h --- a/thumbnail/icoutils.h +++ b/thumbnail/icoutils.h @@ -29,7 +29,7 @@ bool loadIcoImageFromExe(QIODevice * inputDevice, QImage &image, int needWidth=512, int needHeight=512, const qint32 iconNumber=0); bool loadIcoImageFromExe(const QString &inputPath, QImage &image, int needWidth=512, int needHeight=512, const qint32 iconNumber=0); - bool loadIcoImageFromExe(const QString &inputFileName, const QString &outputFileName, const qint32 iconNumber); + bool loadIcoImageFromExe(const QString &inputFileName, QIODevice *outputDevice, const qint32 iconNumber); bool loadIcoImage(QIODevice * inputDevice, QImage &image, int needWidth=512, int needHeight=512); bool loadIcoImage(const QString &inputFileName, QImage &image, int needWidth=512, int needHeight=512); diff --git a/thumbnail/icoutils_common.cpp b/thumbnail/icoutils_common.cpp --- a/thumbnail/icoutils_common.cpp +++ b/thumbnail/icoutils_common.cpp @@ -15,6 +15,7 @@ #include "icoutils.h" +#include #include #include #include @@ -63,17 +64,19 @@ bool IcoUtils::loadIcoImageFromExe(const QString &inputFileName, QImage &image, int needWidth, int needHeight, const qint32 iconNumber) { - - QTemporaryFile outputFile; - - if ( ! outputFile.open() ) + QBuffer iconData; + if (!iconData.open(QIODevice::ReadWrite)) { return false; + } - if ( ! IcoUtils::loadIcoImageFromExe(inputFileName, outputFile.fileName(), iconNumber) ) + if ( ! IcoUtils::loadIcoImageFromExe(inputFileName, &iconData, iconNumber) ) return false; - return IcoUtils::loadIcoImage(outputFile.fileName(), image, needWidth, needHeight); + if (!iconData.seek(0)) { + return false; + } + return IcoUtils::loadIcoImage(&iconData, image, needWidth, needHeight); } bool IcoUtils::loadIcoImage(QImageReader &reader, QImage &image, int needWidth, int needHeight) diff --git a/thumbnail/icoutils_win.cpp b/thumbnail/icoutils_win.cpp --- a/thumbnail/icoutils_win.cpp +++ b/thumbnail/icoutils_win.cpp @@ -91,7 +91,7 @@ return TRUE; } -bool IcoUtils::loadIcoImageFromExe(const QString &inputFileName, const QString &outputFileName, const qint32 iconNumber) +bool IcoUtils::loadIcoImageFromExe(const QString &inputFileName, QIODevice *outputDevice, const qint32 iconNumber) { HMODULE hModule; @@ -183,12 +183,10 @@ imageOffset += resourceSize; } - QFile outFile(outputFileName); - outFile.open(QIODevice::WriteOnly); - outFile.write(outBuffer.data()); + const bool ok = (outputDevice->write(outBuffer.data()) == outBuffer.size()); FreeLibrary( hModule ); - return true; + return ok; } FreeLibrary( hModule ); diff --git a/thumbnail/icoutils_wrestool.cpp b/thumbnail/icoutils_wrestool.cpp --- a/thumbnail/icoutils_wrestool.cpp +++ b/thumbnail/icoutils_wrestool.cpp @@ -27,7 +27,7 @@ #define abs(n) ( ( n < 0 ) ? -n : n ) typedef QPair < QString, int > IconInExe; -bool IcoUtils::loadIcoImageFromExe(const QString &inputFileName, const QString &outputFileName, const qint32 iconNumber) +bool IcoUtils::loadIcoImageFromExe(const QString &inputFileName, QIODevice *outputDevice, const qint32 iconNumber) { QProcess wrestool; @@ -76,14 +76,20 @@ if ( name.at(0) == '\'' ) name = name.mid(1, name.size()-2); - QFile(outputFileName).resize(0); - - wrestool.start("wrestool", QStringList() << "-x" << "-t" << QString::number(type) << "-n" << name << inputFileName << "-o" << outputFileName); + wrestool.start("wrestool", QStringList() << "-x" << "-t" << QString::number(type) << "-n" << name << inputFileName); wrestool.waitForFinished(); - if ( wrestool.exitCode() == 0 && QFile(outputFileName).size() != 0 ) - return true; + if (wrestool.exitCode() != 0) { + return false; + } + + const QByteArray iconData = wrestool.readAllStandardOutput(); + + if (outputDevice->write(iconData) != iconData.size()) { + return false; + } + return true; } return false;