summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2013-03-18 13:17:58 +0100
committerTim Jenssen <tim.jenssen@digia.com>2013-03-21 16:30:49 +0100
commit4cde7b2ed657e5cc2f5f7c071f4ff0a7dd20d56b (patch)
tree7e90e8778a3e318fa8ef204a9dfd568cc9424910
parentc064509db928d6538ebb7d53a1ad03fcc7025b4d (diff)
Fix missing wizard icon on a windows static build.
Q_IMPORT_PLUGIN() macros are needed in application code only for Qt4, in Qt5 those are automatically generated by qmake. Change-Id: Ic75795be402592a0595bb3aa084d0b7ee9a9f8c5 Reviewed-by: Niels Weber <niels.weber@digia.com> Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com> Reviewed-by: Tim Jenssen <tim.jenssen@digia.com>
-rw-r--r--installerfw.pri2
-rw-r--r--src/libs/installer/fileutils.cpp31
-rw-r--r--src/libs/installer/init.cpp15
3 files changed, 31 insertions, 17 deletions
diff --git a/installerfw.pri b/installerfw.pri
index 0dcc1b5e4..ec7b88fb4 100644
--- a/installerfw.pri
+++ b/installerfw.pri
@@ -82,12 +82,14 @@ macx:LIBS += -framework Carbon -framework Security
isEqual(QT_MAJOR_VERSION, 4) {
CONFIG += uitools
CONFIG(static, static|shared) {
+ QTPLUGIN += qico
DEFINES += QT_STATIC
QT += script network xml
}
} else {
QT += uitools core-private
CONFIG(static, static|shared) {
+ QTPLUGIN += qico
QT += concurrent network script xml
}
}
diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp
index e2a995dba..315a34f5d 100644
--- a/src/libs/installer/fileutils.cpp
+++ b/src/libs/installer/fileutils.cpp
@@ -49,6 +49,7 @@
#include <QtCore/QTemporaryFile>
#include <QtCore/QThread>
#include <QtCore/QUrl>
+#include <QImageReader>
#include <errno.h>
@@ -557,20 +558,21 @@ typedef struct {
void QInstaller::setApplicationIcon(const QString &application, const QString &icon)
{
- wchar_t* const path = new wchar_t[application.length() + 1];
- QDir::toNativeSeparators(application).toWCharArray(path);
- path[application.length()] = 0;
-
- HANDLE updateRes = BeginUpdateResource(path, false);
- delete[] path;
-
QFile iconFile(icon);
- if (!iconFile.open(QIODevice::ReadOnly))
+ if (!iconFile.open(QIODevice::ReadOnly)) {
+ qWarning() << QString::fromLatin1("Could not use '%1' as application icon: %2.")
+ .arg(icon, iconFile.errorString());
return;
+ }
- QByteArray temp = iconFile.readAll();
+ if (QImageReader::imageFormat(icon) != "ico") {
+ qWarning() << QString::fromLatin1("Could not use '%1' as application icon, unsupported format %2.")
+ .arg(icon, QLatin1String(QImageReader::imageFormat(icon)));
+ return;
+ }
- ICONDIR* ig = reinterpret_cast< ICONDIR* >(temp.data());
+ QByteArray temp = iconFile.readAll();
+ ICONDIR* ig = reinterpret_cast<ICONDIR*> (temp.data());
DWORD newSize = sizeof(GRPICONDIR) + sizeof(GRPICONDIRENTRY) * (ig->idCount - 1);
GRPICONDIR* newDir = reinterpret_cast< GRPICONDIR* >(new char[newSize]);
@@ -578,6 +580,7 @@ void QInstaller::setApplicationIcon(const QString &application, const QString &i
newDir->idType = ig->idType;
newDir->idCount = ig->idCount;
+ HANDLE updateRes = BeginUpdateResourceW((wchar_t*)QDir::toNativeSeparators(application).utf16(), false);
for (int i = 0; i < ig->idCount; ++i) {
char* temp1 = temp.data() + ig->idEntries[i].dwImageOffset;
DWORD size1 = ig->idEntries[i].dwBytesInRes;
@@ -591,16 +594,16 @@ void QInstaller::setApplicationIcon(const QString &application, const QString &i
newDir->idEntries[i].dwBytesInRes = ig->idEntries[i].dwBytesInRes;
newDir->idEntries[i].nID = i + 1;
- UpdateResource(updateRes, RT_ICON, MAKEINTRESOURCE(i + 1),
+ UpdateResourceW(updateRes, RT_ICON, MAKEINTRESOURCE(i + 1),
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), temp1, size1);
}
- UpdateResource(updateRes, RT_GROUP_ICON, L"IDI_ICON1", MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), newDir
- , newSize);
+ UpdateResourceW(updateRes, RT_GROUP_ICON, L"IDI_ICON1", MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
+ newDir, newSize);
delete [] newDir;
- EndUpdateResource(updateRes, false);
+ EndUpdateResourceW(updateRes, false);
}
#endif
diff --git a/src/libs/installer/init.cpp b/src/libs/installer/init.cpp
index e0c51a2f3..40c396ab4 100644
--- a/src/libs/installer/init.cpp
+++ b/src/libs/installer/init.cpp
@@ -85,6 +85,8 @@
#include <unix/C/7zCrc.h>
+#include <QtPlugin>
+
#include <iostream>
namespace NArchive {
@@ -151,10 +153,17 @@ static void initArchives()
CrcGenerateTable();
}
+#if defined(QT_STATIC)
static void initResources()
{
Q_INIT_RESOURCE(patch_file_lists);
+ Q_INIT_RESOURCE(installer);
+# if QT_VERSION < 0x050000
+ Q_IMPORT_PLUGIN(qico)
+ Q_UNUSED(qt_plugin_instance_qico());
+# endif
}
+#endif
static QByteArray trimAndPrepend(QtMsgType type, const QByteArray &msg)
{
@@ -220,7 +229,10 @@ void messageHandler(QtMsgType type, const QMessageLogContext &context, const QSt
void QInstaller::init()
{
+#if defined(QT_STATIC)
+ ::initArchives();
::initResources();
+#endif
UpdateOperationFactory &factory = UpdateOperationFactory::instance();
factory.registerUpdateOperation<CreateShortcutOperation>(QLatin1String("CreateShortcut"));
@@ -262,9 +274,6 @@ void QInstaller::init()
factory.registerUpdateOperation<MacReplaceInstallNamesOperation>(QLatin1String("ReplaceInstallNames"));
#endif // Q_OS_MAC
- // load 7z stuff, if we're a static lib
- ::initArchives();
-
// qDebug -> verbose()
#if QT_VERSION < 0x050000
qInstallMsgHandler(messageHandler);