From d412060d59b1597ae1d11d793662610e90863fc9 Mon Sep 17 00:00:00 2001 From: Tannin Date: Tue, 15 Jul 2014 17:31:44 +0200 Subject: - qt 5 compatibility fixes - detection for support of optimized find no longer depends on deprecated api --- src/shared/directoryentry.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src/shared/directoryentry.cpp') diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 5172346b..87431ea8 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -489,13 +489,18 @@ void DirectoryEntry::propagateOrigin(int origin) static bool SupportOptimizedFind() { - OSVERSIONINFO versionInfo; - versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&versionInfo); - // large fetch and basic info for FindFirstFileEx is supported on win server 2008 r2, win 7 and newer - return (versionInfo.dwMajorVersion > 6) || - ((versionInfo.dwMajorVersion == 6) && (versionInfo.dwMinorVersion >= 1)); + + OSVERSIONINFOEX versionInfo; + versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + versionInfo.dwMajorVersion = 6; + versionInfo.dwMinorVersion = 1; + ULONGLONG mask = ::VerSetConditionMask( + ::VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), + VER_MINORVERSION, VER_GREATER_EQUAL); + + bool res = ::VerifyVersionInfo(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, mask); + return res; } -- cgit v1.3.1 From e24f3fef770d250a40290a65bebd17f66121fc29 Mon Sep 17 00:00:00 2001 From: Tannin Date: Thu, 17 Jul 2014 20:04:22 +0200 Subject: - bugfix: broke qt4 compatibility in trying to support qt5 - bugfix: overwrite dialog displayed system drives if the overwrite directory didn't exist - bugfix: ini tweak activation wasn't saved --- src/mainwindow.cpp | 22 ++++++++++++++-------- src/modinfodialog.cpp | 2 +- src/overwriteinfodialog.cpp | 18 +++++++++++++----- src/overwriteinfodialog.h | 2 ++ src/shared/directoryentry.cpp | 2 +- 5 files changed, 31 insertions(+), 15 deletions(-) (limited to 'src/shared/directoryentry.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 19cefa89..cf283b49 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3221,14 +3221,20 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, std::vector flags = modInfo->getFlags(); if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) { QDialog *dialog = this->findChild("__overwriteDialog"); - if (dialog == NULL) { - dialog = new OverwriteInfoDialog(modInfo, this); - dialog->setObjectName("__overwriteDialog"); - } - dialog->show(); - dialog->raise(); - dialog->activateWindow(); - connect(dialog, SIGNAL(finished(int)), this, SLOT(overwriteClosed(int))); + try { + if (dialog == NULL) { + dialog = new OverwriteInfoDialog(modInfo, this); + dialog->setObjectName("__overwriteDialog"); + } else { + qobject_cast(dialog)->setModInfo(modInfo); + } + dialog->show(); + dialog->raise(); + dialog->activateWindow(); + connect(dialog, SIGNAL(finished(int)), this, SLOT(overwriteClosed(int))); + } catch (const std::exception &e) { + reportError(tr("Failed to display overwrite dialog: %1").arg(e.what())); + } } else { modInfo->saveMeta(); ModInfoDialog dialog(modInfo, m_DirectoryStructure, modInfo->hasFlag(ModInfo::FLAG_FOREIGN), this); diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 02ba0d38..96a575a0 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -104,7 +104,6 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ui->tabWidget->setTabEnabled(TAB_IMAGES, false); } else { initFiletree(modInfo); - initINITweaks(); addCategories(CategoryFactory::instance(), modInfo->getCategories(), ui->categoriesTree->invisibleRootItem(), 0); refreshPrimaryCategoriesBox(); ui->tabWidget->setTabEnabled(TAB_TEXTFILES, ui->textFileList->count() != 0); @@ -112,6 +111,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ui->tabWidget->setTabEnabled(TAB_ESPS, (ui->inactiveESPList->count() != 0) || (ui->activeESPList->count() != 0)); } refreshLists(); + initINITweaks(); ui->tabWidget->setTabEnabled(TAB_CONFLICTS, m_Origin != NULL); diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp index 2ba81633..16242506 100644 --- a/src/overwriteinfodialog.cpp +++ b/src/overwriteinfodialog.cpp @@ -72,19 +72,17 @@ private: OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget *parent) : QDialog(parent), ui(new Ui::OverwriteInfoDialog), m_FileSystemModel(NULL), - m_DeleteAction(NULL), m_RenameAction(NULL), m_OpenAction(NULL), - m_ModInfo(modInfo) + m_DeleteAction(NULL), m_RenameAction(NULL), m_OpenAction(NULL) { ui->setupUi(this); this->setWindowModality(Qt::NonModal); - QString path = modInfo->absolutePath(); m_FileSystemModel = new MyFileSystemModel(this); m_FileSystemModel->setReadOnly(false); - m_FileSystemModel->setRootPath(path); + setModInfo(modInfo); ui->filesView->setModel(m_FileSystemModel); - ui->filesView->setRootIndex(m_FileSystemModel->index(path)); + ui->filesView->setRootIndex(m_FileSystemModel->index(modInfo->absolutePath())); ui->filesView->setColumnWidth(0, 250); m_DeleteAction = new QAction(tr("&Delete"), ui->filesView); @@ -102,6 +100,16 @@ OverwriteInfoDialog::~OverwriteInfoDialog() delete ui; } +void OverwriteInfoDialog::setModInfo(ModInfo::Ptr modInfo) +{ + m_ModInfo = modInfo; + if (QDir(modInfo->absolutePath()).exists()) { + m_FileSystemModel->setRootPath(modInfo->absolutePath()); + } else { + throw MyException(tr("%1 not found").arg(modInfo->absolutePath())); + } +} + bool OverwriteInfoDialog::recursiveDelete(const QModelIndex &index) { for (int childRow = 0; childRow < m_FileSystemModel->rowCount(index); ++childRow) { diff --git a/src/overwriteinfodialog.h b/src/overwriteinfodialog.h index 34e86219..0726f1f9 100644 --- a/src/overwriteinfodialog.h +++ b/src/overwriteinfodialog.h @@ -39,6 +39,8 @@ public: ModInfo::Ptr modInfo() const { return m_ModInfo; } + void setModInfo(ModInfo::Ptr modInfo); + private: void openFile(const QModelIndex &index); diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 87431ea8..aead0cca 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -499,7 +499,7 @@ static bool SupportOptimizedFind() ::VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL); - bool res = ::VerifyVersionInfo(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, mask); + bool res = ::VerifyVersionInfo(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, mask) == TRUE; return res; } -- cgit v1.3.1 From 5d4a55c3a67caec2811a2b997753adc116403d77 Mon Sep 17 00:00:00 2001 From: Tannin Date: Fri, 1 Aug 2014 12:10:49 +0200 Subject: - performance optimizations for detection of file changes in mod directories - added a workaround for download-link handling in chrome - MO will now create a profile even if the game-launcher has never been run - bugfix: files weren't cleanly removed from vfs file register --- src/ModOrganizer.pro | 2 +- src/organizer.pro | 8 +++-- src/settings.cpp | 45 +++++--------------------- src/settings.h | 3 -- src/shared/directoryentry.cpp | 74 +++++++++++++++++++++++++++++++++++++------ src/shared/directoryentry.h | 36 +++++++++++++-------- src/shared/shared.pro | 4 +-- src/shared/skyriminfo.cpp | 4 ++- src/shared/util.cpp | 18 +++++------ 9 files changed, 115 insertions(+), 79 deletions(-) (limited to 'src/shared/directoryentry.cpp') diff --git a/src/ModOrganizer.pro b/src/ModOrganizer.pro index 9907d086..1624c5d0 100644 --- a/src/ModOrganizer.pro +++ b/src/ModOrganizer.pro @@ -12,7 +12,7 @@ SUBDIRS = bsatk \ proxydll \ nxmhandler \ BossDummy \ - pythonRunner \ +# pythonRunner \ esptk plugins.depends = pythonRunner diff --git a/src/organizer.pro b/src/organizer.pro index 994da396..76f95955 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -235,10 +235,14 @@ OTHER_FILES += \ # leak detection with vld -#INCLUDEPATH += "E:/Visual Leak Detector/include" -#LIBS += -L"E:/Visual Leak Detector/lib/Win32" +INCLUDEPATH += "E:/Visual Leak Detector/include" +LIBS += -L"E:/Visual Leak Detector/lib/Win32" #DEFINES += LEAK_CHECK_WITH_VLD +# custom leak detection +LIBS += -lDbgHelp + +# model tests #SOURCES += modeltest.cpp #HEADERS += modeltest.h #DEFINES += TEST_MODELS diff --git a/src/settings.cpp b/src/settings.cpp index 1cc168dd..6bf13ee0 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -25,6 +25,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include @@ -32,6 +33,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include using namespace MOBase; @@ -107,8 +109,12 @@ void Settings::registerAsNXMHandler(bool force) std::wstring nxmPath = ToWString(QCoreApplication::applicationDirPath() + "/nxmhandler.exe"); std::wstring executable = ToWString(QCoreApplication::applicationFilePath()); std::wstring mode = force ? L"forcereg" : L"reg"; - ::ShellExecuteW(NULL, L"open", nxmPath.c_str(), - (mode + L" " + GameInfo::instance().getGameShortName() + L" \"" + executable + L"\"").c_str(), NULL, SW_SHOWNORMAL); + std::wstring parameters = mode + L" " + GameInfo::instance().getGameShortName() + L" \"" + executable + L"\""; + HINSTANCE res = ::ShellExecuteW(NULL, L"open", nxmPath.c_str(), parameters.c_str(), NULL, SW_SHOWNORMAL); + if ((int)res <= 32) { + QMessageBox::critical(NULL, tr("Failed"), + tr("Sorry, failed to start the helper application")); + } } void Settings::registerPlugin(IPlugin *plugin) @@ -460,41 +466,6 @@ void Settings::addStyles(QComboBox *styleBox) } } -bool Settings::isNXMHandler(bool *modifyable) -{ - QSettings handlerReg("HKEY_CURRENT_USER\\Software\\Classes\\nxm\\shell\\open\\command", - QSettings::NativeFormat); - - QString currentExe = handlerReg.value("Default", "").toString().toUtf8().constData(); - QString myExe = QString("\"%1\" ").arg(QDir::toNativeSeparators(QCoreApplication::applicationFilePath())).append("\"%1\""); - if (modifyable != NULL) { - handlerReg.setValue("Default", currentExe); - handlerReg.sync(); - - *modifyable = handlerReg.status() == QSettings::NoError; - // QSettings::isWritable returns wrong results... - } - return currentExe == myExe; -} - - -void Settings::setNXMHandlerActive(bool active, bool writable) -{ -// QSettings handlerReg("HKEY_CLASSES_ROOT\\nxm\\", QSettings::NativeFormat); - QSettings handlerReg("HKEY_CURRENT_USER\\Software\\Classes\\nxm\\", QSettings::NativeFormat); - - if (writable) { - QString myExe = QString("\"%1\" ").arg(QDir::toNativeSeparators(QCoreApplication::applicationFilePath())).append("\"%1\""); - handlerReg.setValue("Default", "URL:NXM Protocol"); - handlerReg.setValue("URL Protocol", ""); - handlerReg.setValue("shell/open/command/Default", active ? myExe : ""); - handlerReg.sync(); - } else { - Helper::setNXMHandler(GameInfo::instance().getOrganizerDirectory(), active); - } -} - - void Settings::resetDialogs() { m_Settings.beginGroup("DialogChoices"); diff --git a/src/settings.h b/src/settings.h index 44e8088e..40fd2c5a 100644 --- a/src/settings.h +++ b/src/settings.h @@ -272,7 +272,6 @@ public: * even if the user said earlier not to */ void registerAsNXMHandler(bool force); - private: QString obfuscate(const QString &password) const; @@ -280,8 +279,6 @@ private: void addLanguages(QComboBox *languageBox); void addStyles(QComboBox *styleBox); - bool isNXMHandler(bool *modifyable); - void setNXMHandlerActive(bool active, bool writable); void readPluginBlacklist(); void writePluginBlacklist(); diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index aead0cca..e0914870 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -21,6 +21,7 @@ along with Mod Organizer. If not, see . #define WIN32_LEAN_AND_MEAN #include #include +#include #include #include #include "error_report.h" @@ -28,6 +29,7 @@ along with Mod Organizer. If not, see . #include "windows_error.h" #include #include +#include #include "util.h" #include "leaktrace.h" @@ -133,13 +135,11 @@ private: // -void FilesOrigin::enable(bool enabled) +void FilesOrigin::enable(bool enabled, time_t notAfter) { if (!enabled) { std::set copy = m_Files; - for (auto iter = copy.begin(); iter != copy.end(); ++iter) { - m_FileRegister.lock()->removeOrigin(*iter, m_ID); - } + m_FileRegister.lock()->removeOriginMulti(copy, m_ID, notAfter); m_Files.clear(); } m_Disabled = !enabled; @@ -233,6 +233,7 @@ std::vector FilesOrigin::getFiles() const void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &archive) { + m_LastAccessed = time(NULL); if (m_Parent != NULL) { m_Parent->propagateOrigin(origin); } @@ -324,13 +325,13 @@ static bool ByOriginPriority(DirectoryEntry *entry, int LHS, int RHS) FileEntry::FileEntry() - : m_Index(UINT_MAX), m_Name(), m_Parent(NULL) + : m_Index(UINT_MAX), m_Name(), m_Parent(NULL), m_LastAccessed(time(NULL)) { LEAK_TRACE; } FileEntry::FileEntry(Index index, const std::wstring &name, DirectoryEntry *parent) - : m_Index(index), m_Name(name), m_Parent(parent), m_Origin(-1), m_Archive(L"") + : m_Index(index), m_Name(name), m_Parent(parent), m_Origin(-1), m_Archive(L""), m_LastAccessed(time(NULL)) { LEAK_TRACE; } @@ -654,6 +655,18 @@ void DirectoryEntry::removeFile(FileEntry::Index index) } +void DirectoryEntry::removeFiles(const std::set &indices) +{ + for (auto iter = m_Files.begin(); iter != m_Files.end();) { + if (indices.find(iter->second) != indices.end()) { + m_Files.erase(iter++); + } else { + ++iter; + } + } +} + + int DirectoryEntry::anyOrigin() const { bool ignore; @@ -737,7 +750,7 @@ const FileEntry::Ptr DirectoryEntry::searchFile(const std::wstring &path, const if (len == std::string::npos) { // no more path components - auto iter = m_Files.find(path); + auto iter = m_Files.find(ToLower(path)); if (iter != m_Files.end()) { return m_FileRegister->getFile(iter->second); } else if (directory != NULL) { @@ -777,7 +790,7 @@ DirectoryEntry *DirectoryEntry::findSubDirectoryRecursive(const std::wstring &pa const FileEntry::Ptr DirectoryEntry::findFile(const std::wstring &name) const { - auto iter = m_Files.find(name); + auto iter = m_Files.find(ToLower(name)); if (iter != m_Files.end()) { return m_FileRegister->getFile(iter->second); } else { @@ -865,7 +878,6 @@ FileEntry::Ptr FileRegister::getFile(FileEntry::Index index) const return FileEntry::Ptr(); } - void FileRegister::unregisterFile(FileEntry::Ptr file) { bool ignore; @@ -890,6 +902,8 @@ void FileRegister::removeFile(FileEntry::Index index) if (iter != m_Files.end()) { unregisterFile(iter->second); m_Files.erase(index); + } else { + log("invalid file index for remove: %lu", index); } } @@ -899,7 +913,49 @@ void FileRegister::removeOrigin(FileEntry::Index index, int originID) if (iter != m_Files.end()) { if (iter->second->removeOrigin(originID)) { unregisterFile(iter->second); + m_Files.erase(iter); } + } else { + log("invalid file index for remove (for origin): %lu", index); + } +} + +void FileRegister::removeOriginMulti(std::set indices, int originID, time_t notAfter) +{ + std::vector removedFiles; + for (auto iter = indices.begin(); iter != indices.end();) { + auto pos = m_Files.find(*iter); + if (pos != m_Files.end() + && (pos->second->lastAccessed() < notAfter) + && pos->second->removeOrigin(originID)) { + removedFiles.push_back(pos->second); + m_Files.erase(pos); + ++iter; + } else { + indices.erase(iter++); + } + } + + if (removedFiles.size() > 0) { + log("%d files actually removed", removedFiles.size()); + } + + // optimization: this is only called when disabling an origin and in this case we don't have + // to remove the file from the origin + + // need to remove files from their parent directories. multiple ways to go about this: + // a) for each file, search its parents file-list (preferably by name) and remove what is found + // b) gather the parent directories, go through the file list for each once and remove all files that have been removed + // the latter should be faster when there are many files in few directories. since this is called + // only when disabling an origin that is probably frequently the case + std::set parents; + BOOST_FOREACH (const FileEntry::Ptr &file, removedFiles) { + if (file->getParent() != NULL) { + parents.insert(file->getParent()); + } + } + BOOST_FOREACH (DirectoryEntry *parent, parents) { + parent->removeFiles(indices); } } diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index 7b656b05..1e904311 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -34,6 +34,11 @@ along with Mod Organizer. If not, see . #include "util.h" + +#include "error_report.h" + + + namespace MOShared { @@ -60,6 +65,8 @@ public: Index getIndex() const { return m_Index; } + time_t lastAccessed() const { return m_LastAccessed; } + void addOrigin(int origin, FILETIME fileTime, const std::wstring &archive); // remove the specified origin from the list of origins that contain this file. if no origin is left, // the file is effectively deleted and true is returned. otherwise, false is returned @@ -98,6 +105,8 @@ private: DirectoryEntry *m_Parent; mutable FILETIME m_FileTime; + time_t m_LastAccessed; + friend bool operator<(const FileEntry &lhs, const FileEntry &rhs) { return _wcsicmp(lhs.m_Name.c_str(), rhs.m_Name.c_str()) < 0; } @@ -130,7 +139,7 @@ public: std::vector getFiles() const; - void enable(bool enabled); + void enable(bool enabled, time_t notAfter = LONG_MAX); bool isDisabled() const { return m_Disabled; } void addFile(FileEntry::Index index) { m_Files.insert(index); } @@ -171,8 +180,11 @@ public: FileEntry::Ptr createFile(const std::wstring &name, DirectoryEntry *parent); FileEntry::Ptr getFile(FileEntry::Index index) const; + size_t size() const { return m_Files.size(); } + void removeFile(FileEntry::Index index); void removeOrigin(FileEntry::Index index, int originID); + void removeOriginMulti(std::set indices, int originID, time_t notAfter); void sortOrigins(); @@ -258,7 +270,7 @@ public: void removeDir(const std::wstring &path); void remove(const std::wstring &fileName, int *origin) { - auto iter = m_Files.find(fileName); + auto iter = m_Files.find(ToLower(fileName)); if (iter != m_Files.end()) { if (origin != NULL) { FileEntry::Ptr entry = m_FileRegister->getFile(iter->second); @@ -268,6 +280,8 @@ public: } } m_FileRegister->removeFile(iter->second); + } else { + log ("failed to remove %ls from %ls", fileName.c_str(), m_Name.c_str()); } } @@ -275,20 +289,23 @@ public: FilesOrigin &createOrigin(const std::wstring &originName, const std::wstring &directory, int priority); + void removeFiles(const std::set &indices); + private: DirectoryEntry(const DirectoryEntry &reference); DirectoryEntry &operator=(const DirectoryEntry &reference); void insert(const std::wstring &fileName, FilesOrigin &origin, FILETIME fileTime, const std::wstring &archive) { - auto iter = m_Files.find(fileName); + std::wstring fileNameLower = ToLower(fileName); + auto iter = m_Files.find(fileNameLower); FileEntry::Ptr file; if (iter != m_Files.end()) { file = m_FileRegister->getFile(iter->second); } else { file = m_FileRegister->createFile(fileName, this); // TODO this has been observed to cause a crash, no clue why - m_Files[fileName] = file->getIndex(); + m_Files[fileNameLower] = file->getIndex(); } file->addOrigin(origin.getID(), fileTime, archive); origin.addFile(file->getIndex()); @@ -305,22 +322,13 @@ private: void removeDirRecursive(); -private: - - struct WStrLess { - bool operator()(const std::wstring &LHS, const std::wstring &RHS) const { - return _wcsicmp(LHS.c_str(), RHS.c_str()) < 0; - } - }; - - private: boost::shared_ptr m_FileRegister; boost::shared_ptr m_OriginConnection; std::wstring m_Name; - std::map m_Files; + std::map m_Files; std::vector m_SubDirectories; DirectoryEntry *m_Parent; diff --git a/src/shared/shared.pro b/src/shared/shared.pro index c5925c24..84a9c274 100644 --- a/src/shared/shared.pro +++ b/src/shared/shared.pro @@ -15,8 +15,8 @@ INCLUDEPATH += ../bsatk "$(BOOSTPATH)" # only for custom leak detection -#DEFINES += TRACE_LEAKS -#LIBS += -lDbgHelp +DEFINES += TRACE_LEAKS +LIBS += -lDbgHelp CONFIG(debug, debug|release) { diff --git a/src/shared/skyriminfo.cpp b/src/shared/skyriminfo.cpp index 5017da38..72452255 100644 --- a/src/shared/skyriminfo.cpp +++ b/src/shared/skyriminfo.cpp @@ -273,7 +273,9 @@ void SkyrimInfo::createProfile(const std::wstring &directory, bool useDefaults) std::wostringstream source; source << getMyGamesDirectory() << L"\\Skyrim\\skyrimprefs.ini"; if (!::CopyFileW(source.str().c_str(), target.c_str(), true)) { - if (::GetLastError() != ERROR_FILE_EXISTS) { + log("failed to copy ini file %ls", source.str().c_str()); + // create empty + if (::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) == INVALID_HANDLE_VALUE) { std::ostringstream stream; stream << "failed to copy ini file: " << ToString(source.str(), false); throw windows_error(stream.str()); diff --git a/src/shared/util.cpp b/src/shared/util.cpp index 22657e6c..61ca9cdc 100644 --- a/src/shared/util.cpp +++ b/src/shared/util.cpp @@ -86,30 +86,28 @@ std::wstring ToWString(const std::string &source, bool utf8) std::string &ToLower(std::string &text) { - std::transform(text.begin(), text.end(), text.begin(), tolower); + std::transform(text.begin(), text.end(), text.begin(), ::tolower); return text; } std::string ToLower(const std::string &text) { - std::string temp = text; - - std::transform(temp.begin(), temp.end(), temp.begin(), tolower); - return temp; + std::string result = text; + std::transform(result.begin(), result.end(), result.begin(), ::tolower); + return result; } std::wstring &ToLower(std::wstring &text) { - std::transform(text.begin(), text.end(), text.begin(), towlower); + std::transform(text.begin(), text.end(), text.begin(), ::towlower); return text; } std::wstring ToLower(const std::wstring &text) { - std::wstring temp = text; - - std::transform(temp.begin(), temp.end(), temp.begin(), towlower); - return temp; + std::wstring result = text; + std::transform(result.begin(), result.end(), result.begin(), ::towlower); + return result; } VS_FIXEDFILEINFO GetFileVersion(const std::wstring &fileName) -- cgit v1.3.1 From 482f13a50b921e61d34d09f72a7fb4216efe742b Mon Sep 17 00:00:00 2001 From: Tannin Date: Mon, 8 Sep 2014 20:37:23 +0200 Subject: - re-enabled building of loot_cli and started developing against the new api - extended set of default categories - more tolerand bbcode parser - added a few colors for the bbcode parser - more fixes to qt5 compatibility - started work on ability to unloading (and thus re-loading) of plugins - names of plugins are no longer localizable (because those names are also used to store settings) - added settings to disable individual diagnosis settings - path of dependencies is now configured in a .pri file instead of environment variablees - bugfix: if the modid-input is canceled, the id was saved as -1 and wasn't re-requested from the user - bugfix: moving files with the SHFileOperation-Api didn't update the vfs correctly (still not perfect but better) - bugfix: attempt to remove the deleter-file seems to have caused error messages for some users - bugfix: fixed a couple of cases that might have caused the tutorial to hang --- .hgignore | 3 + src/ModOrganizer.pro | 6 +- src/bbcode.cpp | 93 +++++++++++++++++++++---------- src/categories.cpp | 26 +++++++-- src/downloadmanager.cpp | 2 +- src/editexecutablesdialog.cpp | 2 +- src/main.cpp | 12 +++- src/mainwindow.cpp | 77 ++++++++++++++++++------- src/mainwindow.h | 8 +++ src/modinfo.cpp | 4 +- src/modlist.cpp | 11 ++++ src/modlist.h | 6 ++ src/nexusinterface.cpp | 23 ++++---- src/nexusinterface.h | 8 ++- src/organizer.pro | 50 +++++++++-------- src/pluginlist.cpp | 5 +- src/pluginlist.h | 12 ++-- src/settings.cpp | 1 - src/shared/directoryentry.cpp | 4 -- src/shared/directoryentry.h | 2 + src/shared/shared.pro | 53 ++++++++++-------- src/tutorials/TutorialOverlay.qml | 6 +- src/tutorials/tutorial_firststeps_main.js | 35 ++++++++---- 23 files changed, 305 insertions(+), 144 deletions(-) (limited to 'src/shared/directoryentry.cpp') diff --git a/.hgignore b/.hgignore index d1092a1d..acba45c6 100644 --- a/.hgignore +++ b/.hgignore @@ -32,5 +32,8 @@ html *.filters *.lib source/organizer/resources/contents/icons +source/plugins/build-* +*/GeneratedFiles/* syntax: regexp Makefile\.(Debug|Release) +source/.*/debug/.* diff --git a/src/ModOrganizer.pro b/src/ModOrganizer.pro index 9907d086..9b2d998b 100644 --- a/src/ModOrganizer.pro +++ b/src/ModOrganizer.pro @@ -1,6 +1,5 @@ TEMPLATE = subdirs - SUBDIRS = bsatk \ shared \ uibase \ @@ -13,9 +12,10 @@ SUBDIRS = bsatk \ nxmhandler \ BossDummy \ pythonRunner \ + loot_cli \ esptk -plugins.depends = pythonRunner +plugins.depends = pythonRunner uibase hookdll.depends = shared organizer.depends = shared uibase plugins @@ -30,7 +30,7 @@ DLLSPATH = $${DESTDIR}\\dlls otherlibs.path = $$DLLSPATH otherlibs.files += $${STATICDATAPATH}\\7z.dll \ - $$(BOOSTPATH)\\stage\\lib\\boost_python-vc*-mt-1*.dll + $${BOOSTPATH}\\stage\\lib\\boost_python-vc*-mt-1*.dll qtlibs.path = $$DLLSPATH diff --git a/src/bbcode.cpp b/src/bbcode.cpp index 18f2beb1..92eb427f 100644 --- a/src/bbcode.cpp +++ b/src/bbcode.cpp @@ -39,7 +39,7 @@ public: return s_Instance; } - QString convertTag(const QString &input, int &length) + QString convertTag(QString input, int &length) { // extract the tag name m_TagNameExp.indexIn(input, 1, QRegExp::CaretAtOffset); @@ -50,14 +50,30 @@ public: if (tagName.endsWith('=')) { tagName.chop(1); } - QString closeTag = tagName == "*" ? "
" - : QString("[/%1]").arg(tagName); - int closeTagPos = input.indexOf(closeTag, 0, Qt::CaseInsensitive); - //qDebug("close tag %s at %d", closeTag.toUtf8().constData(), closeTagPos); + int closeTagPos = 0; + int closeTagLength = 0; + if (tagName == "*") { + // ends at the next bullet point + closeTagPos = input.indexOf(QRegExp("(\\[\\*\\]|)", Qt::CaseInsensitive), 3); + // leave closeTagLength at 0 because we don't want to "eat" the next bullet point + } else if (tagName == "line") { + // ends immediately after the tag + closeTagPos = 6; + // leave closeTagLength at 0 because there is no close tag to skip over + } else { + QString closeTag = QString("[/%1]").arg(tagName); + closeTagPos = input.indexOf(closeTag, 0, Qt::CaseInsensitive); + if (closeTagPos == -1) { + // workaround to improve compatibility: add fake closing tag + input.append(closeTag); + closeTagPos = input.size() - closeTag.size(); + } + closeTagLength = closeTag.size(); + } if (closeTagPos > -1) { - length = closeTagPos + closeTag.length(); + length = closeTagPos + closeTagLength; QString temp = input.mid(0, length); if (tagIter->second.first.indexIn(temp) == 0) { if (tagIter->second.second.isEmpty()) { @@ -73,6 +89,9 @@ public: qWarning("don't know how to deal with tag %s", qPrintable(tagName)); } } else { + if (tagName == "*") { + temp.remove(QRegExp("(\\[/\\*\\])?(
)?$")); + } return temp.replace(tagIter->second.first, tagIter->second.second); } } else { @@ -123,6 +142,8 @@ private: "
\\1
"); m_TagMap["heading"]= std::make_pair(QRegExp("\\[heading\\](.*)\\[/heading\\]"), "

\\1

"); + m_TagMap["line"] = std::make_pair(QRegExp("\\[line\\]"), + "
"); // lists m_TagMap["list"] = std::make_pair(QRegExp("\\[list\\](.*)\\[/list\\]"), @@ -135,8 +156,6 @@ private: "
    \\1
