summaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2013-01-23 14:29:03 +0100
committerKarsten Heimrich <karsten.heimrich@digia.com>2013-01-29 11:12:24 +0100
commit8633d999d691f7072a6a40679398750e1af5f850 (patch)
tree67eb0742981ede47c1612c44d0a7b7aaac9d713c /src/libs
parent80ceccff00a46ecd37ed2c65784cb5905d067526 (diff)
Make IFW compile with mingw.
Change-Id: I0336e02ef701a2bc392bd385d1822bc51cee0c5c Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/7zip/7zip.pro1
-rw-r--r--src/libs/7zip/win/CPP/Common/DynamicBuffer.h4
-rw-r--r--src/libs/installer/adminauthorization_win.cpp8
-rw-r--r--src/libs/installer/binaryformat.cpp2
-rw-r--r--src/libs/installer/createlocalrepositoryoperation.cpp2
-rw-r--r--src/libs/installer/createshortcutoperation.cpp7
-rw-r--r--src/libs/installer/fileutils.cpp2
-rw-r--r--src/libs/installer/installer.pro4
-rw-r--r--src/libs/installer/lib7z_facade.cpp2
-rw-r--r--src/libs/installer/link.cpp52
-rw-r--r--src/libs/kdtools/kdsavefile.cpp10
-rw-r--r--src/libs/kdtools/kdsysinfo_win.cpp72
-rw-r--r--src/libs/kdtools/kdupdaterupdateoperations.cpp2
13 files changed, 105 insertions, 63 deletions
diff --git a/src/libs/7zip/7zip.pro b/src/libs/7zip/7zip.pro
index 9a10540e6..d09cbf9a5 100644
--- a/src/libs/7zip/7zip.pro
+++ b/src/libs/7zip/7zip.pro
@@ -10,6 +10,7 @@ DESTDIR = $$IFW_LIB_PATH
include(7zip.pri)
win32 {
DEFINES += _CRT_SECURE_NO_WARNINGS
+ win32-g++*:QMAKE_CXXFLAGS += -w -fvisibility=hidden
CONFIG += no_batch # this is needed because we have a same named *.c and *.cpp file -> 7in
include($$7ZIP_BASE/win.pri) #this is 7zip
}
diff --git a/src/libs/7zip/win/CPP/Common/DynamicBuffer.h b/src/libs/7zip/win/CPP/Common/DynamicBuffer.h
index bf52a7425..eaac123e1 100644
--- a/src/libs/7zip/win/CPP/Common/DynamicBuffer.h
+++ b/src/libs/7zip/win/CPP/Common/DynamicBuffer.h
@@ -20,7 +20,7 @@ template <class T> class CDynamicBuffer: public CBuffer<T>
size_t newCap = this->_capacity + delta;
if (newCap < delta)
newCap = this->_capacity + size;
- SetCapacity(newCap);
+ this->SetCapacity(newCap);
}
public:
CDynamicBuffer(): CBuffer<T>() {};
@@ -31,7 +31,7 @@ public:
this->Free();
if (buffer._capacity > 0)
{
- SetCapacity(buffer._capacity);
+ this->SetCapacity(buffer._capacity);
memmove(this->_items, buffer._items, buffer._capacity * sizeof(T));
}
return *this;
diff --git a/src/libs/installer/adminauthorization_win.cpp b/src/libs/installer/adminauthorization_win.cpp
index 731fe044f..8d1f8352e 100644
--- a/src/libs/installer/adminauthorization_win.cpp
+++ b/src/libs/installer/adminauthorization_win.cpp
@@ -45,6 +45,12 @@
#include <QDebug>
#include <QDir>
+#ifdef Q_CC_MINGW
+# ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0501
+# endif
+#endif
+
#include <windows.h>
struct DeCoInitializer
@@ -74,7 +80,7 @@ bool AdminAuthorization::authorize()
bool AdminAuthorization::hasAdminRights()
{
- SID_IDENTIFIER_AUTHORITY authority = SECURITY_NT_AUTHORITY;
+ SID_IDENTIFIER_AUTHORITY authority = { SECURITY_NT_AUTHORITY };
PSID adminGroup;
// Initialize SID.
if (!AllocateAndInitializeSid(&authority,
diff --git a/src/libs/installer/binaryformat.cpp b/src/libs/installer/binaryformat.cpp
index 102a7bd87..50e4e24f3 100644
--- a/src/libs/installer/binaryformat.cpp
+++ b/src/libs/installer/binaryformat.cpp
@@ -311,7 +311,7 @@ bool Archive::copy(const QString &name)
errno = 0;
const QString absoluteFilePath = fileInfo.absoluteFilePath();
if (!fileInfo.exists() && !QDir().mkpath(absoluteFilePath)) {
-#ifdef Q_OS_WIN
+#if defined(Q_OS_WIN) && !defined(Q_CC_MINGW)
char msg[128];
if (strerror_s(msg, sizeof msg, errno) != 0)
setErrorString(tr("Could not create %1: %2").arg(name, QString::fromLocal8Bit(msg)));
diff --git a/src/libs/installer/createlocalrepositoryoperation.cpp b/src/libs/installer/createlocalrepositoryoperation.cpp
index b401efb5d..758064488 100644
--- a/src/libs/installer/createlocalrepositoryoperation.cpp
+++ b/src/libs/installer/createlocalrepositoryoperation.cpp
@@ -371,7 +371,7 @@ bool CreateLocalRepositoryOperation::undoOperation()
errno = 0;
const bool result = QDir::root().rmdir(createdDir.path());
if (!result) {
-#ifdef Q_OS_WIN
+#if defined(Q_OS_WIN) && !defined(Q_CC_MINGW)
char msg[128];
if (strerror_s(msg, sizeof msg, errno) != 0) {
setError(UserDefinedError, tr("Cannot remove directory %1: %2").arg(createdDir.path(),
diff --git a/src/libs/installer/createshortcutoperation.cpp b/src/libs/installer/createshortcutoperation.cpp
index 5142e65de..20be6bfa9 100644
--- a/src/libs/installer/createshortcutoperation.cpp
+++ b/src/libs/installer/createshortcutoperation.cpp
@@ -52,6 +52,11 @@
using namespace QInstaller;
#ifdef Q_OS_WIN
+#ifdef Q_CC_MINGW
+# ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0501
+# endif
+#endif
#include <windows.h>
#include <shlobj.h>
@@ -192,7 +197,7 @@ bool CreateShortcutOperation::performOperation()
if (!created) {
setError(UserDefinedError);
-#ifdef Q_OS_WIN
+#if defined(Q_OS_WIN) && !defined(Q_CC_MINGW)
char msg[128];
if (strerror_s(msg, sizeof msg, errno) != 0) {
setErrorString(tr("Could not create folder %1: %2.").arg(QDir::toNativeSeparators(linkPath),
diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp
index b95ca4a1c..9c8e9e50b 100644
--- a/src/libs/installer/fileutils.cpp
+++ b/src/libs/installer/fileutils.cpp
@@ -256,7 +256,7 @@ void QInstaller::removeFiles(const QString &path, bool ignoreErrors)
static QString errnoToQString(int error)
{
-#ifdef Q_OS_WIN
+#if defined(Q_OS_WIN) && !defined(Q_CC_MINGW)
char msg[128];
if (strerror_s(msg, sizeof msg, error) != 0)
return QString::fromLocal8Bit(msg);
diff --git a/src/libs/installer/installer.pro b/src/libs/installer/installer.pro
index 1f19e3e0d..322c3551c 100644
--- a/src/libs/installer/installer.pro
+++ b/src/libs/installer/installer.pro
@@ -170,7 +170,11 @@ unix:!macx:SOURCES += adminauthorization_x11.cpp
LIBS += -l7z
win32 {
SOURCES += adminauthorization_win.cpp
+
LIBS += -loleaut32 -luser32 # 7zip
LIBS += -ladvapi32 -lpsapi # kdtools
LIBS += -lole32 -lshell32 # createshortcutoperation
+
+ win32-g++*:LIBS += -lmpr -luuid
+ win32-g++*:QMAKE_CXXFLAGS += -Wno-missing-field-initializers
}
diff --git a/src/libs/installer/lib7z_facade.cpp b/src/libs/installer/lib7z_facade.cpp
index e987c7571..0c02890e2 100644
--- a/src/libs/installer/lib7z_facade.cpp
+++ b/src/libs/installer/lib7z_facade.cpp
@@ -185,7 +185,7 @@ static bool IsDST(const QDateTime& datetime = QDateTime())
{
const time_t seconds = static_cast< time_t >(datetime.isValid() ? datetime.toTime_t()
: QDateTime::currentDateTime().toTime_t());
-#ifdef Q_OS_WIN
+#if defined(Q_OS_WIN) && !defined(Q_CC_MINGW)
struct tm t;
localtime_s(&t, &seconds);
#else
diff --git a/src/libs/installer/link.cpp b/src/libs/installer/link.cpp
index 19b50aa49..28f8190d5 100644
--- a/src/libs/installer/link.cpp
+++ b/src/libs/installer/link.cpp
@@ -50,10 +50,19 @@
#endif
#ifdef Q_OS_WIN
+#ifdef Q_CC_MINGW
+# ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0501
+# endif
+#else
+# include <strsafe.h>
+#endif
+
#include <windows.h>
-#include <strsafe.h>
+#include <winioctl.h>
+
+#if !defined(REPARSE_DATA_BUFFER_HEADER_SIZE)
-// REPARSE_DATA_BUFFER structure from msdn help: http://msdn.microsoft.com/en-us/library/ff552012.aspx
typedef struct _REPARSE_DATA_BUFFER {
ULONG ReparseTag;
USHORT ReparseDataLength;
@@ -79,8 +88,9 @@ typedef struct _REPARSE_DATA_BUFFER {
} GenericReparseBuffer;
};
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
-#define _REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(_REPARSE_DATA_BUFFER, GenericReparseBuffer)
+#endif
class FileHandleWrapper
@@ -154,35 +164,31 @@ Link createJunction(const QString &linkPath, const QString &targetPath)
return Link(linkPath);
}
- TCHAR szDestDir[1024] = L"\\??\\"; //you need this to create valid unicode junctions
-
- QString normalizedTargetPath = QString(targetPath).replace(QLatin1Char('/'), QLatin1Char('\\'));
- //now we add the real absolute path
- StringCchCat(szDestDir, 1024, (wchar_t*)normalizedTargetPath.utf16());
+ const QString szDestDir = QString::fromLatin1("\\??\\").arg(targetPath).replace(QLatin1Char('/'),
+ QLatin1Char('\\'));
// Allocates a block of memory for an array of num elements(1) and initializes all its bits to zero.
- _REPARSE_DATA_BUFFER* reparseStructData = (_REPARSE_DATA_BUFFER*)calloc(1,
+ REPARSE_DATA_BUFFER* reparseStructData = (REPARSE_DATA_BUFFER*)calloc(1,
MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
- const size_t destMountPointBytes = lstrlen(szDestDir) * sizeof(WCHAR);
-
+ reparseStructData->Reserved = 0;
reparseStructData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
+ reparseStructData->MountPointReparseBuffer.PrintNameLength = 0;
+ reparseStructData->MountPointReparseBuffer.SubstituteNameOffset = 0;
+ reparseStructData->MountPointReparseBuffer.SubstituteNameLength = szDestDir.length();
+ reparseStructData->MountPointReparseBuffer.PrintNameOffset = szDestDir.length() + sizeof(WCHAR);
- // Reserved(USHORT) + SubstituteNameOffset(USHORT) + SubstituteNameLength(USHORT)
- // + PrintNameOffset(USHORT) + PrintNameLength(USHORT) + PathBuffer[1](WCHAR)
uint spaceAfterGeneralData = sizeof(USHORT) * 5 + sizeof(WCHAR); //should be 12
- reparseStructData->ReparseDataLength = destMountPointBytes + spaceAfterGeneralData;
- reparseStructData->Reserved = 0;
- reparseStructData->MountPointReparseBuffer.SubstituteNameOffset = 0;
- reparseStructData->MountPointReparseBuffer.SubstituteNameLength = destMountPointBytes;
- // + sizeof(WCHAR) means \0 termination at the end of the string
- reparseStructData->MountPointReparseBuffer.PrintNameOffset = destMountPointBytes + sizeof(WCHAR);
- reparseStructData->MountPointReparseBuffer.PrintNameLength = 0;
- StringCchCopy(reparseStructData->MountPointReparseBuffer.PathBuffer, 1024, szDestDir);
+ reparseStructData->ReparseDataLength = szDestDir.length() + spaceAfterGeneralData;
+#ifndef Q_CC_MINGW
+ StringCchCopy(reparseStructData->MountPointReparseBuffer.PathBuffer, 1024, (wchar_t*)szDestDir.utf16());
+#else
+ wcsncpy(reparseStructData->MountPointReparseBuffer.PathBuffer, (wchar_t*)szDestDir.utf16(), 1024);
+#endif
DWORD bytesReturned;
if (!::DeviceIoControl(dirHandle.handle(), FSCTL_SET_REPARSE_POINT, reparseStructData,
- reparseStructData->ReparseDataLength + _REPARSE_DATA_BUFFER_HEADER_SIZE, 0, 0,
+ reparseStructData->ReparseDataLength + REPARSE_DATA_BUFFER_HEADER_SIZE, 0, 0,
&bytesReturned, 0)) {
qWarning() << QString::fromLatin1("Could not set the reparse point: for '%1' to %2; error: %3"
).arg(linkPath, targetPath).arg(GetLastError());
@@ -193,7 +199,7 @@ Link createJunction(const QString &linkPath, const QString &targetPath)
bool removeJunction(const QString &path)
{
// Allocates a block of memory for an array of num elements(1) and initializes all its bits to zero.
- _REPARSE_DATA_BUFFER* reparseStructData = (_REPARSE_DATA_BUFFER*)calloc(1,
+ REPARSE_DATA_BUFFER* reparseStructData = (REPARSE_DATA_BUFFER*)calloc(1,
MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
reparseStructData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
diff --git a/src/libs/kdtools/kdsavefile.cpp b/src/libs/kdtools/kdsavefile.cpp
index a0b3ed4e8..6af7427da 100644
--- a/src/libs/kdtools/kdsavefile.cpp
+++ b/src/libs/kdtools/kdsavefile.cpp
@@ -93,9 +93,13 @@ static QString makeAbsolute(const QString &path)
static int myOpen(const QString &path, int flags, int mode)
{
#ifdef Q_OS_WIN
- int fd;
- _wsopen_s(&fd, reinterpret_cast<const wchar_t *>(path.utf16()), flags, _SH_DENYRW, mode);
- return fd;
+ int fd;
+#ifdef Q_CC_MINGW
+ fd = _wsopen(reinterpret_cast<const wchar_t *>(path.utf16()), flags, _SH_DENYRW, mode);
+#else
+ _wsopen_s(&fd, reinterpret_cast<const wchar_t *>(path.utf16()), flags, _SH_DENYRW, mode);
+#endif
+ return fd;
#else
return open(QFile::encodeName(path).constData(), flags, mode);
#endif
diff --git a/src/libs/kdtools/kdsysinfo_win.cpp b/src/libs/kdtools/kdsysinfo_win.cpp
index 383f6dd8c..10666c8e0 100644
--- a/src/libs/kdtools/kdsysinfo_win.cpp
+++ b/src/libs/kdtools/kdsysinfo_win.cpp
@@ -24,12 +24,21 @@
#include "link.h"
+#ifdef Q_CC_MINGW
+# ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0501
+# endif
+#endif
+
#include <windows.h>
#include <psapi.h>
#include <tlhelp32.h>
#include <winnetwk.h>
+
+#ifndef Q_CC_MINGW
#pragma comment(lib, "mpr.lib")
+#endif
#include <QDebug>
#include <QDir>
@@ -95,18 +104,26 @@ QList<VolumeInfo> networkVolumeInfosFromMountPoints()
Returns a list of volume info objects based on the given \a volumeGUID. The function also solves mounted
volume folder paths. It does not return any network drive shares.
*/
-QList<VolumeInfo> localVolumeInfosFromMountPoints(const QByteArray &volumeGUID)
+QList<VolumeInfo> localVolumeInfosFromMountPoints(PTCHAR volumeGUID)
{
QList<VolumeInfo> volumes;
DWORD bufferSize;
- char volumeNames[1024] = "";
- if (GetVolumePathNamesForVolumeNameA(volumeGUID, volumeNames, ARRAYSIZE(volumeNames), &bufferSize)) {
- QStringList mountedPaths = QString::fromLatin1(volumeNames, bufferSize).split(QLatin1Char(char(0)),
- QString::SkipEmptyParts);
+ TCHAR volumeNames[MAX_PATH + 1] = { 0 };
+ if (GetVolumePathNamesForVolumeName(volumeGUID, volumeNames, MAX_PATH, &bufferSize)) {
+ QStringList mountedPaths =
+#ifdef UNICODE
+ QString::fromWCharArray(volumeNames, bufferSize).split(QLatin1Char(char(0)), QString::SkipEmptyParts);
+#else
+ QString::fromLatin1(volumeNames, bufferSize).split(QLatin1Char(char(0)), QString::SkipEmptyParts);
+#endif
foreach (const QString &mountedPath, mountedPaths) {
VolumeInfo info;
info.setMountPath(mountedPath);
+#ifdef UNICODE
+ info.setVolumeDescriptor(QString::fromWCharArray(volumeGUID));
+#else
info.setVolumeDescriptor(QString::fromLatin1(volumeGUID));
+#endif
volumes.append(info);
}
}
@@ -116,11 +133,11 @@ QList<VolumeInfo> localVolumeInfosFromMountPoints(const QByteArray &volumeGUID)
QList<VolumeInfo> mountedVolumes()
{
QList<VolumeInfo> tmp;
- char volumeGUID[MAX_PATH] = "";
- HANDLE handle = FindFirstVolumeA(volumeGUID, ARRAYSIZE(volumeGUID));
+ TCHAR volumeGUID[MAX_PATH + 1] = { 0 };
+ HANDLE handle = FindFirstVolume(volumeGUID, MAX_PATH);
if (handle != INVALID_HANDLE_VALUE) {
tmp += localVolumeInfosFromMountPoints(volumeGUID);
- while (FindNextVolumeA(handle, volumeGUID, ARRAYSIZE(volumeGUID))) {
+ while (FindNextVolume(handle, volumeGUID, MAX_PATH)) {
tmp += localVolumeInfosFromMountPoints(volumeGUID);
}
FindVolumeClose(handle);
@@ -148,44 +165,42 @@ QList<ProcessInfo> runningProcesses()
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (!snapshot)
return param.processes;
- PROCESSENTRY32 processStruct;
- processStruct.dwSize = sizeof(PROCESSENTRY32);
- bool foundProcess = Process32First(snapshot, &processStruct);
- const DWORD bufferSize = 1024;
- char driveBuffer[bufferSize];
+
QStringList deviceList;
+ const DWORD bufferSize = 1024;
+ char buffer[bufferSize + 1] = { 0 };
if (QSysInfo::windowsVersion() <= QSysInfo::WV_5_2) {
- DWORD size = GetLogicalDriveStringsA(bufferSize, driveBuffer);
- deviceList = QString::fromLatin1(driveBuffer, size).split(QLatin1Char(char(0)), QString::SkipEmptyParts);
+ const DWORD size = GetLogicalDriveStringsA(bufferSize, buffer);
+ deviceList = QString::fromLatin1(buffer, size).split(QLatin1Char(char(0)), QString::SkipEmptyParts);
}
QLibrary kernel32(QLatin1String("Kernel32.dll"));
kernel32.load();
- void *pQueryFullProcessImageNameA = kernel32.resolve("QueryFullProcessImageNameA");
+ QueryFullProcessImageNamePtr pQueryFullProcessImageNamePtr = (QueryFullProcessImageNamePtr) kernel32
+ .resolve("QueryFullProcessImageNameA");
QLibrary psapi(QLatin1String("Psapi.dll"));
psapi.load();
- void *pGetProcessImageFileNamePtr = psapi.resolve("GetProcessImageFileNameA");
- QueryFullProcessImageNamePtr callPtr = (QueryFullProcessImageNamePtr) pQueryFullProcessImageNameA;
- GetProcessImageFileNamePtr callPtrXp = (GetProcessImageFileNamePtr) pGetProcessImageFileNamePtr;
+ GetProcessImageFileNamePtr pGetProcessImageFileNamePtr = (GetProcessImageFileNamePtr) psapi
+ .resolve("GetProcessImageFileNameA");
+ PROCESSENTRY32 processStruct;
+ processStruct.dwSize = sizeof(PROCESSENTRY32);
+ bool foundProcess = Process32First(snapshot, &processStruct);
while (foundProcess) {
HANDLE procHandle = OpenProcess(QSysInfo::windowsVersion() > QSysInfo::WV_5_2
- ? KDSYSINFO_PROCESS_QUERY_LIMITED_INFORMATION
- : PROCESS_QUERY_INFORMATION,
- false,
- processStruct.th32ProcessID);
- char buffer[1024];
- DWORD bufferSize = 1024;
+ ? KDSYSINFO_PROCESS_QUERY_LIMITED_INFORMATION : PROCESS_QUERY_INFORMATION, false, processStruct
+ .th32ProcessID);
+
bool succ = false;
QString executablePath;
- ProcessInfo info;
+ DWORD bufferSize = 1024;
if (QSysInfo::windowsVersion() > QSysInfo::WV_5_2) {
- succ = callPtr(procHandle, 0, buffer, &bufferSize);
+ succ = pQueryFullProcessImageNamePtr(procHandle, 0, buffer, &bufferSize);
executablePath = QString::fromLatin1(buffer);
} else if (pGetProcessImageFileNamePtr) {
- succ = callPtrXp(procHandle, buffer, bufferSize);
+ succ = pGetProcessImageFileNamePtr(procHandle, buffer, bufferSize);
executablePath = QString::fromLatin1(buffer);
for (int i = 0; i < deviceList.count(); ++i) {
executablePath.replace(QString::fromLatin1( "\\Device\\HarddiskVolume%1\\" ).arg(i + 1),
@@ -196,6 +211,7 @@ QList<ProcessInfo> runningProcesses()
if (succ) {
const quint32 pid = processStruct.th32ProcessID;
param.seenIDs.append(pid);
+ ProcessInfo info;
info.id = pid;
info.name = executablePath;
param.processes.append(info);
diff --git a/src/libs/kdtools/kdupdaterupdateoperations.cpp b/src/libs/kdtools/kdupdaterupdateoperations.cpp
index 05c46fe93..8270bba03 100644
--- a/src/libs/kdtools/kdupdaterupdateoperations.cpp
+++ b/src/libs/kdtools/kdupdaterupdateoperations.cpp
@@ -48,7 +48,7 @@ using namespace KDUpdater;
static QString errnoToQString(int error)
{
-#ifdef Q_OS_WIN
+#if defined(Q_OS_WIN) && !defined(Q_CC_MINGW)
char msg[128];
if (strerror_s(msg, sizeof msg, error) != 0)
return QString::fromLocal8Bit(msg);