"); m_TagMap["li"] = std::make_pair(QRegExp("\\[li\\](.*)\\[/li\\]"), "
  • \\1
  • "); - m_TagMap["*"] = std::make_pair(QRegExp("\\[\\*\\](.*)
    "), - "
  • \\1
  • "); // tables m_TagMap["table"] = std::make_pair(QRegExp("\\[table\\](.*)\\[/table\\]"), @@ -153,13 +172,26 @@ private: "\\1"); m_TagMap["url="] = std::make_pair(QRegExp("\\[url=([^\\]]*)\\](.*)\\[/url\\]"), "\\2"); - m_TagMap["img"] = std::make_pair(QRegExp("\\[img\\](.*)\\[/img\\]"), " "); - m_TagMap["img="] = std::make_pair(QRegExp("\\[img=([^\\]]*)\\](.*)\\[/img\\]"), " "); + m_TagMap["img"] = std::make_pair(QRegExp("\\[img\\](.*)\\[/img\\]"), + "\\1"); + m_TagMap["img="] = std::make_pair(QRegExp("\\[img=([^\\]]*)\\](.*)\\[/img\\]"), + "\\2"); m_TagMap["email="] = std::make_pair(QRegExp("\\[email=\"?([^\\]]*)\"?\\](.*)\\[/email\\]"), "\\2"); m_TagMap["youtube"] = std::make_pair(QRegExp("\\[youtube\\](.*)\\[/youtube\\]"), "http://www.youtube.com/v/\\1"); + + // make all patterns non-greedy and case-insensitive + for (TagMap::iterator iter = m_TagMap.begin(); iter != m_TagMap.end(); ++iter) { + iter->second.first.setCaseSensitivity(Qt::CaseInsensitive); + iter->second.first.setMinimal(true); + } + + // this tag is in fact greedy + m_TagMap["*"] = std::make_pair(QRegExp("\\[\\*\\](.*)"), + "
  • \\1
  • "); + m_ColorMap.insert(std::make_pair("red", "FF0000")); m_ColorMap.insert(std::make_pair("green", "00FF00")); m_ColorMap.insert(std::make_pair("blue", "0000FF")); @@ -170,13 +202,13 @@ private: m_ColorMap.insert(std::make_pair("cyan", "00FFFF")); m_ColorMap.insert(std::make_pair("magenta", "FF00FF")); m_ColorMap.insert(std::make_pair("brown", "A52A2A")); - m_ColorMap.insert(std::make_pair("orange", "FFCC00")); - - // make all patterns non-greedy and case-insensitive - for (TagMap::iterator iter = m_TagMap.begin(); iter != m_TagMap.end(); ++iter) { - iter->second.first.setCaseSensitivity(Qt::CaseInsensitive); - iter->second.first.setMinimal(true); - } + m_ColorMap.insert(std::make_pair("orange", "FFA500")); + m_ColorMap.insert(std::make_pair("gold", "FFD700")); + m_ColorMap.insert(std::make_pair("deepskyblue", "00BFFF")); + m_ColorMap.insert(std::make_pair("salmon", "FA8072")); + m_ColorMap.insert(std::make_pair("dodgerblue", "1E90FF")); + m_ColorMap.insert(std::make_pair("greenyellow", "ADFF2F")); + m_ColorMap.insert(std::make_pair("peru", "CD853F")); } private: @@ -209,18 +241,23 @@ QString convertToHTML(const QString &inputParam) // append everything between the previous tag-block and the current one result.append(input.midRef(lastBlock, pos - lastBlock)); - // convert the tag and content if necessary - int length = -1; - QString replacement = BBCodeMap::instance().convertTag(input.mid(pos), length); - if (length != 0) { - QString temp = convertToHTML(replacement); - result.append(temp); - // length contains the number of characters in the original tag - pos += length; + if ((pos < (input.size() - 1)) && (input.at(pos + 1) == '/')) { + // skip invalid end tag + int tagEnd = input.indexOf(']', pos) + 1; + pos = tagEnd; } else { - // nothing replaced - result.append('['); - ++pos; + // convert the tag and content if necessary + int length = -1; + QString replacement = BBCodeMap::instance().convertTag(input.mid(pos), length); + if (length != 0) { + result.append(convertToHTML(replacement)); + // length contains the number of characters in the original tag + pos += length; + } else { + // nothing replaced + result.append('['); + ++pos; + } } lastBlock = pos; } diff --git a/src/categories.cpp b/src/categories.cpp index 4c851338..28b1f4a2 100644 --- a/src/categories.cpp +++ b/src/categories.cpp @@ -104,7 +104,11 @@ void CategoryFactory::reset() { m_Categories.clear(); m_IDMap.clear(); - addCategory(0, "None", MakeVector(2, 28, 87), 0); + // 28 = + // 43 = Savegames (makes no sense to install them through MO) + // 45 = Videos and trailers + // 87 = Miscelanous + addCategory(0, "None", MakeVector(4, 28, 43, 45, 87), 0); } @@ -189,24 +193,38 @@ void CategoryFactory::loadDefaultCategories() // mods appear in the combo box addCategory(1, "Animations", MakeVector(1, 51), 0); addCategory(2, "Armour", MakeVector(1, 54), 0); - addCategory(3, "Audio", MakeVector(1, 61), 0); + addCategory(3, "Sound & Music", MakeVector(1, 61), 0); addCategory(5, "Clothing", MakeVector(1, 60), 0); addCategory(6, "Collectables", MakeVector(1, 92), 0); - addCategory(7, "Creatures", MakeVector(2, 83, 65), 0); + addCategory(28, "Companions", MakeVector(2, 66, 96), 0); + addCategory(7, "Creatures & Mounts", MakeVector(2, 83, 65), 0); addCategory(8, "Factions", MakeVector(1, 25), 0); addCategory(9, "Gameplay", MakeVector(1, 24), 0); addCategory(10, "Hair", MakeVector(1, 26), 0); addCategory(11, "Items", MakeVector(2, 27, 85), 0); - addCategory(19, "Weapons", MakeVector(2, 36, 55), 11); + addCategory(32, "Mercantile", MakeVector(1, 69), 0); + addCategory(19, "Weapons", MakeVector(1, 55), 11); + addCategory(36, "Weapon & Armour Sets", MakeVector(1, 39), 11); addCategory(12, "Locations", MakeVector(7, 22, 30, 70, 88, 89, 90, 91), 0); + addCategory(31, "Landscape Changes", MakeVector(1, 58), 0); addCategory(4, "Cities", MakeVector(1, 53), 12); + addCategory(29, "Environment", MakeVector(1, 74), 0); + addCategory(30, "Immersion", MakeVector(1, 78), 0); + addCategory(25, "Castles & Mansions", MakeVector(1, 68), 23); addCategory(20, "Magic", MakeVector(3, 75, 93, 94), 0); addCategory(21, "Models & Textures", MakeVector(1, 29), 0); + addCategory(33, "Modders resources", MakeVector(1, 82), 0); addCategory(13, "NPCs", MakeVector(1, 33), 0); addCategory(14, "Patches", MakeVector(2, 79, 84), 0); + addCategory(24, "Bugfixes", MakeVector(1, 95), 0); + addCategory(35, "Utilities", MakeVector(1, 39), 0); + addCategory(26, "Cheats", MakeVector(1, 40), 0); + addCategory(23, "Player Homes", MakeVector(1, 67), 0); addCategory(15, "Quests", MakeVector(1, 35), 0); addCategory(16, "Races & Classes", MakeVector(1, 34), 0); + addCategory(27, "Combat", MakeVector(1, 77), 0); addCategory(22, "Skills", MakeVector(1, 73), 0); + addCategory(34, "Stealth", MakeVector(1, 76), 0); addCategory(17, "UI", MakeVector(1, 42), 0); addCategory(18, "Visuals", MakeVector(1, 62), 0); } diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index 856ca79c..bc31adf4 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -685,7 +685,7 @@ void DownloadManager::queryInfo(int index) return; } - if (info->m_FileInfo->modID == 0UL) { + if (info->m_FileInfo->modID <= 0) { QString fileName = getFileName(index); QString ignore; NexusInterface::interpretNexusFileName(fileName, ignore, info->m_FileInfo->modID, true); diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 02abf30e..0e3aa55b 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -132,7 +132,7 @@ void EditExecutablesDialog::on_browseButton_clicked() if (::FindExecutableW(binaryNameW.c_str(), NULL, buffer) > (HINSTANCE)32) { DWORD binaryType = 0UL; if (!::GetBinaryTypeW(binaryNameW.c_str(), &binaryType)) { - qDebug("failed to determine binary type: %lu", ::GetLastError()); + qDebug("failed to determine binary type of \"%ls\": %lu", binaryNameW.c_str(), ::GetLastError()); } else if (binaryType == SCS_32BIT_BINARY) { binaryPath = ToQString(buffer); } diff --git a/src/main.cpp b/src/main.cpp index a21f41e4..3198208a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -311,9 +311,19 @@ int main(int argc, char *argv[]) } QString dataPath = instanceID.isEmpty() ? application.applicationDirPath() - : QDir::fromNativeSeparators(QDesktopServices::storageLocation(QDesktopServices::DataLocation)) + "/" + instanceID; + : QDir::fromNativeSeparators( +#if QT_VERSION >= 0x050000 + QStandardPaths::writableLocation(QStandardPaths::DataLocation) +#else + QDesktopServices::storageLocation(QDesktopServices::DataLocation) +#endif + ) + "/" + instanceID; application.setProperty("dataPath", dataPath); +#if QT_VERSION >= 0x050000 + qDebug("ssl support: %d", QSslSocket::supportsSsl()); +#endif + qDebug("data path: %s", qPrintable(dataPath)); if (!QDir(dataPath).exists()) { if (!QDir().mkpath(dataPath)) { diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 0d9fad5d..984d8cfd 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -97,9 +97,6 @@ along with Mod Organizer. If not, see . #include #include #include -#include -#include -#include #include #include #include @@ -114,8 +111,13 @@ along with Mod Organizer. If not, see . #include #include #include +#ifndef Q_MOC_RUN #include #include +#include +#include +#include +#endif #include #ifdef TEST_MODELS @@ -313,8 +315,6 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget connect(&m_Updater, SIGNAL(updateAvailable()), this, SLOT(updateAvailable())); connect(&m_Updater, SIGNAL(motdAvailable(QString)), this, SLOT(motdReceived(QString))); -// connect(ExitProxy::instance(), SIGNAL(exit()), this, SLOT(close())); - connect(NexusInterface::instance()->getAccessManager(), SIGNAL(loginSuccessful(bool)), this, SLOT(loginSuccessful(bool))); connect(NexusInterface::instance()->getAccessManager(), SIGNAL(loginFailed(QString)), this, SLOT(loginFailed(QString))); connect(NexusInterface::instance(), SIGNAL(requestNXMDownload(QString)), this, SLOT(downloadRequestedNXM(QString))); @@ -367,6 +367,8 @@ MainWindow::MainWindow(const QString &exeName, QSettings &initSettings, QWidget MainWindow::~MainWindow() { + m_AboutToRun.disconnect_all_slots(); + m_ModInstalled.disconnect_all_slots(); m_RefresherThread.exit(); m_RefresherThread.wait(); m_IntegratedBrowser.close(); @@ -888,6 +890,8 @@ void MainWindow::closeEvent(QCloseEvent* event) storeSettings(); +// unloadPlugins(); + // profile has to be cleaned up before the modinfo-buffer is cleared delete m_CurrentProfile; m_CurrentProfile = NULL; @@ -895,6 +899,7 @@ void MainWindow::closeEvent(QCloseEvent* event) ModInfo::clear(); LogBuffer::cleanQuit(); m_ModList.setProfile(NULL); + NexusInterface::instance()->cleanup(); } @@ -1175,7 +1180,9 @@ bool MainWindow::registerPlugin(QObject *plugin, const QString &fileName) IPluginDiagnose *diagnose = qobject_cast(plugin); if (diagnose != NULL) { m_DiagnosisPlugins.push_back(diagnose); - diagnose->onInvalidated([&] () { this->scheduleUpdateButton(); }); + m_DiagnosisConnections.push_back( + diagnose->onInvalidated([&] () { this->scheduleUpdateButton(); }) + ); } } { // mod page plugin @@ -1204,6 +1211,7 @@ bool MainWindow::registerPlugin(QObject *plugin, const QString &fileName) IPluginPreview *preview = qobject_cast(plugin); if (verifyPlugin(preview)) { m_PreviewGenerator.registerPlugin(preview); + return true; } } { // proxy plugins @@ -1242,13 +1250,41 @@ bool MainWindow::registerPlugin(QObject *plugin, const QString &fileName) return false; } - -void MainWindow::loadPlugins() +void MainWindow::unloadPlugins() { + // disconnect all slots before unloading plugins so plugins don't have to take care of that + m_AboutToRun.disconnect_all_slots(); + m_ModInstalled.disconnect_all_slots(); + m_ModList.disconnectSlots(); + m_PluginList.disconnectSlots(); + m_DiagnosisPlugins.clear(); + foreach (const boost::signals2::connection &connection, m_DiagnosisConnections) { + connection.disconnect(); + } + m_DiagnosisConnections.clear(); + m_Settings.clearPlugins(); + if (ui->actionTool->menu() != NULL) { + ui->actionTool->menu()->clear(); + } + + foreach (QPluginLoader *loader, m_PluginLoaders) { + qDebug("unloading %s", qPrintable(loader->fileName())); + if (!loader->unload()) { + qDebug("failed to unload %s: %s", qPrintable(loader->fileName()), qPrintable(loader->errorString())); + } + delete loader; + } + m_PluginLoaders.clear(); +} + +void MainWindow::loadPlugins() +{ + unloadPlugins(); + foreach (QObject *plugin, QPluginLoader::staticInstances()) { registerPlugin(plugin, ""); } @@ -1287,14 +1323,15 @@ void MainWindow::loadPlugins() loadCheck.flush(); QString pluginName = iter.filePath(); if (QLibrary::isLibrary(pluginName)) { - QPluginLoader pluginLoader(pluginName); - if (pluginLoader.instance() == NULL) { + QPluginLoader *pluginLoader = new QPluginLoader(pluginName, this); + if (pluginLoader->instance() == NULL) { m_UnloadedPlugins.push_back(pluginName); qCritical("failed to load plugin %s: %s", - qPrintable(pluginName), qPrintable(pluginLoader.errorString())); + qPrintable(pluginName), qPrintable(pluginLoader->errorString())); } else { - if (registerPlugin(pluginLoader.instance(), pluginName)) { + if (registerPlugin(pluginLoader->instance(), pluginName)) { qDebug("loaded plugin \"%s\"", qPrintable(pluginName)); + m_PluginLoaders.push_back(pluginLoader); } else { m_UnloadedPlugins.push_back(pluginName); qWarning("plugin \"%s\" failed to load", qPrintable(pluginName)); @@ -2214,6 +2251,8 @@ void MainWindow::storeSettings() void MainWindow::on_btnRefreshData_clicked() { if (!m_DirectoryUpdate) { + // save the mod list so changes don't get lost + m_CurrentProfile->writeModlistNow(true); refreshDirectoryStructure(); } else { qDebug("directory update"); @@ -4315,13 +4354,10 @@ void MainWindow::downloadRequested(QNetworkReply *reply, int modID, const QStrin void MainWindow::installTranslator(const QString &name) { -/* if (m_CurrentLanguage == "en_US") { - return; - }*/ QTranslator *translator = new QTranslator(this); QString fileName = name + "_" + m_CurrentLanguage; if (!translator->load(fileName, qApp->applicationDirPath() + "/translations")) { - if (m_CurrentLanguage != "en-US") { + if ((m_CurrentLanguage != "en-US") && (m_CurrentLanguage != "en_US")) { qWarning("localization file %s not found", qPrintable(fileName)); } // we don't actually expect localization files for english } @@ -4485,7 +4521,7 @@ int MainWindow::getBinaryExecuteInfo(const QFileInfo &targetInfo, if (::FindExecutableW(targetPathW.c_str(), NULL, buffer) > (HINSTANCE)32) { DWORD binaryType = 0UL; if (!::GetBinaryTypeW(targetPathW.c_str(), &binaryType)) { - qDebug("failed to determine binary type: %lu", ::GetLastError()); + qDebug("failed to determine binary type of \"%ls\": %lu", targetPathW.c_str(), ::GetLastError()); } else if (binaryType == SCS_32BIT_BINARY) { binaryPath = ToQString(buffer); } @@ -5088,9 +5124,6 @@ void MainWindow::on_bsaList_itemChanged(QTreeWidgetItem*, int) void MainWindow::on_actionProblems_triggered() { -// QString problemDescription; -// checkForProblems(problemDescription); -// QMessageBox::information(this, tr("Problems"), problemDescription); ProblemsDialog problems(m_DiagnosisPlugins, this); if (problems.hasProblems()) { problems.exec(); @@ -5594,7 +5627,11 @@ void MainWindow::on_bossButton_clicked() QStringList temp = report.split("?"); QUrl url = QUrl::fromLocalFile(temp.at(0)); if (temp.size() > 1) { +#if QT_VERSION >= 0x050000 + url.setQuery(temp.at(1).toUtf8()); +#else url.setEncodedQuery(temp.at(1).toUtf8()); +#endif } m_IntegratedBrowser.openUrl(url); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 22152f1c..8bd663ac 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -29,6 +29,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include "executableslist.h" #include "modlist.h" #include "pluginlist.h" @@ -53,7 +54,9 @@ along with Mod Organizer. If not, see . #include "browserdialog.h" #include #include +#ifndef Q_MOC_RUN #include +#endif namespace Ui { class MainWindow; @@ -139,6 +142,8 @@ public: void updateModInDirectoryStructure(unsigned int index, ModInfo::Ptr modInfo); + QString getOriginDisplayName(int originID); + void unloadPlugins(); public slots: void refreshLists(); @@ -191,6 +196,7 @@ private: void registerPluginTool(MOBase::IPluginTool *tool); void registerModPage(MOBase::IPluginModPage *modPage); bool registerPlugin(QObject *pluginObj, const QString &fileName); + bool unregisterPlugin(QObject *pluginObj, const QString &fileName); void updateToolBar(); void activateSelectedProfile(); @@ -373,8 +379,10 @@ private: MOBase::IGameInfo *m_GameInfo; std::vector m_DiagnosisPlugins; + std::vector m_DiagnosisConnections; std::vector m_ModPages; std::vector m_UnloadedPlugins; + std::vector m_PluginLoaders; QFile m_PluginsCheck; diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 9558e03b..4ab6d142 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -569,9 +569,7 @@ void ModInfoRegular::saveMeta() metaFile.setValue("newestVersion", m_NewestVersion.canonicalString()); metaFile.setValue("ignoredVersion", m_IgnoredVersion.canonicalString()); metaFile.setValue("version", m_Version.canonicalString()); - if (m_NexusID != -1) { - metaFile.setValue("modid", m_NexusID); - } + metaFile.setValue("modid", m_NexusID); metaFile.setValue("notes", m_Notes); metaFile.setValue("nexusDescription", m_NexusDescription); metaFile.setValue("lastNexusQuery", m_LastNexusQuery.toString(Qt::ISODate)); diff --git a/src/modlist.cpp b/src/modlist.cpp index 681d880c..eedf1ec6 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -64,6 +64,12 @@ ModList::ModList(QObject *parent) m_ContentIcons[ModInfo::CONTENT_TEXTURE] = std::make_tuple(QIcon(":/MO/gui/content/texture"), ":/MO/gui/content/texture", tr("Textures")); } +ModList::~ModList() +{ + m_ModStateChanged.disconnect_all_slots(); + m_ModMoved.disconnect_all_slots(); +} + void ModList::setProfile(Profile *profile) { m_Profile = profile; @@ -653,6 +659,11 @@ void ModList::modInfoChanged(ModInfo::Ptr info) } } +void ModList::disconnectSlots() { + m_ModMoved.disconnect_all_slots(); + m_ModStateChanged.disconnect_all_slots(); +} + IModList::ModStates ModList::state(unsigned int modIndex) const { IModList::ModStates result; diff --git a/src/modlist.h b/src/modlist.h index 6116a913..632689c6 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -32,7 +32,9 @@ along with Mod Organizer. If not, see . #include #include #include +#ifndef Q_MOC_RUN #include +#endif #include #include #include @@ -73,6 +75,8 @@ public: **/ ModList(QObject *parent = NULL); + ~ModList(); + /** * @brief set the profile used for status information * @@ -103,6 +107,8 @@ public: void modInfoAboutToChange(ModInfo::Ptr info); void modInfoChanged(ModInfo::Ptr info); + void disconnectSlots(); + public: /// \copydoc MOBase::IModList::displayName diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index d844cd39..30221f4b 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -145,30 +145,25 @@ QAtomicInt NexusInterface::NXMRequestInfo::s_NextID(0); NexusInterface::NexusInterface() : m_NMMVersion() { - atexit(&cleanup); - VS_FIXEDFILEINFO version = GetFileVersion(ToWString(QApplication::applicationFilePath())); m_MOVersion = VersionInfo(version.dwFileVersionMS >> 16, version.dwFileVersionMS & 0xFFFF, version.dwFileVersionLS >> 16); m_AccessManager = new NXMAccessManager(this, m_MOVersion.displayString()); - m_DiskCache = new QNetworkDiskCache(this); connect(m_AccessManager, SIGNAL(requestNXMDownload(QString)), this, SLOT(downloadRequestedNXM(QString))); } - -void NexusInterface::cleanup() -{ -} - - NXMAccessManager *NexusInterface::getAccessManager() { return m_AccessManager; } +NexusInterface::~NexusInterface() +{ + cleanup(); +} NexusInterface *NexusInterface::instance() { @@ -176,14 +171,12 @@ NexusInterface *NexusInterface::instance() return &s_Instance; } - void NexusInterface::setCacheDirectory(const QString &directory) { m_DiskCache->setCacheDirectory(directory); m_AccessManager->setCache(m_DiskCache); } - void NexusInterface::setNMMVersion(const QString &nmmVersion) { m_NMMVersion = nmmVersion; @@ -378,6 +371,14 @@ bool NexusInterface::requiresLogin(const NXMRequestInfo &info) || (info.m_Type == NXMRequestInfo::TYPE_DOWNLOADURL); } +void NexusInterface::cleanup() +{ +// delete m_AccessManager; +// delete m_DiskCache; + m_AccessManager = nullptr; + m_DiskCache = nullptr; +} + void NexusInterface::nextRequest() { if ((m_ActiveRequest.size() >= MAX_ACTIVE_DOWNLOADS) diff --git a/src/nexusinterface.h b/src/nexusinterface.h index cc54daa9..af2f8c75 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -130,6 +130,8 @@ class NexusInterface : public QObject public: + ~NexusInterface(); + static NexusInterface *instance(); /** @@ -137,6 +139,11 @@ public: **/ NXMAccessManager *getAccessManager(); + /** + * @brief cleanup this interface. this is destructive, afterwards it can't be used again + */ + void cleanup(); + /** * @brief request description for a mod * @@ -301,7 +308,6 @@ private: void nextRequest(); void requestFinished(std::list::iterator iter); bool requiresLogin(const NXMRequestInfo &info); - static void cleanup(); private: diff --git a/src/organizer.pro b/src/organizer.pro index bffd1e16..b24586e6 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -9,11 +9,15 @@ TARGET = ModOrganizer TEMPLATE = app greaterThan(QT_MAJOR_VERSION, 4) { - QT += core gui widgets network xml sql xmlpatterns qml quick script webkit + QT += core gui widgets network xml sql xmlpatterns qml declarative script webkit webkitwidgets } else { QT += core gui network xml declarative script sql xmlpatterns webkit } +!include(../LocalPaths.pri) { + message("paths to required libraries need to be set up in LocalPaths.pri") +} + SOURCES += \ transfersavesdialog.cpp \ syncoverwritedialog.cpp \ @@ -248,9 +252,9 @@ LIBS += -lDbgHelp #DEFINES += TEST_MODELS -INCLUDEPATH += ../shared ../archive ../uibase ../bsatk ../esptk ../boss_modified/boss-api "$(BOOSTPATH)" +INCLUDEPATH += ../shared ../archive ../uibase ../bsatk ../esptk ../boss_modified/boss-api "$${BOOSTPATH}" -LIBS += -L"$(BOOSTPATH)/stage/lib" +LIBS += -L"$${BOOSTPATH}/stage/lib" CONFIG(debug, debug|release) { LIBS += -L$$OUT_PWD/../shared/debug @@ -258,7 +262,8 @@ CONFIG(debug, debug|release) { LIBS += -L$$OUT_PWD/../uibase/debug LIBS += -L$$OUT_PWD/../boss_modified/debug LIBS += -lDbgHelp - PRE_TARGETDEPS += $$OUT_PWD/../shared/debug/mo_shared.lib \ + PRE_TARGETDEPS += \ + $$OUT_PWD/../shared/debug/mo_shared.lib \ $$OUT_PWD/../bsatk/debug/bsatk.lib } else { LIBS += -L$$OUT_PWD/../shared/release @@ -266,20 +271,19 @@ CONFIG(debug, debug|release) { LIBS += -L$$OUT_PWD/../uibase/release LIBS += -L$$OUT_PWD/../boss_modified/release QMAKE_CXXFLAGS += /Zi# /GL -# QMAKE_CXXFLAGS -= -O2 QMAKE_LFLAGS += /DEBUG# /LTCG /OPT:REF /OPT:ICF - PRE_TARGETDEPS += $$OUT_PWD/../shared/release/mo_shared.lib \ + PRE_TARGETDEPS += \ + $$OUT_PWD/../shared/release/mo_shared.lib \ $$OUT_PWD/../bsatk/release/bsatk.lib } #QMAKE_CXXFLAGS_WARN_ON -= -W3 #QMAKE_CXXFLAGS_WARN_ON += -W4 -QMAKE_CXXFLAGS += -wd4127 -wd4512 -wd4189 +QMAKE_CXXFLAGS += -wd4100 -wd4127 -wd4512 -wd4189 CONFIG += embed_manifest_exe # QMAKE_CXXFLAGS += /analyze - # QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'highestAvailable\' uiAccess=\'false\'\" TRANSLATIONS = organizer_de.ts \ @@ -313,9 +317,9 @@ TRANSLATIONS = organizer_de.ts \ LIBS += -lmo_shared -luibase -lshell32 -lole32 -luser32 -ladvapi32 -lgdi32 -lPsapi -lVersion -lbsatk -lshlwapi -LIBS += -L"$(ZLIBPATH)/build" -lzlibstatic +LIBS += -L"$${ZLIBPATH}/build" -lzlibstatic -DEFINES += UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS NOMINMAX +DEFINES += UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS _SCL_SECURE_NO_WARNINGS NOMINMAX DEFINES += BOOST_DISABLE_ASSERTS NDEBUG #DEFINES += QMLJSDEBUGGER @@ -324,40 +328,40 @@ HGID = $$system(hg id -i) DEFINES += HGID=\\\"$${HGID}\\\" CONFIG(debug, debug|release) { - OUTDIR = $$OUT_PWD/debug + SRCDIR = $$OUT_PWD/debug DSTDIR = $$PWD/../../outputd } else { - OUTDIR = $$OUT_PWD/release + SRCDIR = $$OUT_PWD/release DSTDIR = $$PWD/../../output } -SRCDIR = $$PWD +BASEDIR = $$PWD +BASEDIR ~= s,/,$$QMAKE_DIR_SEP,g SRCDIR ~= s,/,$$QMAKE_DIR_SEP,g -OUTDIR ~= s,/,$$QMAKE_DIR_SEP,g DSTDIR ~= s,/,$$QMAKE_DIR_SEP,g -QMAKE_POST_LINK += xcopy /y /I $$quote($$OUTDIR\\ModOrganizer*.exe) $$quote($$DSTDIR) $$escape_expand(\\n) -QMAKE_POST_LINK += xcopy /y /I $$quote($$OUTDIR\\ModOrganizer*.pdb) $$quote($$DSTDIR) $$escape_expand(\\n) -QMAKE_POST_LINK += xcopy /y /s /I $$quote($$SRCDIR\\stylesheets) $$quote($$DSTDIR)\\stylesheets $$escape_expand(\\n) -QMAKE_POST_LINK += xcopy /y /s /I $$quote($$SRCDIR\\tutorials) $$quote($$DSTDIR)\\tutorials $$escape_expand(\\n) -QMAKE_POST_LINK += xcopy /y /s /I $$quote($$SRCDIR\\*.qm) $$quote($$DSTDIR)\\translations $$escape_expand(\\n) +QMAKE_POST_LINK += xcopy /y /I $$quote($$SRCDIR\\ModOrganizer*.exe) $$quote($$DSTDIR) $$escape_expand(\\n) +QMAKE_POST_LINK += xcopy /y /I $$quote($$SRCDIR\\ModOrganizer*.pdb) $$quote($$DSTDIR) $$escape_expand(\\n) +QMAKE_POST_LINK += xcopy /y /s /I $$quote($$BASEDIR\\stylesheets) $$quote($$DSTDIR)\\stylesheets $$escape_expand(\\n) +QMAKE_POST_LINK += xcopy /y /s /I $$quote($$BASEDIR\\tutorials) $$quote($$DSTDIR)\\tutorials $$escape_expand(\\n) +QMAKE_POST_LINK += xcopy /y /s /I $$quote($$BASEDIR\\*.qm) $$quote($$DSTDIR)\\translations $$escape_expand(\\n) CONFIG(debug, debug|release) { greaterThan(QT_MAJOR_VERSION, 4) { - QMAKE_POST_LINK += xcopy /y /s /I $$quote($$SRCDIR\\..\\dlls.*manifest.debug.qt5) $$quote($$DSTDIR)\\dlls $$escape_expand(\\n) + QMAKE_POST_LINK += xcopy /y /s /I $$quote($$BASEDIR\\..\\dlls.*manifest.debug.qt5) $$quote($$DSTDIR)\\dlls $$escape_expand(\\n) QMAKE_POST_LINK += copy /y $$quote($$DSTDIR\\dlls\\dlls.manifest.debug.qt5) $$quote($$DSTDIR\\dlls\\dlls.manifest) $$escape_expand(\\n) QMAKE_POST_LINK += del $$quote($$DSTDIR)\\dlls\\dlls.manifest.debug.qt5 $$escape_expand(\\n) } else { - QMAKE_POST_LINK += xcopy /y /s /I $$quote($$SRCDIR\\..\\dlls.*manifest.debug) $$quote($$DSTDIR)\\dlls $$escape_expand(\\n) + QMAKE_POST_LINK += xcopy /y /s /I $$quote($$BASEDIR\\..\\dlls.*manifest.debug) $$quote($$DSTDIR)\\dlls $$escape_expand(\\n) QMAKE_POST_LINK += copy /y $$quote($$DSTDIR)\\dlls\\dlls.manifest.debug $$quote($$DSTDIR)\\dlls\\dlls.manifest $$escape_expand(\\n) QMAKE_POST_LINK += del $$quote($$DSTDIR)\\dlls\\dlls.manifest.debug $$escape_expand(\\n) } } else { greaterThan(QT_MAJOR_VERSION, 4) { - QMAKE_POST_LINK += xcopy /y /s /I $$quote($$SRCDIR\\..\\dlls.*manifest.qt5) $$quote($$DSTDIR)\\dlls $$escape_expand(\\n) + QMAKE_POST_LINK += xcopy /y /s /I $$quote($$BASEDIR\\..\\dlls.*manifest.qt5) $$quote($$DSTDIR)\\dlls $$escape_expand(\\n) QMAKE_POST_LINK += copy /y $$quote($$DSTDIR\\dlls\\dlls.manifest.qt5) $$quote($$DSTDIR\\dlls\\dlls.manifest) $$escape_expand(\\n) QMAKE_POST_LINK += del $$quote($$DSTDIR)\\dlls\\dlls.manifest.qt5 $$escape_expand(\\n) } else { - QMAKE_POST_LINK += xcopy /y /s /I $$quote($$SRCDIR\\..\\dlls.*manifest) $$quote($$DSTDIR)\\dlls $$escape_expand(\\n) + QMAKE_POST_LINK += xcopy /y /s /I $$quote($$BASEDIR\\..\\dlls.*manifest) $$quote($$DSTDIR)\\dlls $$escape_expand(\\n) } } diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index f37f9e3a..43246b55 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -33,6 +33,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include #include @@ -95,6 +96,8 @@ PluginList::PluginList(QObject *parent) PluginList::~PluginList() { + m_Refreshed.disconnect_all_slots(); + m_PluginMoved.disconnect_all_slots(); } @@ -484,7 +487,7 @@ void PluginList::saveTo(const QString &pluginFileName if (deleterFile.commitIfDifferent(m_LastSaveHash[deleterFileName])) { qDebug("%s saved", qPrintable(QDir::toNativeSeparators(deleterFileName))); } - } else { + } else if (QFile::exists(deleterFileName)) { shellDelete(QStringList() << deleterFileName); } diff --git a/src/pluginlist.h b/src/pluginlist.h index 67d1b640..8c06fefd 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -26,15 +26,16 @@ along with Mod Organizer. If not, see . #include #include #include +#ifndef Q_MOC_RUN #include #include +#endif #include #include #include "pdll.h" #include - template class ChangeBracket { public: @@ -212,6 +213,11 @@ public: void refreshLoadOrder(); + void disconnectSlots() { + m_PluginMoved.disconnect_all_slots(); + m_Refreshed.disconnect_all_slots(); + } + public: virtual PluginState state(const QString &name) const; @@ -333,13 +339,11 @@ private: mutable QTimer m_SaveTimer; SignalRefreshed m_Refreshed; + SignalPluginMoved m_PluginMoved; QTemporaryFile m_TempFile; - SignalPluginMoved m_PluginMoved; }; - - #endif // PLUGINLIST_H diff --git a/src/settings.cpp b/src/settings.cpp index 6bf13ee0..65ea3a27 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -132,7 +132,6 @@ void Settings::registerPlugin(IPlugin *plugin) } } - QString Settings::obfuscate(const QString &password) const { QByteArray temp = password.toUtf8(); diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index e0914870..5d785822 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -936,10 +936,6 @@ void FileRegister::removeOriginMulti(std::set indices, int ori } } - if (removedFiles.size() > 0) { - log("%d files actually removed", removedFiles.size()); - } - // optimization: this is only called when disabling an origin and in this case we don't have // to remove the file from the origin diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index 7836d719..096f373e 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -29,8 +29,10 @@ along with Mod Organizer. If not, see . #define WIN32_MEAN_AND_LEAN #include #include +#ifndef Q_MOC_RUN #include #include +#endif #include "util.h" diff --git a/src/shared/shared.pro b/src/shared/shared.pro index 84a9c274..69f6f2e6 100644 --- a/src/shared/shared.pro +++ b/src/shared/shared.pro @@ -11,33 +11,11 @@ TARGET = mo_shared TEMPLATE = lib CONFIG += staticlib -INCLUDEPATH += ../bsatk "$(BOOSTPATH)" - -# only for custom leak detection -DEFINES += TRACE_LEAKS -LIBS += -lDbgHelp - - -CONFIG(debug, debug|release) { - LIBS += -L$$OUT_PWD/../bsatk/debug - LIBS += -lDbgHelp - QMAKE_CXXFLAGS_DEBUG -= -Zi - QMAKE_CXXFLAGS += -Z7 - PRE_TARGETDEPS += $$OUT_PWD/../bsatk/debug/bsatk.lib -} else { - LIBS += -L$$OUT_PWD/../bsatk/release - PRE_TARGETDEPS += $$OUT_PWD/../bsatk/release/bsatk.lib +!include(../LocalPaths.pri) { + message("paths to required libraries need to be set up in LocalPaths.pri") } -LIBS += -lbsatk - -DEFINES += UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS - -DEFINES += BOOST_DISABLE_ASSERTS NDEBUG - -# QMAKE_CXXFLAGS += /analyze - SOURCES += \ inject.cpp \ windows_error.cpp \ @@ -66,3 +44,30 @@ HEADERS += \ appconfig.h \ appconfig.inc \ leaktrace.h + + +# only for custom leak detection +DEFINES += TRACE_LEAKS +LIBS += -lDbgHelp + + +CONFIG(debug, debug|release) { + LIBS += -L$$OUT_PWD/../bsatk/debug + LIBS += -lDbgHelp + QMAKE_CXXFLAGS_DEBUG -= -Zi + QMAKE_CXXFLAGS += -Z7 + PRE_TARGETDEPS += $$OUT_PWD/../bsatk/debug/bsatk.lib +} else { + LIBS += -L$$OUT_PWD/../bsatk/release + PRE_TARGETDEPS += $$OUT_PWD/../bsatk/release/bsatk.lib +} + +LIBS += -lbsatk + +DEFINES += UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + +DEFINES += BOOST_DISABLE_ASSERTS NDEBUG + +# QMAKE_CXXFLAGS += /analyze + +INCLUDEPATH += ../bsatk "$${BOOSTPATH}" diff --git a/src/tutorials/TutorialOverlay.qml b/src/tutorials/TutorialOverlay.qml index 34959d7d..f2aad027 100644 --- a/src/tutorials/TutorialOverlay.qml +++ b/src/tutorials/TutorialOverlay.qml @@ -1,4 +1,3 @@ -// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5 import QtQuick 1.1 import "tutorials.js" as Logic @@ -21,10 +20,11 @@ Rectangle { function enableBackground(enabled) { disabledBackground.visible = enabled } - +/* signal nextStep - onNextStep: { + onNextStep: {*/ + function nextStep() { if (step == 0) { Logic.init() } diff --git a/src/tutorials/tutorial_firststeps_main.js b/src/tutorials/tutorial_firststeps_main.js index 4f9c1a74..5ee4e790 100644 --- a/src/tutorials/tutorial_firststeps_main.js +++ b/src/tutorials/tutorial_firststeps_main.js @@ -15,19 +15,24 @@ function getTutorialSteps() function() { tutorial.text = qsTr("The highlighted button provides hints on solving problems MO recognized automatically.") - if (!tutorialControl.waitForAction("actionProblems")) { - highlightAction("actionProblems", false) - waitForClick() - } else { + if (tutorialControl.waitForAction("actionProblems")) { tutorial.text += qsTr("\nThere IS a problem now but you may want to hold off on fixing it until after completing the tutorial.") highlightAction("actionProblems", true) + } else { + highlightAction("actionProblems", false) + waitForClick() } }, function() { + console.log("next") tutorial.text = qsTr("This button provides multiple sources of information and further tutorials.") - highlightItem("actionHelp", true) - tutorialControl.waitForButton("actionHelp") + if (tutorialControl.waitForButton("actionHelp")) { + highlightItem("actionHelp", true) + } else { + console.error("help button broken") + waitForClick() + } }, function() { @@ -47,12 +52,16 @@ function getTutorialSteps() function() { tutorial.text = qsTr("Before we start installing mods, let's have a quick look at the settings.") manager.activateTutorial("SettingsDialog", "tutorial_firststeps_settings.js") - highlightAction("actionSettings", true) - tutorialControl.waitForAction("actionSettings") + if (tutorialControl.waitForAction("actionSettings")) { + highlightAction("actionSettings", true) + } else { + console.error("settings action broken") + waitForClick() + } }, function() { - tutorial.text = qsTr("Now it's time to install a few mods!" + tutorial.text = qsTr("Now it's time to install a few mods!" + "Please go along with this because we need a few mods installed to demonstrate other features") waitForClick() }, @@ -61,8 +70,12 @@ function getTutorialSteps() tutorial.text = qsTr("There are a few ways to get mods into ModOrganizer. " + "If you associated MO with NXM links in the settings you can now use your regular browser to send downloads from Nexus to MO. " + "Click on \"Nexus\" to open nexus, find a mod and click the green download buttons on Nexus saying \"Download with Manager\".") - highlightAction("actionNexus", true) - tutorialControl.waitForAction("actionNexus") + if (tutorialControl.waitForAction("actionNexus")) { + highlightAction("actionNexus", true) + } else { + console.error("browser action broken") + waitForClick() + } }, function() { -- cgit v1.3.1 From 93bd29c13d3355b2544c2fd40dff1f4f985f9b57 Mon Sep 17 00:00:00 2001 From: Tannin Date: Wed, 24 Sep 2014 19:51:51 +0200 Subject: - several style fixes suggested by static analysis - will now support up to 4 levels of version numbers (major.minor.subminor.subsubminor --- src/browserdialog.cpp | 2 +- src/categories.cpp | 8 +++--- src/installationmanager.h | 2 +- src/main.cpp | 11 +++----- src/mainwindow.cpp | 55 +++++++++++++++++++--------------------- src/modinfo.cpp | 2 +- src/modlist.cpp | 8 ++++-- src/modlist.h | 2 +- src/modlistsortproxy.cpp | 2 +- src/nexusinterface.cpp | 5 +++- src/pluginlist.cpp | 50 ++++++++++++++++++------------------- src/profile.cpp | 4 ++- src/selfupdater.h | 3 ++- src/settings.cpp | 2 +- src/shared/directoryentry.cpp | 6 ++--- src/shared/directoryentry.h | 2 +- src/shared/fallout3info.cpp | 21 ++++++++-------- src/shared/fallout3info.h | 6 ++--- src/shared/falloutnvinfo.cpp | 58 +++++++++++++++++++------------------------ src/shared/falloutnvinfo.h | 6 ++--- src/shared/gameinfo.cpp | 40 ++++++++--------------------- src/shared/leaktrace.cpp | 2 +- src/shared/oblivioninfo.cpp | 21 ++++++++-------- src/shared/oblivioninfo.h | 6 ++--- src/shared/skyriminfo.cpp | 53 ++++++++++++++++++--------------------- src/shared/skyriminfo.h | 8 +++--- 26 files changed, 176 insertions(+), 209 deletions(-) (limited to 'src/shared/directoryentry.cpp') diff --git a/src/browserdialog.cpp b/src/browserdialog.cpp index 521459d0..f93ffcae 100644 --- a/src/browserdialog.cpp +++ b/src/browserdialog.cpp @@ -22,10 +22,10 @@ along with Mod Organizer. If not, see . #include "messagedialog.h" #include "report.h" -#include "json.h" #include "persistentcookiejar.h" #include +#include "json.h" #include #include diff --git a/src/categories.cpp b/src/categories.cpp index 28b1f4a2..57e18a28 100644 --- a/src/categories.cpp +++ b/src/categories.cpp @@ -232,7 +232,7 @@ void CategoryFactory::loadDefaultCategories() int CategoryFactory::getParentID(unsigned int index) const { - if ((index < 0) || (index >= m_Categories.size())) { + if (index >= m_Categories.size()) { throw MyException(QObject::tr("invalid index %1").arg(index)); } @@ -267,7 +267,7 @@ bool CategoryFactory::isDecendantOf(int id, int parentID) const bool CategoryFactory::hasChildren(unsigned int index) const { - if ((index < 0) || (index >= m_Categories.size())) { + if (index >= m_Categories.size()) { throw MyException(QObject::tr("invalid index %1").arg(index)); } @@ -277,7 +277,7 @@ bool CategoryFactory::hasChildren(unsigned int index) const QString CategoryFactory::getCategoryName(unsigned int index) const { - if ((index < 0) || (index >= m_Categories.size())) { + if (index >= m_Categories.size()) { throw MyException(QObject::tr("invalid index %1").arg(index)); } @@ -287,7 +287,7 @@ QString CategoryFactory::getCategoryName(unsigned int index) const int CategoryFactory::getCategoryID(unsigned int index) const { - if ((index < 0) || (index >= m_Categories.size())) { + if (index >= m_Categories.size()) { throw MyException(QObject::tr("invalid index %1").arg(index)); } diff --git a/src/installationmanager.h b/src/installationmanager.h index d430c065..336c1ce3 100644 --- a/src/installationmanager.h +++ b/src/installationmanager.h @@ -55,7 +55,7 @@ public: **/ explicit InstallationManager(QWidget *parent); - ~InstallationManager(); + virtual ~InstallationManager(); /** * @brief update the directory where mods are to be installed diff --git a/src/main.cpp b/src/main.cpp index 3198208a..642bfa1a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -455,14 +455,9 @@ int main(int argc, char *argv[]) settings.setValue("gamePath", gamePath.toUtf8().constData()); } - int edition = 0; - if (settings.contains("game_edition")) { - edition = settings.value("game_edition").toInt(); - } else { + if (!settings.contains("game_edition")) { std::vector editions = GameInfo::instance().getSteamVariants(); - if (editions.size() < 2) { - edition = 0; - } else { + if (editions.size() > 1) { SelectionDialog selection(QObject::tr("Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!)"), NULL); int index = 0; for (auto iter = editions.begin(); iter != editions.end(); ++iter) { @@ -475,7 +470,7 @@ int main(int argc, char *argv[]) } } } - +#pragma message("edition isn't used?") qDebug("managing game at %s", qPrintable(QDir::toNativeSeparators(gamePath))); ExecutablesList executablesList; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ae5c1e48..19be758e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1137,7 +1137,6 @@ void MainWindow::registerPluginTool(IPluginTool *tool) void MainWindow::registerModPage(IPluginModPage *modPage) { - QToolButton *browserBtn = NULL; // turn the browser action into a drop-down menu if necessary if (ui->actionNexus->menu() == NULL) { QAction *nexusAction = ui->actionNexus; @@ -1147,10 +1146,8 @@ void MainWindow::registerModPage(IPluginModPage *modPage) ui->toolBar->removeAction(nexusAction); actionToToolButton(ui->actionNexus); - browserBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionNexus)); + QToolButton *browserBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionNexus)); browserBtn->menu()->addAction(nexusAction); - } else { - browserBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionNexus)); } QAction *action = new QAction(modPage->icon(), modPage->displayName(), ui->toolBar); @@ -1434,30 +1431,32 @@ void MainWindow::spawnBinary(const QFileInfo &binary, const QString &arguments, DWORD retLen; JOBOBJECT_BASIC_PROCESS_ID_LIST info; - bool isJobHandle = true; + { + bool isJobHandle = true; - DWORD res = ::MsgWaitForMultipleObjects(1, &processHandle, false, 1000, QS_KEY | QS_MOUSE); - while ((res != WAIT_FAILED) && (res != WAIT_OBJECT_0) && !dialog->unlockClicked()) { - if (isJobHandle) { - if (::QueryInformationJobObject(processHandle, JobObjectBasicProcessIdList, &info, sizeof(info), &retLen) > 0) { - if (info.NumberOfProcessIdsInList == 0) { - break; - } - } else { - // the info-object I passed only provides space for 1 process id. but since this code only cares about whether there - // is more than one that's good enough. ERROR_MORE_DATA simply signals there are at least two processes running. - // any other error probably means the handle is a regular process handle, probably caused by running MO in a job without - // the right to break out. - if (::GetLastError() != ERROR_MORE_DATA) { - isJobHandle = false; + DWORD res = ::MsgWaitForMultipleObjects(1, &processHandle, false, 1000, QS_KEY | QS_MOUSE); + while ((res != WAIT_FAILED) && (res != WAIT_OBJECT_0) && !dialog->unlockClicked()) { + if (isJobHandle) { + if (::QueryInformationJobObject(processHandle, JobObjectBasicProcessIdList, &info, sizeof(info), &retLen) > 0) { + if (info.NumberOfProcessIdsInList == 0) { + break; + } + } else { + // the info-object I passed only provides space for 1 process id. but since this code only cares about whether there + // is more than one that's good enough. ERROR_MORE_DATA simply signals there are at least two processes running. + // any other error probably means the handle is a regular process handle, probably caused by running MO in a job without + // the right to break out. + if (::GetLastError() != ERROR_MORE_DATA) { + isJobHandle = false; + } } } - } - // keep processing events so the app doesn't appear dead - QCoreApplication::processEvents(); + // keep processing events so the app doesn't appear dead + QCoreApplication::processEvents(); - res = ::MsgWaitForMultipleObjects(1, &processHandle, false, 1000, QS_KEY | QS_MOUSE); + res = ::MsgWaitForMultipleObjects(1, &processHandle, false, 1000, QS_KEY | QS_MOUSE); + } } ::CloseHandle(processHandle); @@ -2191,11 +2190,7 @@ void MainWindow::storeSettings() QSettings::Status result = QSettings::NoError; { QSettings settings(iniFile + ".new", QSettings::IniFormat); - if (m_CurrentProfile != NULL) { - settings.setValue("selected_profile", m_CurrentProfile->getName().toUtf8().constData()); - } else { - settings.remove("selected_profile"); - } + settings.setValue("selected_profile", m_CurrentProfile->getName().toUtf8().constData()); settings.setValue("mod_list_state", ui->modList->header()->saveState()); settings.setValue("plugin_list_state", ui->espList->header()->saveState()); @@ -5560,11 +5555,11 @@ void MainWindow::on_bossButton_clicked() DWORD retLen; JOBOBJECT_BASIC_PROCESS_ID_LIST info; - bool isJobHandle = true; - ULONG lastProcessID; HANDLE processHandle = loot; if (loot != INVALID_HANDLE_VALUE) { + bool isJobHandle = true; + ULONG lastProcessID; DWORD res = ::MsgWaitForMultipleObjects(1, &loot, false, 1000, QS_KEY | QS_MOUSE); while ((res != WAIT_FAILED) && (res != WAIT_OBJECT_0)) { if (isJobHandle) { diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 796dab71..189e67b2 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -156,7 +156,7 @@ bool ModInfo::removeMod(unsigned int index) auto iter = s_ModsByModID.find(modInfo->getNexusID()); if (iter != s_ModsByModID.end()) { std::vector indices = iter->second; - std::remove(indices.begin(), indices.end(), index); + indices.erase(std::remove(indices.begin(), indices.end(), index), indices.end()); s_ModsByModID[modInfo->getNexusID()] = indices; } diff --git a/src/modlist.cpp b/src/modlist.cpp index eedf1ec6..fb8df15e 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -49,8 +49,12 @@ using namespace MOBase; ModList::ModList(QObject *parent) - : QAbstractItemModel(parent), m_Profile(NULL), m_Modified(false), - m_FontMetrics(QFont()), m_DropOnItems(false) + : QAbstractItemModel(parent) + , m_Profile(NULL) + , m_NexusInterface(NULL) + , m_Modified(false) + , m_FontMetrics(QFont()) + , m_DropOnItems(false) { m_ContentIcons[ModInfo::CONTENT_PLUGIN] = std::make_tuple(QIcon(":/MO/gui/content/plugin"), ":/MO/gui/content/plugin", tr("Game plugins (esp/esm)")); m_ContentIcons[ModInfo::CONTENT_INTERFACE] = std::make_tuple(QIcon(":/MO/gui/content/interface"), ":/MO/gui/content/interface", tr("Interface")); diff --git a/src/modlist.h b/src/modlist.h index 632689c6..cf52b2ec 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -267,7 +267,7 @@ private: struct TModInfo { TModInfo(unsigned int index, ModInfo::Ptr modInfo) - : modInfo(modInfo), nameOrder(index) {} + : modInfo(modInfo), nameOrder(index), priorityOrder(0), modIDOrder(0), categoryOrder(0) {} ModInfo::Ptr modInfo; unsigned int nameOrder; unsigned int priorityOrder; diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp index da5d99d5..8907e712 100644 --- a/src/modlistsortproxy.cpp +++ b/src/modlistsortproxy.cpp @@ -298,7 +298,7 @@ bool ModListSortProxy::filterMatchesModOr(ModInfo::Ptr info, bool enabled) const } break; case CategoryFactory::CATEGORY_SPECIAL_NOTENDORSED: { ModInfo::EEndorsedState state = info->endorsedState(); - if ((state == ModInfo::ENDORSED_FALSE) && (state != ModInfo::ENDORSED_NEVER)) return true; + if ((state == ModInfo::ENDORSED_FALSE) || (state == ModInfo::ENDORSED_NEVER)) return true; } break; case CategoryFactory::CATEGORY_SPECIAL_MANAGED: { if (!info->hasFlag(ModInfo::FLAG_FOREIGN)) return true; diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index 30221f4b..b4006097 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -20,7 +20,7 @@ along with Mod Organizer. If not, see . #include "nexusinterface.h" #include "nxmaccessmanager.h" #include "utility.h" -#include +#include "json.h" #include "selectiondialog.h" #include #include @@ -580,6 +580,7 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID , m_URL(url) , m_SubModule(subModule) , m_NexusGameID(nexusGameId) + , m_Endorse(false) {} NexusInterface::NXMRequestInfo::NXMRequestInfo(std::vector modIDList @@ -600,6 +601,7 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(std::vector modIDList , m_URL(url) , m_SubModule(subModule) , m_NexusGameID(nexusGameId) + , m_Endorse(false) {} NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID @@ -620,4 +622,5 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID , m_URL(url) , m_SubModule(subModule) , m_NexusGameID(nexusGameId) + , m_Endorse(false) {} diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index ff370fa4..973e3cfc 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -685,7 +685,7 @@ QString PluginList::origin(const QString &name) const { auto iter = m_ESPsByName.find(name.toLower()); if (iter == m_ESPsByName.end()) { - return false; + return QString(); } else { return m_ESPs[iter->second].m_OriginName; } @@ -836,7 +836,7 @@ QVariant PluginList::data(const QModelIndex &modelIndex, int role) const std::set_difference(m_ESPs[index].m_Masters.begin(), m_ESPs[index].m_Masters.end(), m_ESPs[index].m_MasterUnset.begin(), m_ESPs[index].m_MasterUnset.end(), std::inserter(enabledMasters, enabledMasters.end())); - if (enabledMasters.size() > 0) { + if (!enabledMasters.empty()) { text += "
    " + tr("Enabled Masters") + ": " + SetJoin(enabledMasters, ", "); } if (m_ESPs[index].m_HasIni) { @@ -1102,34 +1102,34 @@ bool PluginList::eventFilter(QObject *obj, QEvent *event) ((keyEvent->key() == Qt::Key_Up) || (keyEvent->key() == Qt::Key_Down))) { QItemSelectionModel *selectionModel = itemView->selectionModel(); const QSortFilterProxyModel *proxyModel = qobject_cast(selectionModel->model()); - int diff = -1; - if (((keyEvent->key() == Qt::Key_Up) && (proxyModel->sortOrder() == Qt::DescendingOrder)) || - ((keyEvent->key() == Qt::Key_Down) && (proxyModel->sortOrder() == Qt::AscendingOrder))) { - diff = 1; - } - QModelIndexList rows = selectionModel->selectedRows(); - // remove elements that aren't supposed to be movable - QMutableListIterator iter(rows); - while (iter.hasNext()) { - if ((iter.next().flags() & Qt::ItemIsDragEnabled) == 0) { - iter.remove(); + if (proxyModel != NULL) { + int diff = -1; + if (((keyEvent->key() == Qt::Key_Up) && (proxyModel->sortOrder() == Qt::DescendingOrder)) || + ((keyEvent->key() == Qt::Key_Down) && (proxyModel->sortOrder() == Qt::AscendingOrder))) { + diff = 1; } - } - if (keyEvent->key() == Qt::Key_Down) { - for (int i = 0; i < rows.size() / 2; ++i) { - rows.swap(i, rows.size() - i - 1); + QModelIndexList rows = selectionModel->selectedRows(); + // remove elements that aren't supposed to be movable + QMutableListIterator iter(rows); + while (iter.hasNext()) { + if ((iter.next().flags() & Qt::ItemIsDragEnabled) == 0) { + iter.remove(); + } } - } - foreach (QModelIndex idx, rows) { - if (proxyModel != NULL) { - idx = proxyModel->mapToSource(idx); + if (keyEvent->key() == Qt::Key_Down) { + for (int i = 0; i < rows.size() / 2; ++i) { + rows.swap(i, rows.size() - i - 1); + } } - int newPriority = m_ESPs[idx.row()].m_Priority + diff; - if ((newPriority >= 0) && (newPriority < rowCount())) { - setPluginPriority(idx.row(), newPriority); + foreach (QModelIndex idx, rows) { + idx = proxyModel->mapToSource(idx); + int newPriority = m_ESPs[idx.row()].m_Priority + diff; + if ((newPriority >= 0) && (newPriority < rowCount())) { + setPluginPriority(idx.row(), newPriority); + } } + refreshLoadOrder(); } - refreshLoadOrder(); return true; } else if (keyEvent->key() == Qt::Key_Space) { QItemSelectionModel *selectionModel = itemView->selectionModel(); diff --git a/src/profile.cpp b/src/profile.cpp index 77e4f813..958084d7 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -585,7 +585,9 @@ void Profile::mergeTweaks(ModInfo::Ptr modInfo, const QString &tweakedIni) const bool Profile::invalidationActive(bool *supported) const { if (GameInfo::instance().requiresBSAInvalidation()) { - *supported = true; + if (supported != NULL) { + *supported = true; + } wchar_t buffer[1024]; std::wstring iniFileName = ToWString(QDir::toNativeSeparators(getIniFileName())); // epic ms fail: GetPrivateProfileString uses errno (for whatever reason) to signal a fail since the return value diff --git a/src/selfupdater.h b/src/selfupdater.h index 9648f15a..75b0ff45 100644 --- a/src/selfupdater.h +++ b/src/selfupdater.h @@ -65,7 +65,8 @@ public: * @todo passing the nexus interface is unneccessary **/ SelfUpdater(NexusInterface *nexusInterface, QWidget *parent); - ~SelfUpdater(); + + virtual ~SelfUpdater(); /** * @brief start the update process diff --git a/src/settings.cpp b/src/settings.cpp index 04a5f279..0ca811a3 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -25,7 +25,7 @@ along with Mod Organizer. If not, see . #include #include #include -#include +#include "json.h" #include #include diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 5d785822..24868a93 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -325,13 +325,13 @@ static bool ByOriginPriority(DirectoryEntry *entry, int LHS, int RHS) FileEntry::FileEntry() - : m_Index(UINT_MAX), m_Name(), m_Parent(NULL), m_LastAccessed(time(NULL)) + : m_Index(UINT_MAX), m_Name(), m_Origin(-1), m_Parent(NULL), m_LastAccessed(time(NULL)) { LEAK_TRACE; } FileEntry::FileEntry(Index index, const std::wstring &name, DirectoryEntry *parent) - : m_Index(index), m_Name(name), m_Parent(parent), m_Origin(-1), m_Archive(L""), m_LastAccessed(time(NULL)) + : m_Index(index), m_Name(name), m_Origin(-1), m_Parent(parent), m_Archive(L""), m_LastAccessed(time(NULL)) { LEAK_TRACE; } @@ -636,7 +636,7 @@ void DirectoryEntry::insertFile(const std::wstring &filePath, FilesOrigin &origi void DirectoryEntry::removeFile(FileEntry::Index index) { - if (m_Files.size() != 0) { + if (!m_Files.empty()) { auto iter = std::find_if(m_Files.begin(), m_Files.end(), [&index](const std::pair &iter) -> bool { return iter.second == index; } ); diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index 096f373e..d588ab02 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -219,7 +219,7 @@ public: void clear(); bool isPopulated() const { return m_Populated; } - bool isEmpty() const { return (m_Files.size() == 0) && (m_SubDirectories.size() == 0); } + bool isEmpty() const { return m_Files.empty() && m_SubDirectories.empty(); } const DirectoryEntry *getParent() const { return m_Parent; } diff --git a/src/shared/fallout3info.cpp b/src/shared/fallout3info.cpp index 9487d2de..22db91ac 100644 --- a/src/shared/fallout3info.cpp +++ b/src/shared/fallout3info.cpp @@ -54,15 +54,17 @@ std::wstring Fallout3Info::getRegPathStatic() 0, KEY_QUERY_VALUE, &key); if (errorcode != ERROR_SUCCESS) { - return L""; + return std::wstring(); } WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - errorcode = ::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize); - - return std::wstring(temp); + if (::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + return std::wstring(temp); + } else { + return std::wstring(); + } } std::wstring Fallout3Info::getInvalidationBSA() @@ -233,15 +235,12 @@ void Fallout3Info::createProfile(const std::wstring &directory, bool useDefaults } } { // copy falloutprefs.ini-file - std::wstring target = directory.substr().append(L"\\falloutprefs.ini"); + std::wstring target = directory + L"\\falloutprefs.ini"; if (!FileExists(target)) { - std::wostringstream source; - source << getMyGamesDirectory() << L"\\Fallout3\\falloutprefs.ini"; - if (!::CopyFileW(source.str().c_str(), target.c_str(), true)) { + std::wstring source = getMyGamesDirectory() + L"\\Fallout3\\falloutprefs.ini"; + if (!::CopyFileW(source.c_str(), target.c_str(), true)) { if (::GetLastError() != ERROR_FILE_EXISTS) { - std::ostringstream stream; - stream << "failed to copy ini file: " << ToString(source.str(), false); - throw windows_error(stream.str()); + throw windows_error(std::string("failed to copy ini file: ") + ToString(source, false)); } } } diff --git a/src/shared/fallout3info.h b/src/shared/fallout3info.h index 8e4c260d..d1356de1 100644 --- a/src/shared/fallout3info.h +++ b/src/shared/fallout3info.h @@ -38,7 +38,7 @@ public: virtual unsigned long getBSAVersion(); static std::wstring getRegPathStatic(); - virtual std::wstring getRegPath() { return Fallout3Info::getRegPathStatic(); } + virtual std::wstring getRegPath() { return getRegPathStatic(); } virtual std::wstring getBinaryName() { return L"Fallout3.exe"; } virtual GameInfo::Type getType() { return TYPE_FALLOUT3; } @@ -75,9 +75,9 @@ public: virtual std::wstring getNexusPage(bool nmmScheme = true); static std::wstring getNexusInfoUrlStatic(); - virtual std::wstring getNexusInfoUrl() { return Fallout3Info::getNexusInfoUrlStatic(); } + virtual std::wstring getNexusInfoUrl() { return getNexusInfoUrlStatic(); } static int getNexusModIDStatic(); - virtual int getNexusModID() { return Fallout3Info::getNexusModIDStatic(); } + virtual int getNexusModID() { return getNexusModIDStatic(); } virtual int getNexusGameID() { return 120; } virtual void createProfile(const std::wstring &directory, bool useDefaults); diff --git a/src/shared/falloutnvinfo.cpp b/src/shared/falloutnvinfo.cpp index 9bba7fe4..0dde4db1 100644 --- a/src/shared/falloutnvinfo.cpp +++ b/src/shared/falloutnvinfo.cpp @@ -55,15 +55,17 @@ std::wstring FalloutNVInfo::getRegPathStatic() 0, KEY_QUERY_VALUE, &key); if (errorcode != ERROR_SUCCESS) { - return L""; + return std::wstring(); } WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - errorcode = ::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize); - - return std::wstring(temp); + if (::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + return std::wstring(temp); + } else { + return std::wstring(); + } } std::wstring FalloutNVInfo::getInvalidationBSA() @@ -162,56 +164,46 @@ std::wstring FalloutNVInfo::getSteamAPPId(int) const void FalloutNVInfo::createProfile(const std::wstring &directory, bool useDefaults) { - std::wostringstream target; + std::wstring target = directory + L"\\plugins.txt"; // copy plugins.txt - target << directory << "\\plugins.txt"; - - if (!FileExists(target.str())) { - std::wostringstream source; - source << getLocalAppFolder() << "\\FalloutNV\\plugins.txt"; - if (!::CopyFileW(source.str().c_str(), target.str().c_str(), true)) { - HANDLE file = ::CreateFileW(target.str().c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + if (!FileExists(target)) { + std::wstring source = getLocalAppFolder() + L"\\FalloutNV\\plugins.txt"; + if (!::CopyFileW(source.c_str(), target.c_str(), true)) { + HANDLE file = ::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); ::CloseHandle(file); } } // copy ini-file - target.str(L""); target.clear(); - target << directory << L"\\fallout.ini"; + target = directory + L"\\fallout.ini"; - if (!FileExists(target.str())) { - std::wostringstream source; + if (!FileExists(target)) { + std::wstring source; if (useDefaults) { - source << getGameDirectory() << L"\\fallout_default.ini"; + source = getGameDirectory() + L"\\fallout_default.ini"; } else { - source << getMyGamesDirectory() << L"\\FalloutNV"; - if (FileExists(source.str(), L"fallout.ini")) { - source << L"\\fallout.ini"; + source = getMyGamesDirectory() + L"\\FalloutNV"; + if (FileExists(source, L"fallout.ini")) { + source += L"\\fallout.ini"; } else { - source.str(L""); - source << getGameDirectory() << L"\\fallout_default.ini"; + source = getGameDirectory() + L"\\fallout_default.ini"; } } - if (!::CopyFileW(source.str().c_str(), target.str().c_str(), true)) { + if (!::CopyFileW(source.c_str(), target.c_str(), true)) { if (::GetLastError() != ERROR_FILE_EXISTS) { - std::ostringstream stream; - stream << "failed to copy ini file: " << ToString(source.str(), false); - throw windows_error(stream.str()); + throw windows_error("failed to copy ini file: " + ToString(source, false)); } } } { // copy falloutprefs.ini-file - std::wstring target = directory.substr().append(L"\\falloutprefs.ini"); + std::wstring target = directory + L"\\falloutprefs.ini"; if (!FileExists(target)) { - std::wostringstream source; - source << getMyGamesDirectory() << L"\\FalloutNV\\falloutprefs.ini"; - if (!::CopyFileW(source.str().c_str(), target.c_str(), true)) { + std::wstring source = getMyGamesDirectory() + L"\\FalloutNV\\falloutprefs.ini"; + if (!::CopyFileW(source.c_str(), target.c_str(), true)) { if (::GetLastError() != ERROR_FILE_EXISTS) { - std::ostringstream stream; - stream << "failed to copy ini file: " << ToString(source.str(), false); - throw windows_error(stream.str()); + throw windows_error("failed to copy ini file: " + ToString(source, false)); } } } diff --git a/src/shared/falloutnvinfo.h b/src/shared/falloutnvinfo.h index cfd373c7..50a0d00d 100644 --- a/src/shared/falloutnvinfo.h +++ b/src/shared/falloutnvinfo.h @@ -38,7 +38,7 @@ public: virtual unsigned long getBSAVersion(); static std::wstring getRegPathStatic(); - virtual std::wstring getRegPath() { return FalloutNVInfo::getRegPathStatic(); } + virtual std::wstring getRegPath() { return getRegPathStatic(); } virtual std::wstring getBinaryName() { return L"FalloutNV.exe"; } virtual GameInfo::Type getType() { return TYPE_FALLOUTNV; } @@ -76,9 +76,9 @@ public: virtual std::wstring getNexusPage(bool nmmScheme = true); static std::wstring getNexusInfoUrlStatic(); - virtual std::wstring getNexusInfoUrl() { return FalloutNVInfo::getNexusInfoUrlStatic(); } + virtual std::wstring getNexusInfoUrl() { return getNexusInfoUrlStatic(); } static int getNexusModIDStatic(); - virtual int getNexusModID() { return FalloutNVInfo::getNexusModIDStatic(); } + virtual int getNexusModID() { return getNexusModIDStatic(); } virtual int getNexusGameID() { return 130; } virtual void createProfile(const std::wstring &directory, bool useDefaults); diff --git a/src/shared/gameinfo.cpp b/src/shared/gameinfo.cpp index 21e9a586..5439efff 100644 --- a/src/shared/gameinfo.cpp +++ b/src/shared/gameinfo.cpp @@ -57,7 +57,7 @@ void GameInfo::identifyMyGamesDirectory(const std::wstring &file) { // this function attempts 3 (three!) ways to determine the correct "My Games" folder. wchar_t myDocuments[MAX_PATH]; - memset(myDocuments, '\0', MAX_PATH); + memset(myDocuments, '\0', MAX_PATH * sizeof(wchar_t)); m_MyGamesDirectory.clear(); @@ -137,71 +137,53 @@ std::wstring GameInfo::getGameDirectory() const std::wstring GameInfo::getModsDir() const { - std::wostringstream temp; - temp << m_OrganizerDataDirectory << L"\\mods"; - return temp.str(); + return m_OrganizerDirectory + L"\\mods"; } std::wstring GameInfo::getProfilesDir() const { - std::wostringstream temp; - temp << m_OrganizerDataDirectory << L"\\profiles"; - return temp.str(); + return m_OrganizerDirectory + L"\\profiles"; } std::wstring GameInfo::getIniFilename() const { - std::wostringstream temp; - temp << m_OrganizerDataDirectory << L"\\ModOrganizer.ini"; - return temp.str(); + return m_OrganizerDirectory + L"\\ModOrganizer.ini"; } std::wstring GameInfo::getDownloadDir() const { - std::wostringstream temp; - temp << m_OrganizerDataDirectory << L"\\downloads"; - return temp.str(); + return m_OrganizerDirectory + L"\\downloads"; } std::wstring GameInfo::getCacheDir() const { - std::wostringstream temp; - temp << m_OrganizerDataDirectory << L"\\webcache"; - return temp.str(); + return m_OrganizerDirectory + L"\\webcache"; } std::wstring GameInfo::getOverwriteDir() const { - std::wostringstream temp; - temp << m_OrganizerDataDirectory << "\\overwrite"; - return temp.str(); + return m_OrganizerDirectory + L"\\overwrite"; } std::wstring GameInfo::getLogDir() const { - std::wostringstream temp; - temp << m_OrganizerDataDirectory << "\\logs"; - return temp.str(); + return m_OrganizerDirectory + L"\\logs"; } std::wstring GameInfo::getLootDir() const { - std::wostringstream temp; - temp << m_OrganizerDirectory << "\\loot"; - return temp.str(); + return m_OrganizerDirectory + L"\\loot"; } std::wstring GameInfo::getTutorialDir() const { - std::wostringstream temp; - temp << m_OrganizerDirectory << "\\tutorials"; - return temp.str(); + return m_OrganizerDirectory + L"\\tutorials"; } @@ -219,7 +201,7 @@ std::vector GameInfo::getSteamVariants() const std::wstring GameInfo::getLocalAppFolder() const { wchar_t localAppFolder[MAX_PATH]; - memset(localAppFolder, '\0', MAX_PATH); + memset(localAppFolder, '\0', MAX_PATH * sizeof(wchar_t)); if (::SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, localAppFolder) == S_OK) { return localAppFolder; diff --git a/src/shared/leaktrace.cpp b/src/shared/leaktrace.cpp index 68e57609..729eb42e 100644 --- a/src/shared/leaktrace.cpp +++ b/src/shared/leaktrace.cpp @@ -36,7 +36,7 @@ class StackData { public: StackData() - : m_FunctionName("Dummy"), m_CodeLine(0) + : m_Count(0), m_Hash(0UL), m_FunctionName("Dummy"), m_CodeLine(0) {} StackData(const char *functionName, int line) { m_Count = ::CaptureStackBackTrace(FRAMES_TO_SKIP, FRAMES_TO_CAPTURE, m_Stack, &m_Hash); diff --git a/src/shared/oblivioninfo.cpp b/src/shared/oblivioninfo.cpp index f317812f..790fcdb0 100644 --- a/src/shared/oblivioninfo.cpp +++ b/src/shared/oblivioninfo.cpp @@ -55,15 +55,17 @@ std::wstring OblivionInfo::getRegPathStatic() 0, KEY_QUERY_VALUE, &key); if (errorcode != ERROR_SUCCESS) { - return L""; + return std::wstring(); } WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - errorcode = ::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize); - - return std::wstring(temp); + if (::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + return std::wstring(temp); + } else { + return std::wstring(); + } } std::wstring OblivionInfo::getInvalidationBSA() @@ -188,16 +190,13 @@ void OblivionInfo::createProfile(const std::wstring &directory, bool useDefaults } { // copy oblivionprefs.ini-file - std::wstring target = directory.substr().append(L"\\oblivionprefs.ini"); + std::wstring target = directory + L"\\oblivionprefs.ini"; if (!FileExists(target)) { - std::wostringstream source; - source << getMyGamesDirectory() << L"\\Oblivion\\oblivionprefs.ini"; - if (!::CopyFileW(source.str().c_str(), target.c_str(), true)) { + std::wstring source = getMyGamesDirectory() + L"\\Oblivion\\oblivionprefs.ini"; + if (!::CopyFileW(source.c_str(), target.c_str(), true)) { if ((::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL) == INVALID_HANDLE_VALUE) && (::GetLastError() != ERROR_FILE_EXISTS)) { - std::ostringstream stream; - stream << "failed to create ini file: " << ToString(target.c_str(), false); - throw windows_error(stream.str()); + throw windows_error(std::string("failed to create ini file: ") + ToString(target, false)); } } } diff --git a/src/shared/oblivioninfo.h b/src/shared/oblivioninfo.h index 02fd90b4..e64ae37b 100644 --- a/src/shared/oblivioninfo.h +++ b/src/shared/oblivioninfo.h @@ -36,7 +36,7 @@ public: virtual unsigned long getBSAVersion(); static std::wstring getRegPathStatic(); - virtual std::wstring getRegPath() { return OblivionInfo::getRegPathStatic(); } + virtual std::wstring getRegPath() { return getRegPathStatic(); } virtual std::wstring getBinaryName() { return L"Oblivion.exe"; } virtual GameInfo::Type getType() { return TYPE_OBLIVION; } @@ -72,9 +72,9 @@ public: virtual std::wstring getNexusPage(bool nmmScheme = true); static std::wstring getNexusInfoUrlStatic(); - virtual std::wstring getNexusInfoUrl() { return OblivionInfo::getNexusInfoUrlStatic(); } + virtual std::wstring getNexusInfoUrl() { return getNexusInfoUrlStatic(); } static int getNexusModIDStatic(); - virtual int getNexusModID() { return OblivionInfo::getNexusModIDStatic(); } + virtual int getNexusModID() { return getNexusModIDStatic(); } virtual int getNexusGameID() { return 101; } virtual void createProfile(const std::wstring &directory, bool useDefaults); diff --git a/src/shared/skyriminfo.cpp b/src/shared/skyriminfo.cpp index c985fe9f..319e58d5 100644 --- a/src/shared/skyriminfo.cpp +++ b/src/shared/skyriminfo.cpp @@ -63,15 +63,17 @@ std::wstring SkyrimInfo::getRegPathStatic() 0, KEY_QUERY_VALUE, &key); if (errorcode != ERROR_SUCCESS) { - return L""; + return std::wstring(); } WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - errorcode = ::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize); - - return std::wstring(temp); + if (::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + return std::wstring(temp); + } else { + return std::wstring(); + } } @@ -222,7 +224,7 @@ int SkyrimInfo::getNexusModIDStatic() void SkyrimInfo::createProfile(const std::wstring &directory, bool useDefaults) { { // copy plugins.txt - std::wstring target = directory.substr().append(L"\\plugins.txt"); + std::wstring target = directory + L"\\plugins.txt"; if (!FileExists(target)) { std::wostringstream source; source << getLocalAppFolder() << "\\Skyrim\\plugins.txt"; @@ -231,11 +233,10 @@ void SkyrimInfo::createProfile(const std::wstring &directory, bool useDefaults) ::CloseHandle(file); } } - target = directory.substr().append(L"\\loadorder.txt"); + target = directory + L"\\loadorder.txt"; if (!FileExists(target)) { - std::wostringstream source; - source << getLocalAppFolder() << "\\Skyrim\\loadorder.txt"; - if (!::CopyFileW(source.str().c_str(), target.c_str(), true)) { + std::wstring source = getLocalAppFolder() + L"\\Skyrim\\loadorder.txt"; + if (!::CopyFileW(source.c_str(), target.c_str(), true)) { HANDLE file = ::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); ::CloseHandle(file); } @@ -243,42 +244,36 @@ void SkyrimInfo::createProfile(const std::wstring &directory, bool useDefaults) } { // copy skyrim.ini-file - std::wstring target = directory.substr().append(L"\\skyrim.ini"); + std::wstring target = directory + L"\\skyrim.ini"; if (!FileExists(target)) { - std::wostringstream source; + std::wstring source; if (useDefaults) { - source << getGameDirectory() << L"\\skyrim_default.ini"; + source = getGameDirectory() + L"\\skyrim_default.ini"; } else { - source << getMyGamesDirectory() << L"\\Skyrim"; - if (FileExists(source.str(), L"skyrim.ini")) { - source << L"\\skyrim.ini"; + source = getMyGamesDirectory() + L"\\Skyrim"; + if (FileExists(source, L"skyrim.ini")) { + source += L"\\skyrim.ini"; } else { - source.str(L""); - source << getGameDirectory() << L"\\skyrim_default.ini"; + source = getGameDirectory() + L"\\skyrim_default.ini"; } } - if (!::CopyFileW(source.str().c_str(), target.c_str(), true)) { + if (!::CopyFileW(source.c_str(), target.c_str(), true)) { if (::GetLastError() != ERROR_FILE_EXISTS) { - std::ostringstream stream; - stream << "failed to copy ini file: " << ToString(source.str(), false); - throw windows_error(stream.str()); + throw windows_error(std::string("failed to copy ini file: ") + ToString(source, false)); } } } } { // copy skyrimprefs.ini-file - std::wstring target = directory.substr().append(L"\\skyrimprefs.ini"); + std::wstring target = directory + L"\\skyrimprefs.ini"; if (!FileExists(target)) { - std::wostringstream source; - source << getMyGamesDirectory() << L"\\Skyrim\\skyrimprefs.ini"; - if (!::CopyFileW(source.str().c_str(), target.c_str(), true)) { - log("failed to copy ini file %ls", source.str().c_str()); + std::wstring source = getMyGamesDirectory() + L"\\Skyrim\\skyrimprefs.ini"; + if (!::CopyFileW(source.c_str(), target.c_str(), true)) { + log("failed to copy ini file %ls", source.c_str()); // create empty if (::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) == INVALID_HANDLE_VALUE) { - std::ostringstream stream; - stream << "failed to copy ini file: " << ToString(source.str(), false); - throw windows_error(stream.str()); + throw windows_error(std::string("failed to copy ini file: ") + ToString(source, false)); } } } diff --git a/src/shared/skyriminfo.h b/src/shared/skyriminfo.h index 132f2aee..a7aff8dc 100644 --- a/src/shared/skyriminfo.h +++ b/src/shared/skyriminfo.h @@ -38,7 +38,7 @@ public: virtual unsigned long getBSAVersion(); static std::wstring getRegPathStatic(); - virtual std::wstring getRegPath() { return SkyrimInfo::getRegPathStatic(); } + virtual std::wstring getRegPath() { return getRegPathStatic(); } virtual std::wstring getBinaryName() { return L"TESV.exe"; } virtual GameInfo::Type getType() { return TYPE_SKYRIM; } @@ -81,11 +81,11 @@ public: virtual std::wstring getNexusPage(bool nmmScheme = true); static std::wstring getNexusInfoUrlStatic(); - virtual std::wstring getNexusInfoUrl() { return SkyrimInfo::getNexusInfoUrlStatic(); } + virtual std::wstring getNexusInfoUrl() { return getNexusInfoUrlStatic(); } static int getNexusModIDStatic(); - virtual int getNexusModID() { return SkyrimInfo::getNexusModIDStatic(); } + virtual int getNexusModID() { return getNexusModIDStatic(); } static int getNexusGameIDStatic() { return 110; } - virtual int getNexusGameID() { return SkyrimInfo::getNexusGameIDStatic(); } + virtual int getNexusGameID() { return getNexusGameIDStatic(); } virtual void createProfile(const std::wstring &directory, bool useDefaults); virtual void repairProfile(const std::wstring &directory); -- cgit v1.3.1 From db0e278817cf5a36e15f1945c52e73726598e8d9 Mon Sep 17 00:00:00 2001 From: Tannin Date: Mon, 29 Sep 2014 20:35:35 +0200 Subject: - moved the hook-recursion-protection to tls - some code cleanup and consolidation - hook.dll will now report all of its own exceptions - some more logging during startup - changed the way urls are encoded for download requests - now displaying (one of the) process name(s) while waiting for a program to end - bugfix: spawned processes were forced to leave the job --- src/downloadmanager.cpp | 50 ++++++++++++++++--------------------------- src/mainwindow.cpp | 15 +++++++++++++ src/profile.cpp | 7 +++--- src/shared/directoryentry.cpp | 10 ++++----- src/spawn.cpp | 2 +- 5 files changed, 42 insertions(+), 42 deletions(-) (limited to 'src/shared/directoryentry.cpp') diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index bc31adf4..b3b18a38 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -331,7 +331,8 @@ bool DownloadManager::addDownload(const QStringList &URLs, fileName = "unknown"; } - QNetworkRequest request(URLs.first()); + QUrl preferredUrl = QUrl::fromEncoded(URLs.first().toLocal8Bit()); + QNetworkRequest request(preferredUrl); return addDownload(m_NexusInterface->getAccessManager()->get(request), URLs, fileName, modID, fileID, fileInfo); } @@ -1198,47 +1199,34 @@ void DownloadManager::nxmFileInfoAvailable(int modID, int fileID, QVariant userD m_RequestIDs.insert(m_NexusInterface->requestDownloadURL(modID, fileID, this, qVariantFromValue(test), QString())); } - -// sort function to sort by best download server -bool DownloadManager::ServerByPreference(const std::map &preferredServers, const QVariant &LHS, const QVariant &RHS) +int evaluateFileInfoMap(const QVariantMap &map, const std::map &preferredServers) { - int LHSVal = 0; - int RHSVal = 0; + int result = 0; - QVariantMap LHSMap = LHS.toMap(); - QVariantMap RHSMap = RHS.toMap(); - - int LHSUsers = LHSMap["ConnectedUsers"].toInt(); - int RHSUsers = RHSMap["ConnectedUsers"].toInt(); + int users = map["ConnectedUsers"].toInt(); // 0 users is probably a sign that the server is offline. Since there is currently no // mechanism to try a different server, we avoid those without users - if (LHSUsers == 0) { - LHSVal -= 500; - } else { - LHSVal -= LHSUsers; - } - if (RHSUsers == 0) { - RHSVal -= 500; + if (users == 0) { + result -= 500; } else { - RHSVal -= RHSUsers; + result -= users; } - // user preference. This is a bit silly because the more servers on the preferred list the higher the boost - auto LHSPreference = preferredServers.find(LHSMap["Name"].toString()); - auto RHSPreference = preferredServers.find(RHSMap["Name"].toString()); + auto preference = preferredServers.find(map["Name"].toString()); - if (LHSPreference != preferredServers.end()) { - LHSVal += 100 + LHSPreference->second * 20; - } - if (RHSPreference != preferredServers.end()) { - RHSVal += 100 + RHSPreference->second * 20; + if (preference != preferredServers.end()) { + result += 100 + preference->second * 20; } - // premium isn't valued high because premium servers already get a massive boost for having few users online - if (LHSMap["IsPremium"].toBool()) LHSVal += 5; - if (RHSMap["IsPremium"].toBool()) RHSVal += 5; + if (map["IsPremium"].toBool()) result += 5; + + return result; +} - return RHSVal < LHSVal; +// sort function to sort by best download server +bool DownloadManager::ServerByPreference(const std::map &preferredServers, const QVariant &LHS, const QVariant &RHS) +{ + return evaluateFileInfoMap(LHS.toMap(), preferredServers) > evaluateFileInfoMap(RHS.toMap(), preferredServers); } int DownloadManager::startDownloadURLs(const QStringList &urls) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 19be758e..17743312 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1410,6 +1410,15 @@ HANDLE MainWindow::spawnBinaryDirect(const QFileInfo &binary, const QString &arg } } +std::wstring getProcessName(DWORD processId) +{ + HANDLE process = ::OpenProcess(PROCESS_QUERY_INFORMATION, false, processId); + + DWORD value = MAX_PATH; + wchar_t buffer[MAX_PATH]; + ::QueryFullProcessImageNameW(process, 0, buffer, &value); + return buffer; +} void MainWindow::spawnBinary(const QFileInfo &binary, const QString &arguments, const QDir ¤tDirectory, bool closeAfterStart, const QString &steamAppID) { @@ -1432,6 +1441,7 @@ void MainWindow::spawnBinary(const QFileInfo &binary, const QString &arguments, JOBOBJECT_BASIC_PROCESS_ID_LIST info; { + DWORD currentProcess = 0UL; bool isJobHandle = true; DWORD res = ::MsgWaitForMultipleObjects(1, &processHandle, false, 1000, QS_KEY | QS_MOUSE); @@ -1439,6 +1449,11 @@ void MainWindow::spawnBinary(const QFileInfo &binary, const QString &arguments, if (isJobHandle) { if (::QueryInformationJobObject(processHandle, JobObjectBasicProcessIdList, &info, sizeof(info), &retLen) > 0) { if (info.NumberOfProcessIdsInList == 0) { + } else { + if (info.ProcessIdList[0] != currentProcess) { + currentProcess = info.ProcessIdList[0]; + dialog->setProcessName(ToQString(getProcessName(currentProcess))); + } break; } } else { diff --git a/src/profile.cpp b/src/profile.cpp index 958084d7..6e9d8f0f 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -217,7 +217,7 @@ void Profile::createTweakedIniFile() } if (localSavesEnabled()) { - if (!::WritePrivateProfileStringW(L"General", L"bUseMyGamesDirectory", L"1", ToWString(tweakedIni).c_str())) { + if (!::WritePrivateProfileStringW(L"General", L"bUseMyGamesDirectory", L"0", ToWString(tweakedIni).c_str())) { error = true; } @@ -238,7 +238,7 @@ void Profile::createTweakedIniFile() void Profile::refreshModStatus() { QFile file(getModlistFileName()); - if (!file.exists()) { + if (!file.open(QIODevice::ReadOnly)) { throw MyException(tr("\"%1\" is missing or inaccessible").arg(getModlistFileName())); } @@ -249,10 +249,9 @@ void Profile::refreshModStatus() std::set namesRead; // load mods from file and update enabled state and priority for them - file.open(QIODevice::ReadOnly); int index = 0; while (!file.atEnd()) { - QByteArray line = file.readLine(); + QByteArray line = file.readLine().trimmed(); bool enabled = true; QString modName; if (line.length() == 0) { diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 24868a93..0adf0812 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -72,8 +72,7 @@ public: } bool exists(const std::wstring &name) { - std::map::iterator iter = m_OriginsNameMap.find(name); - return iter != m_OriginsNameMap.end(); + return m_OriginsNameMap.find(name) != m_OriginsNameMap.end(); } FilesOrigin &getByID(Index ID) { @@ -369,16 +368,14 @@ std::wstring FileEntry::getFullPath() const bool ignore = false; result = m_Parent->getOriginByID(getOrigin(ignore)).getPath(); //base directory for origin recurseParents(result, m_Parent); // all intermediate directories - result.append(L"\\").append(m_Name); // the actual filename - return result; + return result + L"\\" + m_Name; } std::wstring FileEntry::getRelativePath() const { std::wstring result; recurseParents(result, m_Parent); // all intermediate directories - result.append(L"\\").append(m_Name); // the actual filename - return result; + return result + L"\\" + m_Name; } @@ -446,6 +443,7 @@ void DirectoryEntry::addFromOrigin(const std::wstring &originName, const std::ws boost::scoped_array buffer(new wchar_t[MAXPATH_UNICODE + 1]); memset(buffer.get(), L'\0', MAXPATH_UNICODE + 1); int offset = _snwprintf(buffer.get(), MAXPATH_UNICODE, L"%ls", directory.c_str()); + buffer.get()[offset] = L'\0'; addFiles(origin, buffer.get(), offset); } m_Populated = true; diff --git a/src/spawn.cpp b/src/spawn.cpp index ddcf573e..cd7e202e 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -120,7 +120,7 @@ HANDLE startBinary(const QFileInfo &binary, JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo; ::QueryInformationJobObject(NULL, JobObjectExtendedLimitInformation, &jobInfo, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION), NULL); - jobInfo.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_BREAKAWAY_OK; + jobInfo.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_BREAKAWAY_OK; HANDLE jobObject = ::CreateJobObject(NULL, NULL); -- cgit v1.3.1 From 99de80e7224f2491fb7518e32f195ad6a912b624 Mon Sep 17 00:00:00 2001 From: Tannin Date: Fri, 28 Nov 2014 11:19:20 +0100 Subject: replaced all uses of NULL with nullptr fixed a few placed where NULL was used as a number or boolean --- src/ModOrganizer.pro | 1 - src/activatemodsdialog.cpp | 4 +- src/bbcode.h | 2 +- src/browserdialog.cpp | 16 ++-- src/categories.cpp | 6 +- src/directoryrefresher.cpp | 8 +- src/downloadlistwidget.cpp | 8 +- src/downloadlistwidgetcompact.cpp | 12 +-- src/downloadmanager.cpp | 32 ++++---- src/downloadmanager.h | 2 +- src/dummybsa.cpp | 4 +- src/editexecutablesdialog.cpp | 10 +-- src/executableslist.cpp | 6 +- src/genericicondelegate.h | 2 +- src/helper.cpp | 2 +- src/installationmanager.cpp | 28 +++---- src/installationmanager.h | 4 +- src/json.cpp | 2 +- src/loadmechanism.cpp | 8 +- src/lockeddialog.cpp | 4 +- src/logbuffer.cpp | 2 +- src/main.cpp | 28 +++---- src/mainwindow.cpp | 160 +++++++++++++++++++------------------- src/messagedialog.cpp | 6 +- src/modinfo.cpp | 2 +- src/modinfodialog.cpp | 18 ++--- src/modlist.cpp | 38 ++++----- src/modlist.h | 2 +- src/modlistsortproxy.cpp | 6 +- src/motddialog.cpp | 2 +- src/nexusinterface.cpp | 22 +++--- src/noeditdelegate.cpp | 2 +- src/noeditdelegate.h | 2 +- src/nxmaccessmanager.cpp | 18 ++--- src/organizercore.cpp | 22 +++--- src/organizerproxy.h | 2 +- src/overwriteinfodialog.cpp | 6 +- src/pdll.h | 110 +++++++++++++------------- src/plugincontainer.cpp | 8 +- src/pluginlist.cpp | 22 +++--- src/pluginlist.h | 2 +- src/pluginlistsortproxy.cpp | 4 +- src/problemsdialog.cpp | 2 +- src/profile.cpp | 14 ++-- src/profilesdialog.cpp | 8 +- src/report.cpp | 2 +- src/savegameinfowidget.cpp | 6 +- src/selectiondialog.cpp | 4 +- src/selfupdater.cpp | 11 ++- src/settingsdialog.cpp | 2 +- src/shared/directoryentry.cpp | 56 ++++++------- src/shared/directoryentry.h | 10 +-- src/shared/error_report.cpp | 12 +-- src/shared/fallout3info.cpp | 12 +-- src/shared/falloutnvinfo.cpp | 12 +-- src/shared/gameinfo.cpp | 14 ++-- src/shared/inject.cpp | 16 ++-- src/shared/leaktrace.cpp | 2 +- src/shared/oblivioninfo.cpp | 14 ++-- src/shared/skyriminfo.cpp | 20 ++--- src/shared/util.cpp | 16 ++-- src/shared/windows_error.cpp | 4 +- src/spawn.cpp | 18 ++--- src/syncoverwritedialog.cpp | 10 +-- src/viewmarkingscrollbar.cpp | 2 +- 65 files changed, 455 insertions(+), 457 deletions(-) (limited to 'src/shared/directoryentry.cpp') diff --git a/src/ModOrganizer.pro b/src/ModOrganizer.pro index a8f7f53e..98f6f730 100644 --- a/src/ModOrganizer.pro +++ b/src/ModOrganizer.pro @@ -12,7 +12,6 @@ SUBDIRS = bsatk \ nxmhandler \ BossDummy \ pythonRunner \ - loot_cli \ esptk pythonRunner.depends = uibase diff --git a/src/activatemodsdialog.cpp b/src/activatemodsdialog.cpp index be6eef54..fd56ae3e 100644 --- a/src/activatemodsdialog.cpp +++ b/src/activatemodsdialog.cpp @@ -72,7 +72,7 @@ std::set ActivateModsDialog::getModsToActivate() for (int row = 0; row < modsTable->rowCount(); ++row) { QComboBox *comboBox = dynamic_cast(modsTable->cellWidget(row, 1)); - if (comboBox != NULL) { + if (comboBox != nullptr) { result.insert(comboBox->currentText()); } } @@ -87,7 +87,7 @@ std::set ActivateModsDialog::getESPsToActivate() for (int row = 0; row < modsTable->rowCount(); ++row) { QComboBox *comboBox = dynamic_cast(modsTable->cellWidget(row, 1)); - if (comboBox != NULL) { + if (comboBox != nullptr) { QLabel *espName = dynamic_cast(modsTable->cellWidget(row, 0)); result.insert(espName->text()); diff --git a/src/bbcode.h b/src/bbcode.h index f88e9a6c..708dfe71 100644 --- a/src/bbcode.h +++ b/src/bbcode.h @@ -29,7 +29,7 @@ namespace BBCode { /** * @brief convert a string with BB Code-Tags to HTML * @param input the input string with BB tags - * @param replaceOccured if not NULL, this parameter will be set to true if any bb tags were replaced + * @param replaceOccured if not nullptr, this parameter will be set to true if any bb tags were replaced * @return the same string in html representation **/ QString convertToHTML(const QString &input); diff --git a/src/browserdialog.cpp b/src/browserdialog.cpp index 82cd8d49..1401b941 100644 --- a/src/browserdialog.cpp +++ b/src/browserdialog.cpp @@ -115,7 +115,7 @@ BrowserView *BrowserDialog::getCurrentView() void BrowserDialog::urlChanged(const QUrl &url) { BrowserView *currentView = getCurrentView(); - if (currentView != NULL) { + if (currentView != nullptr) { ui->backBtn->setEnabled(currentView->history()->canGoBack()); ui->fwdBtn->setEnabled(currentView->history()->canGoForward()); } @@ -192,12 +192,12 @@ void BrowserDialog::unsupportedContent(QNetworkReply *reply) { try { QWebPage *page = qobject_cast(sender()); - if (page == NULL) { + if (page == nullptr) { qCritical("sender not a page"); return; } BrowserView *view = qobject_cast(page->view()); - if (view == NULL) { + if (view == nullptr) { qCritical("no view?"); return; } @@ -231,7 +231,7 @@ void BrowserDialog::tabCloseRequested(int index) void BrowserDialog::on_backBtn_clicked() { BrowserView *currentView = getCurrentView(); - if (currentView != NULL) { + if (currentView != nullptr) { currentView->back(); } } @@ -239,7 +239,7 @@ void BrowserDialog::on_backBtn_clicked() void BrowserDialog::on_fwdBtn_clicked() { BrowserView *currentView = getCurrentView(); - if (currentView != NULL) { + if (currentView != nullptr) { currentView->forward(); } } @@ -254,7 +254,7 @@ void BrowserDialog::startSearch() void BrowserDialog::on_searchEdit_returnPressed() { BrowserView *currentView = getCurrentView(); - if (currentView != NULL) { + if (currentView != nullptr) { currentView->findText(ui->searchEdit->text(), QWebPage::FindWrapsAroundDocument); } } @@ -267,7 +267,7 @@ void BrowserDialog::on_refreshBtn_clicked() void BrowserDialog::on_browserTabWidget_currentChanged(int index) { BrowserView *currentView = qobject_cast(ui->browserTabWidget->widget(index)); - if (currentView != NULL) { + if (currentView != nullptr) { ui->backBtn->setEnabled(currentView->history()->canGoBack()); ui->fwdBtn->setEnabled(currentView->history()->canGoForward()); } @@ -276,7 +276,7 @@ void BrowserDialog::on_browserTabWidget_currentChanged(int index) void BrowserDialog::on_urlEdit_returnPressed() { QWebView *currentView = getCurrentView(); - if (currentView != NULL) { + if (currentView != nullptr) { currentView->setUrl(QUrl(ui->urlEdit->text())); } } diff --git a/src/categories.cpp b/src/categories.cpp index 57e18a28..1d5fdefe 100644 --- a/src/categories.cpp +++ b/src/categories.cpp @@ -32,7 +32,7 @@ using namespace MOBase; using namespace MOShared; -CategoryFactory* CategoryFactory::s_Instance = NULL; +CategoryFactory* CategoryFactory::s_Instance = nullptr; QString CategoryFactory::categoriesFilePath() @@ -93,7 +93,7 @@ CategoryFactory::CategoryFactory() CategoryFactory &CategoryFactory::instance() { - if (s_Instance == NULL) { + if (s_Instance == nullptr) { s_Instance = new CategoryFactory; } return *s_Instance; @@ -133,7 +133,7 @@ void CategoryFactory::setParents() void CategoryFactory::cleanup() { delete s_Instance; - s_Instance = NULL; + s_Instance = nullptr; } diff --git a/src/directoryrefresher.cpp b/src/directoryrefresher.cpp index 24fda501..45692fdf 100644 --- a/src/directoryrefresher.cpp +++ b/src/directoryrefresher.cpp @@ -31,7 +31,7 @@ using namespace MOShared; DirectoryRefresher::DirectoryRefresher() - : m_DirectoryStructure(NULL) + : m_DirectoryStructure(nullptr) { } @@ -44,7 +44,7 @@ DirectoryEntry *DirectoryRefresher::getDirectoryStructure() { QMutexLocker locker(&m_RefreshLock); DirectoryEntry *result = m_DirectoryStructure; - m_DirectoryStructure = NULL; + m_DirectoryStructure = nullptr; return result; } @@ -104,7 +104,7 @@ void DirectoryRefresher::addModFilesToStructure(DirectoryEntry *directoryStructu foreach (const QString &filename, stealFiles) { QFileInfo fileInfo(filename); FileEntry::Ptr file = directoryStructure->findFile(ToWString(fileInfo.fileName())); - if (file.get() != NULL) { + if (file.get() != nullptr) { if (file->getOrigin() == 0) { // replace data as the origin on this bsa file->removeOrigin(0); @@ -134,7 +134,7 @@ void DirectoryRefresher::refresh() delete m_DirectoryStructure; - m_DirectoryStructure = new DirectoryEntry(L"data", NULL, 0); + m_DirectoryStructure = new DirectoryEntry(L"data", nullptr, 0); std::wstring dataDirectory = GameInfo::instance().getGameDirectory() + L"\\data"; m_DirectoryStructure->addFromOrigin(L"data", dataDirectory, 0); diff --git a/src/downloadlistwidget.cpp b/src/downloadlistwidget.cpp index 9d276de9..2a398bc0 100644 --- a/src/downloadlistwidget.cpp +++ b/src/downloadlistwidget.cpp @@ -255,7 +255,7 @@ void DownloadListWidgetDelegate::issueResume() void DownloadListWidgetDelegate::issueDeleteAll() { - if (QMessageBox::question(NULL, tr("Are you sure?"), + if (QMessageBox::question(nullptr, tr("Are you sure?"), tr("This will remove all finished downloads from this list and from disk."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { emit removeDownload(-1, true); @@ -264,7 +264,7 @@ void DownloadListWidgetDelegate::issueDeleteAll() void DownloadListWidgetDelegate::issueDeleteCompleted() { - if (QMessageBox::question(NULL, tr("Are you sure?"), + if (QMessageBox::question(nullptr, tr("Are you sure?"), tr("This will remove all installed downloads from this list and from disk."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { emit removeDownload(-2, true); @@ -273,7 +273,7 @@ void DownloadListWidgetDelegate::issueDeleteCompleted() void DownloadListWidgetDelegate::issueRemoveFromViewAll() { - if (QMessageBox::question(NULL, tr("Are you sure?"), + if (QMessageBox::question(nullptr, tr("Are you sure?"), tr("This will remove all finished downloads from this list (but NOT from disk)."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { emit removeDownload(-1, false); @@ -282,7 +282,7 @@ void DownloadListWidgetDelegate::issueRemoveFromViewAll() void DownloadListWidgetDelegate::issueRemoveFromViewCompleted() { - if (QMessageBox::question(NULL, tr("Are you sure?"), + if (QMessageBox::question(nullptr, tr("Are you sure?"), tr("This will remove all installed downloads from this list (but NOT from disk)."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { emit removeDownload(-2, false); diff --git a/src/downloadlistwidgetcompact.cpp b/src/downloadlistwidgetcompact.cpp index 21a690ab..a298494a 100644 --- a/src/downloadlistwidgetcompact.cpp +++ b/src/downloadlistwidgetcompact.cpp @@ -90,7 +90,7 @@ void DownloadListWidgetCompactDelegate::paintPendingDownload(int downloadIndex) { std::pair nexusids = m_Manager->getPendingDownload(downloadIndex); m_NameLabel->setText(tr("< mod %1 file %2 >").arg(nexusids.first).arg(nexusids.second)); - if (m_SizeLabel != NULL) { + if (m_SizeLabel != nullptr) { m_SizeLabel->setText("???"); } m_DoneLabel->setVisible(true); @@ -110,7 +110,7 @@ void DownloadListWidgetCompactDelegate::paintRegularDownload(int downloadIndex) DownloadManager::DownloadState state = m_Manager->getState(downloadIndex); - if ((m_SizeLabel != NULL) && (state >= DownloadManager::STATE_READY)) { + if ((m_SizeLabel != nullptr) && (state >= DownloadManager::STATE_READY)) { m_SizeLabel->setText(QString::number(m_Manager->getFileSize(downloadIndex) / 1048576)); } @@ -242,7 +242,7 @@ void DownloadListWidgetCompactDelegate::issueResume() void DownloadListWidgetCompactDelegate::issueDeleteAll() { - if (QMessageBox::question(NULL, tr("Are you sure?"), + if (QMessageBox::question(nullptr, tr("Are you sure?"), tr("This will remove all finished downloads from this list and from disk."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { emit removeDownload(-1, true); @@ -251,7 +251,7 @@ void DownloadListWidgetCompactDelegate::issueDeleteAll() void DownloadListWidgetCompactDelegate::issueDeleteCompleted() { - if (QMessageBox::question(NULL, tr("Are you sure?"), + if (QMessageBox::question(nullptr, tr("Are you sure?"), tr("This will remove all installed downloads from this list and from disk."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { emit removeDownload(-2, true); @@ -260,7 +260,7 @@ void DownloadListWidgetCompactDelegate::issueDeleteCompleted() void DownloadListWidgetCompactDelegate::issueRemoveFromViewAll() { - if (QMessageBox::question(NULL, tr("Are you sure?"), + if (QMessageBox::question(nullptr, tr("Are you sure?"), tr("This will permanently remove all finished downloads from this list (but NOT from disk)."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { emit removeDownload(-1, false); @@ -269,7 +269,7 @@ void DownloadListWidgetCompactDelegate::issueRemoveFromViewAll() void DownloadListWidgetCompactDelegate::issueRemoveFromViewCompleted() { - if (QMessageBox::question(NULL, tr("Are you sure?"), + if (QMessageBox::question(nullptr, tr("Are you sure?"), tr("This will permanently remove all installed downloads from this list (but NOT from disk)."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { emit removeDownload(-2, false); diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp index d785a939..1d141656 100644 --- a/src/downloadmanager.cpp +++ b/src/downloadmanager.cpp @@ -75,7 +75,7 @@ DownloadManager::DownloadInfo *DownloadManager::DownloadInfo::createFromMeta(con QString metaFileName = filePath + ".meta"; QSettings metaFile(metaFileName, QSettings::IniFormat); if (!showHidden && metaFile.value("removed", false).toBool()) { - return NULL; + return nullptr; } else { info->m_Hidden = metaFile.value("removed", false).toBool(); } @@ -308,7 +308,7 @@ void DownloadManager::refreshList() QString fileName = QDir::fromNativeSeparators(m_OutputDirectory) + "/" + file; DownloadInfo *info = DownloadInfo::createFromMeta(fileName, m_ShowHidden); - if (info != NULL) { + if (info != nullptr) { m_ActiveDownloads.push_front(info); } } @@ -368,7 +368,7 @@ bool DownloadManager::addDownload(QNetworkReply *reply, const QStringList &URLs, } if (QFile::exists(m_OutputDirectory + "/" + baseName) && - (QMessageBox::question(NULL, tr("Download again?"), tr("A file with the same name has already been downloaded. " + (QMessageBox::question(nullptr, tr("Download again?"), tr("A file with the same name has already been downloaded. " "Do you want to download it again? The new file will receive a different name."), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)) { removePending(modID, fileID); @@ -453,7 +453,7 @@ void DownloadManager::addNXMDownload(const QString &url) qDebug("add nxm download: %s", qPrintable(url)); if (nxmInfo.game().compare(managedGame, Qt::CaseInsensitive) != 0) { qDebug("download requested for wrong game (game: %s, url: %s)", qPrintable(managedGame), qPrintable(nxmInfo.game())); - QMessageBox::information(NULL, tr("Wrong Game"), tr("The download link is for a mod for \"%1\" but this instance of MO " + QMessageBox::information(nullptr, tr("Wrong Game"), tr("The download link is for a mod for \"%1\" but this instance of MO " "has been set up for \"%2\".").arg(nxmInfo.game()).arg(managedGame), QMessageBox::Ok); return; } @@ -608,7 +608,7 @@ void DownloadManager::pauseDownload(int index) DownloadInfo *info = m_ActiveDownloads.at(index); if (info->m_State == STATE_DOWNLOADING) { - if ((info->m_Reply != NULL) && (info->m_Reply->isRunning())) { + if ((info->m_Reply != nullptr) && (info->m_Reply->isRunning())) { setState(info, STATE_PAUSING); } else { setState(info, STATE_PAUSED); @@ -664,7 +664,7 @@ DownloadManager::DownloadInfo *DownloadManager::downloadInfoByID(unsigned int id if (iter != m_ActiveDownloads.end()) { return *iter; } else { - return NULL; + return nullptr; } } @@ -694,8 +694,8 @@ void DownloadManager::queryInfo(int index) if (info->m_FileInfo->modID < 0) { QString modIDString; while (modIDString.isEmpty()) { - modIDString = QInputDialog::getText(NULL, tr("Please enter the nexus mod id"), tr("Mod ID:"), QLineEdit::Normal, - QString(), NULL, 0, Qt::ImhFormattedNumbersOnly); + modIDString = QInputDialog::getText(nullptr, tr("Please enter the nexus mod id"), tr("Mod ID:"), QLineEdit::Normal, + QString(), nullptr, 0, Qt::ImhFormattedNumbersOnly); if (modIDString.isNull()) { // canceled return; @@ -704,7 +704,7 @@ void DownloadManager::queryInfo(int index) modIDString.clear(); } } - info->m_FileInfo->modID = modIDString.toInt(NULL, 10); + info->m_FileInfo->modID = modIDString.toInt(nullptr, 10); } } info->m_ReQueried = true; @@ -962,13 +962,13 @@ DownloadManager::DownloadInfo *DownloadManager::findDownload(QObject *reply, int // reverse search as newer, thus more relevant, downloads are at the end for (int i = m_ActiveDownloads.size() - 1; i >= 0; --i) { if (m_ActiveDownloads[i]->m_Reply == reply) { - if (index != NULL) { + if (index != nullptr) { *index = i; } return m_ActiveDownloads[i]; } } - return NULL; + return nullptr; } @@ -1007,7 +1007,7 @@ void DownloadManager::downloadReadyRead() { try { DownloadInfo *info = findDownload(this->sender()); - if (info != NULL) { + if (info != nullptr) { info->m_Output.write(info->m_Reply->readAll()); } } catch (const std::bad_alloc&) { @@ -1059,7 +1059,7 @@ void DownloadManager::nxmDescriptionAvailable(int, QVariant userData, QVariant r QVariantMap result = resultData.toMap(); DownloadInfo *info = downloadInfoByID(userData.toInt()); - if (info == NULL) return; + if (info == nullptr) return; info->m_FileInfo->categoryID = result["category_id"].toInt(); info->m_FileInfo->modName = result["name"].toString().trimmed(); info->m_FileInfo->newestVersion.parse(result["version"].toString()); @@ -1104,7 +1104,7 @@ void DownloadManager::nxmFilesAvailable(int, QVariant userData, QVariant resultD } DownloadInfo *info = downloadInfoByID(userData.toInt()); - if (info == NULL) return; + if (info == nullptr) return; QVariantList result = resultData.toList(); @@ -1323,7 +1323,7 @@ void DownloadManager::downloadFinished() int index = 0; DownloadInfo *info = findDownload(this->sender(), &index); - if (info != NULL) { + if (info != nullptr) { QNetworkReply *reply = info->m_Reply; QByteArray data; if (reply->isOpen()) { @@ -1437,7 +1437,7 @@ void DownloadManager::metaDataChanged() int index = 0; DownloadInfo *info = findDownload(this->sender(), &index); - if (info != NULL) { + if (info != nullptr) { QString newName = getFileNameFromNetworkReply(info->m_Reply); if (!newName.isEmpty() && (newName != info->m_FileName)) { info->setName(getDownloadFileName(newName), true); diff --git a/src/downloadmanager.h b/src/downloadmanager.h index 95288884..52da27b8 100644 --- a/src/downloadmanager.h +++ b/src/downloadmanager.h @@ -439,7 +439,7 @@ private: bool addDownload(const QStringList &URLs, int modID, int fileID, const MOBase::ModRepositoryFileInfo *fileInfo); // important: the caller has to lock the list-mutex, otherwise the DownloadInfo-pointer might get invalidated at any time - DownloadInfo *findDownload(QObject *reply, int *index = NULL) const; + DownloadInfo *findDownload(QObject *reply, int *index = nullptr) const; void removeFile(int index, bool deleteFile); diff --git a/src/dummybsa.cpp b/src/dummybsa.cpp index df757139..49c6ee53 100644 --- a/src/dummybsa.cpp +++ b/src/dummybsa.cpp @@ -65,7 +65,7 @@ static unsigned long long genHash(const char* fileName) fileNameLower[i] = '\0'; char* ext = strrchr(fileNameLower, '.'); - if (ext == NULL) { + if (ext == nullptr) { ext = fileNameLower + strlen(fileNameLower); } @@ -117,7 +117,7 @@ static unsigned long long genHash(const char* fileName) unsigned char *fileNameLowerU = reinterpret_cast(fileNameLower); char* ext = strrchr(fileNameLower, '.'); - if (ext == NULL) { + if (ext == nullptr) { ext = fileNameLower + strlen(fileNameLower); } unsigned char *extU = reinterpret_cast(ext); diff --git a/src/editexecutablesdialog.cpp b/src/editexecutablesdialog.cpp index 3cc749d6..162c6a83 100644 --- a/src/editexecutablesdialog.cpp +++ b/src/editexecutablesdialog.cpp @@ -30,7 +30,7 @@ using namespace MOShared; EditExecutablesDialog::EditExecutablesDialog(const ExecutablesList &executablesList, QWidget *parent) : TutorableDialog("EditExecutables", parent), - ui(new Ui::EditExecutablesDialog), m_CurrentItem(NULL), m_ExecutablesList(executablesList) + ui(new Ui::EditExecutablesDialog), m_CurrentItem(nullptr), m_ExecutablesList(executablesList) { ui->setupUi(this); @@ -86,7 +86,7 @@ void EditExecutablesDialog::resetInput() ui->appIDOverwriteEdit->clear(); ui->overwriteAppIDBox->setChecked(false); ui->closeCheckBox->setChecked(false); - m_CurrentItem = NULL; + m_CurrentItem = nullptr; } @@ -128,7 +128,7 @@ void EditExecutablesDialog::on_browseButton_clicked() { // try to find java automatically std::wstring binaryNameW = ToWString(binaryName); WCHAR buffer[MAX_PATH]; - if (::FindExecutableW(binaryNameW.c_str(), NULL, buffer) > (HINSTANCE)32) { + if (::FindExecutableW(binaryNameW.c_str(), nullptr, buffer) > (HINSTANCE)32) { DWORD binaryType = 0UL; if (!::GetBinaryTypeW(binaryNameW.c_str(), &binaryType)) { qDebug("failed to determine binary type of \"%ls\": %lu", binaryNameW.c_str(), ::GetLastError()); @@ -204,7 +204,7 @@ void EditExecutablesDialog::on_titleEdit_textChanged(const QString &arg1) bool EditExecutablesDialog::executableChanged() { - if (m_CurrentItem != NULL) { + if (m_CurrentItem != nullptr) { const Executable &selectedExecutable = m_CurrentItem->data(Qt::UserRole).value(); return selectedExecutable.m_Arguments != ui->argumentsEdit->text() @@ -220,7 +220,7 @@ bool EditExecutablesDialog::executableChanged() void EditExecutablesDialog::on_executablesListBox_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { - if (current == NULL) { + if (current == nullptr) { resetInput(); return; } diff --git a/src/executableslist.cpp b/src/executableslist.cpp index c46cea10..03f2b7c9 100644 --- a/src/executableslist.cpp +++ b/src/executableslist.cpp @@ -130,7 +130,7 @@ Executable *ExecutablesList::findExe(const QString &title) return &*iter; } } - return NULL; + return nullptr; } @@ -144,7 +144,7 @@ bool ExecutablesList::titleExists(const QString &title) const void ExecutablesList::addExecutable(const Executable &executable) { Executable *existingExe = findExe(executable.m_Title); - if (existingExe != NULL) { + if (existingExe != nullptr) { *existingExe = executable; } else { m_Executables.push_back(executable); @@ -158,7 +158,7 @@ void ExecutablesList::addExecutable(const QString &title, const QString &executa { QFileInfo file(executableName); Executable *existingExe = findExe(title); - if (existingExe != NULL) { + if (existingExe != nullptr) { existingExe->m_Title = title; existingExe->m_CloseMO = closeMO; existingExe->m_BinaryInfo = file; diff --git a/src/genericicondelegate.h b/src/genericicondelegate.h index 8bc75e27..9842d09a 100644 --- a/src/genericicondelegate.h +++ b/src/genericicondelegate.h @@ -20,7 +20,7 @@ public: * of the view, the delegate will turn off this behaviour if the column is smaller than "compactSize" * @param compactSize see explanation of logicalIndex */ - GenericIconDelegate(QObject *parent = NULL, int role = Qt::UserRole + 1, int logicalIndex = -1, int compactSize = 150); + GenericIconDelegate(QObject *parent = nullptr, int role = Qt::UserRole + 1, int logicalIndex = -1, int compactSize = 150); public slots: void columnResized(int logicalIndex, int oldSize, int newSize); private: diff --git a/src/helper.cpp b/src/helper.cpp index d0825d10..f47a468a 100644 --- a/src/helper.cpp +++ b/src/helper.cpp @@ -40,7 +40,7 @@ bool helperExec(LPCWSTR moDirectory, LPCWSTR commandLine) execInfo.cbSize = sizeof(SHELLEXECUTEINFOW); execInfo.fMask = SEE_MASK_NOCLOSEPROCESS; - execInfo.hwnd = NULL; + execInfo.hwnd = nullptr; execInfo.lpVerb = L"runas"; execInfo.lpFile = fileName; execInfo.lpParameters = commandLine; diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 25fe06a4..6ab051b2 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -60,7 +60,7 @@ typedef Archive* (*CreateArchiveType)(); template T resolveFunction(QLibrary &lib, const char *name) { T temp = reinterpret_cast(lib.resolve(name)); - if (temp == NULL) { + if (temp == nullptr) { throw std::runtime_error(QObject::tr("invalid 7-zip32.dll: %1").arg(lib.errorString()).toLatin1().constData()); } return temp; @@ -94,7 +94,7 @@ InstallationManager::~InstallationManager() void InstallationManager::setParentWidget(QWidget *widget) { - m_InstallationProgress.setParent(widget); + m_InstallationProgress.setParent(widget, Qt::Dialog); for (IPluginInstaller *installer : m_Installers) { installer->setParentWidget(widget); } @@ -103,7 +103,7 @@ void InstallationManager::setParentWidget(QWidget *widget) void InstallationManager::queryPassword(LPSTR password) { - QString result = QInputDialog::getText(NULL, tr("Password required"), tr("Password"), QLineEdit::Password); + QString result = QInputDialog::getText(nullptr, tr("Password required"), tr("Password"), QLineEdit::Password); strncpy(password, result.toLocal8Bit().constData(), MAX_PASSWORD_LENGTH); } @@ -231,10 +231,10 @@ QStringList InstallationManager::extractFiles(const QStringList &filesOrig, bool const wchar_t *targetFile = data[i]->getFileName(); if (flatten) { targetFile = wcsrchr(data[i]->getFileName(), '\\'); - if (targetFile == NULL) { + if (targetFile == nullptr) { targetFile = wcsrchr(data[i]->getFileName(), '/'); } - if (targetFile == NULL) { + if (targetFile == nullptr) { qCritical("failed to find backslash in %ls", data[i]->getFileName()); continue; } else { @@ -383,7 +383,7 @@ DirectoryTree::Node *InstallationManager::getSimpleArchiveBase(DirectoryTree *da currentNode = *currentNode->nodesBegin(); } else { qDebug("not a simple archive"); - return NULL; + return nullptr; } } } @@ -675,7 +675,7 @@ bool InstallationManager::install(const QString &fileName, GuessedValue } ON_BLOCK_EXIT(std::bind(&InstallationManager::postInstallCleanup, this)); - QScopedPointer filesTree(archiveOpen ? createFilesTree() : NULL); + QScopedPointer filesTree(archiveOpen ? createFilesTree() : nullptr); IPluginInstaller::EInstallResult installResult = IPluginInstaller::RESULT_NOTATTEMPTED; std::sort(m_Installers.begin(), m_Installers.end(), [] (IPluginInstaller *LHS, IPluginInstaller *RHS) { @@ -700,8 +700,8 @@ bool InstallationManager::install(const QString &fileName, GuessedValue try { { // simple case IPluginInstallerSimple *installerSimple = dynamic_cast(installer); - if ((installerSimple != NULL) && - (filesTree != NULL) && (installer->isArchiveSupported(*filesTree))) { + if ((installerSimple != nullptr) && + (filesTree != nullptr) && (installer->isArchiveSupported(*filesTree))) { installResult = installerSimple->install(modName, *filesTree, version, modID); if (installResult == IPluginInstaller::RESULT_SUCCESS) { mapToArchive(filesTree.data()); @@ -715,9 +715,9 @@ bool InstallationManager::install(const QString &fileName, GuessedValue { // custom case IPluginInstallerCustom *installerCustom = dynamic_cast(installer); - if ((installerCustom != NULL) && - (((filesTree != NULL) && installer->isArchiveSupported(*filesTree)) || - ((filesTree == NULL) && installerCustom->isArchiveSupported(fileName)))) { + if ((installerCustom != nullptr) && + (((filesTree != nullptr) && installer->isArchiveSupported(*filesTree)) || + ((filesTree == nullptr) && installerCustom->isArchiveSupported(fileName)))) { std::set installerExtensions = installerCustom->supportedExtensions(); if (installerExtensions.find(fileInfo.suffix()) != installerExtensions.end()) { installResult = installerCustom->install(modName, fileName, version, modID); @@ -738,7 +738,7 @@ bool InstallationManager::install(const QString &fileName, GuessedValue } break; case IPluginInstaller::RESULT_SUCCESS: case IPluginInstaller::RESULT_SUCCESSCANCEL: { - if (filesTree != NULL) { + if (filesTree != nullptr) { DirectoryTree::node_iterator iniTweakNode = filesTree->nodeFind(DirectoryTreeInformation("INI Tweaks")); hasIniTweaks = (iniTweakNode != filesTree->nodesEnd()) && ((*iniTweakNode)->numLeafs() != 0); @@ -796,7 +796,7 @@ void InstallationManager::registerInstaller(IPluginInstaller *installer) m_Installers.push_back(installer); installer->setInstallationManager(this); IPluginInstallerCustom *installerCustom = dynamic_cast(installer); - if (installerCustom != NULL) { + if (installerCustom != nullptr) { std::set extensions = installerCustom->supportedExtensions(); m_SupportedExtensions.insert(extensions.begin(), extensions.end()); } diff --git a/src/installationmanager.h b/src/installationmanager.h index cd20f0dd..4750a148 100644 --- a/src/installationmanager.h +++ b/src/installationmanager.h @@ -143,7 +143,7 @@ public: * @param merge if this value is not null, the value will be set to whether the use chose to merge or replace * @return true if we can proceed with the installation, false if the user canceled or in case of an unrecoverable error */ - virtual bool testOverwrite(MOBase::GuessedValue &modName, bool *merge = NULL) const; + virtual bool testOverwrite(MOBase::GuessedValue &modName, bool *merge = nullptr) const; private: @@ -168,7 +168,7 @@ private: bool isSimpleArchiveTopLayer(const MOBase::DirectoryTree::Node *node, bool bainStyle); MOBase::DirectoryTree::Node *getSimpleArchiveBase(MOBase::DirectoryTree *dataTree); - //bool testOverwrite(const QString &modsDirectory, MOBase::GuessedValue &modName, bool *merge = NULL); + //bool testOverwrite(const QString &modsDirectory, MOBase::GuessedValue &modName, bool *merge = nullptr); bool doInstall(MOBase::GuessedValue &modName, int modID, const QString &version, const QString &newestVersion, int categoryID); diff --git a/src/json.cpp b/src/json.cpp index a280ba34..05a2665a 100644 --- a/src/json.cpp +++ b/src/json.cpp @@ -409,7 +409,7 @@ namespace QtJson { bool ok; if (numberStr.contains('.')) { - return QVariant(numberStr.toDouble(NULL)); + return QVariant(numberStr.toDouble(nullptr)); } else if (numberStr.startsWith('-')) { int i = numberStr.toInt(&ok); if (!ok) { diff --git a/src/loadmechanism.cpp b/src/loadmechanism.cpp index 9d7e4e28..711a7f1a 100644 --- a/src/loadmechanism.cpp +++ b/src/loadmechanism.cpp @@ -141,7 +141,7 @@ void LoadMechanism::deactivateScriptExtender() removeHintFile(pluginsDir); } catch (const std::exception &e) { - QMessageBox::critical(NULL, QObject::tr("Failed to deactivate script extender loading"), e.what()); + QMessageBox::critical(nullptr, QObject::tr("Failed to deactivate script extender loading"), e.what()); } } @@ -172,7 +172,7 @@ void LoadMechanism::deactivateProxyDLL() QDir dir(gameDirectory); removeHintFile(dir); } catch (const std::exception &e) { - QMessageBox::critical(NULL, QObject::tr("Failed to deactivate proxy-dll loading"), e.what()); + QMessageBox::critical(nullptr, QObject::tr("Failed to deactivate proxy-dll loading"), e.what()); } } @@ -211,7 +211,7 @@ void LoadMechanism::activateScriptExtender() } writeHintFile(pluginsDir); } catch (const std::exception &e) { - QMessageBox::critical(NULL, QObject::tr("Failed to set up script extender loading"), e.what()); + QMessageBox::critical(nullptr, QObject::tr("Failed to set up script extender loading"), e.what()); } } @@ -265,7 +265,7 @@ void LoadMechanism::activateProxyDLL() } writeHintFile(QDir(gameDirectory)); } catch (const std::exception &e) { - QMessageBox::critical(NULL, QObject::tr("Failed to set up proxy-dll loading"), e.what()); + QMessageBox::critical(nullptr, QObject::tr("Failed to set up proxy-dll loading"), e.what()); } } diff --git a/src/lockeddialog.cpp b/src/lockeddialog.cpp index c688fff6..907e3c0a 100644 --- a/src/lockeddialog.cpp +++ b/src/lockeddialog.cpp @@ -31,7 +31,7 @@ LockedDialog::LockedDialog(QWidget *parent, const QString &text, bool unlockButt this->setWindowFlags(this->windowFlags() | Qt::ToolTip | Qt::FramelessWindowHint); - if (parent != NULL) { + if (parent != nullptr) { QPoint position = parent->mapToGlobal(QPoint(parent->width() / 2, parent->height() / 2)); position.rx() -= this->width() / 2; position.ry() -= this->height() / 2; @@ -61,7 +61,7 @@ void LockedDialog::setProcessName(const QString &name) void LockedDialog::resizeEvent(QResizeEvent *event) { QWidget *par = parentWidget(); - if (par != NULL) { + if (par != nullptr) { QPoint position = par->mapToGlobal(QPoint(par->width() / 2, par->height() / 2)); position.rx() -= event->size().width() / 2; position.ry() -= event->size().height() / 2; diff --git a/src/logbuffer.cpp b/src/logbuffer.cpp index 17417bf9..635ce13e 100644 --- a/src/logbuffer.cpp +++ b/src/logbuffer.cpp @@ -30,7 +30,7 @@ QMutex LogBuffer::s_Mutex; LogBuffer::LogBuffer(int messageCount, QtMsgType minMsgType, const QString &outputFileName) - : QAbstractItemModel(NULL), m_OutFileName(outputFileName), m_ShutDown(false), + : QAbstractItemModel(nullptr), m_OutFileName(outputFileName), m_ShutDown(false), m_MinMsgType(minMsgType), m_NumMessages(0) { m_Messages.resize(messageCount); diff --git a/src/main.cpp b/src/main.cpp index 3f0360c2..a3ddac20 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -99,12 +99,12 @@ bool bootstrap() // verify the hook-dll exists QString dllName = qApp->applicationDirPath() + "/" + ToQString(AppConfig::hookDLLName()); - if (::GetModuleHandleW(ToWString(dllName).c_str()) != NULL) { + if (::GetModuleHandleW(ToWString(dllName).c_str()) != nullptr) { throw std::runtime_error("hook.dll already loaded! You can't start Mod Organizer from within itself (not even indirectly)"); } HMODULE dllMod = ::LoadLibraryW(ToWString(dllName).c_str()); - if (dllMod == NULL) { + if (dllMod == nullptr) { throw windows_error("hook.dll is missing or invalid"); } ::FreeLibrary(dllMod); @@ -135,7 +135,7 @@ LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs FuncMiniDumpWriteDump funcDump = (FuncMiniDumpWriteDump)::GetProcAddress(dbgDLL, "MiniDumpWriteDump"); if (funcDump) { - if (QMessageBox::question(NULL, QObject::tr("Woops"), + if (QMessageBox::question(nullptr, QObject::tr("Woops"), QObject::tr("ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file " "(%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. " "Please include a short description of what you were doing when the crash happened").arg(qApp->applicationFilePath().append(".dmp")), @@ -144,14 +144,14 @@ LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs std::wstring dumpName = ToWString(qApp->applicationFilePath().append(".dmp")); HANDLE dumpFile = ::CreateFile(dumpName.c_str(), - GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + GENERIC_WRITE, FILE_SHARE_WRITE, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); if (dumpFile != INVALID_HANDLE_VALUE) { _MINIDUMP_EXCEPTION_INFORMATION exceptionInfo; exceptionInfo.ThreadId = ::GetCurrentThreadId(); exceptionInfo.ExceptionPointers = exceptionPtrs; - exceptionInfo.ClientPointers = NULL; + exceptionInfo.ClientPointers = false; - BOOL success = funcDump(::GetCurrentProcess(), ::GetCurrentProcessId(), dumpFile, MiniDumpNormal, &exceptionInfo, NULL, NULL); + BOOL success = funcDump(::GetCurrentProcess(), ::GetCurrentProcessId(), dumpFile, MiniDumpNormal, &exceptionInfo, nullptr, nullptr); ::FlushFileBuffers(dumpFile); ::CloseHandle(dumpFile); @@ -174,7 +174,7 @@ LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs _snprintf(errorBuffer, errorLen, "dbghelp.dll not found"); } - QMessageBox::critical(NULL, QObject::tr("Woops"), + QMessageBox::critical(nullptr, QObject::tr("Woops"), QObject::tr("ModOrganizer has crashed! Unfortunately I was not able to write a diagnostic file: %1").arg(errorBuffer)); return result; } @@ -191,14 +191,14 @@ bool HaveWriteAccess(const std::wstring &path) const static SECURITY_INFORMATION requestedFileInformation = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION; DWORD length = 0; - if (!::GetFileSecurityW(path.c_str(), requestedFileInformation, NULL, NULL, &length) + if (!::GetFileSecurityW(path.c_str(), requestedFileInformation, nullptr, 0UL, &length) && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { std::string tempBuffer; tempBuffer.reserve(length); PSECURITY_DESCRIPTOR security = (PSECURITY_DESCRIPTOR)tempBuffer.data(); if (security && ::GetFileSecurity(path.c_str(), requestedFileInformation, security, length, &length)) { - HANDLE token = NULL; + HANDLE token = nullptr; const static DWORD tokenDesiredAccess = TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_DUPLICATE | STANDARD_RIGHTS_READ; if (!::OpenThreadToken(::GetCurrentThread(), tokenDesiredAccess, TRUE, &token)) { if (!::OpenProcessToken(::GetCurrentProcess(), tokenDesiredAccess, &token)) { @@ -206,7 +206,7 @@ bool HaveWriteAccess(const std::wstring &path) } } - HANDLE impersonatedToken = NULL; + HANDLE impersonatedToken = nullptr; if (::DuplicateToken(token, SecurityImpersonation, &impersonatedToken)) { GENERIC_MAPPING mapping = { 0xFFFFFFFF }; mapping.GenericRead = FILE_GENERIC_READ; @@ -297,7 +297,7 @@ int main(int argc, char *argv[]) if (!HaveWriteAccess(ToWString(application.applicationDirPath()))) { QStringList arguments = application.arguments(); arguments.pop_front(); - ::ShellExecuteW( NULL + ::ShellExecuteW( nullptr , L"runas" , ToWString(QString("\"%1\"").arg(QCoreApplication::applicationFilePath())).c_str() , ToWString(arguments.join(" ")).c_str() @@ -348,7 +348,7 @@ int main(int argc, char *argv[]) instance.sendMessage(arguments.at(1)); return 0; } else if (arguments.size() == 1) { - QMessageBox::information(NULL, QObject::tr("Mod Organizer"), QObject::tr("An instance of Mod Organizer is already running")); + QMessageBox::information(nullptr, QObject::tr("Mod Organizer"), QObject::tr("An instance of Mod Organizer is already running")); return 0; } } // we continue for the primary instance OR if MO has been called with parameters @@ -399,7 +399,7 @@ int main(int argc, char *argv[]) } else { gamePath = QDir::cleanPath(selection.getChoiceData().toString()); if (gamePath.isEmpty()) { - gamePath = QFileDialog::getExistingDirectory(NULL, QObject::tr("Please select the game to manage"), QString(), + gamePath = QFileDialog::getExistingDirectory(nullptr, QObject::tr("Please select the game to manage"), QString(), QFileDialog::ShowDirsOnly); } } @@ -426,7 +426,7 @@ int main(int argc, char *argv[]) if (!settings.contains("game_edition")) { std::vector editions = GameInfo::instance().getSteamVariants(); if (editions.size() > 1) { - SelectionDialog selection(QObject::tr("Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!)"), NULL); + SelectionDialog selection(QObject::tr("Please select the game edition you have (MO can't start the game correctly if this is set incorrectly!)"), nullptr); int index = 0; for (auto iter = editions.begin(); iter != editions.end(); ++iter) { selection.addChoice(ToQString(*iter), "", index++); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index d4a7f4fc..0fdbdfad 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -336,7 +336,7 @@ MainWindow::~MainWindow() void MainWindow::disconnectPlugins() { - if (ui->actionTool->menu() != NULL) { + if (ui->actionTool->menu() != nullptr) { ui->actionTool->menu()->clear(); } } @@ -432,11 +432,11 @@ static QModelIndex mapToModel(const QAbstractItemModel *targetModel, QModelIndex QModelIndex result = idx; const QAbstractItemModel *model = idx.model(); while (model != targetModel) { - if (model == NULL) { + if (model == nullptr) { return QModelIndex(); } const QAbstractProxyModel *proxyModel = qobject_cast(model); - if (proxyModel == NULL) { + if (proxyModel == nullptr) { return QModelIndex(); } result = proxyModel->mapToSource(result); @@ -484,7 +484,7 @@ void MainWindow::updateToolBar() QWidget *widget = ui->toolBar->widgetForAction(ui->actionTool); QToolButton *toolBtn = qobject_cast(widget); - if (toolBtn->menu() == NULL) { + if (toolBtn->menu() == nullptr) { actionToToolButton(ui->actionTool); } @@ -600,7 +600,7 @@ void MainWindow::createHelpWidget() { QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionHelp)); QMenu *buttonMenu = toolBtn->menu(); - if (buttonMenu == NULL) { + if (buttonMenu == nullptr) { return; } buttonMenu->clear(); @@ -838,14 +838,14 @@ SaveGameGamebryo *MainWindow::getSaveGame(QListWidgetItem *item) return saveGame; } catch (const std::exception &e) { reportError(tr("failed to read savegame: %1").arg(e.what())); - return NULL; + return nullptr; } } void MainWindow::displaySaveGameInfo(const SaveGameGamebryo *save, QPoint pos) { - if (m_CurrentSaveView == NULL) { + if (m_CurrentSaveView == nullptr) { m_CurrentSaveView = new SaveGameInfoWidgetGamebryo(save, m_OrganizerCore.pluginList(), this); } else { m_CurrentSaveView->setSave(save); @@ -874,11 +874,11 @@ void MainWindow::displaySaveGameInfo(const SaveGameGamebryo *save, QPoint pos) void MainWindow::saveSelectionChanged(QListWidgetItem *newItem) { - if (newItem == NULL) { + if (newItem == nullptr) { hideSaveGameInfo(); - } else if ((m_CurrentSaveView == NULL) || (newItem != m_CurrentSaveView->property("displayItem").value())) { + } else if ((m_CurrentSaveView == nullptr) || (newItem != m_CurrentSaveView->property("displayItem").value())) { const SaveGameGamebryo *save = getSaveGame(newItem); - if (save != NULL) { + if (save != nullptr) { displaySaveGameInfo(save, QCursor::pos()); m_CurrentSaveView->setProperty("displayItem", qVariantFromValue((void*)newItem)); } @@ -889,10 +889,10 @@ void MainWindow::saveSelectionChanged(QListWidgetItem *newItem) void MainWindow::hideSaveGameInfo() { - if (m_CurrentSaveView != NULL) { + if (m_CurrentSaveView != nullptr) { disconnect(m_CurrentSaveView, SIGNAL(closeSaveInfo()), this, SLOT(hideSaveGameInfo())); m_CurrentSaveView->deleteLater(); - m_CurrentSaveView = NULL; + m_CurrentSaveView = nullptr; } } @@ -928,7 +928,7 @@ void MainWindow::modPagePluginInvoke() m_IntegratedBrowser.setWindowTitle(plugin->displayName()); m_IntegratedBrowser.openUrl(plugin->pageURL()); } else { - ::ShellExecuteW(NULL, L"open", ToWString(plugin->pageURL().toString()).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", ToWString(plugin->pageURL().toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } } @@ -948,7 +948,7 @@ void MainWindow::registerPluginTool(IPluginTool *tool) void MainWindow::registerModPage(IPluginModPage *modPage) { // turn the browser action into a drop-down menu if necessary - if (ui->actionNexus->menu() == NULL) { + if (ui->actionNexus->menu() == nullptr) { QAction *nexusAction = ui->actionNexus; // TODO: use a different icon for nexus! ui->actionNexus = new QAction(nexusAction->icon(), tr("Browse Mod Page"), ui->toolBar); @@ -973,7 +973,7 @@ void MainWindow::registerModPage(IPluginModPage *modPage) void MainWindow::startExeAction() { QAction *action = qobject_cast(sender()); - if (action != NULL) { + if (action != nullptr) { Executable selectedExecutable = action->data().value(); m_OrganizerCore.spawnBinary( selectedExecutable.m_BinaryInfo, @@ -1016,7 +1016,7 @@ void MainWindow::on_profileBox_currentIndexChanged(int index) m_OldProfileIndex = index; if ((previousIndex != -1) && - (m_OrganizerCore.currentProfile() != NULL) && + (m_OrganizerCore.currentProfile() != nullptr) && m_OrganizerCore.currentProfile()->exists()) { m_OrganizerCore.saveCurrentLists(); } @@ -1155,7 +1155,7 @@ void MainWindow::expandDataTreeItem(QTreeWidgetItem *item) std::wstring virtualPath = (path + L"\\").substr(6) + ToWString(item->text(0)); DirectoryEntry *dir = m_OrganizerCore.directoryStructure()->findSubDirectoryRecursive(virtualPath); - if (dir != NULL) { + if (dir != nullptr) { updateTo(item, path, *dir, conflictsOnly); } else { qWarning("failed to update view of %ls", path.c_str()); @@ -1227,7 +1227,7 @@ extern QPixmap qt_pixmapFromWinHICON(HICON icon); QIcon MainWindow::iconForExecutable(const QString &filePath) { HICON winIcon; - UINT res = ::ExtractIconExW(ToWString(filePath).c_str(), 0, &winIcon, NULL, 1); + UINT res = ::ExtractIconExW(ToWString(filePath).c_str(), 0, &winIcon, nullptr, 1); if (res == 1) { QIcon result = QIcon(qt_pixmapFromWinHICON(winIcon)); ::DestroyIcon(winIcon); @@ -1397,7 +1397,7 @@ void MainWindow::updateBSAList(const QStringList &defaultArchives, const QString modName = modInfo->name(); } QList items = ui->bsaList->findItems(modName, Qt::MatchFixedString); - QTreeWidgetItem *subItem = NULL; + QTreeWidgetItem *subItem = nullptr; if (items.length() > 0) { subItem = items.at(0); } else { @@ -1648,14 +1648,14 @@ static HRESULT CreateShortcut(LPCWSTR targetFileName, LPCWSTR arguments, LPCWSTR currentDirectory) { HRESULT result = E_INVALIDARG; - if ((targetFileName != NULL) && (wcslen(targetFileName) > 0) && - (arguments != NULL) && - (linkFileName != NULL) && (strlen(linkFileName) > 0) && - (description != NULL) && - (currentDirectory != NULL)) { + if ((targetFileName != nullptr) && (wcslen(targetFileName) > 0) && + (arguments != nullptr) && + (linkFileName != nullptr) && (strlen(linkFileName) > 0) && + (description != nullptr) && + (currentDirectory != nullptr)) { IShellLink* shellLink; - result = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, + result = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&shellLink); if (!SUCCEEDED(result)) { @@ -1755,19 +1755,19 @@ void MainWindow::helpTriggered() void MainWindow::wikiTriggered() { -// ::ShellExecuteW(NULL, L"open", L"http://issue.tannin.eu/tbg/wiki/Modorganizer%3AMainPage", NULL, NULL, SW_SHOWNORMAL); - ::ShellExecuteW(NULL, L"open", L"http://wiki.step-project.com/Guide:Mod_Organizer", NULL, NULL, SW_SHOWNORMAL); +// ::ShellExecuteW(nullptr, L"open", L"http://issue.tannin.eu/tbg/wiki/Modorganizer%3AMainPage", nullptr, nullptr, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", L"http://wiki.step-project.com/Guide:Mod_Organizer", nullptr, nullptr, SW_SHOWNORMAL); } void MainWindow::issueTriggered() { - ::ShellExecuteW(NULL, L"open", L"http://issue.tannin.eu/tbg", NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", L"http://issue.tannin.eu/tbg", nullptr, nullptr, SW_SHOWNORMAL); } void MainWindow::tutorialTriggered() { QAction *tutorialAction = qobject_cast(sender()); - if (tutorialAction != NULL) { + if (tutorialAction != nullptr) { if (QMessageBox::question(this, tr("Start Tutorial?"), tr("You're about to start a tutorial. For technical reasons it's not possible to end " "the tutorial early. Continue?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { @@ -1870,7 +1870,7 @@ void MainWindow::modorder_changed() ModInfo::Ptr modInfo = ModInfo::getByIndex(current.data(Qt::UserRole + 1).toInt()); modInfo->doConflictCheck(); m_OrganizerCore.modList()->setOverwriteMarkers(modInfo->getModOverwrite(), modInfo->getModOverwritten()); - if (m_ModListSortProxy != NULL) { + if (m_ModListSortProxy != nullptr) { m_ModListSortProxy->invalidate(); } ui->modList->verticalScrollBar()->repaint(); @@ -2007,7 +2007,7 @@ void MainWindow::modlistChanged(int) void MainWindow::fileMoved(const QString &filePath, const QString &oldOriginName, const QString &newOriginName) { const FileEntry::Ptr filePtr = m_OrganizerCore.directoryStructure()->findFile(ToWString(filePath)); - if (filePtr.get() != NULL) { + if (filePtr.get() != nullptr) { try { if (m_OrganizerCore.directoryStructure()->originExists(ToWString(newOriginName))) { FilesOrigin &newOrigin = m_OrganizerCore.directoryStructure()->getOriginByName(ToWString(newOriginName)); @@ -2035,7 +2035,7 @@ QTreeWidgetItem *MainWindow::addFilterItem(QTreeWidgetItem *root, const QString QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(name)); item->setData(0, Qt::UserRole, categoryID); item->setData(0, Qt::UserRole + 1, type); - if (root != NULL) { + if (root != nullptr) { root->addChild(item); } else { ui->categoriesList->addTopLevelItem(item); @@ -2046,7 +2046,7 @@ QTreeWidgetItem *MainWindow::addFilterItem(QTreeWidgetItem *root, const QString void MainWindow::addContentFilters() { for (unsigned i = 0; i < ModInfo::NUM_CONTENT_TYPES; ++i) { - addFilterItem(NULL, tr("").arg(ModInfo::getContentTypeName(i)), i, ModListSortProxy::TYPE_CONTENT); + addFilterItem(nullptr, tr("").arg(ModInfo::getContentTypeName(i)), i, ModListSortProxy::TYPE_CONTENT); } } @@ -2079,14 +2079,14 @@ void MainWindow::refreshFilters() } ui->categoriesList->clear(); - addFilterItem(NULL, tr(""), CategoryFactory::CATEGORY_SPECIAL_CHECKED, ModListSortProxy::TYPE_SPECIAL); - addFilterItem(NULL, tr(""), CategoryFactory::CATEGORY_SPECIAL_UNCHECKED, ModListSortProxy::TYPE_SPECIAL); - addFilterItem(NULL, tr(""), CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE, ModListSortProxy::TYPE_SPECIAL); - addFilterItem(NULL, tr(""), CategoryFactory::CATEGORY_SPECIAL_MANAGED, ModListSortProxy::TYPE_SPECIAL); - addFilterItem(NULL, tr(""), CategoryFactory::CATEGORY_SPECIAL_UNMANAGED, ModListSortProxy::TYPE_SPECIAL); - addFilterItem(NULL, tr(""), CategoryFactory::CATEGORY_SPECIAL_NOCATEGORY, ModListSortProxy::TYPE_SPECIAL); - addFilterItem(NULL, tr(""), CategoryFactory::CATEGORY_SPECIAL_CONFLICT, ModListSortProxy::TYPE_SPECIAL); - addFilterItem(NULL, tr(""), CategoryFactory::CATEGORY_SPECIAL_NOTENDORSED, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_CHECKED, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_UNCHECKED, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_MANAGED, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_UNMANAGED, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_NOCATEGORY, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_CONFLICT, ModListSortProxy::TYPE_SPECIAL); + addFilterItem(nullptr, tr(""), CategoryFactory::CATEGORY_SPECIAL_NOTENDORSED, ModListSortProxy::TYPE_SPECIAL); addContentFilters(); @@ -2103,7 +2103,7 @@ void MainWindow::refreshFilters() } } - addCategoryFilters(NULL, categoriesUsed, 0); + addCategoryFilters(nullptr, categoriesUsed, 0); foreach (const QString &item, selectedItems) { QList matches = ui->categoriesList->findItems(item, Qt::MatchFixedString | Qt::MatchRecursive); @@ -2166,7 +2166,7 @@ void MainWindow::modlistSelectionChanged(const QModelIndex ¤t, const QMode } else { m_OrganizerCore.modList()->setOverwriteMarkers(std::set(), std::set()); } - if ((m_ModListSortProxy != NULL) + if ((m_ModListSortProxy != nullptr) && !m_ModListSortProxy->beingInvalidated()) { m_ModListSortProxy->invalidate(); } @@ -2322,7 +2322,7 @@ void MainWindow::windowTutorialFinished(const QString &windowName) void MainWindow::overwriteClosed(int) { OverwriteInfoDialog *dialog = this->findChild("__overwriteDialog"); - if (dialog != NULL) { + if (dialog != nullptr) { m_OrganizerCore.modList()->modInfoChanged(dialog->modInfo()); dialog->deleteLater(); } @@ -2336,7 +2336,7 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, if (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) { QDialog *dialog = this->findChild("__overwriteDialog"); try { - if (dialog == NULL) { + if (dialog == nullptr) { dialog = new OverwriteInfoDialog(modInfo, this); dialog->setObjectName("__overwriteDialog"); } else { @@ -2483,7 +2483,7 @@ void MainWindow::openExplorer_clicked() { ModInfo::Ptr modInfo = ModInfo::getByIndex(m_ContextRow); - ::ShellExecuteW(NULL, L"explore", ToWString(modInfo->absolutePath()).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } void MainWindow::information_clicked() @@ -2523,13 +2523,13 @@ void MainWindow::createModFromOverwrite() } } - if (m_OrganizerCore.getMod(name) != NULL) { + if (m_OrganizerCore.getMod(name) != nullptr) { reportError(tr("A mod with this name already exists")); return; } IModInterface *newMod = m_OrganizerCore.createMod(name); - if (newMod == NULL) { + if (newMod == nullptr) { return; } @@ -2610,11 +2610,11 @@ void MainWindow::replaceCategoriesFromMenu(QMenu *menu, int modRow) { ModInfo::Ptr modInfo = ModInfo::getByIndex(modRow); foreach (QAction* action, menu->actions()) { - if (action->menu() != NULL) { + if (action->menu() != nullptr) { replaceCategoriesFromMenu(action->menu(), modRow); } else { QWidgetAction *widgetAction = qobject_cast(action); - if (widgetAction != NULL) { + if (widgetAction != nullptr) { QCheckBox *checkbox = qobject_cast(widgetAction->defaultWidget()); modInfo->setCategory(widgetAction->data().toInt(), checkbox->isChecked()); } @@ -2627,11 +2627,11 @@ void MainWindow::addRemoveCategoriesFromMenu(QMenu *menu, int modRow, int refere if (referenceRow != -1 && referenceRow != modRow) { ModInfo::Ptr editedModInfo = ModInfo::getByIndex(referenceRow); foreach (QAction* action, menu->actions()) { - if (action->menu() != NULL) { + if (action->menu() != nullptr) { addRemoveCategoriesFromMenu(action->menu(), modRow, referenceRow); } else { QWidgetAction *widgetAction = qobject_cast(action); - if (widgetAction != NULL) { + if (widgetAction != nullptr) { QCheckBox *checkbox = qobject_cast(widgetAction->defaultWidget()); int categoryId = widgetAction->data().toInt(); bool checkedBefore = editedModInfo->categorySet(categoryId); @@ -2651,7 +2651,7 @@ void MainWindow::addRemoveCategoriesFromMenu(QMenu *menu, int modRow, int refere void MainWindow::addRemoveCategories_MenuHandler() { QMenu *menu = qobject_cast(sender()); - if (menu == NULL) { + if (menu == nullptr) { qCritical("not a menu?"); return; } @@ -2688,7 +2688,7 @@ void MainWindow::addRemoveCategories_MenuHandler() { void MainWindow::replaceCategories_MenuHandler() { QMenu *menu = qobject_cast(sender()); - if (menu == NULL) { + if (menu == nullptr) { qCritical("not a menu?"); return; } @@ -2726,14 +2726,14 @@ void MainWindow::replaceCategories_MenuHandler() { void MainWindow::savePrimaryCategory() { QMenu *menu = qobject_cast(sender()); - if (menu == NULL) { + if (menu == nullptr) { qCritical("not a menu?"); return; } foreach (QAction* action, menu->actions()) { QWidgetAction *widgetAction = qobject_cast(action); - if (widgetAction != NULL) { + if (widgetAction != nullptr) { QRadioButton *btn = qobject_cast(widgetAction->defaultWidget()); if (btn->isChecked()) { QModelIndexList selected = ui->modList->selectionModel()->selectedRows(); @@ -2854,7 +2854,7 @@ void MainWindow::addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInf void MainWindow::addPrimaryCategoryCandidates() { QMenu *menu = qobject_cast(sender()); - if (menu == NULL) { + if (menu == nullptr) { qCritical("not a menu?"); return; } @@ -2866,7 +2866,7 @@ void MainWindow::addPrimaryCategoryCandidates() void MainWindow::enableVisibleMods() { - if (QMessageBox::question(NULL, tr("Confirm"), tr("Really enable all visible mods?"), + if (QMessageBox::question(nullptr, tr("Confirm"), tr("Really enable all visible mods?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { m_ModListSortProxy->enableAllVisible(); } @@ -2874,7 +2874,7 @@ void MainWindow::enableVisibleMods() void MainWindow::disableVisibleMods() { - if (QMessageBox::question(NULL, tr("Confirm"), tr("Really disable all visible mods?"), + if (QMessageBox::question(nullptr, tr("Confirm"), tr("Really disable all visible mods?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { m_ModListSortProxy->disableAllVisible(); } @@ -2967,7 +2967,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos) m_ContextIdx = mapToModel(m_OrganizerCore.modList(), modList->indexAt(pos)); m_ContextRow = m_ContextIdx.row(); - QMenu *menu = NULL; + QMenu *menu = nullptr; QMenu *allMods = modListContextMenu(); if (m_ContextRow == -1) { // no selection @@ -3121,7 +3121,7 @@ void MainWindow::fixMods_clicked() { QListWidgetItem *selectedItem = ui->savegameList->currentItem(); - if (selectedItem == NULL) + if (selectedItem == nullptr) return; // if required, parse the save game @@ -3345,20 +3345,20 @@ void MainWindow::on_actionSettings_triggered() void MainWindow::on_actionNexus_triggered() { - ::ShellExecuteW(NULL, L"open", GameInfo::instance().getNexusPage(false).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", GameInfo::instance().getNexusPage(false).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } void MainWindow::nexusLinkActivated(const QString &link) { - ::ShellExecuteW(NULL, L"open", ToWString(link).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", ToWString(link).c_str(), nullptr, nullptr, SW_SHOWNORMAL); ui->tabWidget->setCurrentIndex(4); } void MainWindow::linkClicked(const QString &url) { - ::ShellExecuteW(NULL, L"open", ToWString(url).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", ToWString(url).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } @@ -3470,7 +3470,7 @@ int MainWindow::getBinaryExecuteInfo(const QFileInfo &targetInfo, { // try to find java automatically WCHAR buffer[MAX_PATH]; - if (::FindExecutableW(targetPathW.c_str(), NULL, buffer) > (HINSTANCE)32) { + if (::FindExecutableW(targetPathW.c_str(), nullptr, buffer) > (HINSTANCE)32) { DWORD binaryType = 0UL; if (!::GetBinaryTypeW(targetPathW.c_str(), &binaryType)) { qDebug("failed to determine binary type of \"%ls\": %lu", targetPathW.c_str(), ::GetLastError()); @@ -3507,7 +3507,7 @@ int MainWindow::getBinaryExecuteInfo(const QFileInfo &targetInfo, void MainWindow::addAsExecutable() { - if (m_ContextItem != NULL) { + if (m_ContextItem != nullptr) { QFileInfo targetInfo(m_ContextItem->data(0, Qt::UserRole).toString()); QFileInfo binaryInfo; QString arguments; @@ -3605,9 +3605,9 @@ void MainWindow::previewDataFile() offset = fileName.indexOf("/", offset); fileName = fileName.mid(offset + 1); - const FileEntry::Ptr file = m_OrganizerCore.directoryStructure()->searchFile(ToWString(fileName), NULL); + const FileEntry::Ptr file = m_OrganizerCore.directoryStructure()->searchFile(ToWString(fileName), nullptr); - if (file.get() == NULL) { + if (file.get() == nullptr) { reportError(tr("file not found: %1").arg(fileName)); return; } @@ -3641,7 +3641,7 @@ void MainWindow::previewDataFile() void MainWindow::openDataFile() { - if (m_ContextItem != NULL) { + if (m_ContextItem != nullptr) { QFileInfo targetInfo(m_ContextItem->data(0, Qt::UserRole).toString()); QFileInfo binaryInfo; QString arguments; @@ -3650,7 +3650,7 @@ void MainWindow::openDataFile() m_OrganizerCore.spawnBinaryDirect(binaryInfo, arguments, m_OrganizerCore.currentProfile()->getName(), targetInfo.absolutePath(), ""); } break; case 2: { - ::ShellExecuteW(NULL, L"open", ToWString(targetInfo.absoluteFilePath()).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", ToWString(targetInfo.absoluteFilePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } break; default: { // nop @@ -3702,7 +3702,7 @@ void MainWindow::on_dataTree_customContextMenuRequested(const QPoint &pos) m_ContextItem = dataTree->itemAt(pos.x(), pos.y()); QMenu menu; - if ((m_ContextItem != NULL) && (m_ContextItem->childCount() == 0)) { + if ((m_ContextItem != nullptr) && (m_ContextItem->childCount() == 0)) { menu.addAction(tr("Open/Execute"), this, SLOT(openDataFile())); menu.addAction(tr("Add as Executable"), this, SLOT(addAsExecutable())); @@ -3984,9 +3984,9 @@ void MainWindow::displayColumnSelection(const QPoint &pos) int i = 1; foreach (const QAction *action, menu.actions()) { const QWidgetAction *widgetAction = qobject_cast(action); - if (widgetAction != NULL) { + if (widgetAction != nullptr) { const QCheckBox *checkBox = qobject_cast(widgetAction->defaultWidget()); - if (checkBox != NULL) { + if (checkBox != nullptr) { ui->modList->header()->setSectionHidden(i, !checkBox->isChecked()); } } @@ -4109,7 +4109,7 @@ void MainWindow::removeFromToolbar() void MainWindow::toolBar_customContextMenuRequested(const QPoint &point) { QAction *action = ui->toolBar->actionAt(point); - if (action != NULL) { + if (action != nullptr) { if (action->objectName().startsWith("custom_")) { m_ContextAction = action; QMenu menu; @@ -4161,10 +4161,10 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) void MainWindow::on_groupCombo_currentIndexChanged(int index) { - if (m_ModListSortProxy == NULL) { + if (m_ModListSortProxy == nullptr) { return; } - QAbstractProxyModel *newModel = NULL; + QAbstractProxyModel *newModel = nullptr; switch (index) { case 1: { newModel = new QtGroupingProxy(m_OrganizerCore.modList(), QModelIndex(), ModList::COL_CATEGORY, Qt::UserRole, @@ -4176,11 +4176,11 @@ void MainWindow::on_groupCombo_currentIndexChanged(int index) Qt::UserRole + 2); } break; default: { - newModel = NULL; + newModel = nullptr; } break; } - if (newModel != NULL) { + if (newModel != nullptr) { #ifdef TEST_MODELS new ModelTest(newModel, this); #endif // TEST_MODELS @@ -4220,7 +4220,7 @@ void MainWindow::createStdoutPipe(HANDLE *stdOutRead, HANDLE *stdOutWrite) SECURITY_ATTRIBUTES secAttributes; secAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); secAttributes.bInheritHandle = TRUE; - secAttributes.lpSecurityDescriptor = NULL; + secAttributes.lpSecurityDescriptor = nullptr; if (!::CreatePipe(stdOutRead, stdOutWrite, &secAttributes, 0)) { qCritical("failed to create stdout reroute"); @@ -4242,7 +4242,7 @@ std::string MainWindow::readFromPipe(HANDLE stdOutRead) DWORD read = 1; while (read > 0) { - if (!::ReadFile(stdOutRead, buffer, chunkSize, &read, NULL)) { + if (!::ReadFile(stdOutRead, buffer, chunkSize, &read, nullptr)) { break; } if (read > 0) { diff --git a/src/messagedialog.cpp b/src/messagedialog.cpp index 36902bbf..90b0a9d3 100644 --- a/src/messagedialog.cpp +++ b/src/messagedialog.cpp @@ -52,7 +52,7 @@ MessageDialog::MessageDialog(const QString &text, QWidget *reference) : this->setFocusPolicy(Qt::NoFocus); this->setAttribute(Qt::WA_ShowWithoutActivating); QTimer::singleShot(1000 + (text.length() * 40), this, SLOT(hide())); - if (reference != NULL) { + if (reference != nullptr) { QPoint position = reference->mapToGlobal(QPoint(reference->width() / 2, reference->height())); position.rx() -= this->width() / 2; position.ry() -= this->height() + 5; @@ -70,7 +70,7 @@ MessageDialog::~MessageDialog() void MessageDialog::resizeEvent(QResizeEvent *event) { QWidget *par = parentWidget(); - if (par != NULL) { + if (par != nullptr) { QPoint position = par->mapToGlobal(QPoint(par->width() / 2, par->height())); position.rx() -= event->size().width() / 2; position.ry() -= event->size().height() + 5; @@ -83,7 +83,7 @@ void MessageDialog::showMessage(const QString &text, QWidget *reference, bool br { qDebug("%s", qPrintable(text)); if (reference != nullptr) { - if (bringToFront || (qApp->activeWindow() != NULL)) { + if (bringToFront || (qApp->activeWindow() != nullptr)) { MessageDialog *dialog = new MessageDialog(text, reference); dialog->show(); reference->activateWindow(); diff --git a/src/modinfo.cpp b/src/modinfo.cpp index d773823a..aa831e04 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -639,7 +639,7 @@ void ModInfoRegular::nxmRequestFailed(int, int, QVariant userData, const QString if (userData.canConvert() && (userData.toInt() == 1)) { fullMessage += "\nNexus will reject endorsements within 15 Minutes of a failed attempt, the error message may be misleading."; } - if (QApplication::activeWindow() != NULL) { + if (QApplication::activeWindow() != nullptr) { MessageDialog::showMessage(fullMessage, QApplication::activeWindow()); } emit modDetailsUpdated(false); diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 9133b166..0dfdd1f4 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -63,8 +63,8 @@ bool operator<(const ModFileListWidget &LHS, const ModFileListWidget &RHS) ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directory, bool unmanaged, QWidget *parent) : TutorableDialog("ModInfoDialog", parent), ui(new Ui::ModInfoDialog), m_ModInfo(modInfo), m_ThumbnailMapper(this), m_RequestStarted(false), - m_DeleteAction(NULL), m_RenameAction(NULL), m_OpenAction(NULL), - m_Directory(directory), m_Origin(NULL) + m_DeleteAction(nullptr), m_RenameAction(nullptr), m_OpenAction(nullptr), + m_Directory(directory), m_Origin(nullptr) { ui->setupUi(this); this->setWindowTitle(modInfo->name()); @@ -90,7 +90,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo if (directory->originExists(ToWString(modInfo->name()))) { m_Origin = &directory->getOriginByName(ToWString(modInfo->name())); if (m_Origin->isDisabled()) { - m_Origin = NULL; + m_Origin = nullptr; } } @@ -115,7 +115,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo } initINITweaks(); - ui->tabWidget->setTabEnabled(TAB_CONFLICTS, m_Origin != NULL); + ui->tabWidget->setTabEnabled(TAB_CONFLICTS, m_Origin != nullptr); if (ui->tabWidget->currentIndex() == TAB_NEXUS) { activateNexusTab(); @@ -248,7 +248,7 @@ void ModInfoDialog::refreshLists() ui->overwriteTree->clear(); ui->overwrittenTree->clear(); - if (m_Origin != NULL) { + if (m_Origin != nullptr) { std::vector files = m_Origin->getFiles(); for (auto iter = files.begin(); iter != files.end(); ++iter) { QString relativeName = QDir::fromNativeSeparators(ToQString((*iter)->getRelativePath())); @@ -692,7 +692,7 @@ void ModInfoDialog::linkClicked(const QUrl &url) this->close(); emit nexusLinkActivated(url.toString()); } else { - ::ShellExecuteW(NULL, L"open", ToWString(url.toString()).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", ToWString(url.toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } } @@ -981,7 +981,7 @@ void ModInfoDialog::openFile(const QModelIndex &index) { QString fileName = m_FileSystemModel->filePath(index); - HINSTANCE res = ::ShellExecuteW(NULL, L"open", ToWString(fileName).c_str(), NULL, NULL, SW_SHOW); + HINSTANCE res = ::ShellExecuteW(nullptr, L"open", ToWString(fileName).c_str(), nullptr, nullptr, SW_SHOW); if ((int)res <= 32) { qCritical("failed to invoke %s: %d", fileName.toUtf8().constData(), res); } @@ -1065,7 +1065,7 @@ void ModInfoDialog::on_fileTree_customContextMenuRequested(const QPoint &pos) void ModInfoDialog::on_categoriesTree_itemChanged(QTreeWidgetItem *item, int) { QTreeWidgetItem *parent = item->parent(); - while ((parent != NULL) && ((parent->flags() & Qt::ItemIsUserCheckable) != 0) && (parent->checkState(0) == Qt::Unchecked)) { + while ((parent != nullptr) && ((parent->flags() & Qt::ItemIsUserCheckable) != 0) && (parent->checkState(0) == Qt::Unchecked)) { parent->setCheckState(0, Qt::Checked); parent = parent->parent(); } @@ -1184,7 +1184,7 @@ void ModInfoDialog::on_overwriteTree_customContextMenuRequested(const QPoint &po { m_ConflictsContextItem = ui->overwriteTree->itemAt(pos.x(), pos.y()); - if (m_ConflictsContextItem != NULL) { + if (m_ConflictsContextItem != nullptr) { // offer to hide/unhide file, but not for files from archives if (!m_ConflictsContextItem->data(1, Qt::UserRole + 2).toBool()) { QMenu menu; diff --git a/src/modlist.cpp b/src/modlist.cpp index fb8df15e..1bd7b0f0 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -50,8 +50,8 @@ using namespace MOBase; ModList::ModList(QObject *parent) : QAbstractItemModel(parent) - , m_Profile(NULL) - , m_NexusInterface(NULL) + , m_Profile(nullptr) + , m_NexusInterface(nullptr) , m_Modified(false) , m_FontMetrics(QFont()) , m_DropOnItems(false) @@ -177,7 +177,7 @@ QString ModList::contentsToToolTip(const std::vector &content QVariant ModList::data(const QModelIndex &modelIndex, int role) const { - if (m_Profile == NULL) return QVariant(); + if (m_Profile == nullptr) return QVariant(); if (!modelIndex.isValid()) return QVariant(); unsigned int modIndex = modelIndex.row(); int column = modelIndex.column(); @@ -410,7 +410,7 @@ bool ModList::renameMod(int index, const QString &newName) { QString nameFixed = newName; if (!fixDirectoryName(nameFixed) || nameFixed.isEmpty()) { - MessageDialog::showMessage(tr("Invalid name"), NULL); + MessageDialog::showMessage(tr("Invalid name"), nullptr); return false; } @@ -433,7 +433,7 @@ bool ModList::renameMod(int index, const QString &newName) bool ModList::setData(const QModelIndex &index, const QVariant &value, int role) { - if (m_Profile == NULL) return false; + if (m_Profile == nullptr) return false; if (static_cast(index.row()) >= ModInfo::getNumMods()) { return false; @@ -591,7 +591,7 @@ QStringList ModList::mimeTypes() const void ModList::changeModPriority(std::vector sourceIndices, int newPriority) { - if (m_Profile == NULL) return; + if (m_Profile == nullptr) return; emit layoutAboutToBeChanged(); Profile *profile = m_Profile; @@ -625,7 +625,7 @@ void ModList::changeModPriority(std::vector sourceIndices, int newPriority) void ModList::changeModPriority(int sourceIndex, int newPriority) { - if (m_Profile == NULL) return; + if (m_Profile == nullptr) return; emit layoutAboutToBeChanged(); m_Profile->setModPriority(sourceIndex, newPriority); @@ -839,7 +839,7 @@ bool ModList::dropMimeData(const QMimeData *mimeData, Qt::DropAction action, int return true; } - if (m_Profile == NULL) return false; + if (m_Profile == nullptr) return false; if (mimeData->hasUrls()) { return dropURLs(mimeData, row, parent); } else { @@ -854,7 +854,7 @@ void ModList::removeRowForce(int row) if (static_cast(row) >= ModInfo::getNumMods()) { return; } - if (m_Profile == NULL) return; + if (m_Profile == nullptr) return; m_Profile->setModEnabled(row, false); @@ -882,7 +882,7 @@ void ModList::removeRow(int row, const QModelIndex&) if (static_cast(row) >= ModInfo::getNumMods()) { return; } - if (m_Profile == NULL) return; + if (m_Profile == nullptr) return; m_Profile->setModEnabled(row, false); @@ -992,28 +992,28 @@ bool ModList::eventFilter(QObject *obj, QEvent *event) if (event->type() == QEvent::ContextMenu) { QContextMenuEvent *contextEvent = static_cast(event); QWidget *object = qobject_cast(obj); - if ((object != NULL) && (contextEvent->reason() == QContextMenuEvent::Mouse)) { + if ((object != nullptr) && (contextEvent->reason() == QContextMenuEvent::Mouse)) { emit requestColumnSelect(object->mapToGlobal(contextEvent->pos())); return true; } - } else if ((event->type() == QEvent::KeyPress) && (m_Profile != NULL)) { + } else if ((event->type() == QEvent::KeyPress) && (m_Profile != nullptr)) { QAbstractItemView *itemView = qobject_cast(obj); QKeyEvent *keyEvent = static_cast(event); - if ((itemView != NULL) + if ((itemView != nullptr) && (keyEvent->modifiers() == Qt::ControlModifier) && ((keyEvent->key() == Qt::Key_Up) || (keyEvent->key() == Qt::Key_Down))) { QItemSelectionModel *selectionModel = itemView->selectionModel(); const QAbstractProxyModel *proxyModel = qobject_cast(selectionModel->model()); - const QSortFilterProxyModel *filterModel = NULL; - while ((filterModel == NULL) && (proxyModel != NULL)) { + const QSortFilterProxyModel *filterModel = nullptr; + while ((filterModel == nullptr) && (proxyModel != nullptr)) { filterModel = qobject_cast(proxyModel); - if (filterModel == NULL) { + if (filterModel == nullptr) { proxyModel = qobject_cast(proxyModel->sourceModel()); } } - if (filterModel == NULL) { + if (filterModel == nullptr) { return true; } int diff = -1; @@ -1028,7 +1028,7 @@ bool ModList::eventFilter(QObject *obj, QEvent *event) } } foreach (QModelIndex idx, rows) { - if (filterModel != NULL) { + if (filterModel != nullptr) { idx = filterModel->mapToSource(idx); } int newPriority = m_Profile->getModPriority(idx.row()) + diff; @@ -1054,7 +1054,7 @@ bool ModList::eventFilter(QObject *obj, QEvent *event) QModelIndex minRow, maxRow; foreach (QModelIndex idx, selectionModel->selectedRows()) { - if (proxyModel != NULL) { + if (proxyModel != nullptr) { idx = proxyModel->mapToSource(idx); } if (!minRow.isValid() || (idx.row() < minRow.row())) { diff --git a/src/modlist.h b/src/modlist.h index cf52b2ec..8dcab2fa 100644 --- a/src/modlist.h +++ b/src/modlist.h @@ -73,7 +73,7 @@ public: * @brief constructor * @todo ensure this view works without a profile set, otherwise there are intransparent dependencies on the initialisation order **/ - ModList(QObject *parent = NULL); + ModList(QObject *parent = nullptr); ~ModList(); diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp index e132b71e..d16f8353 100644 --- a/src/modlistsortproxy.cpp +++ b/src/modlistsortproxy.cpp @@ -81,7 +81,7 @@ Qt::ItemFlags ModListSortProxy::flags(const QModelIndex &modelIndex) const void ModListSortProxy::enableAllVisible() { - if (m_Profile == NULL) return; + if (m_Profile == nullptr) return; for (int i = 0; i < this->rowCount(); ++i) { int modID = mapToSource(index(i, 0)).data(Qt::UserRole + 1).toInt(); @@ -92,7 +92,7 @@ void ModListSortProxy::enableAllVisible() void ModListSortProxy::disableAllVisible() { - if (m_Profile == NULL) return; + if (m_Profile == nullptr) return; for (int i = 0; i < this->rowCount(); ++i) { int modID = mapToSource(index(i, 0)).data(Qt::UserRole + 1).toInt(); @@ -313,7 +313,7 @@ void ModListSortProxy::setFilterMode(ModListSortProxy::FilterMode mode) bool ModListSortProxy::filterAcceptsRow(int row, const QModelIndex &parent) const { - if (m_Profile == NULL) { + if (m_Profile == nullptr) { return false; } diff --git a/src/motddialog.cpp b/src/motddialog.cpp index 9fa2f005..59ace4d1 100644 --- a/src/motddialog.cpp +++ b/src/motddialog.cpp @@ -45,5 +45,5 @@ void MotDDialog::on_okButton_clicked() void MotDDialog::linkClicked(const QUrl &url) { - ::ShellExecuteW(NULL, L"open", MOBase::ToWString(url.toString()).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", MOBase::ToWString(url.toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index d68fe8fe..bd40921f 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -218,8 +218,8 @@ void NexusInterface::interpretNexusFileName(const QString &fileName, QString &mo QString r3Highlight(fileName); r3Highlight.insert(result.position(3) + result.length(3), "* ").insert(result.position(3), " *"); - selection.addChoice(candidate.c_str(), r3Highlight, strtol(candidate.c_str(), NULL, 10)); - selection.addChoice(candidate2.c_str() + offset, r2Highlight, abs(strtol(candidate2.c_str() + offset, NULL, 10))); + selection.addChoice(candidate.c_str(), r3Highlight, strtol(candidate.c_str(), nullptr, 10)); + selection.addChoice(candidate2.c_str() + offset, r2Highlight, abs(strtol(candidate2.c_str() + offset, nullptr, 10))); if (selection.exec() == QDialog::Accepted) { modID = selection.getChoiceData().toInt(); } else { @@ -229,7 +229,7 @@ void NexusInterface::interpretNexusFileName(const QString &fileName, QString &mo modID = -1; } } else { - modID = strtol(candidate.c_str(), NULL, 10); + modID = strtol(candidate.c_str(), nullptr, 10); } qDebug("mod id guessed: %s -> %d", qPrintable(fileName), modID); } else if (std::tr1::regex_search(fileNameUTF8.constData(), result, simpleexp)) { @@ -542,7 +542,7 @@ void NexusInterface::requestFinished() void NexusInterface::requestError(QNetworkReply::NetworkError) { QNetworkReply *reply = qobject_cast(sender()); - if (reply == NULL) { + if (reply == nullptr) { qWarning("invalid sender type"); return; } @@ -555,7 +555,7 @@ void NexusInterface::requestError(QNetworkReply::NetworkError) void NexusInterface::requestTimeout() { QTimer *timer = qobject_cast(sender()); - if (timer == NULL) { + if (timer == nullptr) { qWarning("invalid sender type"); return; } @@ -577,10 +577,10 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID , int nexusGameId) : m_ModID(modID) , m_FileID(0) - , m_Reply(NULL) + , m_Reply(nullptr) , m_Type(type) , m_UserData(userData) - , m_Timeout(NULL) + , m_Timeout(nullptr) , m_Reroute(false) , m_ID(s_NextID.fetchAndAddAcquire(1)) , m_URL(url) @@ -598,10 +598,10 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(std::vector modIDList : m_ModID(-1) , m_ModIDList(modIDList) , m_FileID(0) - , m_Reply(NULL) + , m_Reply(nullptr) , m_Type(type) , m_UserData(userData) - , m_Timeout(NULL) + , m_Timeout(nullptr) , m_Reroute(false) , m_ID(s_NextID.fetchAndAddAcquire(1)) , m_URL(url) @@ -619,10 +619,10 @@ NexusInterface::NXMRequestInfo::NXMRequestInfo(int modID , int nexusGameId) : m_ModID(modID) , m_FileID(fileID) - , m_Reply(NULL) + , m_Reply(nullptr) , m_Type(type) , m_UserData(userData) - , m_Timeout(NULL) + , m_Timeout(nullptr) , m_Reroute(false) , m_ID(s_NextID.fetchAndAddAcquire(1)) , m_URL(url) diff --git a/src/noeditdelegate.cpp b/src/noeditdelegate.cpp index ab8a4880..d5147b9f 100644 --- a/src/noeditdelegate.cpp +++ b/src/noeditdelegate.cpp @@ -6,5 +6,5 @@ NoEditDelegate::NoEditDelegate(QObject *parent) } QWidget *NoEditDelegate::createEditor(QWidget*, const QStyleOptionViewItem&, const QModelIndex&) const { - return NULL; + return nullptr; } diff --git a/src/noeditdelegate.h b/src/noeditdelegate.h index d0ba2f68..6fd5ba76 100644 --- a/src/noeditdelegate.h +++ b/src/noeditdelegate.h @@ -5,7 +5,7 @@ class NoEditDelegate: public QStyledItemDelegate { public: - NoEditDelegate(QObject *parent = NULL); + NoEditDelegate(QObject *parent = nullptr); virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index 18568dad..db314be6 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -44,7 +44,7 @@ using namespace MOShared; NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion) : QNetworkAccessManager(parent) - , m_LoginReply(NULL) + , m_LoginReply(nullptr) , m_ProgressDialog() , m_MOVersion(moVersion) , m_LoginAttempted(false) @@ -56,9 +56,9 @@ NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion) NXMAccessManager::~NXMAccessManager() { - if (m_LoginReply != NULL) { + if (m_LoginReply != nullptr) { m_LoginReply->deleteLater(); - m_LoginReply = NULL; + m_LoginReply = nullptr; } } @@ -104,13 +104,13 @@ bool NXMAccessManager::loggedIn() const bool NXMAccessManager::loginWaiting() const { - return m_LoginReply != NULL; + return m_LoginReply != nullptr; } void NXMAccessManager::login(const QString &username, const QString &password) { - if (m_LoginReply != NULL) { + if (m_LoginReply != nullptr) { return; } @@ -168,7 +168,7 @@ void NXMAccessManager::loginTimeout() { emit loginFailed(tr("timeout")); m_LoginReply->deleteLater(); - m_LoginReply = NULL; + m_LoginReply = nullptr; m_LoginAttempted = false; // this usually means we might have usccess later m_LoginTimeout.stop(); m_Username.clear(); @@ -180,10 +180,10 @@ void NXMAccessManager::loginError(QNetworkReply::NetworkError) { m_ProgressDialog.hide(); m_LoginTimeout.stop(); - if (m_LoginReply != NULL) { + if (m_LoginReply != nullptr) { emit loginFailed(m_LoginReply->errorString()); m_LoginReply->deleteLater(); - m_LoginReply = NULL; + m_LoginReply = nullptr; } else { emit loginFailed(tr("Unknown error")); } @@ -216,7 +216,7 @@ void NXMAccessManager::loginFinished() m_LoginTimeout.stop(); m_LoginReply->deleteLater(); - m_LoginReply = NULL; + m_LoginReply = nullptr; m_Username.clear(); m_Password.clear(); } diff --git a/src/organizercore.cpp b/src/organizercore.cpp index 751cc010..fe032eba 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -91,7 +91,7 @@ static bool testForSteam() if (processIDs[i] != 0) { HANDLE process = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processIDs[i]); - if (process != NULL) { + if (process != nullptr) { HMODULE module; DWORD ignore; @@ -463,7 +463,7 @@ MOBase::IModRepositoryBridge *OrganizerCore::createNexusBridge() const QString OrganizerCore::profileName() const { - if (m_CurrentProfile != NULL) { + if (m_CurrentProfile != nullptr) { return m_CurrentProfile->getName(); } else { return ""; @@ -472,7 +472,7 @@ QString OrganizerCore::profileName() const QString OrganizerCore::profilePath() const { - if (m_CurrentProfile != NULL) { + if (m_CurrentProfile != nullptr) { return m_CurrentProfile->getPath(); } else { return ""; @@ -493,7 +493,7 @@ MOBase::IModInterface *OrganizerCore::getMod(const QString &name) { unsigned int index = ModInfo::getIndex(name); if (index == UINT_MAX) { - return NULL; + return nullptr; } else { return ModInfo::getByIndex(index).data(); } @@ -502,7 +502,7 @@ MOBase::IModInterface *OrganizerCore::getMod(const QString &name) MOBase::IModInterface *OrganizerCore::createMod(GuessedValue &name) { if (!m_InstallationManager.testOverwrite(name)) { - return NULL; + return nullptr; } m_InstallationManager.setModsDirectory(m_Settings.getModDirectory()); @@ -670,7 +670,7 @@ QStringList OrganizerCore::listDirectories(const QString &directoryName) const { QStringList result; DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(directoryName)); - if (dir != NULL) { + if (dir != nullptr) { std::vector::iterator current, end; dir->getSubDirectories(current, end); for (; current != end; ++current) { @@ -684,7 +684,7 @@ QStringList OrganizerCore::findFiles(const QString &path, const std::functionfindSubDirectoryRecursive(ToWString(path)); - if (dir != NULL) { + if (dir != nullptr) { std::vector files = dir->getFiles(); foreach (FileEntry::Ptr file, files) { if (filter(ToQString(file->getFullPath()))) { @@ -700,9 +700,9 @@ QStringList OrganizerCore::findFiles(const QString &path, const std::functionsearchFile(ToWString(QFileInfo(fileName).fileName()), NULL); + const FileEntry::Ptr file = m_DirectoryStructure->searchFile(ToWString(QFileInfo(fileName).fileName()), nullptr); - if (file.get() != NULL) { + if (file.get() != nullptr) { result.append(ToQString(m_DirectoryStructure->getOriginByID(file->getOrigin()).getName())); foreach (int i, file->getAlternatives()) { result.append(ToQString(m_DirectoryStructure->getOriginByID(i).getName())); @@ -717,7 +717,7 @@ QList OrganizerCore::findFileInfos(const QString & { QList result; DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(path)); - if (dir != NULL) { + if (dir != nullptr) { std::vector files = dir->getFiles(); foreach (FileEntry::Ptr file, files) { IOrganizer::FileInfo info; @@ -987,7 +987,7 @@ bool OrganizerCore::waitForProcessOrJob(HANDLE handle, LPDWORD exitCode) res = ::MsgWaitForMultipleObjects(1, &handle, false, 500, QS_KEY | QS_MOUSE); } - if (exitCode != NULL) { + if (exitCode != nullptr) { ::GetExitCodeProcess(processHandle, exitCode); } ::CloseHandle(processHandle); diff --git a/src/organizerproxy.h b/src/organizerproxy.h index 625e86aa..aa2a7fab 100644 --- a/src/organizerproxy.h +++ b/src/organizerproxy.h @@ -38,7 +38,7 @@ public: virtual MOBase::IPluginList *pluginList(); virtual MOBase::IModList *modList(); virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = ""); - virtual bool waitForApplication(HANDLE handle, LPDWORD exitCode = NULL) const; + virtual bool waitForApplication(HANDLE handle, LPDWORD exitCode = nullptr) const; virtual void refreshModList(bool saveChanges); virtual bool onAboutToRun(const std::function &func); diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp index d06922bc..e956b025 100644 --- a/src/overwriteinfodialog.cpp +++ b/src/overwriteinfodialog.cpp @@ -71,8 +71,8 @@ private: OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget *parent) - : QDialog(parent), ui(new Ui::OverwriteInfoDialog), m_FileSystemModel(NULL), - m_DeleteAction(NULL), m_RenameAction(NULL), m_OpenAction(NULL) + : QDialog(parent), ui(new Ui::OverwriteInfoDialog), m_FileSystemModel(nullptr), + m_DeleteAction(nullptr), m_RenameAction(nullptr), m_OpenAction(nullptr) { ui->setupUi(this); @@ -185,7 +185,7 @@ void OverwriteInfoDialog::openFile(const QModelIndex &index) { QString fileName = m_FileSystemModel->filePath(index); - HINSTANCE res = ::ShellExecuteW(NULL, L"open", ToWString(fileName).c_str(), NULL, NULL, SW_SHOW); + HINSTANCE res = ::ShellExecuteW(nullptr, L"open", ToWString(fileName).c_str(), nullptr, nullptr, SW_SHOW); if ((int)res <= 32) { qCritical("failed to invoke %s: %d", fileName.toUtf8().constData(), res); } diff --git a/src/pdll.h b/src/pdll.h index 6e1d06f3..22d74557 100644 --- a/src/pdll.h +++ b/src/pdll.h @@ -26,7 +26,7 @@ //check for dll handle //if this is the first call to the function then try to load it //if not then if the function was loaded successfully make a call to it -//otherwise return a NULL cast to the return parameter. +//otherwise return a nullptr cast to the return parameter. #define DECLARE_FUNCTION0(CallType, retVal, FuncName) \ typedef retVal (CallType* TYPE_##FuncName)(); \ @@ -38,17 +38,17 @@ { \ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(); \ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } \ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION1(CallType,retVal, FuncName, Param1) \ @@ -61,17 +61,17 @@ { \ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1); \ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } \ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION2(CallType,retVal, FuncName, Param1, Param2) \ @@ -84,17 +84,17 @@ {\ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2); \ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } \ else\ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION3(CallType,retVal, FuncName, Param1, Param2, Param3) \ @@ -107,17 +107,17 @@ {\ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED; \ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2, p3);\ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } \ else\ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION4(CallType,retVal, FuncName, Param1, Param2, Param3, Param4) \ @@ -130,17 +130,17 @@ {\ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2, p3, p4);\ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } \ else\ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION5(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5) \ @@ -153,17 +153,17 @@ {\ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2, p3, p4, p5);\ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } \ else\ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION6(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6) \ @@ -176,17 +176,17 @@ {\ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2, p3, p4, p5, p6);\ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } \ else\ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION7(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7) \ @@ -199,17 +199,17 @@ {\ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2, p3, p4, p5, p6, p7);\ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ } \ else\ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION8(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) \ @@ -222,17 +222,17 @@ {\ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2, p3, p4, p5, p6, p7, p8);\ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ }\ else\ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION9(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) \ @@ -245,17 +245,17 @@ {\ if (FUNC_NAME != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9);\ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ }\ else\ - return (retVal)NULL; \ + return (retVal)nullptr; \ } #define DECLARE_FUNCTION10(CallType,retVal, FuncName, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) \ @@ -268,17 +268,17 @@ {\ if (FUNC_LOADED != m_is##FuncName) \ {\ - m_##FuncName = NULL; \ + m_##FuncName = nullptr; \ m_##FuncName = (TYPE_##FuncName)GetProcAddress(m_dllHandle, #FuncName); \ m_is##FuncName = FUNC_LOADED;\ }\ - if (NULL != m_##FuncName) \ + if (nullptr != m_##FuncName) \ return m_##FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\ else \ - return (retVal)NULL; \ + return (retVal)nullptr; \ }\ else \ - return (retVal)NULL;\ + return (retVal)nullptr;\ } //declare constructors and LoadFunctions @@ -299,12 +299,12 @@ public: PDLL() { - m_dllHandle = NULL; - m_dllName = NULL; + m_dllHandle = nullptr; + m_dllName = nullptr; m_refCount = 0; } - //A NULL here means the name has already been set + //A nullptr here means the name has already been set void LoadDll(LPCTSTR name, bool showMsg = true) { if (name) @@ -313,7 +313,7 @@ public: //try to load m_dllHandle = LoadLibrary(m_dllName); - if (m_dllHandle == NULL && showMsg) + if (m_dllHandle == nullptr && showMsg) { std::ostringstream message; message << "failed to load dll: " << ::GetLastError(); @@ -332,7 +332,7 @@ public: if (m_dllName) { delete []m_dllName; - m_dllName = NULL; + m_dllName = nullptr; } //They may be setting this null (e.g., uninitialize) @@ -357,8 +357,8 @@ public: if (m_refCount == 1 && m_dllName) //if this is first time, load the DLL { //we are assuming the name is already set - LoadDll(NULL, showMsg); - retVal = (m_dllHandle != NULL); + LoadDll(nullptr, showMsg); + retVal = (m_dllHandle != nullptr); } return retVal; } @@ -377,10 +377,10 @@ public: if (m_dllHandle) { FreeLibrary(m_dllHandle); - m_dllHandle = NULL; + m_dllHandle = nullptr; } - SetDllName(NULL); //clear out the name & free memory + SetDllName(nullptr); //clear out the name & free memory } } @@ -394,7 +394,7 @@ public: if (m_dllName) { delete [] m_dllName; - m_dllName = NULL; + m_dllName = nullptr; } } diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index 92073c12..bbcd3b6a 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -59,7 +59,7 @@ QStringList PluginContainer::pluginFileNames() const bool PluginContainer::verifyPlugin(IPlugin *plugin) { - if (plugin == NULL) { + if (plugin == nullptr) { return false; } else if (!plugin->init(new OrganizerProxy(m_Organizer, plugin->name()))) { qWarning("plugin failed to initialize"); @@ -89,7 +89,7 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) { // diagnosis plugins IPluginDiagnose *diagnose = qobject_cast(plugin); - if (diagnose != NULL) { + if (diagnose != nullptr) { bf::at_key(m_Plugins).push_back(diagnose); m_DiagnosisConnections.push_back( diagnose->onInvalidated([&] () { emit diagnosisUpdate(); }) @@ -142,7 +142,7 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) foreach (const QString &pluginName, pluginNames) { try { QObject *proxiedPlugin = proxy->instantiate(pluginName); - if (proxiedPlugin != NULL) { + if (proxiedPlugin != nullptr) { if (registerPlugin(proxiedPlugin, pluginName)) { qDebug("loaded plugin \"%s\"", qPrintable(pluginName)); } else { @@ -264,7 +264,7 @@ void PluginContainer::loadPlugins() QString pluginName = iter.filePath(); if (QLibrary::isLibrary(pluginName)) { QPluginLoader *pluginLoader = new QPluginLoader(pluginName, this); - if (pluginLoader->instance() == NULL) { + if (pluginLoader->instance() == nullptr) { m_FailedPlugins.push_back(pluginName); qCritical("failed to load plugin %s: %s", qPrintable(pluginName), qPrintable(pluginLoader->errorString())); diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp index 2b1fcca1..f0352e8a 100644 --- a/src/pluginlist.cpp +++ b/src/pluginlist.cpp @@ -88,7 +88,7 @@ PluginList::PluginList(QObject *parent) m_Utf8Codec = QTextCodec::codecForName("utf-8"); m_LocalCodec = QTextCodec::codecForName("Windows-1252"); - if (m_LocalCodec == NULL) { + if (m_LocalCodec == nullptr) { qCritical("required 8-bit string-encoding not supported."); m_LocalCodec = m_Utf8Codec; } @@ -142,7 +142,7 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD std::vector files = baseDirectory.getFiles(); for (auto iter = files.begin(); iter != files.end(); ++iter) { FileEntry::Ptr current = *iter; - if (current.get() == NULL) { + if (current.get() == nullptr) { continue; } QString filename = ToQString(current->getName()); @@ -157,7 +157,7 @@ void PluginList::refresh(const QString &profileName, const DirectoryEntry &baseD FilesOrigin &origin = baseDirectory.getOriginByID(current->getOrigin(archive)); QString iniPath = QFileInfo(filename).baseName() + ".ini"; - bool hasIni = baseDirectory.findFile(ToWString(iniPath)).get() != NULL; + bool hasIni = baseDirectory.findFile(ToWString(iniPath)).get() != nullptr; QString originName = ToQString(origin.getName()); unsigned int modIndex = ModInfo::getIndex(originName); @@ -243,7 +243,7 @@ void PluginList::enableESP(const QString &name, bool enable) void PluginList::enableAll() { - if (QMessageBox::question(NULL, tr("Confirm"), tr("Really enable all plugins?"), + if (QMessageBox::question(nullptr, tr("Confirm"), tr("Really enable all plugins?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { for (std::vector::iterator iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) { iter->m_Enabled = true; @@ -255,7 +255,7 @@ void PluginList::enableAll() void PluginList::disableAll() { - if (QMessageBox::question(NULL, tr("Confirm"), tr("Really disable all plugins?"), + if (QMessageBox::question(nullptr, tr("Confirm"), tr("Really disable all plugins?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { for (std::vector::iterator iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) { if (!iter->m_ForceEnabled) { @@ -515,14 +515,14 @@ bool PluginList::saveLoadOrder(DirectoryEntry &directoryStructure) for (std::vector::iterator iter = m_ESPs.begin(); iter != m_ESPs.end(); ++iter) { std::wstring espName = ToWString(iter->m_Name); const FileEntry::Ptr fileEntry = directoryStructure.findFile(espName); - if (fileEntry.get() != NULL) { + if (fileEntry.get() != nullptr) { QString fileName; bool archive = false; int originid = fileEntry->getOrigin(archive); fileName = QString("%1\\%2").arg(QDir::toNativeSeparators(ToQString(directoryStructure.getOriginByID(originid).getPath()))).arg(iter->m_Name); HANDLE file = ::CreateFile(ToWString(fileName).c_str(), GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); if (file == INVALID_HANDLE_VALUE) { if (::GetLastError() == ERROR_SHARING_VIOLATION) { // file is locked, probably the game is running @@ -541,7 +541,7 @@ bool PluginList::saveLoadOrder(DirectoryEntry &directoryStructure) newWriteTime.dwHighDateTime = (DWORD)(temp >> 32); iter->m_Time = newWriteTime; fileEntry->setFileTime(newWriteTime); - if (!::SetFileTime(file, NULL, NULL, &newWriteTime)) { + if (!::SetFileTime(file, nullptr, nullptr, &newWriteTime)) { throw windows_error(QObject::tr("failed to set file time %1").arg(fileName).toUtf8().constData()); } @@ -1102,7 +1102,7 @@ bool PluginList::eventFilter(QObject *obj, QEvent *event) if (event->type() == QEvent::KeyPress) { QAbstractItemView *itemView = qobject_cast(obj); - if (itemView == NULL) { + if (itemView == nullptr) { return QObject::eventFilter(obj, event); } @@ -1112,7 +1112,7 @@ bool PluginList::eventFilter(QObject *obj, QEvent *event) ((keyEvent->key() == Qt::Key_Up) || (keyEvent->key() == Qt::Key_Down))) { QItemSelectionModel *selectionModel = itemView->selectionModel(); const QSortFilterProxyModel *proxyModel = qobject_cast(selectionModel->model()); - if (proxyModel != NULL) { + if (proxyModel != nullptr) { int diff = -1; if (((keyEvent->key() == Qt::Key_Up) && (proxyModel->sortOrder() == Qt::DescendingOrder)) || ((keyEvent->key() == Qt::Key_Down) && (proxyModel->sortOrder() == Qt::AscendingOrder))) { @@ -1147,7 +1147,7 @@ bool PluginList::eventFilter(QObject *obj, QEvent *event) QModelIndex minRow, maxRow; foreach (QModelIndex idx, selectionModel->selectedRows()) { - if (proxyModel != NULL) { + if (proxyModel != nullptr) { idx = proxyModel->mapToSource(idx); } if (!minRow.isValid() || (idx.row() < minRow.row())) { diff --git a/src/pluginlist.h b/src/pluginlist.h index 933a38ee..da644ad3 100644 --- a/src/pluginlist.h +++ b/src/pluginlist.h @@ -96,7 +96,7 @@ public: * * @param parent parent object **/ - PluginList(QObject *parent = NULL); + PluginList(QObject *parent = nullptr); ~PluginList(); diff --git a/src/pluginlistsortproxy.cpp b/src/pluginlistsortproxy.cpp index 02d99b36..dd236f4c 100644 --- a/src/pluginlistsortproxy.cpp +++ b/src/pluginlistsortproxy.cpp @@ -86,9 +86,9 @@ void PluginListSortProxy::displayColumnSelection(const QPoint &pos) m_EnabledColumns.reset(); foreach (const QAction *action, menu.actions()) { const QWidgetAction *widgetAction = qobject_cast(action); - if (widgetAction != NULL) { + if (widgetAction != nullptr) { const QCheckBox *checkBox = qobject_cast(widgetAction->defaultWidget()); - if (checkBox != NULL) { + if (checkBox != nullptr) { m_EnabledColumns.set(i, checkBox->checkState() == Qt::Checked); } } diff --git a/src/problemsdialog.cpp b/src/problemsdialog.cpp index edb34f39..d8af6a62 100644 --- a/src/problemsdialog.cpp +++ b/src/problemsdialog.cpp @@ -73,5 +73,5 @@ void ProblemsDialog::startFix() void ProblemsDialog::urlClicked(const QUrl &url) { - ::ShellExecuteW(NULL, L"open", ToWString(url.toString()).c_str(), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecuteW(nullptr, L"open", ToWString(url.toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } diff --git a/src/profile.cpp b/src/profile.cpp index 37ed94cc..a6b8bf00 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -42,7 +42,7 @@ using namespace MOBase; using namespace MOShared; Profile::Profile() - : m_SaveTimer(NULL) + : m_SaveTimer(nullptr) { initTimer(); } @@ -56,7 +56,7 @@ void Profile::touchFile(QString fileName) } Profile::Profile(const QString &name, bool useDefaultSettings) - : m_SaveTimer(NULL) + : m_SaveTimer(nullptr) { initTimer(); QString profilesDir = qApp->property("datapath").toString() + "/" + ToQString(AppConfig::profilesPath()); @@ -108,7 +108,7 @@ Profile::Profile(const QDir &directory) Profile::Profile(const Profile& reference) - : m_Directory(reference.m_Directory), m_SaveTimer(NULL) + : m_Directory(reference.m_Directory), m_SaveTimer(nullptr) { initTimer(); refreshModStatus(); @@ -553,7 +553,7 @@ void Profile::mergeTweak(const QString &tweakName, const QString &tweakedIni) co for (std::vector::iterator iter = sections.begin(); iter != sections.end(); ++iter) { // retrieve the names of all keys - size = ::GetPrivateProfileStringW(iter->c_str(), NULL, NULL, buffer.data(), + size = ::GetPrivateProfileStringW(iter->c_str(), nullptr, nullptr, buffer.data(), bufferSize, tweakNameW.c_str()); if (size == bufferSize - 2) { throw MyException(QString("Buffer too small. Please report this as a bug. " @@ -566,7 +566,7 @@ void Profile::mergeTweak(const QString &tweakName, const QString &tweakedIni) co keyIter != keys.end(); ++keyIter) { //TODO this treats everything as strings but how could I differentiate the type? ::GetPrivateProfileStringW(iter->c_str(), keyIter->c_str(), - NULL, buffer.data(), bufferSize, ToWString(tweakName).c_str()); + nullptr, buffer.data(), bufferSize, ToWString(tweakName).c_str()); ::WritePrivateProfileStringW(iter->c_str(), keyIter->c_str(), buffer.data(), tweakedIniW.c_str()); } @@ -586,7 +586,7 @@ void Profile::mergeTweaks(ModInfo::Ptr modInfo, const QString &tweakedIni) const bool Profile::invalidationActive(bool *supported) const { if (GameInfo::instance().requiresBSAInvalidation()) { - if (supported != NULL) { + if (supported != nullptr) { *supported = true; } wchar_t buffer[1024]; @@ -597,7 +597,7 @@ bool Profile::invalidationActive(bool *supported) const if (::GetPrivateProfileStringW(L"Archive", GameInfo::instance().archiveListKey().c_str(), L"", buffer, 1024, iniFileName.c_str()) == 0) { if (errno != 0x02) { - if (supported != NULL) { + if (supported != nullptr) { *supported = false; } return false; diff --git a/src/profilesdialog.cpp b/src/profilesdialog.cpp index 3fdad880..26891b3c 100644 --- a/src/profilesdialog.cpp +++ b/src/profilesdialog.cpp @@ -177,7 +177,7 @@ void ProfilesDialog::on_removeProfileButton_clicked() Profile::Ptr currentProfile = profilesList->currentItem()->data(Qt::UserRole).value(); QString profilePath; - if (currentProfile.get() == NULL) { + if (currentProfile.get() == nullptr) { profilePath = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getProfilesDir())) + "/" + profilesList->currentItem()->text(); if (QMessageBox::question(this, tr("Profile broken"), tr("This profile you're about to delete seems to be broken or the path is invalid. " @@ -190,7 +190,7 @@ void ProfilesDialog::on_removeProfileButton_clicked() profilePath = currentProfile->getPath(); } QListWidgetItem* item = profilesList->takeItem(profilesList->currentRow()); - if (item != NULL) { + if (item != nullptr) { delete item; } if (!shellDelete(QStringList(profilePath))) { @@ -231,7 +231,7 @@ void ProfilesDialog::on_invalidationBox_stateChanged(int state) QListWidget *profilesList = findChild("profilesList"); QListWidgetItem *currentItem = profilesList->currentItem(); - if (currentItem == NULL) { + if (currentItem == nullptr) { return; } if (!ui->invalidationBox->isEnabled()) { @@ -263,7 +263,7 @@ void ProfilesDialog::on_profilesList_currentItemChanged(QListWidgetItem *current QPushButton *transferButton = findChild("transferButton"); QPushButton *renameButton = findChild("renameButton"); - if (current != NULL) { + if (current != nullptr) { if (!current->data(Qt::UserRole).isValid()) return; const Profile::Ptr currentProfile = current->data(Qt::UserRole).value(); diff --git a/src/report.cpp b/src/report.cpp index 5cf36078..cca511a9 100644 --- a/src/report.cpp +++ b/src/report.cpp @@ -33,7 +33,7 @@ void reportError(QString message) QMessageBox messageBox(QMessageBox::Warning, QObject::tr("Error"), message, QMessageBox::Ok); messageBox.exec(); } else { - ::MessageBoxW(NULL, ToWString(message).c_str(), ToWString(QObject::tr("Error")).c_str(), MB_ICONERROR | MB_OK); + ::MessageBoxW(nullptr, ToWString(message).c_str(), ToWString(QObject::tr("Error")).c_str(), MB_ICONERROR | MB_OK); } } diff --git a/src/savegameinfowidget.cpp b/src/savegameinfowidget.cpp index 093b794c..7da89747 100644 --- a/src/savegameinfowidget.cpp +++ b/src/savegameinfowidget.cpp @@ -46,9 +46,9 @@ void SaveGameInfoWidget::setSave(const SaveGame *saveGame) ui->levelLabel->setText(QString("%1").arg(saveGame->pcLevel())); ui->dateLabel->setText(MOBase::ToString(saveGame->creationTime())); ui->screenshotLabel->setPixmap(QPixmap::fromImage(saveGame->screenshot())); - if (ui->gameFrame->layout() != NULL) { - QLayoutItem *item = NULL; - while ((item = ui->gameFrame->layout()->takeAt(0)) != NULL) { + if (ui->gameFrame->layout() != nullptr) { + QLayoutItem *item = nullptr; + while ((item = ui->gameFrame->layout()->takeAt(0)) != nullptr) { delete item->widget(); delete item; } diff --git a/src/selectiondialog.cpp b/src/selectiondialog.cpp index b4df8a1f..1b284928 100644 --- a/src/selectiondialog.cpp +++ b/src/selectiondialog.cpp @@ -23,7 +23,7 @@ along with Mod Organizer. If not, see . #include SelectionDialog::SelectionDialog(const QString &description, QWidget *parent) - : QDialog(parent), ui(new Ui::SelectionDialog), m_Choice(NULL), m_ValidateByData(false) + : QDialog(parent), ui(new Ui::SelectionDialog), m_Choice(nullptr), m_ValidateByData(false) { ui->setupUi(this); @@ -58,7 +58,7 @@ QVariant SelectionDialog::getChoiceData() QString SelectionDialog::getChoiceString() { - if ((m_Choice == NULL) || + if ((m_Choice == nullptr) || (m_ValidateByData && !m_Choice->property("data").isValid())) { return QString(); } else { diff --git a/src/selfupdater.cpp b/src/selfupdater.cpp index 0f75e392..0c222ebb 100644 --- a/src/selfupdater.cpp +++ b/src/selfupdater.cpp @@ -48,7 +48,7 @@ typedef Archive* (*CreateArchiveType)(); template T resolveFunction(QLibrary &lib, const char *name) { T temp = reinterpret_cast(lib.resolve(name)); - if (temp == NULL) { + if (temp == nullptr) { throw std::runtime_error(QObject::tr("invalid 7-zip32.dll: %1").arg(lib.errorString()).toLatin1().constData()); } return temp; @@ -94,7 +94,6 @@ SelfUpdater::~SelfUpdater() void SelfUpdater::setUserInterface(QWidget *widget) { - m_Progress.setVisible(false); m_Parent = widget; } @@ -163,7 +162,7 @@ void SelfUpdater::download(const QString &downloadLink, const QString &fileName) void SelfUpdater::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { - if (m_Reply != NULL) { + if (m_Reply != nullptr) { if (m_Canceled) { m_Reply->abort(); } else { @@ -177,7 +176,7 @@ void SelfUpdater::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) void SelfUpdater::downloadReadyRead() { - if (m_Reply != NULL) { + if (m_Reply != nullptr) { m_UpdateFile.write(m_Reply->readAll()); } } @@ -187,7 +186,7 @@ void SelfUpdater::downloadFinished() { int error = QNetworkReply::NoError; - if (m_Reply != NULL) { + if (m_Reply != nullptr) { m_UpdateFile.write(m_Reply->readAll()); error = m_Reply->error(); @@ -199,7 +198,7 @@ void SelfUpdater::downloadFinished() m_Progress.hide(); m_Reply->close(); m_Reply->deleteLater(); - m_Reply = NULL; + m_Reply = nullptr; } m_UpdateFile.close(); diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index d1947b5a..765858f5 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -125,7 +125,7 @@ void SettingsDialog::on_resetDialogsButton_clicked() void SettingsDialog::storeSettings(QListWidgetItem *pluginItem) { - if (pluginItem != NULL) { + if (pluginItem != nullptr) { QMap settings = pluginItem->data(Qt::UserRole + 1).toMap(); for (int i = 0; i < ui->pluginSettingsList->topLevelItemCount(); ++i) { diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 0adf0812..58bf5ae6 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -232,8 +232,8 @@ std::vector FilesOrigin::getFiles() const void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &archive) { - m_LastAccessed = time(NULL); - if (m_Parent != NULL) { + m_LastAccessed = time(nullptr); + if (m_Parent != nullptr) { m_Parent->propagateOrigin(origin); } if (m_Origin == -1) { @@ -290,8 +290,8 @@ bool FileEntry::removeOrigin(int origin) // now we need to update the file time... std::wstring filePath = getFullPath(); HANDLE file = ::CreateFile(filePath.c_str(), GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (!::GetFileTime(file, NULL, NULL, &m_FileTime)) { + 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + if (!::GetFileTime(file, nullptr, nullptr, &m_FileTime)) { // maybe this file is in a bsa, but there is no easy way to find out which. User should refresh // the view to find out m_Archive = L"bsa?"; @@ -324,13 +324,13 @@ static bool ByOriginPriority(DirectoryEntry *entry, int LHS, int RHS) FileEntry::FileEntry() - : m_Index(UINT_MAX), m_Name(), m_Origin(-1), m_Parent(NULL), m_LastAccessed(time(NULL)) + : m_Index(UINT_MAX), m_Name(), m_Origin(-1), m_Parent(nullptr), m_LastAccessed(time(nullptr)) { LEAK_TRACE; } FileEntry::FileEntry(Index index, const std::wstring &name, DirectoryEntry *parent) - : m_Index(index), m_Name(name), m_Origin(-1), m_Parent(parent), m_Archive(L""), m_LastAccessed(time(NULL)) + : m_Index(index), m_Name(name), m_Origin(-1), m_Parent(parent), m_Archive(L""), m_LastAccessed(time(nullptr)) { LEAK_TRACE; } @@ -351,7 +351,7 @@ void FileEntry::sortOrigins() bool FileEntry::recurseParents(std::wstring &path, const DirectoryEntry *parent) const { - if (parent == NULL) { + if (parent == nullptr) { return false; } else { // don't append the topmost parent because it is the virtual data-root @@ -480,7 +480,7 @@ void DirectoryEntry::addFromBSA(const std::wstring &originName, std::wstring &di void DirectoryEntry::propagateOrigin(int origin) { m_Origins.insert(origin); - if (m_Parent != NULL) { + if (m_Parent != nullptr) { m_Parent->propagateOrigin(origin); } } @@ -515,13 +515,13 @@ void DirectoryEntry::addFiles(FilesOrigin &origin, wchar_t *buffer, int bufferOf _snwprintf(buffer + bufferOffset, MAXPATH_UNICODE - bufferOffset, L"\\*"); - HANDLE searchHandle = NULL; + HANDLE searchHandle = nullptr; if (SupportOptimizedFind()) { - searchHandle = ::FindFirstFileExW(buffer, FindExInfoBasic, &findData, FindExSearchNameMatch, NULL, + searchHandle = ::FindFirstFileExW(buffer, FindExInfoBasic, &findData, FindExSearchNameMatch, nullptr, FIND_FIRST_EX_LARGE_FETCH); } else { - searchHandle = ::FindFirstFileExW(buffer, FindExInfoStandard, &findData, FindExSearchNameMatch, NULL, 0); + searchHandle = ::FindFirstFileExW(buffer, FindExInfoStandard, &findData, FindExSearchNameMatch, nullptr, 0); } if (searchHandle != INVALID_HANDLE_VALUE) { @@ -572,7 +572,7 @@ void DirectoryEntry::removeFile(const std::wstring &filePath, int *origin) std::wstring dirName = filePath.substr(0, pos); std::wstring rest = filePath.substr(pos + 1); DirectoryEntry *entry = getSubDirectoryRecursive(dirName, false); - if (entry != NULL) { + if (entry != nullptr) { entry->removeFile(rest, origin); } } @@ -608,7 +608,7 @@ void DirectoryEntry::removeDir(const std::wstring &path) std::wstring dirName = path.substr(0, pos); std::wstring rest = path.substr(pos + 1); DirectoryEntry *entry = getSubDirectoryRecursive(dirName, false); - if (entry != NULL) { + if (entry != nullptr) { entry->removeDir(rest); } } @@ -707,12 +707,12 @@ FilesOrigin &DirectoryEntry::getOriginByName(const std::wstring &name) const int DirectoryEntry::getOrigin(const std::wstring &path, bool &archive) { - const DirectoryEntry *directory = NULL; + const DirectoryEntry *directory = nullptr; const FileEntry::Ptr file = searchFile(path, &directory); - if (file.get() != NULL) { + if (file.get() != nullptr) { return file->getOrigin(archive); } else { - if (directory != NULL) { + if (directory != nullptr) { return directory->anyOrigin(); } else { return -1; @@ -732,13 +732,13 @@ std::vector DirectoryEntry::getFiles() const const FileEntry::Ptr DirectoryEntry::searchFile(const std::wstring &path, const DirectoryEntry **directory) const { - if (directory != NULL) { - *directory = NULL; + if (directory != nullptr) { + *directory = nullptr; } if ((path.length() == 0) || (path == L"*")) { // no file name -> the path ended on a (back-)slash - if (directory != NULL) { + if (directory != nullptr) { *directory = this; } return FileEntry::Ptr(); @@ -751,9 +751,9 @@ const FileEntry::Ptr DirectoryEntry::searchFile(const std::wstring &path, const auto iter = m_Files.find(ToLower(path)); if (iter != m_Files.end()) { return m_FileRegister->getFile(iter->second); - } else if (directory != NULL) { + } else if (directory != nullptr) { DirectoryEntry *temp = findSubDirectory(path); - if (temp != NULL) { + if (temp != nullptr) { *directory = temp; } } @@ -761,7 +761,7 @@ const FileEntry::Ptr DirectoryEntry::searchFile(const std::wstring &path, const // file is in in a subdirectory, recurse into the matching subdirectory std::wstring pathComponent = path.substr(0, len); DirectoryEntry *temp = findSubDirectory(pathComponent); - if (temp != NULL) { + if (temp != nullptr) { return temp->searchFile(path.substr(len + 1), directory); } } @@ -776,7 +776,7 @@ DirectoryEntry *DirectoryEntry::findSubDirectory(const std::wstring &name) const return *iter; } } - return NULL; + return nullptr; } @@ -808,7 +808,7 @@ DirectoryEntry *DirectoryEntry::getSubDirectory(const std::wstring &name, bool c new DirectoryEntry(name, this, originID, m_FileRegister, m_OriginConnection)); return *iter; } else { - return NULL; + return nullptr; } } @@ -825,8 +825,8 @@ DirectoryEntry *DirectoryEntry::getSubDirectoryRecursive(const std::wstring &pat return getSubDirectory(path, create); } else { DirectoryEntry *nextChild = getSubDirectory(path.substr(0, pos), create, originID); - if (nextChild == NULL) { - return NULL; + if (nextChild == nullptr) { + return nullptr; } else { return nextChild->getSubDirectoryRecursive(path.substr(pos + 1), create, originID); } @@ -888,7 +888,7 @@ void FileRegister::unregisterFile(FileEntry::Ptr file) } // unregister from directory - if (file->getParent() != NULL) { + if (file->getParent() != nullptr) { file->getParent()->removeFile(file->getIndex()); } } @@ -944,7 +944,7 @@ void FileRegister::removeOriginMulti(std::set indices, int ori // only when disabling an origin that is probably frequently the case std::set parents; BOOST_FOREACH (const FileEntry::Ptr &file, removedFiles) { - if (file->getParent() != NULL) { + if (file->getParent() != nullptr) { parents.insert(file->getParent()); } } diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index d588ab02..197062ef 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -250,12 +250,12 @@ public: /** retrieve a file in this directory by name. * @param name name of the file - * @return fileentry object for the file or NULL if no file matches + * @return fileentry object for the file or nullptr if no file matches */ const FileEntry::Ptr findFile(const std::wstring &name) const; /** search through this directory and all subdirectories for a file by the specified name (relative path). - if directory is not NULL, the referenced variable will be set to the path containing the file */ + if directory is not nullptr, the referenced variable will be set to the path containing the file */ const FileEntry::Ptr searchFile(const std::wstring &path, const DirectoryEntry **directory) const; void insertFile(const std::wstring &filePath, FilesOrigin &origin, FILETIME fileTime); @@ -263,7 +263,7 @@ public: void removeFile(FileEntry::Index index); // remove the specified file from the tree. This can be a path leading to a file in a subdirectory - void removeFile(const std::wstring &filePath, int *origin = NULL); + void removeFile(const std::wstring &filePath, int *origin = nullptr); /** * @brief remove the specified directory @@ -274,9 +274,9 @@ public: void remove(const std::wstring &fileName, int *origin) { auto iter = m_Files.find(ToLower(fileName)); if (iter != m_Files.end()) { - if (origin != NULL) { + if (origin != nullptr) { FileEntry::Ptr entry = m_FileRegister->getFile(iter->second); - if (entry.get() != NULL) { + if (entry.get() != nullptr) { bool ignore; *origin = entry->getOrigin(ignore); } diff --git a/src/shared/error_report.cpp b/src/shared/error_report.cpp index 02ff2d56..c9277c1b 100644 --- a/src/shared/error_report.cpp +++ b/src/shared/error_report.cpp @@ -35,7 +35,7 @@ void reportError(LPCSTR format, ...) vsnprintf(buffer, 1024, format, argList); va_end(argList); - MessageBoxA(NULL, buffer, "Error", MB_OK | MB_ICONERROR); + MessageBoxA(nullptr, buffer, "Error", MB_OK | MB_ICONERROR); } void reportError(LPCWSTR format, ...) @@ -50,18 +50,18 @@ void reportError(LPCWSTR format, ...) _vsnwprintf(buffer, 1024, format, argList); va_end(argList); - MessageBoxW(NULL, buffer, L"Error", MB_OK | MB_ICONERROR); + MessageBoxW(nullptr, buffer, L"Error", MB_OK | MB_ICONERROR); } std::string getCurrentErrorStringA() { - LPSTR buffer = NULL; + LPSTR buffer = nullptr; DWORD errorCode = ::GetLastError(); if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buffer, 0, NULL) == 0) { + nullptr, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buffer, 0, nullptr) == 0) { ::SetLastError(errorCode); return std::string(); } else { @@ -78,12 +78,12 @@ std::string getCurrentErrorStringA() std::wstring getCurrentErrorStringW() { - LPWSTR buffer = NULL; + LPWSTR buffer = nullptr; DWORD errorCode = ::GetLastError(); if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&buffer, 0, NULL) == 0) { + nullptr, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&buffer, 0, nullptr) == 0) { ::SetLastError(errorCode); return std::wstring(); } else { diff --git a/src/shared/fallout3info.cpp b/src/shared/fallout3info.cpp index 82b285b7..6c420044 100644 --- a/src/shared/fallout3info.cpp +++ b/src/shared/fallout3info.cpp @@ -60,7 +60,7 @@ std::wstring Fallout3Info::getRegPathStatic() WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - if (::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + if (::RegQueryValueExW(key, L"Installed Path", nullptr, nullptr, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { return std::wstring(temp); } else { return std::wstring(); @@ -74,9 +74,9 @@ std::wstring Fallout3Info::getInvalidationBSA() bool Fallout3Info::isInvalidationBSA(const std::wstring &bsaName) { - static LPCWSTR invalidation[] = { L"Fallout - AI!.bsa", L"Fallout - Invalidation.bsa", NULL }; + static LPCWSTR invalidation[] = { L"Fallout - AI!.bsa", L"Fallout - Invalidation.bsa", nullptr }; - for (int i = 0; invalidation[i] != NULL; ++i) { + for (int i = 0; invalidation[i] != nullptr; ++i) { if (wcscmp(bsaName.c_str(), invalidation[i]) == 0) { return true; } @@ -203,7 +203,7 @@ void Fallout3Info::createProfile(const std::wstring &directory, bool useDefaults std::wostringstream source; source << getLocalAppFolder() << "\\Fallout3\\plugins.txt"; if (!::CopyFileW(source.str().c_str(), target.str().c_str(), true)) { - HANDLE file = ::CreateFileW(target.str().c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = ::CreateFileW(target.str().c_str(), GENERIC_WRITE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr); ::CloseHandle(file); } } @@ -256,9 +256,9 @@ void Fallout3Info::repairProfile(const std::wstring &directory) bool Fallout3Info::rerouteToProfile(const wchar_t *fileName, const wchar_t*) { - static LPCWSTR profileFiles[] = { L"fallout.ini", L"falloutprefs.ini", L"plugins.txt", NULL }; + static LPCWSTR profileFiles[] = { L"fallout.ini", L"falloutprefs.ini", L"plugins.txt", nullptr }; - for (int i = 0; profileFiles[i] != NULL; ++i) { + for (int i = 0; profileFiles[i] != nullptr; ++i) { if (_wcsicmp(fileName, profileFiles[i]) == 0) { return true; } diff --git a/src/shared/falloutnvinfo.cpp b/src/shared/falloutnvinfo.cpp index 178ce8b4..f589124a 100644 --- a/src/shared/falloutnvinfo.cpp +++ b/src/shared/falloutnvinfo.cpp @@ -61,7 +61,7 @@ std::wstring FalloutNVInfo::getRegPathStatic() WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - if (::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + if (::RegQueryValueExW(key, L"Installed Path", nullptr, nullptr, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { return std::wstring(temp); } else { return std::wstring(); @@ -75,9 +75,9 @@ std::wstring FalloutNVInfo::getInvalidationBSA() bool FalloutNVInfo::isInvalidationBSA(const std::wstring &bsaName) { - static LPCWSTR invalidation[] = { L"Fallout - AI!.bsa", L"Fallout - Invalidation.bsa", NULL }; + static LPCWSTR invalidation[] = { L"Fallout - AI!.bsa", L"Fallout - Invalidation.bsa", nullptr }; - for (int i = 0; invalidation[i] != NULL; ++i) { + for (int i = 0; invalidation[i] != nullptr; ++i) { if (wcscmp(bsaName.c_str(), invalidation[i]) == 0) { return true; } @@ -170,7 +170,7 @@ void FalloutNVInfo::createProfile(const std::wstring &directory, bool useDefault if (!FileExists(target)) { std::wstring source = getLocalAppFolder() + L"\\FalloutNV\\plugins.txt"; if (!::CopyFileW(source.c_str(), target.c_str(), true)) { - HANDLE file = ::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = ::CreateFileW(target.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr); ::CloseHandle(file); } } @@ -247,9 +247,9 @@ void FalloutNVInfo::repairProfile(const std::wstring &directory) bool FalloutNVInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t*) { - static LPCWSTR profileFiles[] = { L"fallout.ini", L"falloutprefs.ini", L"plugins.txt", NULL }; + static LPCWSTR profileFiles[] = { L"fallout.ini", L"falloutprefs.ini", L"plugins.txt", nullptr }; - for (int i = 0; profileFiles[i] != NULL; ++i) { + for (int i = 0; profileFiles[i] != nullptr; ++i) { if (_wcsicmp(fileName, profileFiles[i]) == 0) { return true; } diff --git a/src/shared/gameinfo.cpp b/src/shared/gameinfo.cpp index 1a815701..3727ea49 100644 --- a/src/shared/gameinfo.cpp +++ b/src/shared/gameinfo.cpp @@ -37,7 +37,7 @@ along with Mod Organizer. If not, see . namespace MOShared { -GameInfo* GameInfo::s_Instance = NULL; +GameInfo* GameInfo::s_Instance = nullptr; GameInfo::GameInfo(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gameDirectory) @@ -62,14 +62,14 @@ void GameInfo::identifyMyGamesDirectory(const std::wstring &file) m_MyGamesDirectory.clear(); // a) this is the way it should work. get the configured My Documents\My Games directory - if (::SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, myDocuments) == S_OK) { + if (::SHGetFolderPathW(nullptr, CSIDL_PERSONAL, nullptr, SHGFP_TYPE_CURRENT, myDocuments) == S_OK) { m_MyGamesDirectory = std::wstring(myDocuments) + L"\\My Games"; } // b) if there is no directory there, look in the default directory if (m_MyGamesDirectory.empty() || !FileExists(m_MyGamesDirectory + L"\\" + file)) { - if (::SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_DEFAULT, myDocuments) == S_OK) { + if (::SHGetFolderPathW(nullptr, CSIDL_PERSONAL, nullptr, SHGFP_TYPE_DEFAULT, myDocuments) == S_OK) { std::wstring fromDefault = std::wstring(myDocuments) + L"\\My Games"; if (FileExists(fromDefault + L"\\" + file)) { m_MyGamesDirectory = fromDefault; @@ -99,13 +99,13 @@ bool GameInfo::identifyGame(const std::wstring &moDirectory, const std::wstring s_Instance = new SkyrimInfo(moDirectory, moDataDirectory, searchPath); } - return s_Instance != NULL; + return s_Instance != nullptr; } bool GameInfo::init(const std::wstring &moDirectory, const std::wstring &moDataDirectory, const std::wstring &gamePath) { - if (s_Instance == NULL) { + if (s_Instance == nullptr) { if (gamePath.length() == 0) { // search upward in the directory until a recognized game-binary is found std::wstring searchPath(moDirectory); @@ -191,7 +191,7 @@ std::wstring GameInfo::getLocalAppFolder() const wchar_t localAppFolder[MAX_PATH]; memset(localAppFolder, '\0', MAX_PATH * sizeof(wchar_t)); - if (::SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, localAppFolder) == S_OK) { + if (::SHGetFolderPathW(nullptr, CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, localAppFolder) == S_OK) { return localAppFolder; } else { // fallback: try the registry @@ -212,7 +212,7 @@ std::wstring GameInfo::getSpecialPath(LPCWSTR name) const WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - errorcode = ::RegQueryValueExW(key, name, NULL, NULL, (LPBYTE)temp, &bufferSize); + errorcode = ::RegQueryValueExW(key, name, nullptr, nullptr, (LPBYTE)temp, &bufferSize); if (errorcode != ERROR_SUCCESS) { throw windows_error((boost::format("failed to look up special folder (%1%)") % ToString(name, true)).str(), errorcode); } diff --git a/src/shared/inject.cpp b/src/shared/inject.cpp index 5a111c4a..143652c2 100644 --- a/src/shared/inject.cpp +++ b/src/shared/inject.cpp @@ -57,13 +57,13 @@ void injectDLL(HANDLE processHandle, HANDLE threadHandle, const std::string &dll _snprintf(parameters.initstr, 5, "Init"); //this is the name of thie initialisation function we want to call in the target process HMODULE k32mod = ::LoadLibrary(__TEXT("kernel32.dll")); - TLoadLibraryType loadLibraryFunc = NULL; - TGetProcAddressType getProcAddressFunc = NULL; + TLoadLibraryType loadLibraryFunc = nullptr; + TGetProcAddressType getProcAddressFunc = nullptr; // ansi binaries - if (k32mod != NULL) { + if (k32mod != nullptr) { loadLibraryFunc = reinterpret_cast(::GetProcAddress(k32mod, "LoadLibraryA")); getProcAddressFunc = reinterpret_cast(::GetProcAddress(k32mod, "GetProcAddress")); - if ((loadLibraryFunc == NULL) || (getProcAddressFunc == NULL)) { + if ((loadLibraryFunc == nullptr) || (getProcAddressFunc == nullptr)) { throw windows_error("failed to determine address for required functions"); } } else { @@ -71,8 +71,8 @@ void injectDLL(HANDLE processHandle, HANDLE threadHandle, const std::string &dll } // allocate memory in the target process and write the parameter-block there - LPVOID remoteMem = ::VirtualAllocEx(processHandle, NULL, sizeof(TParameters), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); - if (remoteMem == NULL) { + LPVOID remoteMem = ::VirtualAllocEx(processHandle, nullptr, sizeof(TParameters), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + if (remoteMem == nullptr) { throw windows_error("failed to allocate memory in target process"); } SIZE_T written; @@ -104,8 +104,8 @@ void injectDLL(HANDLE processHandle, HANDLE threadHandle, const std::string &dll }; // reserve memory for the stub - PBYTE stubRemote = reinterpret_cast(::VirtualAllocEx(processHandle, NULL, sizeof(stubLocal), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)); - if (stubRemote == NULL) { + PBYTE stubRemote = reinterpret_cast(::VirtualAllocEx(processHandle, nullptr, sizeof(stubLocal), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)); + if (stubRemote == nullptr) { throw windows_error("failed to allocate memory for stub"); } TParameters *remoteParams = reinterpret_cast(remoteMem); diff --git a/src/shared/leaktrace.cpp b/src/shared/leaktrace.cpp index 729eb42e..46ff7924 100644 --- a/src/shared/leaktrace.cpp +++ b/src/shared/leaktrace.cpp @@ -22,7 +22,7 @@ void initDbgIfNecessary() ::SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS); firstCall = false; } - if (!::SymInitialize(process, NULL, TRUE)) { + if (!::SymInitialize(process, nullptr, TRUE)) { printf("failed to initialize symbols: %d", ::GetLastError()); } initialized.insert(::GetCurrentProcessId()); diff --git a/src/shared/oblivioninfo.cpp b/src/shared/oblivioninfo.cpp index 89a795a5..586bcaef 100644 --- a/src/shared/oblivioninfo.cpp +++ b/src/shared/oblivioninfo.cpp @@ -61,7 +61,7 @@ std::wstring OblivionInfo::getRegPathStatic() WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - if (::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + if (::RegQueryValueExW(key, L"Installed Path", nullptr, nullptr, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { return std::wstring(temp); } else { return std::wstring(); @@ -76,9 +76,9 @@ std::wstring OblivionInfo::getInvalidationBSA() bool OblivionInfo::isInvalidationBSA(const std::wstring &bsaName) { static LPCWSTR invalidation[] = { L"Oblivion - Invalidation.bsa", L"ArchiveInvalidationInvalidated!.bsa", - L"BSARedirection.bsa", NULL }; + L"BSARedirection.bsa", nullptr }; - for (int i = 0; invalidation[i] != NULL; ++i) { + for (int i = 0; invalidation[i] != nullptr; ++i) { if (wcscmp(bsaName.c_str(), invalidation[i]) == 0) { return true; } @@ -158,7 +158,7 @@ void OblivionInfo::createProfile(const std::wstring &directory, bool useDefaults std::wostringstream source; source << getLocalAppFolder() << "\\Oblivion\\plugins.txt"; if (!::CopyFileW(source.str().c_str(), target.str().c_str(), true)) { - HANDLE file = ::CreateFileW(target.str().c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = ::CreateFileW(target.str().c_str(), GENERIC_WRITE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr); ::CloseHandle(file); } } @@ -194,7 +194,7 @@ void OblivionInfo::createProfile(const std::wstring &directory, bool useDefaults if (!FileExists(target)) { std::wstring source = getMyGamesDirectory() + L"\\Oblivion\\oblivionprefs.ini"; if (!::CopyFileW(source.c_str(), target.c_str(), true)) { - if ((::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL) == INVALID_HANDLE_VALUE) && + if ((::CreateFileW(target.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr) == INVALID_HANDLE_VALUE) && (::GetLastError() != ERROR_FILE_EXISTS)) { throw windows_error(std::string("failed to create ini file: ") + ToString(target, false)); } @@ -240,9 +240,9 @@ void OblivionInfo::repairProfile(const std::wstring &directory) bool OblivionInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t*) { - static LPCWSTR profileFiles[] = { L"oblivion.ini", L"oblivionprefs.ini", L"plugins.txt", NULL }; + static LPCWSTR profileFiles[] = { L"oblivion.ini", L"oblivionprefs.ini", L"plugins.txt", nullptr }; - for (int i = 0; profileFiles[i] != NULL; ++i) { + for (int i = 0; profileFiles[i] != nullptr; ++i) { if (_wcsicmp(fileName, profileFiles[i]) == 0) { return true; } diff --git a/src/shared/skyriminfo.cpp b/src/shared/skyriminfo.cpp index 7f70c097..1d00c4f3 100644 --- a/src/shared/skyriminfo.cpp +++ b/src/shared/skyriminfo.cpp @@ -39,7 +39,7 @@ SkyrimInfo::SkyrimInfo(const std::wstring &moDirectory, const std::wstring &moDa identifyMyGamesDirectory(L"skyrim"); wchar_t appDataPath[MAX_PATH]; - if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, appDataPath))) { + if (SUCCEEDED(SHGetFolderPathW(nullptr, CSIDL_LOCAL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, appDataPath))) { m_AppData = appDataPath; } } @@ -69,7 +69,7 @@ std::wstring SkyrimInfo::getRegPathStatic() WCHAR temp[MAX_PATH]; DWORD bufferSize = MAX_PATH; - if (::RegQueryValueExW(key, L"Installed Path", NULL, NULL, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { + if (::RegQueryValueExW(key, L"Installed Path", nullptr, nullptr, (LPBYTE)temp, &bufferSize) == ERROR_SUCCESS) { return std::wstring(temp); } else { return std::wstring(); @@ -84,9 +84,9 @@ std::wstring SkyrimInfo::getInvalidationBSA() bool SkyrimInfo::isInvalidationBSA(const std::wstring &bsaName) { - static LPCWSTR invalidation[] = { L"Skyrim - Invalidation.bsa", NULL }; + static LPCWSTR invalidation[] = { L"Skyrim - Invalidation.bsa", nullptr }; - for (int i = 0; invalidation[i] != NULL; ++i) { + for (int i = 0; invalidation[i] != nullptr; ++i) { if (wcscmp(bsaName.c_str(), invalidation[i]) == 0) { return true; } @@ -229,7 +229,7 @@ void SkyrimInfo::createProfile(const std::wstring &directory, bool useDefaults) std::wostringstream source; source << getLocalAppFolder() << "\\Skyrim\\plugins.txt"; if (!::CopyFileW(source.str().c_str(), target.c_str(), true)) { - HANDLE file = ::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = ::CreateFileW(target.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr); ::CloseHandle(file); } } @@ -237,7 +237,7 @@ void SkyrimInfo::createProfile(const std::wstring &directory, bool useDefaults) if (!FileExists(target)) { std::wstring source = getLocalAppFolder() + L"\\Skyrim\\loadorder.txt"; if (!::CopyFileW(source.c_str(), target.c_str(), true)) { - HANDLE file = ::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE file = ::CreateFileW(target.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr); ::CloseHandle(file); } } @@ -272,7 +272,7 @@ void SkyrimInfo::createProfile(const std::wstring &directory, bool useDefaults) if (!::CopyFileW(source.c_str(), target.c_str(), true)) { log("failed to copy ini file %ls", source.c_str()); // create empty - if (::CreateFileW(target.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) == INVALID_HANDLE_VALUE) { + if (::CreateFileW(target.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr) == INVALID_HANDLE_VALUE) { throw windows_error(std::string("failed to copy ini file: ") + ToString(source, false)); } } @@ -289,16 +289,16 @@ void SkyrimInfo::repairProfile(const std::wstring &directory) bool SkyrimInfo::rerouteToProfile(const wchar_t *fileName, const wchar_t *fullPath) { - static LPCWSTR profileFiles[] = { L"skyrim.ini", L"skyrimprefs.ini", L"loadorder.txt", NULL }; + static LPCWSTR profileFiles[] = { L"skyrim.ini", L"skyrimprefs.ini", L"loadorder.txt", nullptr }; - for (int i = 0; profileFiles[i] != NULL; ++i) { + for (int i = 0; profileFiles[i] != nullptr; ++i) { if (_wcsicmp(fileName, profileFiles[i]) == 0) { return true; } } if ((_wcsicmp(fileName, L"plugins.txt") == 0) && - (m_AppData.empty() || (StrStrIW(fullPath, m_AppData.c_str()) != NULL))) { + (m_AppData.empty() || (StrStrIW(fullPath, m_AppData.c_str()) != nullptr))) { return true; } diff --git a/src/shared/util.cpp b/src/shared/util.cpp index d4a77929..df3a8bad 100644 --- a/src/shared/util.cpp +++ b/src/shared/util.cpp @@ -34,7 +34,7 @@ bool FileExists(const std::string &filename) { WIN32_FIND_DATAA findData; ZeroMemory(&findData, sizeof(WIN32_FIND_DATAA)); - HANDLE search = ::FindFirstFileExA(filename.c_str(), FindExInfoStandard, &findData, FindExSearchNameMatch, NULL, 0); + HANDLE search = ::FindFirstFileExA(filename.c_str(), FindExInfoStandard, &findData, FindExSearchNameMatch, nullptr, 0); if (search == INVALID_HANDLE_VALUE) { return false; } else { @@ -47,7 +47,7 @@ bool FileExists(const std::wstring &filename) { WIN32_FIND_DATAW findData; ZeroMemory(&findData, sizeof(WIN32_FIND_DATAW)); - HANDLE search = ::FindFirstFileExW(filename.c_str(), FindExInfoStandard, &findData, FindExSearchNameMatch, NULL, 0); + HANDLE search = ::FindFirstFileExW(filename.c_str(), FindExInfoStandard, &findData, FindExSearchNameMatch, nullptr, 0); if (search == INVALID_HANDLE_VALUE) { return false; } else { @@ -67,14 +67,14 @@ std::string ToString(const std::wstring &source, bool utf8) { std::string result; UINT codepage = utf8 ? CP_UTF8 : GetACP(); - int sizeRequired = ::WideCharToMultiByte(codepage, 0, &source[0], -1, NULL, 0, NULL, NULL); + int sizeRequired = ::WideCharToMultiByte(codepage, 0, &source[0], -1, nullptr, 0, nullptr, nullptr); if (sizeRequired == 0) { throw windows_error("failed to convert string to multibyte"); } // the size returned by WideCharToMultiByte contains zero termination IF -1 is specified for the length. // we don't want that \0 in the string because then the length field would be wrong. Because madness result.resize(sizeRequired - 1, '\0'); - ::WideCharToMultiByte(codepage, 0, &source[0], (int)source.size(), &result[0], sizeRequired, NULL, NULL); + ::WideCharToMultiByte(codepage, 0, &source[0], (int)source.size(), &result[0], sizeRequired, nullptr, nullptr); return result; } @@ -82,7 +82,7 @@ std::wstring ToWString(const std::string &source, bool utf8) { std::wstring result; UINT codepage = utf8 ? CP_UTF8 : GetACP(); - int sizeRequired = ::MultiByteToWideChar(codepage, 0, &source[0], (int)source.size(), NULL, 0); + int sizeRequired = ::MultiByteToWideChar(codepage, 0, &source[0], (int)source.size(), nullptr, 0); if (sizeRequired == 0) { throw windows_error("failed to convert string to wide character"); } @@ -131,7 +131,7 @@ VS_FIXEDFILEINFO GetFileVersion(const std::wstring &fileName) throw windows_error("failed to determine file version info"); } - void *versionInfoPtr = NULL; + void *versionInfoPtr = nullptr; UINT versionInfoLength = 0; if (!::VerQueryValue(buffer, L"\\", &versionInfoPtr, &versionInfoLength)) { throw windows_error("failed to determine file version"); @@ -160,14 +160,14 @@ std::string GetStack() ::SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS); firstCall = false; } - if (!::SymInitialize(process, NULL, TRUE)) { + if (!::SymInitialize(process, nullptr, TRUE)) { log("failed to initialize symbols: %d", ::GetLastError()); } initialized.insert(::GetCurrentProcessId()); } LPVOID stack[32]; - WORD frames = ::CaptureStackBackTrace(0, 100, stack, NULL); + WORD frames = ::CaptureStackBackTrace(0, 100, stack, nullptr); char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)]; PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer; diff --git a/src/shared/windows_error.cpp b/src/shared/windows_error.cpp index 647a5bfb..97a58a20 100644 --- a/src/shared/windows_error.cpp +++ b/src/shared/windows_error.cpp @@ -27,13 +27,13 @@ std::string windows_error::constructMessage(const std::string& input, int inErro std::ostringstream finalMessage; finalMessage << input; - LPSTR buffer = NULL; + LPSTR buffer = nullptr; DWORD errorCode = inErrorCode != -1 ? inErrorCode : ::GetLastError(); // TODO: the message is not english? if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buffer, 0, NULL) == 0) { + nullptr, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buffer, 0, nullptr) == 0) { finalMessage << " (errorcode " << errorCode << ")"; } else { LPSTR lastChar = buffer + strlen(buffer) - 2; diff --git a/src/spawn.cpp b/src/spawn.cpp index cd7e202e..96c219fc 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -55,7 +55,7 @@ bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool sus } si.cb = sizeof(si); int length = wcslen(binary) + wcslen(arguments) + 4; - wchar_t *commandLine = NULL; + wchar_t *commandLine = nullptr; if (arguments[0] != L'\0') { commandLine = new wchar_t[length]; _snwprintf(commandLine, length, L"\"%ls\" %ls", binary, arguments); @@ -84,12 +84,12 @@ bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, bool sus } PROCESS_INFORMATION pi; - BOOL success = ::CreateProcess(NULL, + BOOL success = ::CreateProcess(nullptr, commandLine, - NULL, NULL, // no special process or thread attributes + nullptr, nullptr, // no special process or thread attributes inheritHandles, // inherit handles if we plan to use stdout or stderr reroute CREATE_BREAKAWAY_FROM_JOB | (suspended ? CREATE_SUSPENDED : 0), // create suspended so I have time to inject the DLL - NULL, // same environment as parent + nullptr, // same environment as parent currentDirectory, // current directory &si, &pi // startup and process information ); @@ -119,12 +119,12 @@ HANDLE startBinary(const QFileInfo &binary, { JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo; - ::QueryInformationJobObject(NULL, JobObjectExtendedLimitInformation, &jobInfo, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION), NULL); + ::QueryInformationJobObject(nullptr, JobObjectExtendedLimitInformation, &jobInfo, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION), nullptr); jobInfo.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_BREAKAWAY_OK; - HANDLE jobObject = ::CreateJobObject(NULL, NULL); + HANDLE jobObject = ::CreateJobObject(nullptr, nullptr); - if (jobObject == NULL) { + if (jobObject == nullptr) { qWarning("failed to create job object: %lu", ::GetLastError()); } else { ::SetInformationJobObject(jobObject, JobObjectExtendedLimitInformation, &jobInfo, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); @@ -144,7 +144,7 @@ HANDLE startBinary(const QFileInfo &binary, if (e.getErrorCode() == ERROR_ELEVATION_REQUIRED) { // TODO: check if this is really correct. Are all settings updated that the secondary instance may use? - if (QMessageBox::question(NULL, QObject::tr("Elevation required"), + if (QMessageBox::question(nullptr, QObject::tr("Elevation required"), QObject::tr("This process requires elevation to run.\n" "This is a potential security risk so I highly advice you to investigate if\n" "\"%1\"\n" @@ -153,7 +153,7 @@ HANDLE startBinary(const QFileInfo &binary, "(you will be asked if you want to allow ModOrganizer.exe to make changes to the system)").arg( QDir::toNativeSeparators(binary.absoluteFilePath())), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - ::ShellExecuteW(NULL, L"runas", ToWString(QCoreApplication::applicationFilePath()).c_str(), + ::ShellExecuteW(nullptr, L"runas", ToWString(QCoreApplication::applicationFilePath()).c_str(), (std::wstring(L"\"") + binaryName + L"\" " + ToWString(arguments)).c_str(), currentDirectoryName.c_str(), SW_SHOWNORMAL); return INVALID_HANDLE_VALUE; } else { diff --git a/src/syncoverwritedialog.cpp b/src/syncoverwritedialog.cpp index 380719d8..adeac9b8 100644 --- a/src/syncoverwritedialog.cpp +++ b/src/syncoverwritedialog.cpp @@ -82,18 +82,18 @@ void SyncOverwriteDialog::readTree(const QString &path, DirectoryEntry *director if (fileInfo.isDir()) { DirectoryEntry *subDir = directoryStructure->findSubDirectory(ToWString(file)); - if (subDir != NULL) { + if (subDir != nullptr) { readTree(fileInfo.absoluteFilePath(), subDir, newItem); } else { qCritical("no directory structure for %s?", file.toUtf8().constData()); delete newItem; - newItem = NULL; + newItem = nullptr; } } else { const FileEntry::Ptr entry = directoryStructure->findFile(ToWString(file)); QComboBox* combo = new QComboBox(ui->syncTree); combo->addItem(tr(""), -1); - if (entry.get() != NULL) { + if (entry.get() != nullptr) { bool ignore; int origin = entry->getOrigin(ignore); addToComboBox(combo, ToQString(m_DirectoryStructure->getOriginByID(origin).getName()), origin); @@ -107,7 +107,7 @@ void SyncOverwriteDialog::readTree(const QString &path, DirectoryEntry *director } ui->syncTree->setItemWidget(newItem, 1, combo); } - if (newItem != NULL) { + if (newItem != nullptr) { subTree->addChild(newItem); } } @@ -137,7 +137,7 @@ void SyncOverwriteDialog::applyTo(QTreeWidgetItem *item, const QString &path, co applyTo(child, filePath, modDirectory); } else { QComboBox *comboBox = qobject_cast(ui->syncTree->itemWidget(child, 1)); - if (comboBox != NULL) { + if (comboBox != nullptr) { int originID = comboBox->itemData(comboBox->currentIndex(), Qt::UserRole).toInt(); if (originID != -1) { FilesOrigin &origin = m_DirectoryStructure->getOriginByID(originID); diff --git a/src/viewmarkingscrollbar.cpp b/src/viewmarkingscrollbar.cpp index f1b1ba34..2452d0e3 100644 --- a/src/viewmarkingscrollbar.cpp +++ b/src/viewmarkingscrollbar.cpp @@ -14,7 +14,7 @@ ViewMarkingScrollBar::ViewMarkingScrollBar(QAbstractItemModel *model, QWidget *p void ViewMarkingScrollBar::paintEvent(QPaintEvent *event) { - if (m_Model == NULL) { + if (m_Model == nullptr) { return; } QScrollBar::paintEvent(event); -- cgit v1.3.1 From 6479f972dccaabb3afadb570583a4269e8a785e4 Mon Sep 17 00:00:00 2001 From: Tannin Date: Wed, 25 Feb 2015 18:38:01 +0100 Subject: tons of code cleanup and minor fixes to harden the code (mostly suggestions from static code analysis) --- src/ModOrganizer.pro | 1 - src/aboutdialog.cpp | 2 +- src/helper.cpp | 2 +- src/installationmanager.cpp | 10 +++++----- src/main.cpp | 4 ++-- src/mainwindow.cpp | 7 +++---- src/plugincontainer.cpp | 11 +++++++---- src/qt.conf | 3 +++ src/shared/directoryentry.cpp | 8 +++++--- src/shared/error_report.cpp | 3 +-- src/shared/fallout3info.h | 33 +-------------------------------- src/shared/leaktrace.cpp | 2 +- src/shared/stackdata.cpp | 1 - src/shared/util.cpp | 13 ++++++++++--- src/spawn.cpp | 6 +++--- 15 files changed, 43 insertions(+), 63 deletions(-) create mode 100644 src/qt.conf (limited to 'src/shared/directoryentry.cpp') diff --git a/src/ModOrganizer.pro b/src/ModOrganizer.pro index a8f7f53e..c0e5d9f5 100644 --- a/src/ModOrganizer.pro +++ b/src/ModOrganizer.pro @@ -8,7 +8,6 @@ SUBDIRS = bsatk \ archive \ helper \ plugins \ - proxydll \ nxmhandler \ BossDummy \ pythonRunner \ diff --git a/src/aboutdialog.cpp b/src/aboutdialog.cpp index cd29600b..7b311263 100644 --- a/src/aboutdialog.cpp +++ b/src/aboutdialog.cpp @@ -37,7 +37,7 @@ AboutDialog::AboutDialog(const QString &version, QWidget *parent) m_LicenseFiles[LICENSE_ZLIB] = "zlib.txt"; m_LicenseFiles[LICENSE_APACHE2] = "apache-license-2.0.txt"; - addLicense("Qt 5.3", LICENSE_LGPL3); + addLicense("Qt 5.4", LICENSE_LGPL3); addLicense("Qt Json", LICENSE_GPL3); addLicense("Boost Library", LICENSE_BOOST); addLicense("7-zip", LICENSE_LGPL3); diff --git a/src/helper.cpp b/src/helper.cpp index 4c22dbda..1f072bd9 100644 --- a/src/helper.cpp +++ b/src/helper.cpp @@ -49,7 +49,7 @@ static bool helperExec(LPCWSTR moDirectory, LPCWSTR commandLine) ::ShellExecuteExW(&execInfo); - if (::WaitForSingleObject(execInfo.hProcess, INFINITE) != WAIT_OBJECT_0) { + if ((execInfo.hProcess == 0) || (::WaitForSingleObject(execInfo.hProcess, INFINITE) != WAIT_OBJECT_0)) { reportError(QObject::tr("helper failed")); return false; } diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 6101cf39..7d431f02 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -70,7 +70,8 @@ static T resolveFunction(QLibrary &lib, const char *name) InstallationManager::InstallationManager() - : m_InstallationProgress(nullptr) + : m_ParentWidget(nullptr) + , m_InstallationProgress(nullptr) , m_SupportedExtensions({ "zip", "rar", "7z", "fomod", "001" }) { QLibrary archiveLib("dlls\\archive.dll"); @@ -441,7 +442,6 @@ QString InstallationManager::generateBackupName(const QString &directoryName) co bool InstallationManager::testOverwrite(GuessedValue &modName, bool *merge) const { QString targetDirectory = QDir::fromNativeSeparators(m_ModsDirectory + "\\" + modName); - while (QDir(targetDirectory).exists()) { QueryOverwriteDialog overwriteDialog(m_ParentWidget); if (overwriteDialog.exec()) { @@ -644,7 +644,7 @@ bool InstallationManager::install(const QString &fileName, GuessedValue int categoryID = 0; QString repository = "Nexus"; - QString metaName = fileName.mid(0).append(".meta"); + QString metaName = fileName + ".meta"; if (QFile(metaName).exists()) { QSettings metaFile(metaName, QSettings::IniFormat); modID = metaFile.value("modID", 0).toInt(); @@ -697,8 +697,8 @@ bool InstallationManager::install(const QString &fileName, GuessedValue }); foreach (IPluginInstaller *installer, m_Installers) { - // don't use inactive installers - if (!installer->isActive()) { + // don't use inactive installers (installer can't be null here but vc static code analysis thinks it could) + if ((installer == nullptr) || !installer->isActive()) { continue; } diff --git a/src/main.cpp b/src/main.cpp index bc89375e..a61e3150 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -69,6 +69,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include #include @@ -146,7 +147,7 @@ bool bootstrap() bool isNxmLink(const QString &link) { - return link.left(6).toLower() == "nxm://"; + return link.startsWith("nxm://", Qt::CaseInsensitive); } static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs) @@ -166,7 +167,6 @@ static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *except if (dbgDLL) { FuncMiniDumpWriteDump funcDump = (FuncMiniDumpWriteDump)::GetProcAddress(dbgDLL, "MiniDumpWriteDump"); if (funcDump) { - if (QMessageBox::question(nullptr, QObject::tr("Woops"), QObject::tr("ModOrganizer has crashed! Should a diagnostic file be created? If you send me this file " "(%1) to sherb@gmx.net, the bug is a lot more likely to be fixed. " diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9e8d0c82..af654e2f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -138,8 +138,6 @@ using namespace MOBase; using namespace MOShared; - - MainWindow::MainWindow(const QString &exeName , QSettings &initSettings , OrganizerCore &organizerCore @@ -2172,7 +2170,6 @@ void MainWindow::removeMod_clicked() QString mods; QStringList modNames; foreach (QModelIndex idx, selection->selectedRows()) { -// QString name = ModInfo::getByIndex(m_ModListGroupProxy->mapToSource(idx).row())->name(); QString name = idx.data().toString(); if (!ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->isRegular()) { continue; @@ -3363,7 +3360,9 @@ void MainWindow::installTranslator(const QString &name) QTranslator *translator = new QTranslator(this); QString fileName = name + "_" + m_CurrentLanguage; if (!translator->load(fileName, qApp->applicationDirPath() + "/translations")) { - if ((m_CurrentLanguage != "en-US") && (m_CurrentLanguage != "en_US")) { + if ((m_CurrentLanguage != "en-US") + && (m_CurrentLanguage != "en_US") + && (m_CurrentLanguage != "en-GB")) { qDebug("localization file %s not found", qPrintable(fileName)); } // we don't actually expect localization files for english } diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index bbcd3b6a..1b06d1a6 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -138,7 +138,8 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) IPluginProxy *proxy = qobject_cast(plugin); if (verifyPlugin(proxy)) { bf::at_key(m_Plugins).push_back(proxy); - QStringList pluginNames = proxy->pluginList(QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::pluginPath())); + QStringList pluginNames = proxy->pluginList( + QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::pluginPath())); foreach (const QString &pluginName, pluginNames) { try { QObject *proxiedPlugin = proxy->instantiate(pluginName); @@ -146,11 +147,13 @@ bool PluginContainer::registerPlugin(QObject *plugin, const QString &fileName) if (registerPlugin(proxiedPlugin, pluginName)) { qDebug("loaded plugin \"%s\"", qPrintable(pluginName)); } else { - qWarning("plugin \"%s\" failed to load", qPrintable(pluginName)); + qWarning("plugin \"%s\" failed to load. If this plugin is for an older version of MO " + "you have to update it or delete it if no update exists.", + qPrintable(pluginName)); } } } catch (const std::exception &e) { - reportError(QObject::tr("failed to init plugin %1: %2").arg(pluginName).arg(e.what())); + reportError(QObject::tr("failed to initialize plugin %1: %2").arg(pluginName).arg(e.what())); } } return true; @@ -199,7 +202,7 @@ void PluginContainer::unloadPlugins() while (!m_PluginLoaders.empty()) { QPluginLoader *loader = m_PluginLoaders.back(); m_PluginLoaders.pop_back(); - if (!loader->unload()) { + if ((loader != nullptr) && !loader->unload()) { qDebug("failed to unload %s: %s", qPrintable(loader->fileName()), qPrintable(loader->errorString())); } delete loader; diff --git a/src/qt.conf b/src/qt.conf new file mode 100644 index 00000000..f834a22a --- /dev/null +++ b/src/qt.conf @@ -0,0 +1,3 @@ +[Paths] +Prefix=. +Plugins=dlls diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 5cf75752..9a864245 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -235,7 +235,8 @@ void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &arc m_Origin = origin; m_FileTime = fileTime; m_Archive = archive; - } else if (m_Parent->getOriginByID(origin).getPriority() > m_Parent->getOriginByID(m_Origin).getPriority()) { + } else if ((m_Parent != nullptr) + && (m_Parent->getOriginByID(origin).getPriority() > m_Parent->getOriginByID(m_Origin).getPriority())) { if (std::find(m_Alternatives.begin(), m_Alternatives.end(), m_Origin) == m_Alternatives.end()) { m_Alternatives.push_back(m_Origin); } @@ -253,7 +254,8 @@ void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &arc // already an origin return; } - if (m_Parent->getOriginByID(*iter).getPriority() < m_Parent->getOriginByID(origin).getPriority()) { + if ((m_Parent != nullptr) + && (m_Parent->getOriginByID(*iter).getPriority() < m_Parent->getOriginByID(origin).getPriority())) { m_Alternatives.insert(iter, origin); found = true; break; @@ -508,7 +510,7 @@ void DirectoryEntry::addFiles(FilesOrigin &origin, wchar_t *buffer, int bufferOf { WIN32_FIND_DATAW findData; - _snwprintf(buffer + bufferOffset, MAXPATH_UNICODE - bufferOffset, L"\\*"); + _snwprintf_s(buffer + bufferOffset, MAXPATH_UNICODE - bufferOffset, _TRUNCATE, L"\\*"); HANDLE searchHandle = nullptr; diff --git a/src/shared/error_report.cpp b/src/shared/error_report.cpp index c9277c1b..6d091630 100644 --- a/src/shared/error_report.cpp +++ b/src/shared/error_report.cpp @@ -46,8 +46,7 @@ void reportError(LPCWSTR format, ...) va_list argList; va_start(argList, format); - - _vsnwprintf(buffer, 1024, format, argList); + _vsnwprintf_s(buffer, 1024, format, argList); va_end(argList); MessageBoxW(nullptr, buffer, L"Error", MB_OK | MB_ICONERROR); diff --git a/src/shared/fallout3info.h b/src/shared/fallout3info.h index 1f3a381d..6e6a7b85 100644 --- a/src/shared/fallout3info.h +++ b/src/shared/fallout3info.h @@ -43,38 +43,7 @@ public: virtual std::wstring getGameName() const { return L"Fallout 3"; } virtual std::wstring getGameShortName() const { return L"Fallout3"; } -/* - virtual std::wstring getInvalidationBSA() - { - return L"Fallout - Invalidation.bsa"; - } - - virtual bool isInvalidationBSA(const std::wstring &bsaName) - { - static LPCWSTR invalidation[] = { L"Fallout - AI!.bsa", L"Fallout - Invalidation.bsa", nullptr }; - - for (int i = 0; invalidation[i] != nullptr; ++i) { - if (wcscmp(bsaName.c_str(), invalidation[i]) == 0) { - return true; - } - } - return false; - } - - virtual std::vector getVanillaBSAs() - { - return boost::assign::list_of (L"Fallout - Textures.bsa") - (L"Fallout - Meshes.bsa") - (L"Fallout - Voices.bsa") - (L"Fallout - Sound.bsa") - (L"Fallout - MenuVoices.bsa") - (L"Fallout - Misc.bsa"); - } - - virtual std::vector getPrimaryPlugins() - { - return boost::assign::list_of(L"fallout3.esm"); - }*/ + virtual std::vector getDLCPlugins(); virtual std::vector getSavegameAttachmentExtensions(); diff --git a/src/shared/leaktrace.cpp b/src/shared/leaktrace.cpp index 0d99b82e..73786c6b 100644 --- a/src/shared/leaktrace.cpp +++ b/src/shared/leaktrace.cpp @@ -34,7 +34,7 @@ static struct __TraceData { iter->second.size(), iter->first.toString().c_str()); printf("Addresses: "); for (int i = 0; i < (std::min)(5, iter->second.size()); ++i) { - printf("%p, ", iter->second[i]); + printf("%p, ", reinterpret_cast(iter->second[i])); } printf("\n"); } diff --git a/src/shared/stackdata.cpp b/src/shared/stackdata.cpp index 2f8bfc4e..43acd90a 100644 --- a/src/shared/stackdata.cpp +++ b/src/shared/stackdata.cpp @@ -135,7 +135,6 @@ void StackData::initTrace() { } } -#pragma warning( enable : 4748 ) bool MOShared::operator==(const StackData &LHS, const StackData &RHS) { if (LHS.m_Count != RHS.m_Count) { diff --git a/src/shared/util.cpp b/src/shared/util.cpp index ceed3a34..2ce88eca 100644 --- a/src/shared/util.cpp +++ b/src/shared/util.cpp @@ -55,7 +55,10 @@ std::string ToString(const std::wstring &source, bool utf8) { std::string result; if (source.length() > 0) { - UINT codepage = utf8 ? CP_UTF8 : GetACP(); + UINT codepage = CP_UTF8; + if (!utf8) { + codepage = AreFileApisANSI() ? GetACP() : GetOEMCP(); + } int sizeRequired = ::WideCharToMultiByte(codepage, 0, &source[0], -1, nullptr, 0, nullptr, nullptr); if (sizeRequired == 0) { throw windows_error("failed to convert string to multibyte"); @@ -73,7 +76,10 @@ std::wstring ToWString(const std::string &source, bool utf8) { std::wstring result; if (source.length() > 0) { - UINT codepage = utf8 ? CP_UTF8 : GetACP(); + UINT codepage = CP_UTF8; + if (!utf8) { + codepage = AreFileApisANSI() ? GetACP() : GetOEMCP(); + } int sizeRequired = ::MultiByteToWideChar(codepage, 0, source.c_str(), source.length(), nullptr, 0); if (sizeRequired == 0) { throw windows_error("failed to convert string to wide character"); @@ -113,7 +119,7 @@ std::wstring ToLower(const std::wstring &text) VS_FIXEDFILEINFO GetFileVersion(const std::wstring &fileName) { - DWORD handle; + DWORD handle = 0UL; DWORD size = ::GetFileVersionInfoSizeW(fileName.c_str(), &handle); if (size == 0) { throw windows_error("failed to determine file version info size"); @@ -121,6 +127,7 @@ VS_FIXEDFILEINFO GetFileVersion(const std::wstring &fileName) void *buffer = new char[size]; try { + handle = 0UL; if (!::GetFileVersionInfoW(fileName.c_str(), handle, size, buffer)) { throw windows_error("failed to determine file version info"); } diff --git a/src/spawn.cpp b/src/spawn.cpp index c031b25e..b1127df3 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -61,7 +61,7 @@ static bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, b _snwprintf(commandLine, length, L"\"%ls\" %ls", binary, arguments); } else { commandLine = new wchar_t[length]; - _snwprintf(commandLine, length, L"\"%ls\"", binary); + _snwprintf_s(commandLine, length, _TRUNCATE, L"\"%ls\"", binary); } QString moPath = QCoreApplication::applicationDirPath(); @@ -75,8 +75,8 @@ static bool spawn(LPCWSTR binary, LPCWSTR arguments, LPCWSTR currentDirectory, b { boost::scoped_array newPath(new TCHAR[offset + moPath.length() + 2]); - _tcsncpy(newPath.get(), oldPath.get(), offset - 1); - newPath.get()[offset - 1] = L'\0'; + _tcsncpy(newPath.get(), oldPath.get(), offset); + newPath.get()[offset] = '\0'; _tcsncat(newPath.get(), TEXT(";"), 1); _tcsncat(newPath.get(), ToWString(QDir::toNativeSeparators(moPath)).c_str(), moPath.length()); -- cgit v1.3.1