Files
extra/keepassx/latest-commit.patch
2025-06-22 20:39:04 -05:00

12062 lines
408 KiB
Diff

diff --git a/.travis.yml b/.travis.yml
index fa33cf0..550518a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,16 +5,20 @@ compiler:
- gcc
- clang
language: cpp
+sudo: required
+dist: trusty
install:
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq update; fi
- - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake libqt4-dev libgcrypt11-dev zlib1g-dev libxtst-dev; fi
+ - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake qtbase5-dev libqt5x11extras5-dev qttools5-dev qttools5-dev-tools libgcrypt20-dev zlib1g-dev libxtst-dev xvfb; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq cmake || brew install cmake; fi
- - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq qt || brew install qt; fi
+ - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq qt5 || brew install qt5; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq libgcrypt || brew install libgcrypt; fi
-before_script: mkdir build && pushd build
+before_script:
+ - if [ "$TRAVIS_OS_NAME" = "osx" ]; then CMAKE_ARGS="-DCMAKE_PREFIX_PATH=/usr/local/opt/qt5"; fi
+ - mkdir build && pushd build
script:
- - cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_GUI_TESTS=ON ..
+ - cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_GUI_TESTS=ON $CMAKE_ARGS ..
- make
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then make test ARGS+="-E testgui --output-on-failure"; fi
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then xvfb-run -a --server-args="-screen 0 800x600x24" make test ARGS+="-R testgui --output-on-failure"; fi
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4dd3ed2..048b8f7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,7 +21,7 @@ endif()
project(KeePassX)
-cmake_minimum_required(VERSION 2.6.4)
+cmake_minimum_required(VERSION 2.8.12)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
@@ -31,7 +31,7 @@ include(CheckCXXSourceCompiles)
option(WITH_TESTS "Enable building of unit tests" ON)
option(WITH_GUI_TESTS "Enable building of GUI tests" OFF)
-option(WITH_CXX11 "Build with the C++ 11 standard" ON)
+option(WITH_DEV_BUILD "Use only for development. Disables/warns about deprecated methods." OFF)
set(KEEPASSX_VERSION "2.0.3")
set(KEEPASSX_VERSION_NUM "2.0.3")
@@ -61,7 +61,7 @@ macro(add_gcc_compiler_flags FLAGS)
add_gcc_compiler_cflags("${FLAGS}")
endmacro(add_gcc_compiler_flags)
-add_definitions(-DQT_NO_KEYWORDS -DQT_NO_EXCEPTIONS -DQT_NO_STL -DQT_STRICT_ITERATORS -DQT_NO_CAST_TO_ASCII)
+add_definitions(-DQT_NO_KEYWORDS -DQT_NO_EXCEPTIONS -DQT_STRICT_ITERATORS -DQT_NO_CAST_TO_ASCII)
add_gcc_compiler_flags("-fno-common -fstack-protector --param=ssp-buffer-size=4")
add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long")
@@ -100,14 +100,16 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro")
endif()
-if (WITH_CXX11)
- add_gcc_compiler_cxxflags("-std=c++0x")
- add_gcc_compiler_cflags("-ansi")
- if(APPLE)
- add_gcc_compiler_cxxflags("-stdlib=libc++")
- endif()
-else()
- add_gcc_compiler_flags("-ansi")
+add_gcc_compiler_cxxflags("-std=c++11")
+
+if(APPLE)
+ add_gcc_compiler_cxxflags("-stdlib=libc++")
+endif()
+
+add_gcc_compiler_cflags("-ansi")
+
+if(WITH_DEV_BUILD)
+ add_definitions(-DQT_DEPRECATED_WARNINGS -DGCRYPT_NO_DEPRECATED)
endif()
if(MINGW)
@@ -146,19 +148,18 @@ if(WITH_TESTS)
enable_testing()
endif(WITH_TESTS)
-set(QT_REQUIRED_MODULES QtCore QtGui QtTest)
+find_package(Qt5Core 5.2 REQUIRED)
+find_package(Qt5Concurrent 5.2 REQUIRED)
+find_package(Qt5Widgets 5.2 REQUIRED)
+find_package(Qt5Test 5.2 REQUIRED)
+find_package(Qt5LinguistTools 5.2 REQUIRED)
+set(CMAKE_AUTOMOC ON)
-find_package(Qt4 4.6.0 REQUIRED ${QT_REQUIRED_MODULES})
-include(${QT_USE_FILE})
# Debian sets the the build type to None for package builds.
# Make sure we don't enable asserts there.
-set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG)
+set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:None>:QT_NO_DEBUG>)
-find_package(Gcrypt REQUIRED)
-if(NOT (${GCRYPT_VERSION_STRING} VERSION_LESS "1.6.0"))
- message(STATUS "Gcrypt ${GCRYPT_VERSION_STRING} supports the SALSA20 cipher")
- set(GCRYPT_HAS_SALSA20 1)
-endif()
+find_package(Gcrypt 1.6.0 REQUIRED)
find_package(ZLIB REQUIRED)
@@ -199,10 +200,7 @@ endif()
include_directories(SYSTEM ${GCRYPT_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
-if(NOT (${CMAKE_VERSION} VERSION_LESS 2.8.3))
- set(PRINT_SUMMARY ON)
- include(FeatureSummary)
-endif()
+include(FeatureSummary)
add_subdirectory(src)
add_subdirectory(share)
diff --git a/README.md b/README.md
index a581789..e0861d3 100644
--- a/README.md
+++ b/README.md
@@ -49,20 +49,20 @@ Once downloaded, double click on the file to execute the installer.
The following tools must exist within your PATH:
* make
-* cmake (>= 2.6.4)
-* g++ or clang++
+* cmake (>= 2.8.12)
+* g++ (>= 4.7) or clang++ (>= 3.0)
The following libraries are required:
-* Qt 4 (>= 4.6)
-* libgcrypt
+* Qt 5 (>= 5.2): qtbase and qttools5
+* libgcrypt (>= 1.6)
* zlib
-* libxi, libxtst (optional for auto-type on X11)
+* libxi, libxtst, qtx11extras (optional for auto-type on X11)
On Debian you can install them with:
```bash
-sudo apt-get install build-essential cmake libqt4-dev libgcrypt11-dev zlib1g-dev libxi-dev libxtst-dev
+sudo apt-get install build-essential cmake qtbase5-dev libqt5x11extras5-dev qttools5-dev qttools5-dev-tools libgcrypt20-dev zlib1g-dev libxi-dev libxtst-dev
```
#### Build Steps
diff --git a/share/translations/CMakeLists.txt b/share/translations/CMakeLists.txt
index b1aa878..7380750 100644
--- a/share/translations/CMakeLists.txt
+++ b/share/translations/CMakeLists.txt
@@ -17,9 +17,9 @@ file(GLOB TRANSLATION_FILES *.ts)
get_filename_component(TRANSLATION_EN_ABS keepassx_en.ts ABSOLUTE)
list(REMOVE_ITEM TRANSLATION_FILES keepassx_en.ts)
list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS})
-message(STATUS ${TRANSLATION_FILES})
+message(STATUS "${TRANSLATION_FILES}")
-qt4_add_translation(QM_FILES ${TRANSLATION_FILES})
+qt5_add_translation(QM_FILES ${TRANSLATION_FILES})
install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations)
add_custom_target(translations DEPENDS ${QM_FILES})
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index da8b9ec..da35651 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -54,9 +54,6 @@ set(keepassx_SOURCES
core/ListDeleter.h
core/Metadata.cpp
core/PasswordGenerator.cpp
- core/qlockfile.cpp
- core/qsavefile.cpp
- core/qsavefile_p.h
core/SignalMultiplexer.cpp
core/TimeDelta.cpp
core/TimeInfo.cpp
@@ -64,8 +61,6 @@ set(keepassx_SOURCES
core/Tools.cpp
core/Translator.cpp
core/Uuid.cpp
- core/qcommandlineoption.cpp
- core/qcommandlineparser.cpp
crypto/Crypto.cpp
crypto/CryptoHash.cpp
crypto/Random.cpp
@@ -133,94 +128,10 @@ set(keepassx_SOURCES
streams/SymmetricCipherStream.cpp
)
-if(NOT GCRYPT_HAS_SALSA20)
- set(keepassx_SOURCES
- ${keepassx_SOURCES}
- crypto/salsa20/ecrypt-config.h
- crypto/salsa20/ecrypt-machine.h
- crypto/salsa20/ecrypt-portable.h
- crypto/salsa20/ecrypt-sync.h
- crypto/salsa20/salsa20.c
- crypto/SymmetricCipherSalsa20.cpp
- )
-endif()
-
-if(UNIX)
- set(keepassx_SOURCES
- ${keepassx_SOURCES}
- core/qlockfile_unix.cpp
- )
-elseif(MINGW)
- set(keepassx_SOURCES
- ${keepassx_SOURCES}
- core/qlockfile_win.cpp
- )
-endif()
-
set(keepassx_SOURCES_MAINEXE
main.cpp
)
-set(keepassx_MOC
- autotype/AutoType.h
- autotype/AutoTypeSelectDialog.h
- autotype/AutoTypeSelectView.h
- autotype/ShortcutWidget.h
- autotype/WindowSelectComboBox.h
- core/AutoTypeAssociations.h
- core/Config.h
- core/Database.h
- core/Entry.h
- core/EntryAttachments.h
- core/EntryAttributes.h
- core/Group.h
- core/InactivityTimer.h
- core/Metadata.h
- core/qsavefile.h
- gui/AboutDialog.h
- gui/Application.h
- gui/ChangeMasterKeyWidget.h
- gui/Clipboard.h
- gui/DatabaseOpenWidget.h
- gui/DatabaseRepairWidget.h
- gui/DatabaseSettingsWidget.h
- gui/DatabaseTabWidget.h
- gui/DatabaseWidget.h
- gui/DatabaseWidgetStateSync.h
- gui/DialogyWidget.h
- gui/DragTabBar.h
- gui/EditWidget.h
- gui/EditWidgetIcons.h
- gui/EditWidgetProperties.h
- gui/IconModels.h
- gui/KeePass1OpenWidget.h
- gui/LineEdit.h
- gui/MainWindow.h
- gui/PasswordEdit.h
- gui/PasswordGeneratorWidget.h
- gui/PasswordComboBox.h
- gui/SettingsWidget.h
- gui/SortFilterHideProxyModel.h
- gui/UnlockDatabaseWidget.h
- gui/WelcomeWidget.h
- gui/entry/AutoTypeAssociationsModel.h
- gui/entry/EditEntryWidget.h
- gui/entry/EntryAttachmentsModel.h
- gui/entry/EntryAttributesModel.h
- gui/entry/EntryHistoryModel.h
- gui/entry/EntryModel.h
- gui/entry/EntryView.h
- gui/group/EditGroupWidget.h
- gui/group/GroupModel.h
- gui/group/GroupView.h
- keys/CompositeKey_p.h
- streams/HashedBlockStream.h
- streams/LayeredStream.h
- streams/qtiocompressor.h
- streams/StoreDataStream.h
- streams/SymmetricCipherStream.h
-)
-
set(keepassx_FORMS
gui/AboutDialog.ui
gui/ChangeMasterKeyWidget.ui
@@ -248,17 +159,18 @@ if(MINGW)
${CMAKE_SOURCE_DIR}/share/windows/icon.rc)
endif()
-qt4_wrap_ui(keepassx_SOURCES ${keepassx_FORMS})
-qt4_wrap_cpp(keepassx_SOURCES ${keepassx_MOC})
+qt5_wrap_ui(keepassx_SOURCES ${keepassx_FORMS})
add_library(keepassx_core STATIC ${keepassx_SOURCES})
set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE)
+target_link_libraries(keepassx_core Qt5::Core Qt5::Concurrent Qt5::Widgets)
add_executable(${PROGNAME} WIN32 MACOSX_BUNDLE ${keepassx_SOURCES_MAINEXE})
target_link_libraries(${PROGNAME}
keepassx_core
- ${QT_QTCORE_LIBRARY}
- ${QT_QTGUI_LIBRARY}
+ Qt5::Core
+ Qt5::Concurrent
+ Qt5::Widgets
${GCRYPT_LIBRARIES}
${ZLIB_LIBRARIES})
@@ -276,7 +188,7 @@ install(TARGETS ${PROGNAME}
add_subdirectory(autotype)
-if(APPLE AND NOT (${CMAKE_VERSION} VERSION_LESS 2.8.8))
+if(APPLE)
if(QT_MAC_USE_COCOA AND EXISTS "${QT_LIBRARY_DIR}/Resources/qt_menu.nib")
install(DIRECTORY "${QT_LIBRARY_DIR}/Resources/qt_menu.nib"
DESTINATION "${DATA_INSTALL_DIR}")
@@ -294,7 +206,7 @@ if(APPLE AND NOT (${CMAKE_VERSION} VERSION_LESS 2.8.8))
install_qt4_executable(${PROGNAME}.app "qjpeg;qgif;qico;qtaccessiblewidgets")
endif()
-if(MINGW AND NOT (${CMAKE_VERSION} VERSION_LESS 2.8.8))
+if(MINGW )
set(CPACK_GENERATOR "ZIP")
set(CPACK_STRIP_FILES ON)
set(CPACK_PACKAGE_FILE_NAME "${PROGNAME}-${KEEPASSX_VERSION_NUM}")
diff --git a/src/autotype/AutoType.cpp b/src/autotype/AutoType.cpp
index f1b7e3e..8032c27 100644
--- a/src/autotype/AutoType.cpp
+++ b/src/autotype/AutoType.cpp
@@ -32,7 +32,7 @@
#include "core/Tools.h"
#include "gui/MessageBox.h"
-AutoType* AutoType::m_instance = Q_NULLPTR;
+AutoType* AutoType::m_instance = nullptr;
AutoType::AutoType(QObject* parent, bool test)
: QObject(parent)
@@ -40,8 +40,8 @@ AutoType::AutoType(QObject* parent, bool test)
, m_currentGlobalKey(static_cast<Qt::Key>(0))
, m_currentGlobalModifiers(0)
, m_pluginLoader(new QPluginLoader(this))
- , m_plugin(Q_NULLPTR)
- , m_executor(Q_NULLPTR)
+ , m_plugin(nullptr)
+ , m_executor(nullptr)
, m_windowFromGlobal(0)
{
// prevent crash when the plugin has unresolved symbols
@@ -49,7 +49,7 @@ AutoType::AutoType(QObject* parent, bool test)
QString pluginName = "keepassx-autotype-";
if (!test) {
- pluginName += Tools::platform();
+ pluginName += QApplication::platformName();
}
else {
pluginName += "test";
@@ -68,7 +68,7 @@ AutoType::~AutoType()
{
if (m_executor) {
delete m_executor;
- m_executor = Q_NULLPTR;
+ m_executor = nullptr;
}
}
@@ -79,7 +79,7 @@ void AutoType::loadPlugin(const QString& pluginPath)
QObject* pluginInstance = m_pluginLoader->instance();
if (pluginInstance) {
m_plugin = qobject_cast<AutoTypePlatformInterface*>(pluginInstance);
- m_executor = Q_NULLPTR;
+ m_executor = nullptr;
if (m_plugin) {
if (m_plugin->isAvailable()) {
@@ -157,7 +157,7 @@ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow, const QS
QCoreApplication::processEvents(QEventLoop::AllEvents, 10);
- Q_FOREACH (AutoTypeAction* action, actions) {
+ for (AutoTypeAction* action : asConst(actions)) {
if (m_plugin->activeWindow() != window) {
qWarning("Active window changed, interrupting auto-type.");
break;
@@ -187,8 +187,9 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList)
QList<Entry*> entryList;
QHash<Entry*, QString> sequenceHash;
- Q_FOREACH (Database* db, dbList) {
- Q_FOREACH (Entry* entry, db->rootGroup()->entriesRecursive()) {
+ for (Database* db : dbList) {
+ const QList<Entry*> dbEntries = db->rootGroup()->entriesRecursive();
+ for (Entry* entry : dbEntries) {
QString sequence = autoTypeSequence(entry, windowTitle);
if (!sequence.isEmpty()) {
entryList << entry;
@@ -202,11 +203,11 @@ void AutoType::performGlobalAutoType(const QList<Database*>& dbList)
QString message = tr("Couldn't find an entry that matches the window title:");
message.append("\n\n");
message.append(windowTitle);
- MessageBox::information(Q_NULLPTR, tr("Auto-Type - KeePassX"), message);
+ MessageBox::information(nullptr, tr("Auto-Type - KeePassX"), message);
}
else if ((entryList.size() == 1) && !config()->get("security/autotypeask").toBool()) {
m_inAutoType = false;
- performAutoType(entryList.first(), Q_NULLPTR, sequenceHash[entryList.first()]);
+ performAutoType(entryList.first(), nullptr, sequenceHash[entryList.first()]);
}
else {
m_windowFromGlobal = m_plugin->activeWindow();
@@ -228,7 +229,7 @@ void AutoType::performAutoTypeFromGlobal(Entry* entry, const QString& sequence)
m_plugin->raiseWindow(m_windowFromGlobal);
m_inAutoType = false;
- performAutoType(entry, Q_NULLPTR, sequence, m_windowFromGlobal);
+ performAutoType(entry, nullptr, sequence, m_windowFromGlobal);
}
void AutoType::resetInAutoType()
@@ -242,12 +243,12 @@ void AutoType::unloadPlugin()
{
if (m_executor) {
delete m_executor;
- m_executor = Q_NULLPTR;
+ m_executor = nullptr;
}
if (m_plugin) {
m_plugin->unload();
- m_plugin = Q_NULLPTR;
+ m_plugin = nullptr;
}
}
@@ -300,7 +301,7 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A
QString tmpl;
bool inTmpl = false;
- Q_FOREACH (const QChar& ch, sequence) {
+ for (const QChar& ch : sequence) {
// TODO: implement support for {{}, {}} and {DELAY=X}
if (inTmpl) {
@@ -482,10 +483,10 @@ QList<AutoTypeAction*> AutoType::createActionFromTemplate(const QString& tmpl, c
}
- QString placeholder = QString("{%1}").arg(tmplName);
- QString resolved = entry->resolvePlaceholders(placeholder);
+ const QString placeholder = QString("{%1}").arg(tmplName);
+ const QString resolved = entry->resolvePlaceholders(placeholder);
if (placeholder != resolved) {
- Q_FOREACH (const QChar& ch, resolved) {
+ for (const QChar& ch : resolved) {
if (ch == '\n') {
list.append(new AutoTypeKey(Qt::Key_Enter));
}
@@ -511,7 +512,8 @@ QString AutoType::autoTypeSequence(const Entry* entry, const QString& windowTitl
QString sequence;
if (!windowTitle.isEmpty()) {
bool match = false;
- Q_FOREACH (const AutoTypeAssociations::Association& assoc, entry->autoTypeAssociations()->getAll()) {
+ const QList<AutoTypeAssociations::Association> assocList = entry->autoTypeAssociations()->getAll();
+ for (const AutoTypeAssociations::Association& assoc : assocList) {
if (windowMatches(windowTitle, assoc.window)) {
if (!assoc.sequence.isEmpty()) {
sequence = assoc.sequence;
diff --git a/src/autotype/AutoType.h b/src/autotype/AutoType.h
index f3d626c..d1c8817 100644
--- a/src/autotype/AutoType.h
+++ b/src/autotype/AutoType.h
@@ -22,8 +22,6 @@
#include <QStringList>
#include <QWidget>
-#include "core/Global.h"
-
class AutoTypeAction;
class AutoTypeExecutor;
class AutoTypePlatformInterface;
@@ -37,7 +35,7 @@ class AutoType : public QObject
public:
QStringList windowTitles();
- void performAutoType(const Entry* entry, QWidget* hideWindow = Q_NULLPTR,
+ void performAutoType(const Entry* entry, QWidget* hideWindow = nullptr,
const QString& customSequence = QString(), WId window = 0);
bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
void unregisterGlobalShortcut();
@@ -62,7 +60,7 @@ private Q_SLOTS:
void unloadPlugin();
private:
- explicit AutoType(QObject* parent = Q_NULLPTR, bool test = false);
+ explicit AutoType(QObject* parent = nullptr, bool test = false);
~AutoType();
void loadPlugin(const QString& pluginPath);
bool parseActions(const QString& sequence, const Entry* entry, QList<AutoTypeAction*>& actions);
diff --git a/src/autotype/AutoTypeAction.h b/src/autotype/AutoTypeAction.h
index 07e050b..490f0d8 100644
--- a/src/autotype/AutoTypeAction.h
+++ b/src/autotype/AutoTypeAction.h
@@ -66,7 +66,7 @@ public:
class KEEPASSX_EXPORT AutoTypeClearField : public AutoTypeAction
{
public:
- explicit AutoTypeClearField();
+ AutoTypeClearField();
AutoTypeAction* clone();
void accept(AutoTypeExecutor* executor);
};
diff --git a/src/autotype/AutoTypeSelectDialog.cpp b/src/autotype/AutoTypeSelectDialog.cpp
index 3e7a247..61b534b 100644
--- a/src/autotype/AutoTypeSelectDialog.cpp
+++ b/src/autotype/AutoTypeSelectDialog.cpp
@@ -20,10 +20,12 @@
#include <QApplication>
#include <QDesktopWidget>
#include <QDialogButtonBox>
+#include <QHeaderView>
#include <QLabel>
#include <QVBoxLayout>
#include "autotype/AutoTypeSelectView.h"
+#include "core/Config.h"
#include "core/FilePath.h"
#include "gui/entry/EntryModel.h"
@@ -39,11 +41,14 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
setWindowTitle(tr("Auto-Type - KeePassX"));
setWindowIcon(filePath()->applicationIcon());
- QSize size(400, 250);
+ QRect screenGeometry = QApplication::desktop()->availableGeometry(QCursor::pos());
+ QSize size = config()->get("GUI/AutoTypeSelectDialogSize", QSize(400, 250)).toSize();
+ size.setWidth(qMin(size.width(), screenGeometry.width()));
+ size.setHeight(qMin(size.height(), screenGeometry.height()));
resize(size);
// move dialog to the center of the screen
- QPoint screenCenter = QApplication::desktop()->availableGeometry(QCursor::pos()).center();
+ QPoint screenCenter = screenGeometry.center();
move(screenCenter.x() - (size.width() / 2), screenCenter.y() - (size.height() / 2));
QVBoxLayout* layout = new QVBoxLayout(this);
@@ -65,6 +70,15 @@ void AutoTypeSelectDialog::setEntries(const QList<Entry*>& entries, const QHash<
{
m_sequences = sequences;
m_view->setEntryList(entries);
+
+ m_view->header()->resizeSections(QHeaderView::ResizeToContents);
+}
+
+void AutoTypeSelectDialog::done(int r)
+{
+ config()->set("GUI/AutoTypeSelectDialogSize", size());
+
+ QDialog::done(r);
}
void AutoTypeSelectDialog::emitEntryActivated(const QModelIndex& index)
diff --git a/src/autotype/AutoTypeSelectDialog.h b/src/autotype/AutoTypeSelectDialog.h
index 4f455c7..7b3909a 100644
--- a/src/autotype/AutoTypeSelectDialog.h
+++ b/src/autotype/AutoTypeSelectDialog.h
@@ -22,8 +22,6 @@
#include <QDialog>
#include <QHash>
-#include "core/Global.h"
-
class AutoTypeSelectView;
class Entry;
@@ -32,12 +30,15 @@ class AutoTypeSelectDialog : public QDialog
Q_OBJECT
public:
- explicit AutoTypeSelectDialog(QWidget* parent = Q_NULLPTR);
+ explicit AutoTypeSelectDialog(QWidget* parent = nullptr);
void setEntries(const QList<Entry*>& entries, const QHash<Entry*, QString>& sequences);
Q_SIGNALS:
void entryActivated(Entry* entry, const QString& sequence);
+public Q_SLOTS:
+ void done(int r) override;
+
private Q_SLOTS:
void emitEntryActivated(const QModelIndex& index);
void entryRemoved();
diff --git a/src/autotype/AutoTypeSelectView.h b/src/autotype/AutoTypeSelectView.h
index bcbb262..749f6a9 100644
--- a/src/autotype/AutoTypeSelectView.h
+++ b/src/autotype/AutoTypeSelectView.h
@@ -18,7 +18,6 @@
#ifndef KEEPASSX_AUTOTYPESELECTVIEW_H
#define KEEPASSX_AUTOTYPESELECTVIEW_H
-#include "core/Global.h"
#include "gui/entry/EntryView.h"
class Entry;
@@ -28,10 +27,10 @@ class AutoTypeSelectView : public EntryView
Q_OBJECT
public:
- explicit AutoTypeSelectView(QWidget* parent = Q_NULLPTR);
+ explicit AutoTypeSelectView(QWidget* parent = nullptr);
protected:
- void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
+ void mouseMoveEvent(QMouseEvent* event) override;
private Q_SLOTS:
void selectFirstEntry();
diff --git a/src/autotype/CMakeLists.txt b/src/autotype/CMakeLists.txt
index fb6e512..468de18 100644
--- a/src/autotype/CMakeLists.txt
+++ b/src/autotype/CMakeLists.txt
@@ -1,12 +1,12 @@
-if(Q_WS_X11)
+if(UNIX AND NOT APPLE)
find_package(X11)
- if(PRINT_SUMMARY)
- add_feature_info(libXi X11_Xi_FOUND "The X11 Xi Protocol library is required for auto-type")
- add_feature_info(libXtst X11_XTest_FOUND "The X11 XTEST Protocol library is required for auto-type")
- endif()
+ find_package(Qt5X11Extras 5.2)
+ add_feature_info(libXi X11_Xi_FOUND "The X11 Xi Protocol library is required for auto-type")
+ add_feature_info(libXtst X11_XTest_FOUND "The X11 XTEST Protocol library is required for auto-type")
+ add_feature_info(Qt5X11Extras Qt5X11Extras_FOUND "The Qt5X11Extras library is required for auto-type")
- if(X11_FOUND AND X11_Xi_FOUND AND X11_XTest_FOUND)
- add_subdirectory(x11)
+ if(X11_FOUND AND X11_Xi_FOUND AND X11_XTest_FOUND AND Qt5X11Extras_FOUND)
+ add_subdirectory(xcb)
endif()
endif()
diff --git a/src/autotype/ShortcutWidget.h b/src/autotype/ShortcutWidget.h
index 5ff306c..60898ab 100644
--- a/src/autotype/ShortcutWidget.h
+++ b/src/autotype/ShortcutWidget.h
@@ -20,21 +20,19 @@
#include <QLineEdit>
-#include "core/Global.h"
-
class ShortcutWidget : public QLineEdit
{
Q_OBJECT
public:
- explicit ShortcutWidget(QWidget* parent = Q_NULLPTR);
+ explicit ShortcutWidget(QWidget* parent = nullptr);
Qt::Key key() const;
Qt::KeyboardModifiers modifiers() const;
void setShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
protected:
- void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
- void keyReleaseEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
+ void keyPressEvent(QKeyEvent* event) override;
+ void keyReleaseEvent(QKeyEvent* event) override;
private:
void keyEvent(QKeyEvent* event);
diff --git a/src/autotype/WildcardMatcher.cpp b/src/autotype/WildcardMatcher.cpp
index 3d7cc75..ad83f9b 100644
--- a/src/autotype/WildcardMatcher.cpp
+++ b/src/autotype/WildcardMatcher.cpp
@@ -70,7 +70,7 @@ bool WildcardMatcher::startOrEndDoesNotMatch(const QStringList& parts)
bool WildcardMatcher::partsMatch(const QStringList& parts)
{
int index = 0;
- Q_FOREACH (const QString& part, parts) {
+ for (const QString& part : parts) {
int matchIndex = getMatchIndex(part, index);
if (noMatchFound(matchIndex)) {
return false;
diff --git a/src/autotype/WindowSelectComboBox.h b/src/autotype/WindowSelectComboBox.h
index 661bc84..244119a 100644
--- a/src/autotype/WindowSelectComboBox.h
+++ b/src/autotype/WindowSelectComboBox.h
@@ -20,19 +20,17 @@
#include <QComboBox>
-#include "core/Global.h"
-
class WindowSelectComboBox : public QComboBox
{
Q_OBJECT
public:
- explicit WindowSelectComboBox(QWidget* parent = Q_NULLPTR);
+ explicit WindowSelectComboBox(QWidget* parent = nullptr);
void refreshWindowList();
- void showPopup() Q_DECL_OVERRIDE;
- QSize sizeHint() const Q_DECL_OVERRIDE;
- QSize minimumSizeHint() const Q_DECL_OVERRIDE;
+ void showPopup() override;
+ QSize sizeHint() const override;
+ QSize minimumSizeHint() const override;
};
#endif // KEEPASSX_WINDOWSELECTCOMBOBOX_H
diff --git a/src/autotype/test/AutoTypeTest.cpp b/src/autotype/test/AutoTypeTest.cpp
index a8bcc71..979af8b 100644
--- a/src/autotype/test/AutoTypeTest.cpp
+++ b/src/autotype/test/AutoTypeTest.cpp
@@ -129,5 +129,3 @@ void AutoTypeExecturorTest::execKey(AutoTypeKey* action)
{
m_platform->addActionKey(action);
}
-
-Q_EXPORT_PLUGIN2(keepassx-autotype-test, AutoTypePlatformTest)
diff --git a/src/autotype/test/AutoTypeTest.h b/src/autotype/test/AutoTypeTest.h
index c791c15..8c6e524 100644
--- a/src/autotype/test/AutoTypeTest.h
+++ b/src/autotype/test/AutoTypeTest.h
@@ -23,34 +23,34 @@
#include "autotype/AutoTypePlatformPlugin.h"
#include "autotype/AutoTypeAction.h"
#include "autotype/test/AutoTypeTestInterface.h"
-#include "core/Global.h"
class AutoTypePlatformTest : public QObject,
public AutoTypePlatformInterface,
public AutoTypeTestInterface
{
Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.keepassx.AutoTypePlatformInterface")
Q_INTERFACES(AutoTypePlatformInterface AutoTypeTestInterface)
public:
- QString keyToString(Qt::Key key) Q_DECL_OVERRIDE;
+ QString keyToString(Qt::Key key) override;
- bool isAvailable() Q_DECL_OVERRIDE;
- QStringList windowTitles() Q_DECL_OVERRIDE;
- WId activeWindow() Q_DECL_OVERRIDE;
- QString activeWindowTitle() Q_DECL_OVERRIDE;
- bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
- void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
- int platformEventFilter(void* event) Q_DECL_OVERRIDE;
- int initialTimeout() Q_DECL_OVERRIDE;
- bool raiseWindow(WId window) Q_DECL_OVERRIDE;
- AutoTypeExecutor* createExecutor() Q_DECL_OVERRIDE;
+ bool isAvailable() override;
+ QStringList windowTitles() override;
+ WId activeWindow() override;
+ QString activeWindowTitle() override;
+ bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) override;
+ void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) override;
+ int platformEventFilter(void* event) override;
+ int initialTimeout() override;
+ bool raiseWindow(WId window) override;
+ AutoTypeExecutor* createExecutor() override;
- void setActiveWindowTitle(const QString& title) Q_DECL_OVERRIDE;
+ void setActiveWindowTitle(const QString& title) override;
- QString actionChars() Q_DECL_OVERRIDE;
- int actionCount() Q_DECL_OVERRIDE;
- void clearActions() Q_DECL_OVERRIDE;
+ QString actionChars() override;
+ int actionCount() override;
+ void clearActions() override;
void addActionChar(AutoTypeChar* action);
void addActionKey(AutoTypeKey* action);
@@ -69,8 +69,8 @@ class AutoTypeExecturorTest : public AutoTypeExecutor
public:
explicit AutoTypeExecturorTest(AutoTypePlatformTest* platform);
- void execChar(AutoTypeChar* action) Q_DECL_OVERRIDE;
- void execKey(AutoTypeKey* action) Q_DECL_OVERRIDE;
+ void execChar(AutoTypeChar* action) override;
+ void execKey(AutoTypeKey* action) override;
private:
AutoTypePlatformTest* const m_platform;
diff --git a/src/autotype/test/CMakeLists.txt b/src/autotype/test/CMakeLists.txt
index 749f7d5..9b3dbd4 100644
--- a/src/autotype/test/CMakeLists.txt
+++ b/src/autotype/test/CMakeLists.txt
@@ -2,11 +2,5 @@ set(autotype_test_SOURCES
AutoTypeTest.cpp
)
-set(autotype_test_MOC
- AutoTypeTest.h
-)
-
-qt4_wrap_cpp(autotype_test_SOURCES ${autotype_test_MOC})
-
add_library(keepassx-autotype-test MODULE ${autotype_test_SOURCES})
-target_link_libraries(keepassx-autotype-test testautotype ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})
+target_link_libraries(keepassx-autotype-test testautotype Qt5::Core Qt5::Widgets)
diff --git a/src/autotype/x11/CMakeLists.txt b/src/autotype/x11/CMakeLists.txt
deleted file mode 100644
index cc401f7..0000000
--- a/src/autotype/x11/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-include_directories(SYSTEM ${X11_X11_INCLUDE_PATH})
-
-set(autotype_X11_SOURCES
- AutoTypeX11.cpp
-)
-
-set(autotype_X11_MOC
- AutoTypeX11.h
-)
-
-qt4_wrap_cpp(autotype_X11_SOURCES ${autotype_X11_MOC})
-
-add_library(keepassx-autotype-x11 MODULE ${autotype_X11_SOURCES})
-target_link_libraries(keepassx-autotype-x11 ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
-install(TARGETS keepassx-autotype-x11
- BUNDLE DESTINATION . COMPONENT Runtime
- LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
diff --git a/src/autotype/x11/AutoTypeX11.cpp b/src/autotype/xcb/AutoTypeXCB.cpp
similarity index 90%
rename from src/autotype/x11/AutoTypeX11.cpp
rename to src/autotype/xcb/AutoTypeXCB.cpp
index b185ad6..becb65e 100644
--- a/src/autotype/x11/AutoTypeX11.cpp
+++ b/src/autotype/xcb/AutoTypeXCB.cpp
@@ -16,14 +16,16 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "AutoTypeX11.h"
+#include "AutoTypeXCB.h"
#include "KeySymMap.h"
+#include "core/Tools.h"
#include <time.h>
+#include <xcb/xcb.h>
bool AutoTypePlatformX11::m_catchXErrors = false;
bool AutoTypePlatformX11::m_xErrorOccured = false;
-int (*AutoTypePlatformX11::m_oldXErrorHandler)(Display*, XErrorEvent*) = Q_NULLPTR;
+int (*AutoTypePlatformX11::m_oldXErrorHandler)(Display*, XErrorEvent*) = nullptr;
AutoTypePlatformX11::AutoTypePlatformX11()
{
@@ -46,8 +48,8 @@ AutoTypePlatformX11::AutoTypePlatformX11()
m_currentGlobalKey = static_cast<Qt::Key>(0);
m_currentGlobalModifiers = 0;
- m_keysymTable = Q_NULLPTR;
- m_xkb = Q_NULLPTR;
+ m_keysymTable = nullptr;
+ m_xkb = nullptr;
m_remapKeycode = 0;
m_currentRemapKeysym = NoSymbol;
m_modifierMask = ControlMask | ShiftMask | Mod1Mask | Mod4Mask;
@@ -119,7 +121,7 @@ WId AutoTypePlatformX11::activeWindow()
Window root;
Window parent;
- Window* children = Q_NULLPTR;
+ Window* children = nullptr;
unsigned int numChildren;
tree = XQueryTree(m_dpy, window, &root, &parent, &children, &numChildren);
window = parent;
@@ -202,22 +204,42 @@ void AutoTypePlatformX11::unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModi
int AutoTypePlatformX11::platformEventFilter(void* event)
{
- XEvent* xevent = static_cast<XEvent*>(event);
+ xcb_generic_event_t* genericEvent = static_cast<xcb_generic_event_t*>(event);
+ quint8 type = genericEvent->response_type & 0x7f;
+
+ if (type == XCB_KEY_PRESS || type == XCB_KEY_RELEASE) {
+ xcb_key_press_event_t* keyPressEvent = static_cast<xcb_key_press_event_t*>(event);
+ if (keyPressEvent->detail == m_currentGlobalKeycode
+ && (keyPressEvent->state & m_modifierMask) == m_currentGlobalNativeModifiers
+ && (!QApplication::activeWindow() || QApplication::activeWindow()->isMinimized())
+ && m_loaded) {
+ if (type == XCB_KEY_PRESS) {
+ Q_EMIT globalShortcutTriggered();
+ }
- if ((xevent->type == KeyPress || xevent->type == KeyRelease)
- && m_currentGlobalKey
- && xevent->xkey.keycode == m_currentGlobalKeycode
- && (xevent->xkey.state & m_modifierMask) == m_currentGlobalNativeModifiers
- && (!QApplication::activeWindow() || QApplication::activeWindow()->isMinimized())
- && m_loaded) {
- if (xevent->type == KeyPress) {
- Q_EMIT globalShortcutTriggered();
+ return 1;
}
- return 1;
}
- if (xevent->type == MappingNotify && m_loaded) {
- XRefreshKeyboardMapping(reinterpret_cast<XMappingEvent*>(xevent));
- updateKeymap();
+ else if (type == XCB_MAPPING_NOTIFY) {
+ xcb_mapping_notify_event_t* mappingNotifyEvent = static_cast<xcb_mapping_notify_event_t*>(event);
+ if (mappingNotifyEvent->request == XCB_MAPPING_KEYBOARD
+ || mappingNotifyEvent->request == XCB_MAPPING_MODIFIER)
+ {
+ XMappingEvent xMappingEvent;
+ memset(&xMappingEvent, 0, sizeof(xMappingEvent));
+ xMappingEvent.type = MappingNotify;
+ xMappingEvent.display = m_dpy;
+ if (mappingNotifyEvent->request == XCB_MAPPING_KEYBOARD) {
+ xMappingEvent.request = MappingKeyboard;
+ }
+ else {
+ xMappingEvent.request = MappingModifier;
+ }
+ xMappingEvent.first_keycode = mappingNotifyEvent->first_keycode;
+ xMappingEvent.count = mappingNotifyEvent->count;
+ XRefreshKeyboardMapping(&xMappingEvent);
+ updateKeymap();
+ }
}
return -1;
@@ -236,7 +258,7 @@ QString AutoTypePlatformX11::windowTitle(Window window, bool useBlacklist)
int format;
unsigned long nitems;
unsigned long after;
- unsigned char* data = Q_NULLPTR;
+ unsigned char* data = nullptr;
// the window manager spec says we should read _NET_WM_NAME first, then fall back to WM_NAME
@@ -250,7 +272,7 @@ QString AutoTypePlatformX11::windowTitle(Window window, bool useBlacklist)
XTextProperty textProp;
retVal = XGetTextProperty(m_dpy, window, &textProp, m_atomWmName);
if ((retVal != 0) && textProp.value) {
- char** textList = Q_NULLPTR;
+ char** textList = nullptr;
int count;
if (textProp.encoding == m_atomUtf8String) {
@@ -302,8 +324,8 @@ QString AutoTypePlatformX11::windowClassName(Window window)
QString className;
XClassHint wmClass;
- wmClass.res_name = Q_NULLPTR;
- wmClass.res_class = Q_NULLPTR;
+ wmClass.res_name = nullptr;
+ wmClass.res_class = nullptr;
if (XGetClassHint(m_dpy, window, &wmClass) && wmClass.res_name) {
className = QString::fromLocal8Bit(wmClass.res_name);
@@ -322,7 +344,7 @@ QList<Window> AutoTypePlatformX11::widgetsToX11Windows(const QWidgetList& widget
{
QList<Window> windows;
- Q_FOREACH (const QWidget* widget, widgetList) {
+ for (const QWidget* widget : widgetList) {
windows.append(widget->effectiveWinId());
}
@@ -342,7 +364,7 @@ QStringList AutoTypePlatformX11::windowTitlesRecursive(Window window)
Window root;
Window parent;
- Window* children = Q_NULLPTR;
+ Window* children = nullptr;
unsigned int numChildren;
if (XQueryTree(m_dpy, window, &root, &parent, &children, &numChildren) && children) {
for (uint i = 0; i < numChildren; i++) {
@@ -362,7 +384,7 @@ bool AutoTypePlatformX11::isTopLevelWindow(Window window)
int format;
unsigned long nitems;
unsigned long after;
- unsigned char* data = Q_NULLPTR;
+ unsigned char* data = nullptr;
int retVal = XGetWindowProperty(m_dpy, window, m_atomWmState, 0, 2, False, m_atomWmState, &type, &format,
&nitems, &after, &data);
@@ -391,9 +413,9 @@ KeySym AutoTypePlatformX11::charToKeySym(const QChar& ch)
}
/* mapping table generated from keysymdef.h */
- const uint* match = qBinaryFind(m_unicodeToKeysymKeys,
- m_unicodeToKeysymKeys + m_unicodeToKeysymLen,
- unicode);
+ const uint* match = Tools::binaryFind(m_unicodeToKeysymKeys,
+ m_unicodeToKeysymKeys + m_unicodeToKeysymLen,
+ unicode);
int index = match - m_unicodeToKeysymKeys;
if (index != m_unicodeToKeysymLen) {
return m_unicodeToKeysymValues[index];
@@ -514,7 +536,7 @@ void AutoTypePlatformX11::updateKeymap()
timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = 30 * 1000 * 1000;
- nanosleep(&ts, Q_NULLPTR);
+ nanosleep(&ts, nullptr);
}
bool AutoTypePlatformX11::isRemapKeycodeValid()
@@ -565,7 +587,7 @@ XkbDescPtr AutoTypePlatformX11::getKeyboard()
XID keyboard_id = XkbUseCoreKbd;
XDeviceInfo* devices = XListInputDevices(m_dpy, &num_devices);
if (!devices) {
- return Q_NULLPTR;
+ return nullptr;
}
for (int i = 0; i < num_devices; i++) {
@@ -721,7 +743,7 @@ void AutoTypePlatformX11::SendKeyPressedEvent(KeySym keysym)
event.y = 1;
event.x_root = 1;
event.y_root = 1;
- event.same_screen = TRUE;
+ event.same_screen = True;
Window root, child;
int root_x, root_y, x, y;
@@ -854,5 +876,3 @@ bool AutoTypePlatformX11::raiseWindow(WId window)
return true;
}
-
-Q_EXPORT_PLUGIN2(keepassx-autotype-x11, AutoTypePlatformX11)
diff --git a/src/autotype/x11/AutoTypeX11.h b/src/autotype/xcb/AutoTypeXCB.h
similarity index 83%
rename from src/autotype/x11/AutoTypeX11.h
rename to src/autotype/xcb/AutoTypeXCB.h
index 99abb23..8adee77 100644
--- a/src/autotype/x11/AutoTypeX11.h
+++ b/src/autotype/xcb/AutoTypeXCB.h
@@ -16,8 +16,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef KEEPASSX_AUTOTYPEX11_H
-#define KEEPASSX_AUTOTYPEX11_H
+#ifndef KEEPASSX_AUTOTYPEXCB_H
+#define KEEPASSX_AUTOTYPEXCB_H
#include <QApplication>
#include <QSet>
@@ -31,28 +31,28 @@
#include "autotype/AutoTypePlatformPlugin.h"
#include "autotype/AutoTypeAction.h"
-#include "core/Global.h"
#define N_MOD_INDICES (Mod5MapIndex + 1)
class AutoTypePlatformX11 : public QObject, public AutoTypePlatformInterface
{
Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.keepassx.AutoTypePlatformX11")
Q_INTERFACES(AutoTypePlatformInterface)
public:
AutoTypePlatformX11();
- bool isAvailable() Q_DECL_OVERRIDE;
- void unload() Q_DECL_OVERRIDE;
- QStringList windowTitles() Q_DECL_OVERRIDE;
- WId activeWindow() Q_DECL_OVERRIDE;
- QString activeWindowTitle() Q_DECL_OVERRIDE;
- bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
- void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;
- int platformEventFilter(void* event) Q_DECL_OVERRIDE;
- int initialTimeout() Q_DECL_OVERRIDE;
- bool raiseWindow(WId window) Q_DECL_OVERRIDE;
- AutoTypeExecutor* createExecutor() Q_DECL_OVERRIDE;
+ bool isAvailable() override;
+ void unload() override;
+ QStringList windowTitles() override;
+ WId activeWindow() override;
+ QString activeWindowTitle() override;
+ bool registerGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) override;
+ void unregisterGlobalShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers) override;
+ int platformEventFilter(void* event) override;
+ int initialTimeout() override;
+ bool raiseWindow(WId window) override;
+ AutoTypeExecutor* createExecutor() override;
KeySym charToKeySym(const QChar& ch);
KeySym keyToKeySym(Qt::Key key);
@@ -124,11 +124,11 @@ class AutoTypeExecturorX11 : public AutoTypeExecutor
public:
explicit AutoTypeExecturorX11(AutoTypePlatformX11* platform);
- void execChar(AutoTypeChar* action) Q_DECL_OVERRIDE;
- void execKey(AutoTypeKey* action) Q_DECL_OVERRIDE;
+ void execChar(AutoTypeChar* action) override;
+ void execKey(AutoTypeKey* action) override;
private:
AutoTypePlatformX11* const m_platform;
};
-#endif // KEEPASSX_AUTOTYPEX11_H
+#endif // KEEPASSX_AUTOTYPEXCB_H
diff --git a/src/autotype/xcb/CMakeLists.txt b/src/autotype/xcb/CMakeLists.txt
new file mode 100644
index 0000000..3b56b31
--- /dev/null
+++ b/src/autotype/xcb/CMakeLists.txt
@@ -0,0 +1,11 @@
+include_directories(SYSTEM ${X11_X11_INCLUDE_PATH})
+
+set(autotype_XCB_SOURCES
+ AutoTypeXCB.cpp
+)
+
+add_library(keepassx-autotype-xcb MODULE ${autotype_XCB_SOURCES})
+target_link_libraries(keepassx-autotype-xcb Qt5::Core Qt5::Widgets Qt5::X11Extras ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
+install(TARGETS keepassx-autotype-xcb
+ BUNDLE DESTINATION . COMPONENT Runtime
+ LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
diff --git a/src/autotype/x11/KeySymMap.h b/src/autotype/xcb/KeySymMap.h
similarity index 100%
rename from src/autotype/x11/KeySymMap.h
rename to src/autotype/xcb/KeySymMap.h
diff --git a/src/autotype/x11/keysymmap.py b/src/autotype/xcb/keysymmap.py
similarity index 100%
rename from src/autotype/x11/keysymmap.py
rename to src/autotype/xcb/keysymmap.py
diff --git a/src/config-keepassx.h.cmake b/src/config-keepassx.h.cmake
index 197c0d3..dc418b6 100644
--- a/src/config-keepassx.h.cmake
+++ b/src/config-keepassx.h.cmake
@@ -16,6 +16,4 @@
#cmakedefine HAVE_RLIMIT_CORE 1
#cmakedefine HAVE_PT_DENY_ATTACH 1
-#cmakedefine GCRYPT_HAS_SALSA20
-
#endif // KEEPASSX_CONFIG_KEEPASSX_H
diff --git a/src/core/AutoTypeAssociations.h b/src/core/AutoTypeAssociations.h
index 1b5871b..491a5db 100644
--- a/src/core/AutoTypeAssociations.h
+++ b/src/core/AutoTypeAssociations.h
@@ -20,8 +20,6 @@
#include <QObject>
-#include "core/Global.h"
-
class AutoTypeAssociations : public QObject
{
Q_OBJECT
@@ -36,7 +34,7 @@ public:
bool operator!=(const AutoTypeAssociations::Association& other) const;
};
- explicit AutoTypeAssociations(QObject* parent = Q_NULLPTR);
+ explicit AutoTypeAssociations(QObject* parent = nullptr);
void copyDataFrom(const AutoTypeAssociations* other);
void add(const AutoTypeAssociations::Association& association);
void remove(int index);
diff --git a/src/core/Config.cpp b/src/core/Config.cpp
index 046a0fe..5b06c22 100644
--- a/src/core/Config.cpp
+++ b/src/core/Config.cpp
@@ -18,12 +18,12 @@
#include "Config.h"
#include <QCoreApplication>
-#include <QDesktopServices>
#include <QDir>
#include <QSettings>
+#include <QStandardPaths>
#include <QTemporaryFile>
-Config* Config::m_instance(Q_NULLPTR);
+Config* Config::m_instance(nullptr);
QVariant Config::get(const QString& key)
{
@@ -53,7 +53,7 @@ Config::Config(QObject* parent)
QString homePath = QDir::homePath();
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
- // we can't use QDesktopServices on X11 as it uses XDG_DATA_HOME instead of XDG_CONFIG_HOME
+ // we can't use QStandardPaths on X11 as it uses XDG_DATA_HOME instead of XDG_CONFIG_HOME
QByteArray env = qgetenv("XDG_CONFIG_HOME");
if (env.isEmpty()) {
userPath = homePath;
@@ -70,7 +70,7 @@ Config::Config(QObject* parent)
userPath += "/keepassx/";
#else
- userPath = QDir::fromNativeSeparators(QDesktopServices::storageLocation(QDesktopServices::DataLocation));
+ userPath = QDir::fromNativeSeparators(QStandardPaths::writableLocation(QStandardPaths::DataLocation));
// storageLocation() appends the application name ("/keepassx") to the end
userPath += "/";
#endif
diff --git a/src/core/Config.h b/src/core/Config.h
index ca0f74c..09aa02f 100644
--- a/src/core/Config.h
+++ b/src/core/Config.h
@@ -21,8 +21,6 @@
#include <QScopedPointer>
#include <QVariant>
-#include "core/Global.h"
-
class QSettings;
class Config : public QObject
diff --git a/src/core/Database.cpp b/src/core/Database.cpp
index 098cc06..9e01d3b 100644
--- a/src/core/Database.cpp
+++ b/src/core/Database.cpp
@@ -23,7 +23,6 @@
#include "core/Group.h"
#include "core/Metadata.h"
-#include "core/Tools.h"
#include "crypto/Random.h"
#include "format/KeePass2.h"
@@ -92,20 +91,22 @@ Entry* Database::resolveEntry(const Uuid& uuid)
Entry* Database::recFindEntry(const Uuid& uuid, Group* group)
{
- Q_FOREACH (Entry* entry, group->entries()) {
+ const QList<Entry*> entryList = group->entries();
+ for (Entry* entry : entryList) {
if (entry->uuid() == uuid) {
return entry;
}
}
- Q_FOREACH (Group* child, group->children()) {
+ const QList<Group*> children = group->children();
+ for (Group* child : children) {
Entry* result = recFindEntry(uuid, child);
if (result) {
return result;
}
}
- return Q_NULLPTR;
+ return nullptr;
}
Group* Database::resolveGroup(const Uuid& uuid)
@@ -119,14 +120,15 @@ Group* Database::recFindGroup(const Uuid& uuid, Group* group)
return group;
}
- Q_FOREACH (Group* child, group->children()) {
+ const QList<Group*> children = group->children();
+ for (Group* child : children) {
Group* result = recFindGroup(uuid, child);
if (result) {
return result;
}
}
- return Q_NULLPTR;
+ return nullptr;
}
QList<DeletedObject> Database::deletedObjects()
@@ -143,7 +145,7 @@ void Database::addDeletedObject(const DeletedObject& delObj)
void Database::addDeletedObject(const Uuid& uuid)
{
DeletedObject delObj;
- delObj.deletionTime = Tools::currentDateTimeUtc();
+ delObj.deletionTime = QDateTime::currentDateTimeUtc();
delObj.uuid = uuid;
addDeletedObject(delObj);
@@ -223,7 +225,7 @@ bool Database::setKey(const CompositeKey& key, const QByteArray& transformSeed,
m_data.transformedMasterKey = transformedMasterKey;
m_data.hasKey = true;
if (updateChangedTime) {
- m_metadata->setMasterKeyChanged(Tools::currentDateTimeUtc());
+ m_metadata->setMasterKeyChanged(QDateTime::currentDateTimeUtc());
}
Q_EMIT modifiedImmediate();
diff --git a/src/core/Database.h b/src/core/Database.h
index 97ccad2..6fde3c6 100644
--- a/src/core/Database.h
+++ b/src/core/Database.h
@@ -20,6 +20,7 @@
#include <QDateTime>
#include <QHash>
+#include <QObject>
#include "core/Uuid.h"
#include "keys/CompositeKey.h"
diff --git a/src/core/DatabaseIcons.cpp b/src/core/DatabaseIcons.cpp
index d6e816f..4e62f79 100644
--- a/src/core/DatabaseIcons.cpp
+++ b/src/core/DatabaseIcons.cpp
@@ -19,7 +19,7 @@
#include "core/FilePath.h"
-DatabaseIcons* DatabaseIcons::m_instance(Q_NULLPTR);
+DatabaseIcons* DatabaseIcons::m_instance(nullptr);
const int DatabaseIcons::IconCount(69);
const int DatabaseIcons::ExpiredIconIndex(45);
const char* const DatabaseIcons::m_indexToName[] = {
diff --git a/src/core/DatabaseIcons.h b/src/core/DatabaseIcons.h
index 68d1e0c..a1d9480 100644
--- a/src/core/DatabaseIcons.h
+++ b/src/core/DatabaseIcons.h
@@ -23,8 +23,6 @@
#include <QPixmapCache>
#include <QVector>
-#include "core/Global.h"
-
class DatabaseIcons
{
public:
diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp
index 1bc89e9..d90a33f 100644
--- a/src/core/Entry.cpp
+++ b/src/core/Entry.cpp
@@ -21,7 +21,6 @@
#include "core/DatabaseIcons.h"
#include "core/Group.h"
#include "core/Metadata.h"
-#include "core/Tools.h"
const int Entry::DefaultIconNumber = 0;
@@ -29,7 +28,7 @@ Entry::Entry()
: m_attributes(new EntryAttributes(this))
, m_attachments(new EntryAttachments(this))
, m_autoTypeAssociations(new AutoTypeAssociations(this))
- , m_tmpHistoryItem(Q_NULLPTR)
+ , m_tmpHistoryItem(nullptr)
, m_modifiedSinceBegin(false)
, m_updateTimeinfo(true)
{
@@ -74,8 +73,8 @@ template <class T> inline bool Entry::set(T& property, const T& value)
void Entry::updateTimeinfo()
{
if (m_updateTimeinfo) {
- m_data.timeInfo.setLastModificationTime(Tools::currentDateTimeUtc());
- m_data.timeInfo.setLastAccessTime(Tools::currentDateTimeUtc());
+ m_data.timeInfo.setLastModificationTime(QDateTime::currentDateTimeUtc());
+ m_data.timeInfo.setLastAccessTime(QDateTime::currentDateTimeUtc());
}
}
@@ -223,7 +222,7 @@ QString Entry::notes() const
bool Entry::isExpired() const
{
- return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < Tools::currentDateTimeUtc();
+ return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < QDateTime::currentDateTimeUtc();
}
EntryAttributes* Entry::attributes()
@@ -383,7 +382,7 @@ void Entry::removeHistoryItems(const QList<Entry*>& historyEntries)
return;
}
- Q_FOREACH (Entry* entry, historyEntries) {
+ for (Entry* entry : historyEntries) {
Q_ASSERT(!entry->parent());
Q_ASSERT(entry->uuid() == uuid());
Q_ASSERT(m_history.contains(entry));
@@ -432,8 +431,8 @@ void Entry::truncateHistory()
if (size <= histMaxSize) {
size += historyItem->attributes()->attributesSize();
- QSet<QByteArray> newAttachments = historyItem->attachments()->values().toSet() - foundAttachements;
- Q_FOREACH (const QByteArray& attachment, newAttachments) {
+ const QSet<QByteArray> newAttachments = historyItem->attachments()->values().toSet() - foundAttachements;
+ for (const QByteArray& attachment : newAttachments) {
size += attachment.size();
}
foundAttachements += newAttachments;
@@ -462,7 +461,7 @@ Entry* Entry::clone(CloneFlags flags) const
entry->m_attachments->copyDataFrom(m_attachments);
entry->m_autoTypeAssociations->copyDataFrom(this->m_autoTypeAssociations);
if (flags & CloneIncludeHistory) {
- Q_FOREACH (Entry* historyItem, m_history) {
+ for (Entry* historyItem : m_history) {
Entry* historyItemClone = historyItem->clone(flags & ~CloneIncludeHistory & ~CloneNewUuid);
historyItemClone->setUpdateTimeinfo(false);
historyItemClone->setUuid(entry->uuid());
@@ -473,7 +472,7 @@ Entry* Entry::clone(CloneFlags flags) const
entry->setUpdateTimeinfo(true);
if (flags & CloneResetTimeInfo) {
- QDateTime now = Tools::currentDateTimeUtc();
+ QDateTime now = QDateTime::currentDateTimeUtc();
entry->m_data.timeInfo.setCreationTime(now);
entry->m_data.timeInfo.setLastModificationTime(now);
entry->m_data.timeInfo.setLastAccessTime(now);
@@ -509,7 +508,7 @@ void Entry::beginUpdate()
m_modifiedSinceBegin = false;
}
-void Entry::endUpdate()
+bool Entry::endUpdate()
{
Q_ASSERT(m_tmpHistoryItem);
if (m_modifiedSinceBegin) {
@@ -521,7 +520,9 @@ void Entry::endUpdate()
delete m_tmpHistoryItem;
}
- m_tmpHistoryItem = Q_NULLPTR;
+ m_tmpHistoryItem = nullptr;
+
+ return m_modifiedSinceBegin;
}
void Entry::updateModifiedSinceBegin()
@@ -567,7 +568,7 @@ void Entry::setGroup(Group* group)
QObject::setParent(group);
if (m_updateTimeinfo) {
- m_data.timeInfo.setLocationChanged(Tools::currentDateTimeUtc());
+ m_data.timeInfo.setLocationChanged(QDateTime::currentDateTimeUtc());
}
}
@@ -582,7 +583,7 @@ const Database* Entry::database() const
return m_group->database();
}
else {
- return Q_NULLPTR;
+ return nullptr;
}
}
diff --git a/src/core/Entry.h b/src/core/Entry.h
index 3044dc8..0b4d482 100644
--- a/src/core/Entry.h
+++ b/src/core/Entry.h
@@ -29,7 +29,6 @@
#include "core/AutoTypeAssociations.h"
#include "core/EntryAttachments.h"
#include "core/EntryAttributes.h"
-#include "core/Global.h"
#include "core/TimeInfo.h"
#include "core/Uuid.h"
@@ -134,7 +133,7 @@ public:
* if the entry has been changed.
*/
void beginUpdate();
- void endUpdate();
+ bool endUpdate();
Group* group();
const Group* group() const;
diff --git a/src/core/EntryAttachments.h b/src/core/EntryAttachments.h
index 3446b31..903ca10 100644
--- a/src/core/EntryAttachments.h
+++ b/src/core/EntryAttachments.h
@@ -21,14 +21,12 @@
#include <QMap>
#include <QObject>
-#include "core/Global.h"
-
class EntryAttachments : public QObject
{
Q_OBJECT
public:
- explicit EntryAttachments(QObject* parent = Q_NULLPTR);
+ explicit EntryAttachments(QObject* parent = nullptr);
QList<QString> keys() const;
bool hasKey(const QString& key) const;
QList<QByteArray> values() const;
diff --git a/src/core/EntryAttributes.cpp b/src/core/EntryAttributes.cpp
index 01dcf96..5b30c70 100644
--- a/src/core/EntryAttributes.cpp
+++ b/src/core/EntryAttributes.cpp
@@ -44,7 +44,8 @@ bool EntryAttributes::hasKey(const QString& key) const
QList<QString> EntryAttributes::customKeys()
{
QList<QString> customKeys;
- Q_FOREACH (const QString& key, keys()) {
+ const QList<QString> keyList = keys();
+ for (const QString& key : keyList) {
if (!isDefaultAttribute(key)) {
customKeys.append(key);
}
@@ -162,14 +163,16 @@ void EntryAttributes::copyCustomKeysFrom(const EntryAttributes* other)
Q_EMIT aboutToBeReset();
// remove all non-default keys
- Q_FOREACH (const QString& key, keys()) {
+ const QList<QString> keyList = keys();
+ for (const QString& key : keyList) {
if (!isDefaultAttribute(key)) {
m_attributes.remove(key);
m_protectedAttributes.remove(key);
}
}
- Q_FOREACH (const QString& key, other->keys()) {
+ const QList<QString> otherKeyList = other->keys();
+ for (const QString& key : otherKeyList) {
if (!isDefaultAttribute(key)) {
m_attributes.insert(key, other->value(key));
if (other->isProtected(key)) {
@@ -189,7 +192,8 @@ bool EntryAttributes::areCustomKeysDifferent(const EntryAttributes* other)
return true;
}
- Q_FOREACH (const QString& key, keys()) {
+ const QList<QString> keyList = keys();
+ for (const QString& key : keyList) {
if (isDefaultAttribute(key)) {
continue;
}
@@ -234,7 +238,7 @@ void EntryAttributes::clear()
m_attributes.clear();
m_protectedAttributes.clear();
- Q_FOREACH (const QString& key, DefaultAttributes) {
+ for (const QString& key : DefaultAttributes) {
m_attributes.insert(key, "");
}
diff --git a/src/core/EntryAttributes.h b/src/core/EntryAttributes.h
index 334eb0a..c6bbf29 100644
--- a/src/core/EntryAttributes.h
+++ b/src/core/EntryAttributes.h
@@ -23,14 +23,12 @@
#include <QSet>
#include <QStringList>
-#include "core/Global.h"
-
class EntryAttributes : public QObject
{
Q_OBJECT
public:
- explicit EntryAttributes(QObject* parent = Q_NULLPTR);
+ explicit EntryAttributes(QObject* parent = nullptr);
QList<QString> keys() const;
bool hasKey(const QString& key) const;
QList<QString> customKeys();
diff --git a/src/core/EntrySearcher.cpp b/src/core/EntrySearcher.cpp
index 82a553e..c0360a3 100644
--- a/src/core/EntrySearcher.cpp
+++ b/src/core/EntrySearcher.cpp
@@ -19,7 +19,8 @@
#include "core/Group.h"
-QList<Entry*> EntrySearcher::search(const QString &searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity)
+QList<Entry*> EntrySearcher::search(const QString& searchTerm, const Group* group,
+ Qt::CaseSensitivity caseSensitivity)
{
if (!group->resolveSearchingEnabled()) {
return QList<Entry*>();
@@ -28,14 +29,18 @@ QList<Entry*> EntrySearcher::search(const QString &searchTerm, const Group* grou
return searchEntries(searchTerm, group, caseSensitivity);
}
-QList<Entry*> EntrySearcher::searchEntries(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity)
+QList<Entry*> EntrySearcher::searchEntries(const QString& searchTerm, const Group* group,
+ Qt::CaseSensitivity caseSensitivity)
{
QList<Entry*> searchResult;
- Q_FOREACH (Entry* entry, group->entries()) {
- searchResult.append(matchEntry(searchTerm, entry, caseSensitivity));
+ const QList<Entry*> entryList = group->entries();
+ for (Entry* entry : entryList) {
+ searchResult.append(matchEntry(searchTerm, entry, caseSensitivity));
}
- Q_FOREACH (Group* childGroup, group->children()) {
+
+ const QList<Group*> children = group->children();
+ for (Group* childGroup : children) {
if (childGroup->searchingEnabled() != Group::Disable) {
searchResult.append(searchEntries(searchTerm, childGroup, caseSensitivity));
}
@@ -44,10 +49,11 @@ QList<Entry*> EntrySearcher::searchEntries(const QString& searchTerm, const Grou
return searchResult;
}
-QList<Entry*> EntrySearcher::matchEntry(const QString& searchTerm, Entry* entry, Qt::CaseSensitivity caseSensitivity)
+QList<Entry*> EntrySearcher::matchEntry(const QString& searchTerm, Entry* entry,
+ Qt::CaseSensitivity caseSensitivity)
{
- QStringList wordList = searchTerm.split(QRegExp("\\s"), QString::SkipEmptyParts);
- Q_FOREACH (const QString& word, wordList) {
+ const QStringList wordList = searchTerm.split(QRegExp("\\s"), QString::SkipEmptyParts);
+ for (const QString& word : wordList) {
if (!wordMatch(word, entry, caseSensitivity)) {
return QList<Entry*>();
}
diff --git a/src/core/EntrySearcher.h b/src/core/EntrySearcher.h
index 246538c..c7075dc 100644
--- a/src/core/EntrySearcher.h
+++ b/src/core/EntrySearcher.h
@@ -28,10 +28,11 @@ class EntrySearcher
{
public:
QList<Entry*> search(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity);
+
private:
QList<Entry*> searchEntries(const QString& searchTerm, const Group* group, Qt::CaseSensitivity caseSensitivity);
QList<Entry*> matchEntry(const QString& searchTerm, Entry* entry, Qt::CaseSensitivity caseSensitivity);
- bool wordMatch(const QString &word, Entry *entry, Qt::CaseSensitivity caseSensitivity);
+ bool wordMatch(const QString& word, Entry* entry, Qt::CaseSensitivity caseSensitivity);
};
#endif // KEEPASSX_ENTRYSEARCHER_H
diff --git a/src/core/FilePath.cpp b/src/core/FilePath.cpp
index f7c4075..06208b7 100644
--- a/src/core/FilePath.cpp
+++ b/src/core/FilePath.cpp
@@ -22,8 +22,9 @@
#include <QLibrary>
#include "config-keepassx.h"
+#include "core/Global.h"
-FilePath* FilePath::m_instance(Q_NULLPTR);
+FilePath* FilePath::m_instance(nullptr);
QString FilePath::dataPath(const QString& name)
{
@@ -40,7 +41,8 @@ QString FilePath::pluginPath(const QString& name)
QStringList pluginPaths;
QDir buildDir(QCoreApplication::applicationDirPath() + "/autotype");
- Q_FOREACH (const QString& dir, buildDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
+ const QStringList buildDirEntryList = buildDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
+ for (const QString& dir : buildDirEntryList) {
pluginPaths << QCoreApplication::applicationDirPath() + "/autotype/" + dir;
}
@@ -68,10 +70,10 @@ QString FilePath::pluginPath(const QString& name)
QStringList dirFilter;
dirFilter << QString("*%1*").arg(name);
- Q_FOREACH (const QString& path, pluginPaths) {
- QStringList fileCandidates = QDir(path).entryList(dirFilter, QDir::Files);
+ for (const QString& path : asConst(pluginPaths)) {
+ const QStringList fileCandidates = QDir(path).entryList(dirFilter, QDir::Files);
- Q_FOREACH (const QString& file, fileCandidates) {
+ for (const QString& file : fileCandidates) {
QString filePath = path + "/" + file;
if (QLibrary::isLibrary(filePath)) {
@@ -103,10 +105,9 @@ QIcon FilePath::icon(const QString& category, const QString& name, bool fromThem
}
if (icon.isNull()) {
- QList<int> pngSizes;
- pngSizes << 16 << 22 << 24 << 32 << 48 << 64 << 128;
+ const QList<int> pngSizes = { 16, 22, 24, 32, 48, 64, 128 };
QString filename;
- Q_FOREACH (int size, pngSizes) {
+ for (int size : pngSizes) {
filename = QString("%1/icons/application/%2x%2/%3.png").arg(m_dataPath, QString::number(size),
combinedName);
if (QFile::exists(filename)) {
@@ -148,10 +149,9 @@ QIcon FilePath::onOffIcon(const QString& category, const QString& name)
stateName = "on";
}
- QList<int> pngSizes;
- pngSizes << 16 << 22 << 24 << 32 << 48 << 64 << 128;
+ const QList<int> pngSizes = { 16, 22, 24, 32, 48, 64, 128 };
QString filename;
- Q_FOREACH (int size, pngSizes) {
+ for (int size : pngSizes) {
filename = QString("%1/icons/application/%2x%2/%3-%4.png").arg(m_dataPath, QString::number(size),
combinedName, stateName);
if (QFile::exists(filename)) {
diff --git a/src/core/FilePath.h b/src/core/FilePath.h
index 9e98d3e..c37a908 100644
--- a/src/core/FilePath.h
+++ b/src/core/FilePath.h
@@ -22,8 +22,6 @@
#include <QIcon>
#include <QString>
-#include "core/Global.h"
-
class FilePath
{
public:
diff --git a/src/core/Global.h b/src/core/Global.h
index 914c7b4..bd6a733 100644
--- a/src/core/Global.h
+++ b/src/core/Global.h
@@ -20,104 +20,8 @@
#ifndef KEEPASSX_GLOBAL_H
#define KEEPASSX_GLOBAL_H
-// mostly copied from qcompilerdetection.h which is part of Qt 5
-
#include <QtGlobal>
-#ifdef Q_CC_CLANG
-# if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
-# if __has_feature(cxx_strong_enums)
-# define COMPILER_CLASS_ENUM
-# endif
-# if __has_feature(cxx_constexpr)
-# define COMPILER_CONSTEXPR
-# endif
-# if __has_feature(cxx_decltype) /* && __has_feature(cxx_decltype_incomplete_return_types) */
-# define COMPILER_DECLTYPE
-# endif
-# if __has_feature(cxx_override_control)
-# define COMPILER_EXPLICIT_OVERRIDES
-# endif
-# if __has_feature(cxx_nullptr)
-# define COMPILER_NULLPTR
-# endif
-# if __has_feature(cxx_static_assert)
-# define COMPILER_STATIC_ASSERT
-# endif
-# endif
-#endif // Q_CC_CLANG
-
-#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG)
-# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
-# define COMPILER_DECLTYPE
-# define COMPILER_STATIC_ASSERT
-# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404
-# define COMPILER_CLASS_ENUM
-# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
-# define COMPILER_CONSTEXPR
-# define COMPILER_NULLPTR
-# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407
-# define COMPILER_EXPLICIT_OVERRIDES
-# endif
-# endif
-#endif
-
-/*
- * C++11 keywords and expressions
- */
-#if !defined(Q_NULLPTR)
-# ifdef COMPILER_NULLPTR
-# define Q_NULLPTR nullptr
-# else
-# define Q_NULLPTR 0
-# endif
-#endif
-
-#if !defined(Q_DECL_CONSTEXPR)
-# ifdef COMPILER_CONSTEXPR
-# define Q_DECL_CONSTEXPR constexpr
-# else
-# define Q_DECL_CONSTEXPR
-# endif
-#endif
-
-#if !defined(Q_DECL_OVERRIDE) && !defined(Q_DECL_FINAL) && !defined(Q_DECL_FINAL_CLASS)
-# ifdef COMPILER_EXPLICIT_OVERRIDES
-# define Q_DECL_OVERRIDE override
-# define Q_DECL_FINAL final
-# ifdef COMPILER_DECLTYPE
-# define Q_DECL_FINAL_CLASS final
-# else
-# define Q_DECL_FINAL_CLASS
-# endif
-# else
-# define Q_DECL_OVERRIDE
-# define Q_DECL_FINAL
-# define Q_DECL_FINAL_CLASS
-# endif
-#endif
-
-#if !defined(Q_STATIC_ASSERT) && !defined(Q_STATIC_ASSERT_X)
-#ifdef COMPILER_STATIC_ASSERT
-#define Q_STATIC_ASSERT(Condition) static_assert(static_cast<bool>(Condition), #Condition)
-#define Q_STATIC_ASSERT_X(Condition, Message) static_assert(static_cast<bool>(Condition), Message)
-#else
-// Intentionally undefined
-template <bool Test> class QStaticAssertFailure;
-template <> class QStaticAssertFailure<true> {};
-
-#define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
-#define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
-#define Q_STATIC_ASSERT(Condition) \
- enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
-#define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
-#endif // COMPILER_STATIC_ASSERT
-#endif // !defined(Q_STATIC_ASSERT) && !defined(Q_STATIC_ASSERT_X)
-
#if defined(Q_OS_WIN)
# if defined(KEEPASSX_BUILDING_CORE)
# define KEEPASSX_EXPORT Q_DECL_EXPORT
@@ -132,4 +36,13 @@ template <> class QStaticAssertFailure<true> {};
#define QUINT32_MAX 4294967295U
#endif
+template <typename T> struct AddConst { typedef const T Type; };
+
+// this adds const to non-const objects (like std::as_const)
+template <typename T>
+constexpr typename AddConst<T>::Type& asConst(T &t) noexcept { return t; }
+// prevent rvalue arguments:
+template <typename T>
+void asConst(const T&&) = delete;
+
#endif // KEEPASSX_GLOBAL_H
diff --git a/src/core/Group.cpp b/src/core/Group.cpp
index cae53db..325ef94 100644
--- a/src/core/Group.cpp
+++ b/src/core/Group.cpp
@@ -18,9 +18,9 @@
#include "Group.h"
#include "core/Config.h"
+#include "core/Global.h"
#include "core/DatabaseIcons.h"
#include "core/Metadata.h"
-#include "core/Tools.h"
const int Group::DefaultIconNumber = 48;
const int Group::RecycleBinIconNumber = 43;
@@ -38,19 +38,19 @@ Group::~Group()
{
// Destroy entries and children manually so DeletedObjects can be added
// to database.
- QList<Entry*> entries = m_entries;
- Q_FOREACH (Entry* entry, entries) {
+ const QList<Entry*> entries = m_entries;
+ for (Entry* entry : entries) {
delete entry;
}
- QList<Group*> children = m_children;
- Q_FOREACH (Group* group, children) {
+ const QList<Group*> children = m_children;
+ for (Group* group : children) {
delete group;
}
if (m_db && m_parent) {
DeletedObject delGroup;
- delGroup.deletionTime = Tools::currentDateTimeUtc();
+ delGroup.deletionTime = QDateTime::currentDateTimeUtc();
delGroup.uuid = m_uuid;
m_db->addDeletedObject(delGroup);
}
@@ -84,8 +84,8 @@ template <class P, class V> inline bool Group::set(P& property, const V& value)
void Group::updateTimeinfo()
{
if (m_updateTimeinfo) {
- m_data.timeInfo.setLastModificationTime(Tools::currentDateTimeUtc());
- m_data.timeInfo.setLastAccessTime(Tools::currentDateTimeUtc());
+ m_data.timeInfo.setLastModificationTime(QDateTime::currentDateTimeUtc());
+ m_data.timeInfo.setLastAccessTime(QDateTime::currentDateTimeUtc());
}
}
@@ -203,7 +203,7 @@ Entry* Group::lastTopVisibleEntry() const
bool Group::isExpired() const
{
- return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < Tools::currentDateTimeUtc();
+ return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < QDateTime::currentDateTimeUtc();
}
void Group::setUuid(const Uuid& uuid)
@@ -365,7 +365,7 @@ void Group::setParent(Group* parent, int index)
}
if (m_updateTimeinfo) {
- m_data.timeInfo.setLocationChanged(Tools::currentDateTimeUtc());
+ m_data.timeInfo.setLocationChanged(QDateTime::currentDateTimeUtc());
}
Q_EMIT modified();
@@ -385,7 +385,7 @@ void Group::setParent(Database* db)
cleanupParent();
- m_parent = Q_NULLPTR;
+ m_parent = nullptr;
recSetDatabase(db);
QObject::setParent(db);
@@ -428,12 +428,12 @@ QList<Entry*> Group::entriesRecursive(bool includeHistoryItems) const
entryList.append(m_entries);
if (includeHistoryItems) {
- Q_FOREACH (Entry* entry, m_entries) {
+ for (Entry* entry : m_entries) {
entryList.append(entry->historyItems());
}
}
- Q_FOREACH (Group* group, m_children) {
+ for (Group* group : m_children) {
entryList.append(group->entriesRecursive(includeHistoryItems));
}
@@ -447,7 +447,7 @@ QList<const Group*> Group::groupsRecursive(bool includeSelf) const
groupList.append(this);
}
- Q_FOREACH (const Group* group, m_children) {
+ for (const Group* group : m_children) {
groupList.append(group->groupsRecursive(true));
}
@@ -461,7 +461,7 @@ QList<Group*> Group::groupsRecursive(bool includeSelf)
groupList.append(this);
}
- Q_FOREACH (Group* group, m_children) {
+ for (Group* group : asConst(m_children)) {
groupList.append(group->groupsRecursive(true));
}
@@ -476,13 +476,14 @@ QSet<Uuid> Group::customIconsRecursive() const
result.insert(iconUuid());
}
- Q_FOREACH (Entry* entry, entriesRecursive(true)) {
+ const QList<Entry*> entryList = entriesRecursive(true);
+ for (Entry* entry : entryList) {
if (!entry->iconUuid().isNull()) {
result.insert(entry->iconUuid());
}
}
- Q_FOREACH (Group* group, m_children) {
+ for (Group* group : m_children) {
result.unite(group->customIconsRecursive());
}
@@ -498,19 +499,21 @@ Group* Group::clone(Entry::CloneFlags entryFlags) const
clonedGroup->setUuid(Uuid::random());
clonedGroup->m_data = m_data;
- Q_FOREACH (Entry* entry, entries()) {
+ const QList<Entry*> entryList = entries();
+ for (Entry* entry : entryList) {
Entry* clonedEntry = entry->clone(entryFlags);
clonedEntry->setGroup(clonedGroup);
}
- Q_FOREACH (Group* groupChild, children()) {
+ const QList<Group*> childrenGroups = children();
+ for (Group* groupChild : childrenGroups) {
Group* clonedGroupChild = groupChild->clone(entryFlags);
clonedGroupChild->setParent(clonedGroup);
}
clonedGroup->setUpdateTimeinfo(true);
- QDateTime now = Tools::currentDateTimeUtc();
+ QDateTime now = QDateTime::currentDateTimeUtc();
clonedGroup->m_data.timeInfo.setCreationTime(now);
clonedGroup->m_data.timeInfo.setLastModificationTime(now);
clonedGroup->m_data.timeInfo.setLastAccessTime(now);
@@ -570,7 +573,7 @@ void Group::recSetDatabase(Database* db)
disconnect(SIGNAL(modified()), m_db);
}
- Q_FOREACH (Entry* entry, m_entries) {
+ for (Entry* entry : asConst(m_entries)) {
if (m_db) {
entry->disconnect(m_db);
}
@@ -592,7 +595,7 @@ void Group::recSetDatabase(Database* db)
m_db = db;
- Q_FOREACH (Group* group, m_children) {
+ for (Group* group : asConst(m_children)) {
group->recSetDatabase(db);
}
}
@@ -610,11 +613,11 @@ void Group::cleanupParent()
void Group::recCreateDelObjects()
{
if (m_db) {
- Q_FOREACH (Entry* entry, m_entries) {
+ for (Entry* entry : asConst(m_entries)) {
m_db->addDeletedObject(entry->uuid());
}
- Q_FOREACH (Group* group, m_children) {
+ for (Group* group : asConst(m_children)) {
group->recCreateDelObjects();
}
m_db->addDeletedObject(m_uuid);
diff --git a/src/core/InactivityTimer.h b/src/core/InactivityTimer.h
index e0a21e0..ba571a5 100644
--- a/src/core/InactivityTimer.h
+++ b/src/core/InactivityTimer.h
@@ -21,8 +21,6 @@
#include <QMutex>
#include <QObject>
-#include "core/Global.h"
-
class QTimer;
class InactivityTimer : public QObject
@@ -30,7 +28,7 @@ class InactivityTimer : public QObject
Q_OBJECT
public:
- explicit InactivityTimer(QObject* parent = Q_NULLPTR);
+ explicit InactivityTimer(QObject* parent = nullptr);
void setInactivityTimeout(int inactivityTimeout);
void activate();
void deactivate();
diff --git a/src/core/Metadata.cpp b/src/core/Metadata.cpp
index 0c67bba..e908fbb 100644
--- a/src/core/Metadata.cpp
+++ b/src/core/Metadata.cpp
@@ -42,7 +42,7 @@ Metadata::Metadata(QObject* parent)
m_data.protectNotes = false;
// m_data.autoEnableVisualHiding = false;
- QDateTime now = Tools::currentDateTimeUtc();
+ QDateTime now = QDateTime::currentDateTimeUtc();
m_data.nameChanged = now;
m_data.descriptionChanged = now;
m_data.defaultUserNameChanged = now;
@@ -67,7 +67,7 @@ template <class P, class V> bool Metadata::set(P& property, const V& value, QDat
if (property != value) {
property = value;
if (m_updateDatetime) {
- dateTime = Tools::currentDateTimeUtc();
+ dateTime = QDateTime::currentDateTimeUtc();
}
Q_EMIT modified();
return true;
@@ -218,7 +218,7 @@ QHash<Uuid, QPixmap> Metadata::customIconsScaledPixmaps() const
{
QHash<Uuid, QPixmap> result;
- Q_FOREACH (const Uuid& uuid, m_customIconsOrder) {
+ for (const Uuid& uuid : m_customIconsOrder) {
result.insert(uuid, customIconScaledPixmap(uuid));
}
@@ -427,7 +427,7 @@ void Metadata::removeCustomIcon(const Uuid& uuid)
void Metadata::copyCustomIcons(const QSet<Uuid>& iconList, const Metadata* otherMetadata)
{
- Q_FOREACH (const Uuid& uuid, iconList) {
+ for (const Uuid& uuid : iconList) {
Q_ASSERT(otherMetadata->containsCustomIcon(uuid));
if (!containsCustomIcon(uuid) && otherMetadata->containsCustomIcon(uuid)) {
diff --git a/src/core/Metadata.h b/src/core/Metadata.h
index 062e552..c35aed3 100644
--- a/src/core/Metadata.h
+++ b/src/core/Metadata.h
@@ -26,7 +26,6 @@
#include <QPixmapCache>
#include <QPointer>
-#include "core/Global.h"
#include "core/Uuid.h"
class Database;
@@ -37,7 +36,7 @@ class Metadata : public QObject
Q_OBJECT
public:
- explicit Metadata(QObject* parent = Q_NULLPTR);
+ explicit Metadata(QObject* parent = nullptr);
struct MetadataData
{
diff --git a/src/core/PasswordGenerator.cpp b/src/core/PasswordGenerator.cpp
index 5915ba8..f52f6e4 100644
--- a/src/core/PasswordGenerator.cpp
+++ b/src/core/PasswordGenerator.cpp
@@ -45,11 +45,11 @@ QString PasswordGenerator::generatePassword() const
{
Q_ASSERT(isValid());
- QVector<PasswordGroup> groups = passwordGroups();
+ const QVector<PasswordGroup> groups = passwordGroups();
QVector<QChar> passwordChars;
- Q_FOREACH (const PasswordGroup& group, groups) {
- Q_FOREACH (QChar ch, group) {
+ for (const PasswordGroup& group : groups) {
+ for (QChar ch : group) {
passwordChars.append(ch);
}
}
diff --git a/src/core/PasswordGenerator.h b/src/core/PasswordGenerator.h
index 6a9d212..cc8196f 100644
--- a/src/core/PasswordGenerator.h
+++ b/src/core/PasswordGenerator.h
@@ -22,8 +22,6 @@
#include <QString>
#include <QVector>
-#include "core/Global.h"
-
typedef QVector<QChar> PasswordGroup;
class PasswordGenerator
diff --git a/src/core/SignalMultiplexer.cpp b/src/core/SignalMultiplexer.cpp
index a70e9ef..7b5fab9 100644
--- a/src/core/SignalMultiplexer.cpp
+++ b/src/core/SignalMultiplexer.cpp
@@ -17,6 +17,8 @@
#include "SignalMultiplexer.h"
+#include "core/Global.h"
+
SignalMultiplexer::SignalMultiplexer()
{
}
@@ -24,7 +26,7 @@ SignalMultiplexer::SignalMultiplexer()
SignalMultiplexer::~SignalMultiplexer()
{
// disconnect all connections
- setCurrentObject(Q_NULLPTR);
+ setCurrentObject(nullptr);
}
QObject* SignalMultiplexer::currentObject() const
@@ -45,7 +47,7 @@ void SignalMultiplexer::setCurrentObject(QObject* object)
}
if (m_currentObject) {
- Q_FOREACH (const Connection& con, m_connections) {
+ for (const Connection& con : asConst(m_connections)) {
disconnect(con);
}
}
@@ -53,7 +55,7 @@ void SignalMultiplexer::setCurrentObject(QObject* object)
m_currentObject = object;
if (object) {
- Q_FOREACH (const Connection& con, m_connections) {
+ for (const Connection& con : asConst(m_connections)) {
connect(con);
}
}
diff --git a/src/core/SignalMultiplexer.h b/src/core/SignalMultiplexer.h
index 6d39cd5..b27e1f3 100644
--- a/src/core/SignalMultiplexer.h
+++ b/src/core/SignalMultiplexer.h
@@ -21,8 +21,6 @@
#include <QObject>
#include <QPointer>
-#include "core/Global.h"
-
class SignalMultiplexer
{
public:
diff --git a/src/core/TimeInfo.cpp b/src/core/TimeInfo.cpp
index 2613325..ec6ebde 100644
--- a/src/core/TimeInfo.cpp
+++ b/src/core/TimeInfo.cpp
@@ -23,7 +23,7 @@ TimeInfo::TimeInfo()
: m_expires(false)
, m_usageCount(0)
{
- QDateTime now = Tools::currentDateTimeUtc();
+ QDateTime now = QDateTime::currentDateTimeUtc();
m_lastModificationTime = now;
m_creationTime = now;
m_lastAccessTime = now;
diff --git a/src/core/Tools.cpp b/src/core/Tools.cpp
index db3baa8..bc63bf1 100644
--- a/src/core/Tools.cpp
+++ b/src/core/Tools.cpp
@@ -23,11 +23,7 @@
#include <QLocale>
#include <QStringList>
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
#include <QElapsedTimer>
-#else
-#include <QTime>
-#endif
#ifdef Q_OS_WIN
#include <windows.h> // for Sleep(), SetDllDirectoryA() and SetSearchPathMode()
@@ -75,7 +71,9 @@ bool hasChild(const QObject* parent, const QObject* child)
if (!parent || !child) {
return false;
}
- Q_FOREACH (QObject* c, parent->children()) {
+
+ const QObjectList children = parent->children();
+ for (QObject* c : children) {
if (child == c || hasChild(c, child)) {
return true;
}
@@ -122,21 +120,12 @@ bool readAllFromDevice(QIODevice* device, QByteArray& data)
}
}
-QDateTime currentDateTimeUtc()
-{
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
- return QDateTime::currentDateTimeUtc();
-#else
- return QDateTime::currentDateTime().toUTC();
-#endif
-}
-
QString imageReaderFilter()
{
- QList<QByteArray> formats = QImageReader::supportedImageFormats();
+ const QList<QByteArray> formats = QImageReader::supportedImageFormats();
QStringList formatsStringList;
- Q_FOREACH (const QByteArray& format, formats) {
+ for (const QByteArray& format : formats) {
for (int i = 0; i < format.size(); i++) {
if (!QChar(format.at(i)).isLetterOrNumber()) {
continue;
@@ -151,7 +140,7 @@ QString imageReaderFilter()
bool isHex(const QByteArray& ba)
{
- Q_FOREACH (char c, ba) {
+ for (char c : ba) {
if ( !( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') ) ) {
return false;
}
@@ -184,7 +173,7 @@ void sleep(int ms)
timespec ts;
ts.tv_sec = ms / 1000;
ts.tv_nsec = (ms % 1000) * 1000 * 1000;
- nanosleep(&ts, Q_NULLPTR);
+ nanosleep(&ts, nullptr);
#endif
}
@@ -196,11 +185,7 @@ void wait(int ms)
return;
}
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
QElapsedTimer timer;
-#else
- QTime timer;
-#endif
timer.start();
if (ms <= 50) {
@@ -215,23 +200,10 @@ void wait(int ms)
QCoreApplication::processEvents(QEventLoop::AllEvents, timeLeft);
sleep(10);
}
- } while (timer.elapsed() < ms);
+ } while (!timer.hasExpired(ms));
}
}
-QString platform()
-{
-#if defined(Q_WS_X11)
- return "x11";
-#elif defined(Q_WS_MAC)
- return "mac";
-#elif defined(Q_WS_WIN)
- return "win";
-#else
- return QString();
-#endif
-}
-
void disableCoreDumps()
{
// default to true
diff --git a/src/core/Tools.h b/src/core/Tools.h
index 68e9dcd..65df1ea 100644
--- a/src/core/Tools.h
+++ b/src/core/Tools.h
@@ -18,11 +18,13 @@
#ifndef KEEPASSX_TOOLS_H
#define KEEPASSX_TOOLS_H
+#include "core/Global.h"
+
#include <QDateTime>
#include <QObject>
#include <QString>
-#include "core/Global.h"
+#include <algorithm>
class QIODevice;
@@ -32,16 +34,27 @@ QString humanReadableFileSize(qint64 bytes);
bool hasChild(const QObject* parent, const QObject* child);
bool readFromDevice(QIODevice* device, QByteArray& data, int size = 16384);
bool readAllFromDevice(QIODevice* device, QByteArray& data);
-QDateTime currentDateTimeUtc();
QString imageReaderFilter();
bool isHex(const QByteArray& ba);
bool isBase64(const QByteArray& ba);
void sleep(int ms);
void wait(int ms);
-QString platform();
void disableCoreDumps();
void setupSearchPaths();
+template <typename RandomAccessIterator, typename T>
+RandomAccessIterator binaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T& value)
+{
+ RandomAccessIterator it = std::lower_bound(begin, end, value);
+
+ if ((it == end) || (value < *it)) {
+ return end;
+ }
+ else {
+ return it;
+ }
+}
+
} // namespace Tools
#endif // KEEPASSX_TOOLS_H
diff --git a/src/core/Translator.cpp b/src/core/Translator.cpp
index ed63693..713727e 100644
--- a/src/core/Translator.cpp
+++ b/src/core/Translator.cpp
@@ -49,18 +49,20 @@ void Translator::installTranslator()
QList<QPair<QString, QString> > Translator::availableLanguages()
{
- QStringList paths;
+ const QStringList paths = {
#ifdef QT_DEBUG
- paths.append(QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR));
+ QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR),
#endif
- paths.append(filePath()->dataPath("translations"));
+ filePath()->dataPath("translations")
+ };
QList<QPair<QString, QString> > languages;
languages.append(QPair<QString, QString>("system", "System default"));
QRegExp regExp("keepassx_([a-zA-Z_]+)\\.qm", Qt::CaseInsensitive, QRegExp::RegExp2);
- Q_FOREACH (const QString& path, paths) {
- Q_FOREACH (const QString& filename, QDir(path).entryList()) {
+ for (const QString& path : paths) {
+ const QStringList fileList = QDir(path).entryList();
+ for (const QString& filename : fileList) {
if (regExp.exactMatch(filename)) {
QString langcode = regExp.cap(1);
if (langcode == "en_plurals") {
@@ -85,13 +87,14 @@ QList<QPair<QString, QString> > Translator::availableLanguages()
bool Translator::installTranslator(const QString& language)
{
- QStringList paths;
+ const QStringList paths = {
#ifdef QT_DEBUG
- paths.append(QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR));
+ QString("%1/share/translations").arg(KEEPASSX_BINARY_DIR),
#endif
- paths.append(filePath()->dataPath("translations"));
+ filePath()->dataPath("translations")
+ };
- Q_FOREACH (const QString& path, paths) {
+ for (const QString& path : paths) {
if (installTranslator(language, path)) {
return true;
}
@@ -116,7 +119,7 @@ bool Translator::installTranslator(const QString& language, const QString& path)
bool Translator::installQtTranslator(const QString& language)
{
QTranslator* qtTranslator = new QTranslator(qApp);
- if (qtTranslator->load(QString("%1/qt_%2").arg(QLibraryInfo::location(QLibraryInfo::TranslationsPath), language))) {
+ if (qtTranslator->load(QString("%1/qtbase_%2").arg(QLibraryInfo::location(QLibraryInfo::TranslationsPath), language))) {
QCoreApplication::installTranslator(qtTranslator);
return true;
}
diff --git a/src/core/qcommandlineoption.cpp b/src/core/qcommandlineoption.cpp
deleted file mode 100644
index c908807..0000000
--- a/src/core/qcommandlineoption.cpp
+++ /dev/null
@@ -1,305 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Copyright (C) 2013 David Faure <faure@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcommandlineoption.h"
-
-#include <QSet>
-
-class QCommandLineOptionPrivate : public QSharedData
-{
-public:
- inline QCommandLineOptionPrivate()
- { }
-
- void setNames(const QStringList &nameList);
-
- //! The list of names used for this option.
- QStringList names;
-
- //! The documentation name for the value, if one is expected
- //! Example: "-o <file>" means valueName == "file"
- QString valueName;
-
- //! The description used for this option.
- QString description;
-
- //! The list of default values used for this option.
- QStringList defaultValues;
-};
-
-/*!
- \since 5.2
- \class QCommandLineOption
- \brief The QCommandLineOption class defines a possible command-line option.
- \inmodule QtCore
- \ingroup shared
- \ingroup tools
-
- This class is used to describe an option on the command line. It allows
- different ways of defining the same option with multiple aliases possible.
- It is also used to describe how the option is used - it may be a flag (e.g. \c{-v})
- or take an argument (e.g. \c{-o file}).
-
- Examples:
- \snippet code/src_corelib_tools_qcommandlineoption.cpp 0
-
- \sa QCommandLineParser
-*/
-
-/*!
- Constructs a command line option object with the given arguments.
-
- The name of the option is set to \a name.
- The name can be either short or long. If the name is one character in
- length, it is considered a short name. Option names must not be empty,
- must not start with a dash or a slash character, must not contain a \c{=}
- and cannot be repeated.
-
- The description is set to \a description. It is customary to add a "."
- at the end of the description.
-
- In addition, the \a valueName can be set if the option expects a value.
- The default value for the option is set to \a defaultValue.
-
- \sa setDescription(), setValueName(), setDefaultValues()
-*/
-QCommandLineOption::QCommandLineOption(const QString &name, const QString &description,
- const QString &valueName,
- const QString &defaultValue)
- : d(new QCommandLineOptionPrivate)
-{
- d->setNames(QStringList(name));
- setValueName(valueName);
- setDescription(description);
- setDefaultValue(defaultValue);
-}
-
-/*!
- Constructs a command line option object with the given arguments.
-
- This overload allows to set multiple names for the option, for instance
- \c{o} and \c{output}.
-
- The names of the option are set to \a names.
- The names can be either short or long. Any name in the list that is one
- character in length is a short name. Option names must not be empty,
- must not start with a dash or a slash character, must not contain a \c{=}
- and cannot be repeated.
-
- The description is set to \a description. It is customary to add a "."
- at the end of the description.
-
- In addition, the \a valueName can be set if the option expects a value.
- The default value for the option is set to \a defaultValue.
-
- \sa setDescription(), setValueName(), setDefaultValues()
-*/
-QCommandLineOption::QCommandLineOption(const QStringList &names, const QString &description,
- const QString &valueName,
- const QString &defaultValue)
- : d(new QCommandLineOptionPrivate)
-{
- d->setNames(names);
- setValueName(valueName);
- setDescription(description);
- setDefaultValue(defaultValue);
-}
-
-/*!
- Constructs a QCommandLineOption object that is a copy of the QCommandLineOption
- object \a other.
-
- \sa operator=()
-*/
-QCommandLineOption::QCommandLineOption(const QCommandLineOption &other)
- : d(other.d)
-{
-}
-
-/*!
- Destroys the command line option object.
-*/
-QCommandLineOption::~QCommandLineOption()
-{
-}
-
-/*!
- Makes a copy of the \a other object and assigns it to this QCommandLineOption
- object.
-*/
-QCommandLineOption &QCommandLineOption::operator=(const QCommandLineOption &other)
-{
- d = other.d;
- return *this;
-}
-
-/*!
- Returns the names set for this option.
- */
-QStringList QCommandLineOption::names() const
-{
- return d->names;
-}
-
-void QCommandLineOptionPrivate::setNames(const QStringList &nameList)
-{
- QStringList newNames;
- if (nameList.isEmpty())
- qWarning("QCommandLineOption: Options must have at least one name");
- Q_FOREACH (const QString &name, nameList) {
- if (name.isEmpty()) {
- qWarning("QCommandLineOption: Option names cannot be empty");
- } else {
- const QChar c = name.at(0);
- if (c == QLatin1Char('-'))
- qWarning("QCommandLineOption: Option names cannot start with a '-'");
- else if (c == QLatin1Char('/'))
- qWarning("QCommandLineOption: Option names cannot start with a '/'");
- else if (name.contains(QLatin1Char('=')))
- qWarning("QCommandLineOption: Option names cannot contain a '='");
- else
- newNames.append(name);
- }
- }
- // commit
- names = newNames;
-}
-
-/*!
- Sets the name of the expected value, for the documentation, to \a valueName.
-
- Options without a value assigned have a boolean-like behavior:
- either the user specifies --option or they don't.
-
- Options with a value assigned need to set a name for the expected value,
- for the documentation of the option in the help output. An option with names \c{o} and \c{output},
- and a value name of \c{file} will appear as \c{-o, --output <file>}.
-
- Call QCommandLineParser::argument() if you expect the option to be present
- only once, and QCommandLineParser::arguments() if you expect that option
- to be present multiple times.
-
- \sa valueName()
- */
-void QCommandLineOption::setValueName(const QString &valueName)
-{
- d->valueName = valueName;
-}
-
-/*!
- Returns the name of the expected value.
-
- If empty, the option doesn't take a value.
-
- \sa setValueName()
- */
-QString QCommandLineOption::valueName() const
-{
- return d->valueName;
-}
-
-/*!
- Sets the description used for this option to \a description.
-
- It is customary to add a "." at the end of the description.
-
- The description is used by QCommandLineParser::showHelp().
-
- \sa description()
- */
-void QCommandLineOption::setDescription(const QString &description)
-{
- d->description = description;
-}
-
-/*!
- Returns the description set for this option.
-
- \sa setDescription()
- */
-QString QCommandLineOption::description() const
-{
- return d->description;
-}
-
-/*!
- Sets the default value used for this option to \a defaultValue.
-
- The default value is used if the user of the application does not specify
- the option on the command line.
-
- If \a defaultValue is empty, the option has no default values.
-
- \sa defaultValues() setDefaultValues()
- */
-void QCommandLineOption::setDefaultValue(const QString &defaultValue)
-{
- QStringList newDefaultValues;
- if (!defaultValue.isEmpty()) {
- newDefaultValues << defaultValue;
- }
- // commit:
- d->defaultValues = newDefaultValues;
-}
-
-/*!
- Sets the list of default values used for this option to \a defaultValues.
-
- The default values are used if the user of the application does not specify
- the option on the command line.
-
- \sa defaultValues() setDefaultValue()
- */
-void QCommandLineOption::setDefaultValues(const QStringList &defaultValues)
-{
- d->defaultValues = defaultValues;
-}
-
-/*!
- Returns the default values set for this option.
-
- \sa setDefaultValues()
- */
-QStringList QCommandLineOption::defaultValues() const
-{
- return d->defaultValues;
-}
diff --git a/src/core/qcommandlineoption.h b/src/core/qcommandlineoption.h
deleted file mode 100644
index b97d44c..0000000
--- a/src/core/qcommandlineoption.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCOMMANDLINEOPTION_H
-#define QCOMMANDLINEOPTION_H
-
-#include <QStringList>
-#include <QSharedData>
-
-class QCommandLineOptionPrivate;
-
-class QCommandLineOption
-{
-public:
- explicit QCommandLineOption(const QString &name, const QString &description = QString(),
- const QString &valueName = QString(),
- const QString &defaultValue = QString());
- explicit QCommandLineOption(const QStringList &names, const QString &description = QString(),
- const QString &valueName = QString(),
- const QString &defaultValue = QString());
- QCommandLineOption(const QCommandLineOption &other);
-
- ~QCommandLineOption();
-
- QCommandLineOption &operator=(const QCommandLineOption &other);
-
- QStringList names() const;
-
- void setValueName(const QString &name);
- QString valueName() const;
-
- void setDescription(const QString &description);
- QString description() const;
-
- void setDefaultValue(const QString &defaultValue);
- void setDefaultValues(const QStringList &defaultValues);
- QStringList defaultValues() const;
-
-private:
- QSharedDataPointer<QCommandLineOptionPrivate> d;
-};
-
-#endif // QCOMMANDLINEOPTION_H
diff --git a/src/core/qcommandlineparser.cpp b/src/core/qcommandlineparser.cpp
deleted file mode 100644
index f97d78a..0000000
--- a/src/core/qcommandlineparser.cpp
+++ /dev/null
@@ -1,944 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Copyright (C) 2013 David Faure <faure@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcommandlineparser.h"
-
-#include <QCoreApplication>
-#include <QHash>
-#include <QVector>
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef QHash<QString, int> NameHash_t;
-
-class QCommandLineParserPrivate
-{
-public:
- inline QCommandLineParserPrivate()
- : singleDashWordOptionMode(QCommandLineParser::ParseAsCompactedShortOptions),
- builtinVersionOption(false),
- builtinHelpOption(false),
- needsParsing(true)
- { }
-
- bool parse(const QStringList &args);
- void checkParsed(const char *method);
- QStringList aliases(const QString &name) const;
- QString helpText() const;
- bool registerFoundOption(const QString &optionName);
- bool parseOptionValue(const QString &optionName, const QString &argument,
- QStringList::const_iterator *argumentIterator,
- QStringList::const_iterator argsEnd);
-
- //! Error text set when parse() returns false
- QString errorText;
-
- //! The command line options used for parsing
- QList<QCommandLineOption> commandLineOptionList;
-
- //! Hash mapping option names to their offsets in commandLineOptionList and optionArgumentList.
- NameHash_t nameHash;
-
- //! Option values found (only for options with a value)
- QHash<int, QStringList> optionValuesHash;
-
- //! Names of options found on the command line.
- QStringList optionNames;
-
- //! Arguments which did not belong to any option.
- QStringList positionalArgumentList;
-
- //! Names of options which were unknown.
- QStringList unknownOptionNames;
-
- //! Application description
- QString description;
-
- //! Documentation for positional arguments
- struct PositionalArgumentDefinition
- {
- QString name;
- QString description;
- QString syntax;
- };
- QVector<PositionalArgumentDefinition> positionalArgumentDefinitions;
-
- //! The parsing mode for "-abc"
- QCommandLineParser::SingleDashWordOptionMode singleDashWordOptionMode;
-
- //! Whether addVersionOption was called
- bool builtinVersionOption;
-
- //! Whether addHelpOption was called
- bool builtinHelpOption;
-
- //! True if parse() needs to be called
- bool needsParsing;
-};
-
-QStringList QCommandLineParserPrivate::aliases(const QString &optionName) const
-{
- const NameHash_t::const_iterator it = nameHash.find(optionName);
- if (it == nameHash.end()) {
- qWarning("QCommandLineParser: option not defined: \"%s\"", qPrintable(optionName));
- return QStringList();
- }
- return commandLineOptionList.at(*it).names();
-}
-
-/*!
- \since 5.2
- \class QCommandLineParser
- \inmodule QtCore
- \ingroup tools
-
- \brief The QCommandLineParser class provides a means for handling the
- command line options.
-
- QCoreApplication provides the command-line arguments as a simple list of strings.
- QCommandLineParser provides the ability to define a set of options, parse the
- command-line arguments, and store which options have actually been used, as
- well as option values.
-
- Any argument that isn't an option (i.e. doesn't start with a \c{-}) is stored
- as a "positional argument".
-
- The parser handles short names, long names, more than one name for the same
- option, and option values.
-
- Options on the command line are recognized as starting with a single or
- double \c{-} character(s).
- The option \c{-} (single dash alone) is a special case, often meaning standard
- input, and not treated as an option. The parser will treat everything after the
- option \c{--} (double dash) as positional arguments.
-
- Short options are single letters. The option \c{v} would be specified by
- passing \c{-v} on the command line. In the default parsing mode, short options
- can be written in a compact form, for instance \c{-abc} is equivalent to \c{-a -b -c}.
- The parsing mode for can be set to ParseAsLongOptions, in which case \c{-abc}
- will be parsed as the long option \c{abc}.
-
- Long options are more than one letter long and cannot be compacted together.
- The long option \c{verbose} would be passed as \c{--verbose} or \c{-verbose}.
-
- Passing values to options can be done using the assignment operator: \c{-v=value}
- \c{--verbose=value}, or a space: \c{-v value} \c{--verbose value}, i.e. the next
- argument is used as value (even if it starts with a \c{-}).
-
- The parser does not support optional values - if an option is set to
- require a value, one must be present. If such an option is placed last
- and has no value, the option will be treated as if it had not been
- specified.
-
- The parser does not automatically support negating or disabling long options
- by using the format \c{--disable-option} or \c{--no-option}. However, it is
- possible to handle this case explicitly by making an option with \c{no-option}
- as one of its names, and handling the option explicitly.
-
- Example:
- \snippet code/src_corelib_tools_qcommandlineparser_main.cpp 0
-
- Known limitation: the parsing of Qt options inside QCoreApplication and subclasses
- happens before QCommandLineParser exists, so it can't take it into account. This
- means any option value that looks like a builtin Qt option, will be treated by
- QCoreApplication as a builtin Qt option. Example: \c{--profile -reverse} will
- lead to QGuiApplication seeing the -reverse option set, and removing it from
- QCoreApplication::arguments() before QCommandLineParser defines the \c{profile}
- option and parses the command line.
-
- \sa QCommandLineOption, QCoreApplication
-*/
-
-/*!
- Constructs a command line parser object.
-*/
-QCommandLineParser::QCommandLineParser()
- : d(new QCommandLineParserPrivate)
-{
-}
-
-/*!
- Destroys the command line parser object.
-*/
-QCommandLineParser::~QCommandLineParser()
-{
- delete d;
-}
-
-/*!
- \enum QCommandLineParser::SingleDashWordOptionMode
-
- This enum describes the way the parser interprets command-line
- options that use a single dash followed by multiple letters, as as \c{-abc}.
-
- \value ParseAsCompactedShortOptions \c{-abc} is interpreted as \c{-a -b -c},
- i.e. as three short options that have been compacted on the command-line,
- if none of the options take a value. If \c{a} takes a value, then it
- is interpreted as \c{-a bc}, i.e. the short option \c{a} followed by the value \c{bc}.
- This is typically used in tools that behave like compilers, in order
- to handle options such as \c{-DDEFINE=VALUE} or \c{-I/include/path}.
- This is the default parsing mode. New applications are recommended to
- use this mode.
-
- \value ParseAsLongOptions \c{-abc} is interpreted as \c{--abc},
- i.e. as the long option named \c{abc}. This is how Qt's own tools
- (uic, rcc...) have always been parsing arguments. This mode should be
- used for preserving compatibility in applications that were parsing
- arguments in such a way.
-
- \sa setSingleDashWordOptionMode()
-*/
-
-/*!
- Sets the parsing mode to \a singleDashWordOptionMode.
- This must be called before process() or parse().
-*/
-void QCommandLineParser::setSingleDashWordOptionMode(QCommandLineParser::SingleDashWordOptionMode singleDashWordOptionMode)
-{
- d->singleDashWordOptionMode = singleDashWordOptionMode;
-}
-
-/*!
- Adds the option \a option to look for while parsing.
-
- Returns \c true if adding the option was successful; otherwise returns \c false.
-
- Adding the option fails if there is no name attached to the option, or
- the option has a name that clashes with an option name added before.
- */
-bool QCommandLineParser::addOption(const QCommandLineOption &option)
-{
- QStringList optionNames = option.names();
-
- if (!optionNames.isEmpty()) {
- Q_FOREACH (const QString &name, optionNames) {
- if (d->nameHash.contains(name))
- return false;
- }
-
- d->commandLineOptionList.append(option);
-
- const int offset = d->commandLineOptionList.size() - 1;
- Q_FOREACH (const QString &name, optionNames)
- d->nameHash.insert(name, offset);
-
- return true;
- }
-
- return false;
-}
-
-/*!
- Adds the \c{-v} / \c{--version} option, which displays the version string of the application.
-
- This option is handled automatically by QCommandLineParser.
-
- You can set the actual version string by using QCoreApplication::setApplicationVersion().
-
- Returns the option instance, which can be used to call isSet().
-*/
-QCommandLineOption QCommandLineParser::addVersionOption()
-{
- QCommandLineOption opt(QStringList() << "v" << "version", tr("Displays version information."));
- addOption(opt);
- d->builtinVersionOption = true;
- return opt;
-}
-
-/*!
- Adds the help option (\c{-h}, \c{--help} and \c{-?} on Windows)
- This option is handled automatically by QCommandLineParser.
-
- Remember to use setApplicationDescription to set the application description,
- which will be displayed when this option is used.
-
- Example:
- \snippet code/src_corelib_tools_qcommandlineparser_main.cpp 0
-
- Returns the option instance, which can be used to call isSet().
-*/
-QCommandLineOption QCommandLineParser::addHelpOption()
-{
- QCommandLineOption opt(QStringList()
-#ifdef Q_OS_WIN
- << "?"
-#endif
- << "h"
- << "help", tr("Displays this help."));
- addOption(opt);
- d->builtinHelpOption = true;
- return opt;
-}
-
-/*!
- Sets the application \a description shown by helpText().
-*/
-void QCommandLineParser::setApplicationDescription(const QString &description)
-{
- d->description = description;
-}
-
-/*!
- Returns the application description set in setApplicationDescription().
-*/
-QString QCommandLineParser::applicationDescription() const
-{
- return d->description;
-}
-
-/*!
- Defines an additional argument to the application, for the benefit of the help text.
-
- The argument \a name and \a description will appear under the \c{Arguments:} section
- of the help. If \a syntax is specified, it will be appended to the Usage line, otherwise
- the \a name will be appended.
-
- Example:
- \snippet code/src_corelib_tools_qcommandlineparser.cpp 2
-
- \sa addHelpOption(), helpText()
-*/
-void QCommandLineParser::addPositionalArgument(const QString &name, const QString &description, const QString &syntax)
-{
- QCommandLineParserPrivate::PositionalArgumentDefinition arg;
- arg.name = name;
- arg.description = description;
- arg.syntax = syntax.isEmpty() ? name : syntax;
- d->positionalArgumentDefinitions.append(arg);
-}
-
-/*!
- Clears the definitions of additional arguments from the help text.
-
- This is only needed for the special case of tools which support multiple commands
- with different options. Once the actual command has been identified, the options
- for this command can be defined, and the help text for the command can be adjusted
- accordingly.
-
- Example:
- \snippet code/src_corelib_tools_qcommandlineparser.cpp 3
-*/
-void QCommandLineParser::clearPositionalArguments()
-{
- d->positionalArgumentDefinitions.clear();
-}
-
-/*!
- Parses the command line \a arguments.
-
- Most programs don't need to call this, a simple call to process() is enough.
-
- parse() is more low-level, and only does the parsing. The application will have to
- take care of the error handling, using errorText() if parse() returns \c false.
- This can be useful for instance to show a graphical error message in graphical programs.
-
- Calling parse() instead of process() can also be useful in order to ignore unknown
- options temporarily, because more option definitions will be provided later on
- (depending on one of the arguments), before calling process().
-
- Don't forget that \a arguments must start with the name of the executable (ignored, though).
-
- Returns \c false in case of a parse error (unknown option or missing value); returns \c true otherwise.
-
- \sa process()
-*/
-bool QCommandLineParser::parse(const QStringList &arguments)
-{
- return d->parse(arguments);
-}
-
-/*!
- Returns a translated error text for the user.
- This should only be called when parse() returns \c false.
-*/
-QString QCommandLineParser::errorText() const
-{
- if (!d->errorText.isEmpty())
- return d->errorText;
- if (d->unknownOptionNames.count() == 1)
- return tr("Unknown option '%1'.").arg(d->unknownOptionNames.first());
- if (d->unknownOptionNames.count() > 1)
- return tr("Unknown options: %1.").arg(d->unknownOptionNames.join(", "));
- return QString();
-}
-
-/*!
- Processes the command line \a arguments.
-
- In addition to parsing the options (like parse()), this function also handles the builtin
- options and handles errors.
-
- The builtin options are \c{--version} if addVersionOption was called and \c{--help} if addHelpOption was called.
-
- When invoking one of these options, or when an error happens (for instance an unknown option was
- passed), the current process will then stop, using the exit() function.
-
- \sa QCoreApplication::arguments(), parse()
- */
-void QCommandLineParser::process(const QStringList &arguments)
-{
- if (!d->parse(arguments)) {
- fprintf(stderr, "%s\n", qPrintable(errorText()));
- ::exit(EXIT_FAILURE);
- }
-
- if (d->builtinVersionOption && isSet("version")) {
- printf("%s %s\n", qPrintable(QCoreApplication::applicationName()), qPrintable(QCoreApplication::applicationVersion()));
- ::exit(EXIT_SUCCESS);
- }
-
- if (d->builtinHelpOption && isSet("help"))
- showHelp(EXIT_SUCCESS);
-}
-
-/*!
- \overload
-
- The command line is obtained from the QCoreApplication instance \a app.
- */
-void QCommandLineParser::process(const QCoreApplication &app)
-{
- // QCoreApplication::arguments() is static, but the app instance must exist so we require it as parameter
- Q_UNUSED(app);
- process(QCoreApplication::arguments());
-}
-
-void QCommandLineParserPrivate::checkParsed(const char *method)
-{
- if (needsParsing)
- qWarning("QCommandLineParser: call process() or parse() before %s", method);
-}
-
-/*!
- \internal
- Looks up the option \a optionName (found on the command line) and register it as found.
- Returns \c true on success.
- */
-bool QCommandLineParserPrivate::registerFoundOption(const QString &optionName)
-{
- if (nameHash.contains(optionName)) {
- optionNames.append(optionName);
- return true;
- } else {
- unknownOptionNames.append(optionName);
- return false;
- }
-}
-
-/*!
- \internal
- \brief Parse the value for a given option, if it was defined to expect one.
-
- The value is taken from the next argument, or after the equal sign in \a argument.
-
- \param optionName the short option name
- \param argument the argument from the command line currently parsed. Only used for -k=value parsing.
- \param argumentIterator iterator to the currently parsed argument. Incremented if the next argument contains the value.
- \param argsEnd args.end(), to check if ++argumentIterator goes out of bounds
- Returns \c true on success.
- */
-bool QCommandLineParserPrivate::parseOptionValue(const QString &optionName, const QString &argument,
- QStringList::const_iterator *argumentIterator, QStringList::const_iterator argsEnd)
-{
- const QLatin1Char assignChar('=');
- const NameHash_t::const_iterator nameHashIt = nameHash.constFind(optionName);
- if (nameHashIt != nameHash.constEnd()) {
- const int assignPos = argument.indexOf(assignChar);
- const NameHash_t::mapped_type optionOffset = *nameHashIt;
- const bool withValue = !commandLineOptionList.at(optionOffset).valueName().isEmpty();
- if (withValue) {
- if (assignPos == -1) {
- ++(*argumentIterator);
- if (*argumentIterator == argsEnd) {
- errorText = QCommandLineParser::tr("Missing value after '%1'.").arg(argument);
- return false;
- }
- optionValuesHash[optionOffset].append(*(*argumentIterator));
- } else {
- optionValuesHash[optionOffset].append(argument.mid(assignPos + 1));
- }
- } else {
- if (assignPos != -1) {
- errorText = QCommandLineParser::tr("Unexpected value after '%1'.").arg(argument.left(assignPos));
- return false;
- }
- }
- }
- return true;
-}
-
-/*!
- \internal
-
- Parse the list of arguments \a args, and fills in
- optionNames, optionValuesHash, unknownOptionNames, positionalArguments, and errorText.
-
- Any results from a previous parse operation are removed.
-
- The parser will not look for further options once it encounters the option
- \c{--}; this does not include when \c{--} follows an option that requires a value.
- */
-bool QCommandLineParserPrivate::parse(const QStringList &args)
-{
- needsParsing = false;
- bool error = false;
-
- const QString doubleDashString("--");
- const QLatin1Char dashChar('-');
- const QLatin1Char assignChar('=');
-
- bool doubleDashFound = false;
- errorText.clear();
- positionalArgumentList.clear();
- optionNames.clear();
- unknownOptionNames.clear();
- optionValuesHash.clear();
-
- if (args.isEmpty()) {
- qWarning("QCommandLineParser: argument list cannot be empty, it should contain at least the executable name");
- return false;
- }
-
- QStringList::const_iterator argumentIterator = args.begin();
- ++argumentIterator; // skip executable name
-
- for (; argumentIterator != args.end() ; ++argumentIterator) {
- QString argument = *argumentIterator;
-
- if (doubleDashFound) {
- positionalArgumentList.append(argument);
- } else if (argument.startsWith(doubleDashString)) {
- if (argument.length() > 2) {
- QString optionName = argument.mid(2).section(assignChar, 0, 0);
- if (registerFoundOption(optionName)) {
- if (!parseOptionValue(optionName, argument, &argumentIterator, args.end()))
- error = true;
- } else {
- error = true;
- }
- } else {
- doubleDashFound = true;
- }
- } else if (argument.startsWith(dashChar)) {
- if (argument.size() == 1) { // single dash ("stdin")
- positionalArgumentList.append(argument);
- continue;
- }
- switch (singleDashWordOptionMode) {
- case QCommandLineParser::ParseAsCompactedShortOptions:
- {
- QString optionName;
- bool valueFound = false;
- for (int pos = 1 ; pos < argument.size(); ++pos) {
- optionName = argument.mid(pos, 1);
- if (!registerFoundOption(optionName)) {
- error = true;
- } else {
- const NameHash_t::const_iterator nameHashIt = nameHash.constFind(optionName);
- Q_ASSERT(nameHashIt != nameHash.constEnd()); // checked by registerFoundOption
- const NameHash_t::mapped_type optionOffset = *nameHashIt;
- const bool withValue = !commandLineOptionList.at(optionOffset).valueName().isEmpty();
- if (withValue) {
- if (pos + 1 < argument.size()) {
- if (argument.at(pos + 1) == assignChar)
- ++pos;
- optionValuesHash[optionOffset].append(argument.mid(pos + 1));
- valueFound = true;
- }
- break;
- }
- if (pos + 1 < argument.size() && argument.at(pos + 1) == assignChar)
- break;
- }
- }
- if (!valueFound && !parseOptionValue(optionName, argument, &argumentIterator, args.end()))
- error = true;
- break;
- }
- case QCommandLineParser::ParseAsLongOptions:
- {
- const QString optionName = argument.mid(1).section(assignChar, 0, 0);
- if (registerFoundOption(optionName)) {
- if (!parseOptionValue(optionName, argument, &argumentIterator, args.end()))
- error = true;
- } else {
- error = true;
- }
- break;
- }
- }
- } else {
- positionalArgumentList.append(argument);
- }
- if (argumentIterator == args.end())
- break;
- }
- return !error;
-}
-
-/*!
- Checks whether the option \a name was passed to the application.
-
- Returns \c true if the option \a name was set, false otherwise.
-
- The name provided can be any long or short name of any option that was
- added with \c addOption(). All the options names are treated as being
- equivalent. If the name is not recognized or that option was not present,
- false is returned.
-
- Example:
- \snippet code/src_corelib_tools_qcommandlineparser.cpp 0
- */
-
-bool QCommandLineParser::isSet(const QString &name) const
-{
- d->checkParsed("isSet");
- if (d->optionNames.contains(name))
- return true;
- const QStringList aliases = d->aliases(name);
- Q_FOREACH (const QString &optionName, d->optionNames) {
- if (aliases.contains(optionName))
- return true;
- }
- return false;
-}
-
-/*!
- Returns the option value found for the given option name \a optionName, or
- an empty string if not found.
-
- The name provided can be any long or short name of any option that was
- added with \c addOption(). All the option names are treated as being
- equivalent. If the name is not recognized or that option was not present, an
- empty string is returned.
-
- For options found by the parser, the last value found for
- that option is returned. If the option wasn't specified on the command line,
- the default value is returned.
-
- An empty string is returned if the option does not take a value.
-
- \sa values(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
- */
-
-QString QCommandLineParser::value(const QString &optionName) const
-{
- d->checkParsed("value");
- const QStringList valueList = values(optionName);
-
- if (!valueList.isEmpty())
- return valueList.last();
-
- return QString();
-}
-
-/*!
- Returns a list of option values found for the given option name \a
- optionName, or an empty list if not found.
-
- The name provided can be any long or short name of any option that was
- added with \c addOption(). All the options names are treated as being
- equivalent. If the name is not recognized or that option was not present, an
- empty list is returned.
-
- For options found by the parser, the list will contain an entry for
- each time the option was encountered by the parser. If the option wasn't
- specified on the command line, the default values are returned.
-
- An empty list is returned if the option does not take a value.
-
- \sa value(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
- */
-
-QStringList QCommandLineParser::values(const QString &optionName) const
-{
- d->checkParsed("values");
- const NameHash_t::const_iterator it = d->nameHash.constFind(optionName);
- if (it != d->nameHash.constEnd()) {
- const int optionOffset = *it;
- QStringList values = d->optionValuesHash.value(optionOffset);
- if (values.isEmpty())
- values = d->commandLineOptionList.at(optionOffset).defaultValues();
- return values;
- }
-
- qWarning("QCommandLineParser: option not defined: \"%s\"", qPrintable(optionName));
- return QStringList();
-}
-
-/*!
- \overload
- Checks whether the \a option was passed to the application.
-
- Returns \c true if the \a option was set, false otherwise.
-
- This is the recommended way to check for options with no values.
-
- Example:
- \snippet code/src_corelib_tools_qcommandlineparser.cpp 1
-*/
-bool QCommandLineParser::isSet(const QCommandLineOption &option) const
-{
- // option.names() might be empty if the constructor failed
- return !option.names().isEmpty() && isSet(option.names().first());
-}
-
-/*!
- \overload
- Returns the option value found for the given \a option, or
- an empty string if not found.
-
- For options found by the parser, the last value found for
- that option is returned. If the option wasn't specified on the command line,
- the default value is returned.
-
- An empty string is returned if the option does not take a value.
-
- \sa values(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
-*/
-QString QCommandLineParser::value(const QCommandLineOption &option) const
-{
- return value(option.names().first());
-}
-
-/*!
- \overload
- Returns a list of option values found for the given \a option,
- or an empty list if not found.
-
- For options found by the parser, the list will contain an entry for
- each time the option was encountered by the parser. If the option wasn't
- specified on the command line, the default values are returned.
-
- An empty list is returned if the option does not take a value.
-
- \sa value(), QCommandLineOption::setDefaultValue(), QCommandLineOption::setDefaultValues()
-*/
-QStringList QCommandLineParser::values(const QCommandLineOption &option) const
-{
- return values(option.names().first());
-}
-
-/*!
- Returns a list of positional arguments.
-
- These are all of the arguments that were not recognized as part of an
- option.
- */
-
-QStringList QCommandLineParser::positionalArguments() const
-{
- d->checkParsed("positionalArguments");
- return d->positionalArgumentList;
-}
-
-/*!
- Returns a list of option names that were found.
-
- This returns a list of all the recognized option names found by the
- parser, in the order in which they were found. For any long options
- that were in the form {--option=value}, the value part will have been
- dropped.
-
- The names in this list do not include the preceding dash characters.
- Names may appear more than once in this list if they were encountered
- more than once by the parser.
-
- Any entry in the list can be used with \c value() or with
- \c values() to get any relevant option values.
- */
-
-QStringList QCommandLineParser::optionNames() const
-{
- d->checkParsed("optionNames");
- return d->optionNames;
-}
-
-/*!
- Returns a list of unknown option names.
-
- This list will include both long an short name options that were not
- recognized. For any long options that were in the form {--option=value},
- the value part will have been dropped and only the long name is added.
-
- The names in this list do not include the preceding dash characters.
- Names may appear more than once in this list if they were encountered
- more than once by the parser.
-
- \sa optionNames()
- */
-
-QStringList QCommandLineParser::unknownOptionNames() const
-{
- d->checkParsed("unknownOptionNames");
- return d->unknownOptionNames;
-}
-
-/*!
- Displays the help information, and exits the application.
- This is automatically triggered by the --help option, but can also
- be used to display the help when the user is not invoking the
- application correctly.
- The exit code is set to \a exitCode. It should be set to 0 if the
- user requested to see the help, and to any other value in case of
- an error.
-
- \sa helpText()
-*/
-void QCommandLineParser::showHelp(int exitCode)
-{
- fprintf(stdout, "%s", qPrintable(d->helpText()));
- ::exit(exitCode);
-}
-
-/*!
- Returns a string containing the complete help information.
-
- \sa showHelp()
-*/
-QString QCommandLineParser::helpText() const
-{
- return d->helpText();
-}
-
-static QString wrapText(const QString &names, int longestOptionNameString, const QString &description)
-{
- const QLatin1Char nl('\n');
- QString text = QString(" ") + names.leftJustified(longestOptionNameString) + QLatin1Char(' ');
- const int indent = text.length();
- int lineStart = 0;
- int lastBreakable = -1;
- const int max = 79 - indent;
- int x = 0;
- const int len = description.length();
-
- for (int i = 0; i < len; ++i) {
- ++x;
- const QChar c = description.at(i);
- if (c.isSpace())
- lastBreakable = i;
-
- int breakAt = -1;
- int nextLineStart = -1;
- if (x > max && lastBreakable != -1) {
- // time to break and we know where
- breakAt = lastBreakable;
- nextLineStart = lastBreakable + 1;
- } else if ((x > max - 1 && lastBreakable == -1) || i == len - 1) {
- // time to break but found nowhere [-> break here], or end of last line
- breakAt = i + 1;
- nextLineStart = breakAt;
- } else if (c == nl) {
- // forced break
- breakAt = i;
- nextLineStart = i + 1;
- }
-
- if (breakAt != -1) {
- const int numChars = breakAt - lineStart;
- //qDebug() << "breakAt=" << description.at(breakAt) << "breakAtSpace=" << breakAtSpace << lineStart << "to" << breakAt << description.mid(lineStart, numChars);
- if (lineStart > 0)
- text += QString(indent, QLatin1Char(' '));
- text += description.mid(lineStart, numChars) + nl;
- x = 0;
- lastBreakable = -1;
- lineStart = nextLineStart;
- if (lineStart < len && description.at(lineStart).isSpace())
- ++lineStart; // don't start a line with a space
- i = lineStart;
- }
- }
-
- return text;
-}
-
-QString QCommandLineParserPrivate::helpText() const
-{
- const QLatin1Char nl('\n');
- QString text;
- const QString exeName = QCoreApplication::instance()->arguments().first();
- QString usage = exeName;
- if (!commandLineOptionList.isEmpty()) {
- usage += QLatin1Char(' ');
- usage += QCommandLineParser::tr("[options]");
- }
- Q_FOREACH (const PositionalArgumentDefinition &arg, positionalArgumentDefinitions) {
- usage += QLatin1Char(' ');
- usage += arg.syntax;
- }
- text += QCommandLineParser::tr("Usage: %1").arg(usage) + nl;
- if (!description.isEmpty())
- text += description + nl;
- text += nl;
- if (!commandLineOptionList.isEmpty())
- text += QCommandLineParser::tr("Options:") + nl;
- QStringList optionNameList;
- int longestOptionNameString = 0;
- Q_FOREACH (const QCommandLineOption &option, commandLineOptionList) {
- QStringList optionNames;
- Q_FOREACH (const QString &optionName, option.names()) {
- if (optionName.length() == 1)
- optionNames.append(QLatin1Char('-') + optionName);
- else
- optionNames.append(QString("--") + optionName);
- }
- QString optionNamesString = optionNames.join(", ");
- if (!option.valueName().isEmpty())
- optionNamesString += QString(" <") + option.valueName() + QLatin1Char('>');
- optionNameList.append(optionNamesString);
- longestOptionNameString = qMax(longestOptionNameString, optionNamesString.length());
- }
- ++longestOptionNameString;
- for (int i = 0; i < commandLineOptionList.count(); ++i) {
- const QCommandLineOption &option = commandLineOptionList.at(i);
- text += wrapText(optionNameList.at(i), longestOptionNameString, option.description());
- }
- if (!positionalArgumentDefinitions.isEmpty()) {
- if (!commandLineOptionList.isEmpty())
- text += nl;
- text += QCommandLineParser::tr("Arguments:") + nl;
- Q_FOREACH (const PositionalArgumentDefinition &arg, positionalArgumentDefinitions) {
- text += wrapText(arg.name, longestOptionNameString, arg.description);
- }
- }
- return text;
-}
diff --git a/src/core/qcommandlineparser.h b/src/core/qcommandlineparser.h
deleted file mode 100644
index eeecf2d..0000000
--- a/src/core/qcommandlineparser.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Laszlo Papp <lpapp@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCOMMANDLINEPARSER_H
-#define QCOMMANDLINEPARSER_H
-
-#include <QStringList>
-#include <QCoreApplication>
-
-#include "qcommandlineoption.h"
-
-class QCommandLineParserPrivate;
-class QCoreApplication;
-
-class QCommandLineParser
-{
- Q_DECLARE_TR_FUNCTIONS(QCommandLineParser)
-public:
- QCommandLineParser();
- ~QCommandLineParser();
-
- enum SingleDashWordOptionMode {
- ParseAsCompactedShortOptions,
- ParseAsLongOptions
- };
- void setSingleDashWordOptionMode(SingleDashWordOptionMode parsingMode);
-
- bool addOption(const QCommandLineOption &commandLineOption);
-
- QCommandLineOption addVersionOption();
- QCommandLineOption addHelpOption();
- void setApplicationDescription(const QString &description);
- QString applicationDescription() const;
- void addPositionalArgument(const QString &name, const QString &description, const QString &syntax = QString());
- void clearPositionalArguments();
-
- void process(const QStringList &arguments);
- void process(const QCoreApplication &app);
-
- bool parse(const QStringList &arguments);
- QString errorText() const;
-
- bool isSet(const QString &name) const;
- QString value(const QString &name) const;
- QStringList values(const QString &name) const;
-
- bool isSet(const QCommandLineOption &option) const;
- QString value(const QCommandLineOption &option) const;
- QStringList values(const QCommandLineOption &option) const;
-
- QStringList positionalArguments() const;
- QStringList optionNames() const;
- QStringList unknownOptionNames() const;
-
- void showHelp(int exitCode = 0);
- QString helpText() const;
-
-private:
- Q_DISABLE_COPY(QCommandLineParser)
-
- QCommandLineParserPrivate * const d;
-};
-
-#endif // QCOMMANDLINEPARSER_H
diff --git a/src/core/qlockfile.cpp b/src/core/qlockfile.cpp
deleted file mode 100644
index 567440c..0000000
--- a/src/core/qlockfile.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qlockfile.h"
-#include "qlockfile_p.h"
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
-# include <QElapsedTimer>
-#else
-# include <QTime>
-#endif
-#include <QDateTime>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QLockFile
- \inmodule QtCore
- \brief The QLockFile class provides locking between processes using a file.
- \since 5.1
-
- A lock file can be used to prevent multiple processes from accessing concurrently
- the same resource. For instance, a configuration file on disk, or a socket, a port,
- a region of shared memory...
-
- Serialization is only guaranteed if all processes that access the shared resource
- use QLockFile, with the same file path.
-
- QLockFile supports two use cases:
- to protect a resource for a short-term operation (e.g. verifying if a configuration
- file has changed before saving new settings), and for long-lived protection of a
- resource (e.g. a document opened by a user in an editor) for an indefinite amount of time.
-
- When protecting for a short-term operation, it is acceptable to call lock() and wait
- until any running operation finishes.
- When protecting a resource over a long time, however, the application should always
- call setStaleLockTime(0) and then tryLock() with a short timeout, in order to
- warn the user that the resource is locked.
-
- If the process holding the lock crashes, the lock file stays on disk and can prevent
- any other process from accessing the shared resource, ever. For this reason, QLockFile
- tries to detect such a "stale" lock file, based on the process ID written into the file,
- and (in case that process ID got reused meanwhile), on the last modification time of
- the lock file (30s by default, for the use case of a short-lived operation).
- If the lock file is found to be stale, it will be deleted.
-
- For the use case of protecting a resource over a long time, you should therefore call
- setStaleLockTime(0), and when tryLock() returns LockFailedError, inform the user
- that the document is locked, possibly using getLockInfo() for more details.
-*/
-
-/*!
- \enum QLockFile::LockError
-
- This enum describes the result of the last call to lock() or tryLock().
-
- \value NoError The lock was acquired successfully.
- \value LockFailedError The lock could not be acquired because another process holds it.
- \value PermissionError The lock file could not be created, for lack of permissions
- in the parent directory.
- \value UnknownError Another error happened, for instance a full partition
- prevented writing out the lock file.
-*/
-
-/*!
- Constructs a new lock file object.
- The object is created in an unlocked state.
- When calling lock() or tryLock(), a lock file named \a fileName will be created,
- if it doesn't already exist.
-
- \sa lock(), unlock()
-*/
-QLockFile::QLockFile(const QString &fileName)
- : d_ptr(new QLockFilePrivate(fileName))
-{
-}
-
-/*!
- Destroys the lock file object.
- If the lock was acquired, this will release the lock, by deleting the lock file.
-*/
-QLockFile::~QLockFile()
-{
- unlock();
-}
-
-/*!
- Sets \a staleLockTime to be the time in milliseconds after which
- a lock file is considered stale.
- The default value is 30000, i.e. 30 seconds.
- If your application typically keeps the file locked for more than 30 seconds
- (for instance while saving megabytes of data for 2 minutes), you should set
- a bigger value using setStaleLockTime().
-
- The value of \a staleLockTime is used by lock() and tryLock() in order
- to determine when an existing lock file is considered stale, i.e. left over
- by a crashed process. This is useful for the case where the PID got reused
- meanwhile, so the only way to detect a stale lock file is by the fact that
- it has been around for a long time.
-
- \sa staleLockTime()
-*/
-void QLockFile::setStaleLockTime(int staleLockTime)
-{
- Q_D(QLockFile);
- d->staleLockTime = staleLockTime;
-}
-
-/*!
- Returns the time in milliseconds after which
- a lock file is considered stale.
-
- \sa setStaleLockTime()
-*/
-int QLockFile::staleLockTime() const
-{
- Q_D(const QLockFile);
- return d->staleLockTime;
-}
-
-/*!
- Returns \c true if the lock was acquired by this QLockFile instance,
- otherwise returns \c false.
-
- \sa lock(), unlock(), tryLock()
-*/
-bool QLockFile::isLocked() const
-{
- Q_D(const QLockFile);
- return d->isLocked;
-}
-
-/*!
- Creates the lock file.
-
- If another process (or another thread) has created the lock file already,
- this function will block until that process (or thread) releases it.
-
- Calling this function multiple times on the same lock from the same
- thread without unlocking first is not allowed. This function will
- \e dead-lock when the file is locked recursively.
-
- Returns \c true if the lock was acquired, false if it could not be acquired
- due to an unrecoverable error, such as no permissions in the parent directory.
-
- \sa unlock(), tryLock()
-*/
-bool QLockFile::lock()
-{
- return tryLock(-1);
-}
-
-/*!
- Attempts to create the lock file. This function returns \c true if the
- lock was obtained; otherwise it returns \c false. If another process (or
- another thread) has created the lock file already, this function will
- wait for at most \a timeout milliseconds for the lock file to become
- available.
-
- Note: Passing a negative number as the \a timeout is equivalent to
- calling lock(), i.e. this function will wait forever until the lock
- file can be locked if \a timeout is negative.
-
- If the lock was obtained, it must be released with unlock()
- before another process (or thread) can successfully lock it.
-
- Calling this function multiple times on the same lock from the same
- thread without unlocking first is not allowed, this function will
- \e always return false when attempting to lock the file recursively.
-
- \sa lock(), unlock()
-*/
-bool QLockFile::tryLock(int timeout)
-{
- Q_D(QLockFile);
-#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0)
- QElapsedTimer timer;
-#else
- QTime timer;
-#endif
- if (timeout > 0)
- timer.start();
- int sleepTime = 100;
- Q_FOREVER {
- d->lockError = d->tryLock_sys();
- switch (d->lockError) {
- case NoError:
- d->isLocked = true;
- return true;
- case PermissionError:
- case UnknownError:
- return false;
- case LockFailedError:
- if (!d->isLocked && d->isApparentlyStale()) {
- // Stale lock from another thread/process
- // Ensure two processes don't remove it at the same time
- QLockFile rmlock(d->fileName + QLatin1String(".rmlock"));
- if (rmlock.tryLock()) {
- if (d->isApparentlyStale() && d->removeStaleLock())
- continue;
- }
- }
- break;
- }
- if (timeout == 0 || (timeout > 0 && (timer.elapsed() > timeout)))
- return false;
- QLockFileThread::msleep(sleepTime);
- if (sleepTime < 5 * 1000)
- sleepTime *= 2;
- }
- // not reached
- return false;
-}
-
-/*!
- \fn void QLockFile::unlock()
- Releases the lock, by deleting the lock file.
-
- Calling unlock() without locking the file first, does nothing.
-
- \sa lock(), tryLock()
-*/
-
-/*!
- Retrieves information about the current owner of the lock file.
-
- If tryLock() returns \c false, and error() returns LockFailedError,
- this function can be called to find out more information about the existing
- lock file:
- \list
- \li the PID of the application (returned in \a pid)
- \li the \a hostname it's running on (useful in case of networked filesystems),
- \li the name of the application which created it (returned in \a appname),
- \endlist
-
- Note that tryLock() automatically deleted the file if there is no
- running application with this PID, so LockFailedError can only happen if there is
- an application with this PID (it could be unrelated though).
-
- This can be used to inform users about the existing lock file and give them
- the choice to delete it. After removing the file using removeStaleLockFile(),
- the application can call tryLock() again.
-
- This function returns \c true if the information could be successfully retrieved, false
- if the lock file doesn't exist or doesn't contain the expected data.
- This can happen if the lock file was deleted between the time where tryLock() failed
- and the call to this function. Simply call tryLock() again if this happens.
-*/
-bool QLockFile::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const
-{
- Q_D(const QLockFile);
- return d->getLockInfo(pid, hostname, appname);
-}
-
-bool QLockFilePrivate::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const
-{
- QFile reader(fileName);
- if (!reader.open(QIODevice::ReadOnly))
- return false;
-
- QByteArray pidLine = reader.readLine();
- pidLine.chop(1);
- QByteArray appNameLine = reader.readLine();
- appNameLine.chop(1);
- QByteArray hostNameLine = reader.readLine();
- hostNameLine.chop(1);
- if (pidLine.isEmpty())
- return false;
-
- qint64 thePid = pidLine.toLongLong();
- if (pid)
- *pid = thePid;
- if (appname)
- *appname = QString::fromUtf8(appNameLine);
- if (hostname)
- *hostname = QString::fromUtf8(hostNameLine);
- return thePid > 0;
-}
-
-/*!
- Attempts to forcefully remove an existing lock file.
-
- Calling this is not recommended when protecting a short-lived operation: QLockFile
- already takes care of removing lock files after they are older than staleLockTime().
-
- This method should only be called when protecting a resource for a long time, i.e.
- with staleLockTime(0), and after tryLock() returned LockFailedError, and the user
- agreed on removing the lock file.
-
- Returns \c true on success, false if the lock file couldn't be removed. This happens
- on Windows, when the application owning the lock is still running.
-*/
-bool QLockFile::removeStaleLockFile()
-{
- Q_D(QLockFile);
- if (d->isLocked) {
- qWarning("removeStaleLockFile can only be called when not holding the lock");
- return false;
- }
- return d->removeStaleLock();
-}
-
-/*!
- Returns the lock file error status.
-
- If tryLock() returns \c false, this function can be called to find out
- the reason why the locking failed.
-*/
-QLockFile::LockError QLockFile::error() const
-{
- Q_D(const QLockFile);
- return d->lockError;
-}
-
-QT_END_NAMESPACE
diff --git a/src/core/qlockfile.h b/src/core/qlockfile.h
deleted file mode 100644
index 673026f..0000000
--- a/src/core/qlockfile.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QLOCKFILE_H
-#define QLOCKFILE_H
-
-#include <QString>
-#include <QScopedPointer>
-
-QT_BEGIN_NAMESPACE
-
-class QLockFilePrivate;
-
-class QLockFile
-{
-public:
- QLockFile(const QString &fileName);
- ~QLockFile();
-
- bool lock();
- bool tryLock(int timeout = 0);
- void unlock();
-
- void setStaleLockTime(int);
- int staleLockTime() const;
-
- bool isLocked() const;
- bool getLockInfo(qint64 *pid, QString *hostname, QString *appname) const;
- bool removeStaleLockFile();
-
- enum LockError {
- NoError = 0,
- LockFailedError = 1,
- PermissionError = 2,
- UnknownError = 3
- };
- LockError error() const;
-
-protected:
- QScopedPointer<QLockFilePrivate> d_ptr;
-
-private:
- Q_DECLARE_PRIVATE(QLockFile)
- Q_DISABLE_COPY(QLockFile)
-};
-
-QT_END_NAMESPACE
-
-#endif // QLOCKFILE_H
diff --git a/src/core/qlockfile_p.h b/src/core/qlockfile_p.h
deleted file mode 100644
index 15fa37b..0000000
--- a/src/core/qlockfile_p.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QLOCKFILE_P_H
-#define QLOCKFILE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qlockfile.h"
-
-#include <QFile>
-#include <QThread>
-
-#ifdef Q_OS_WIN
-#include <qt_windows.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QLockFileThread : public QThread
-{
-public:
- static void msleep(unsigned long msecs) { QThread::msleep(msecs); }
-};
-
-class QLockFilePrivate
-{
-public:
- QLockFilePrivate(const QString &fn)
- : fileName(fn),
-#ifdef Q_OS_WIN
- fileHandle(INVALID_HANDLE_VALUE),
-#else
- fileHandle(-1),
-#endif
- staleLockTime(30 * 1000), // 30 seconds
- lockError(QLockFile::NoError),
- isLocked(false)
- {
- }
- QLockFile::LockError tryLock_sys();
- bool removeStaleLock();
- bool getLockInfo(qint64 *pid, QString *hostname, QString *appname) const;
- // Returns \c true if the lock belongs to dead PID, or is old.
- // The attempt to delete it will tell us if it was really stale or not, though.
- bool isApparentlyStale() const;
- static QString processNameByPid(qint64 pid);
-
- QString fileName;
-#ifdef Q_OS_WIN
- Qt::HANDLE fileHandle;
-#else
- int fileHandle;
-#endif
- int staleLockTime; // "int milliseconds" is big enough for 24 days
- QLockFile::LockError lockError;
- bool isLocked;
-};
-
-QT_END_NAMESPACE
-
-#endif /* QLOCKFILE_P_H */
diff --git a/src/core/qlockfile_unix.cpp b/src/core/qlockfile_unix.cpp
deleted file mode 100644
index 5b3add3..0000000
--- a/src/core/qlockfile_unix.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qlockfile_p.h"
-
-#include <QTemporaryFile>
-#include <QCoreApplication>
-#include <QFileInfo>
-#include <QDebug>
-#include <QDateTime>
-
-#include <sys/file.h> // flock
-#include <sys/types.h> // kill
-#include <signal.h> // kill
-#include <unistd.h> // gethostname
-
-#include <errno.h>
-
-#if defined(Q_OS_MAC)
-# include <libproc.h>
-#elif defined(Q_OS_LINUX)
-# include <unistd.h>
-# include <cstdio>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#define EINTR_LOOP(var, cmd) \
- do { \
- var = cmd; \
- } while (var == -1 && errno == EINTR)
-
-// don't call QT_OPEN or ::open
-// call qt_safe_open
-static inline int qt_safe_open(const char *pathname, int flags, mode_t mode = 0777)
-{
-#ifdef O_CLOEXEC
- flags |= O_CLOEXEC;
-#endif
- int fd;
- EINTR_LOOP(fd, ::open(pathname, flags, mode));
-
- // unknown flags are ignored, so we have no way of verifying if
- // O_CLOEXEC was accepted
- if (fd != -1)
- ::fcntl(fd, F_SETFD, FD_CLOEXEC);
- return fd;
-}
-
-static inline qint64 qt_safe_write(int fd, const void *data, qint64 len)
-{
- qint64 ret = 0;
- EINTR_LOOP(ret, ::write(fd, data, len));
- return ret;
-}
-
-static QByteArray localHostName() // from QHostInfo::localHostName(), modified to return a QByteArray
-{
- QByteArray hostName(512, Qt::Uninitialized);
- if (gethostname(hostName.data(), hostName.size()) == -1)
- return QByteArray();
- hostName.truncate(strlen(hostName.data()));
- return hostName;
-}
-
-// ### merge into qt_safe_write?
-static qint64 qt_write_loop(int fd, const char *data, qint64 len)
-{
- qint64 pos = 0;
- while (pos < len) {
- const qint64 ret = qt_safe_write(fd, data + pos, len - pos);
- if (ret == -1) // e.g. partition full
- return pos;
- pos += ret;
- }
- return pos;
-}
-
-static bool setNativeLocks(int fd)
-{
-#if defined(LOCK_EX) && defined(LOCK_NB)
- if (flock(fd, LOCK_EX | LOCK_NB) == -1) // other threads, and other processes on a local fs
- return false;
-#endif
- struct flock flockData;
- flockData.l_type = F_WRLCK;
- flockData.l_whence = SEEK_SET;
- flockData.l_start = 0;
- flockData.l_len = 0; // 0 = entire file
- flockData.l_pid = getpid();
- if (fcntl(fd, F_SETLK, &flockData) == -1) // for networked filesystems
- return false;
- return true;
-}
-
-QLockFile::LockError QLockFilePrivate::tryLock_sys()
-{
- // Assemble data, to write in a single call to write
- // (otherwise we'd have to check every write call)
- // Use operator% from the fast builder to avoid multiple memory allocations.
- QByteArray fileData = QByteArray::number(QCoreApplication::applicationPid()) + '\n'
- + QCoreApplication::applicationName().toUtf8() + '\n'
- + localHostName() + '\n';
-
- const QByteArray lockFileName = QFile::encodeName(fileName);
- const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY | O_CREAT | O_EXCL, 0644);
- if (fd < 0) {
- switch (errno) {
- case EEXIST:
- return QLockFile::LockFailedError;
- case EACCES:
- case EROFS:
- return QLockFile::PermissionError;
- default:
- return QLockFile::UnknownError;
- }
- }
- // Ensure nobody else can delete the file while we have it
- if (!setNativeLocks(fd))
- qWarning() << "setNativeLocks failed:" << strerror(errno);
-
- if (qt_write_loop(fd, fileData.constData(), fileData.size()) < fileData.size()) {
- close(fd);
- if (!QFile::remove(fileName))
- qWarning("QLockFile: Could not remove our own lock file %s.", qPrintable(fileName));
- return QLockFile::UnknownError; // partition full
- }
-
- // We hold the lock, continue.
- fileHandle = fd;
-
- return QLockFile::NoError;
-}
-
-bool QLockFilePrivate::removeStaleLock()
-{
- const QByteArray lockFileName = QFile::encodeName(fileName);
- const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0644);
- if (fd < 0) // gone already?
- return false;
-#ifdef Q_OS_MAC
- // ugly workaround: ignore setNativeLocks() result on Mac since it's broken there
- setNativeLocks(fd);
- bool success = (::unlink(lockFileName) == 0);
-#else
- bool success = setNativeLocks(fd) && (::unlink(lockFileName) == 0);
-#endif
- close(fd);
- return success;
-}
-
-bool QLockFilePrivate::isApparentlyStale() const
-{
- qint64 pid;
- QString hostname, appname;
- if (getLockInfo(&pid, &hostname, &appname)) {
- if (hostname.isEmpty() || hostname == QString::fromLocal8Bit(localHostName())) {
- if (::kill(pid, 0) == -1 && errno == ESRCH)
- return true; // PID doesn't exist anymore
- const QString processName = processNameByPid(pid);
- if (!processName.isEmpty()) {
- QFileInfo fi(appname);
- if (fi.isSymLink())
- fi.setFile(fi.symLinkTarget());
- if (processName.toLower() != fi.fileName().toLower())
- return true; // PID got reused by a different application.
- }
- }
- }
- const qint64 age = QFileInfo(fileName).lastModified().secsTo(QDateTime::currentDateTime()) * 1000;
- return staleLockTime > 0 && age > staleLockTime;
-}
-
-QString QLockFilePrivate::processNameByPid(qint64 pid)
-{
-#if defined(Q_OS_MAC)
- char name[1024];
- proc_name(pid, name, sizeof(name) / sizeof(char));
- return QFile::decodeName(name);
-#elif defined(Q_OS_LINUX)
- if (!QFile::exists(QString("/proc/version")))
- return QString();
- char exePath[64];
- char buf[PATH_MAX + 1];
- sprintf(exePath, "/proc/%lld/exe", pid);
- size_t len = static_cast<size_t>(readlink(exePath, buf, sizeof(buf)));
- if (len >= sizeof(buf)) {
- // The pid is gone. Return some invalid process name to fail the test.
- return QString("/ERROR/");
- }
- buf[len] = 0;
- return QFileInfo(QFile::decodeName(buf)).fileName();
-#else
- return QString();
-#endif
-}
-
-void QLockFile::unlock()
-{
- Q_D(QLockFile);
- if (!d->isLocked)
- return;
- close(d->fileHandle);
- d->fileHandle = -1;
- if (!QFile::remove(d->fileName)) {
- qWarning() << "Could not remove our own lock file" << d->fileName << "maybe permissions changed meanwhile?";
- // This is bad because other users of this lock file will now have to wait for the stale-lock-timeout...
- }
- d->lockError = QLockFile::NoError;
- d->isLocked = false;
-}
-
-QT_END_NAMESPACE
diff --git a/src/core/qlockfile_win.cpp b/src/core/qlockfile_win.cpp
deleted file mode 100644
index 5fc3327..0000000
--- a/src/core/qlockfile_win.cpp
+++ /dev/null
@@ -1,227 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org>
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef _UNICODE
-#define _UNICODE
-#endif
-
-#ifndef UNICODE
-#define UNICODE
-#endif
-
-#include "qlockfile_p.h"
-
-#include <qt_windows.h>
-
-#include <QCoreApplication>
-#include <QDir>
-#include <QFileInfo>
-#include <QDateTime>
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-static inline QByteArray localHostName()
-{
- return qgetenv("COMPUTERNAME");
-}
-
-static inline bool fileExists(const wchar_t *fileName)
-{
- WIN32_FILE_ATTRIBUTE_DATA data;
- return GetFileAttributesEx(fileName, GetFileExInfoStandard, &data);
-}
-
-QLockFile::LockError QLockFilePrivate::tryLock_sys()
-{
- const ushort* nativePath = QDir::toNativeSeparators(fileName).utf16();
- // When writing, allow others to read.
- // When reading, QFile will allow others to read and write, all good.
- // Adding FILE_SHARE_DELETE would allow forceful deletion of stale files,
- // but Windows doesn't allow recreating it while this handle is open anyway,
- // so this would only create confusion (can't lock, but no lock file to read from).
- const DWORD dwShareMode = FILE_SHARE_READ;
-#ifndef Q_OS_WINRT
- SECURITY_ATTRIBUTES securityAtts = { sizeof(SECURITY_ATTRIBUTES), NULL, FALSE };
- HANDLE fh = CreateFile((const wchar_t*)nativePath,
- GENERIC_WRITE,
- dwShareMode,
- &securityAtts,
- CREATE_NEW, // error if already exists
- FILE_ATTRIBUTE_NORMAL,
- NULL);
-#else // !Q_OS_WINRT
- HANDLE fh = CreateFile2((const wchar_t*)nativePath,
- GENERIC_WRITE,
- dwShareMode,
- CREATE_NEW, // error if already exists
- NULL);
-#endif // Q_OS_WINRT
- if (fh == INVALID_HANDLE_VALUE) {
- const DWORD lastError = GetLastError();
- switch (lastError) {
- case ERROR_SHARING_VIOLATION:
- case ERROR_ALREADY_EXISTS:
- case ERROR_FILE_EXISTS:
- return QLockFile::LockFailedError;
- case ERROR_ACCESS_DENIED:
- // readonly file, or file still in use by another process.
- // Assume the latter if the file exists, since we don't create it readonly.
- return fileExists((const wchar_t*)nativePath)
- ? QLockFile::LockFailedError
- : QLockFile::PermissionError;
- default:
- qWarning() << "Got unexpected locking error" << lastError;
- return QLockFile::UnknownError;
- }
- }
-
- // We hold the lock, continue.
- fileHandle = fh;
- // Assemble data, to write in a single call to write
- // (otherwise we'd have to check every write call)
- QByteArray fileData;
- fileData += QByteArray::number(QCoreApplication::applicationPid());
- fileData += '\n';
- fileData += QCoreApplication::applicationName().toUtf8();
- fileData += '\n';
- fileData += localHostName();
- fileData += '\n';
- DWORD bytesWritten = 0;
- QLockFile::LockError error = QLockFile::NoError;
- if (!WriteFile(fh, fileData.constData(), fileData.size(), &bytesWritten, NULL) || !FlushFileBuffers(fh))
- error = QLockFile::UnknownError; // partition full
- return error;
-}
-
-bool QLockFilePrivate::removeStaleLock()
-{
- // QFile::remove fails on Windows if the other process is still using the file, so it's not stale.
- return QFile::remove(fileName);
-}
-
-bool QLockFilePrivate::isApparentlyStale() const
-{
- qint64 pid;
- QString hostname, appname;
-
- // On WinRT there seems to be no way of obtaining information about other
- // processes due to sandboxing
-#ifndef Q_OS_WINRT
- if (getLockInfo(&pid, &hostname, &appname)) {
- if (hostname.isEmpty() || hostname == QString::fromLocal8Bit(localHostName())) {
- HANDLE procHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
- if (!procHandle)
- return true;
- // We got a handle but check if process is still alive
- DWORD dwR = ::WaitForSingleObject(procHandle, 0);
- ::CloseHandle(procHandle);
- if (dwR == WAIT_TIMEOUT)
- return true;
- const QString processName = processNameByPid(pid);
- if (!processName.isEmpty() && processName != appname)
- return true; // PID got reused by a different application.
- }
- }
-#else // !Q_OS_WINRT
- Q_UNUSED(pid);
- Q_UNUSED(hostname);
- Q_UNUSED(appname);
-#endif // Q_OS_WINRT
- const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime());
- return staleLockTime > 0 && age > staleLockTime;
-}
-
-QString QLockFilePrivate::processNameByPid(qint64 pid)
-{
-#if !defined(Q_OS_WINRT) && !defined(Q_OS_WINCE)
- typedef DWORD (WINAPI *GetModuleFileNameExFunc)(HANDLE, HMODULE, LPTSTR, DWORD);
-
- HMODULE hPsapi = LoadLibraryA("psapi");
- if (!hPsapi)
- return QString();
-
- GetModuleFileNameExFunc qGetModuleFileNameEx
- = (GetModuleFileNameExFunc)GetProcAddress(hPsapi, "GetModuleFileNameExW");
- if (!qGetModuleFileNameEx) {
- FreeLibrary(hPsapi);
- return QString();
- }
-
- HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, DWORD(pid));
- if (!hProcess) {
- FreeLibrary(hPsapi);
- return QString();
- }
- wchar_t buf[MAX_PATH];
- const DWORD length = qGetModuleFileNameEx(hProcess, NULL, buf, sizeof(buf) / sizeof(wchar_t));
- CloseHandle(hProcess);
- FreeLibrary(hPsapi);
- if (!length)
- return QString();
- QString name = QString::fromWCharArray(buf, length);
- int i = name.lastIndexOf(QLatin1Char('\\'));
- if (i >= 0)
- name.remove(0, i + 1);
- i = name.lastIndexOf(QLatin1Char('.'));
- if (i >= 0)
- name.truncate(i);
- return name;
-#else
- Q_UNUSED(pid);
- return QString();
-#endif
-}
-
-void QLockFile::unlock()
-{
- Q_D(QLockFile);
- if (!d->isLocked)
- return;
- CloseHandle(d->fileHandle);
- int attempts = 0;
- static const int maxAttempts = 500; // 500ms
- while (!QFile::remove(d->fileName) && ++attempts < maxAttempts) {
- // Someone is reading the lock file right now (on Windows this prevents deleting it).
- QLockFileThread::msleep(1);
- }
- if (attempts == maxAttempts) {
- qWarning() << "Could not remove our own lock file" << d->fileName << ". Either other users of the lock file are reading it constantly for 500 ms, or we (no longer) have permissions to delete the file";
- // This is bad because other users of this lock file will now have to wait for the stale-lock-timeout...
- }
- d->lockError = QLockFile::NoError;
- d->isLocked = false;
-}
-
-QT_END_NAMESPACE
diff --git a/src/core/qsavefile.cpp b/src/core/qsavefile.cpp
deleted file mode 100644
index 287f9e8..0000000
--- a/src/core/qsavefile.cpp
+++ /dev/null
@@ -1,452 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsavefile.h"
-#include "qsavefile_p.h"
-
-#include <QAbstractFileEngine>
-#include <QFileInfo>
-#include <QTemporaryFile>
-
-#ifdef Q_OS_WIN
-# include <windows.h>
-#else
-# include <unistd.h>
-#endif
-
-QSaveFilePrivate::QSaveFilePrivate()
- : tempFile(0), error(QFile::NoError)
-{
-}
-
-QSaveFilePrivate::~QSaveFilePrivate()
-{
-}
-
-/*!
- \class QSaveFile
- \brief The QSaveFile class provides an interface for safely writing to files.
-
- \ingroup io
-
- \reentrant
-
- QSaveFile is an I/O device for writing text and binary files, without losing
- existing data if the writing operation fails.
-
- While writing, the contents will be written to a temporary file, and if
- no error happened, commit() will move it to the final file. This ensures that
- no data at the final file is lost in case an error happens while writing,
- and no partially-written file is ever present at the final location. Always
- use QSaveFile when saving entire documents to disk.
-
- QSaveFile automatically detects errors while writing, such as the full partition
- situation, where write() cannot write all the bytes. It will remember that
- an error happened, and will discard the temporary file in commit().
-
- Much like with QFile, the file is opened with open(). Data is usually read
- and written using QDataStream or QTextStream, but you can also call the
- QIODevice-inherited functions read(), readLine(), readAll(), write().
-
- Unlike QFile, calling close() is not allowed. commit() replaces it. If commit()
- was not called and the QSaveFile instance is destroyed, the temporary file is
- discarded.
-
- \sa QTextStream, QDataStream, QFileInfo, QDir, QFile, QTemporaryFile
-*/
-
-/*!
- \internal
-*/
-QSaveFile::QSaveFile()
- : QIODevice(), d_ptr(new QSaveFilePrivate)
-{
-}
-/*!
- Constructs a new file object with the given \a parent.
-*/
-QSaveFile::QSaveFile(QObject *parent)
- : QIODevice(parent), d_ptr(new QSaveFilePrivate)
-{
-}
-/*!
- Constructs a new file object to represent the file with the given \a name.
-*/
-QSaveFile::QSaveFile(const QString &name)
- : QIODevice(0), d_ptr(new QSaveFilePrivate)
-{
- Q_D(QSaveFile);
- d->fileName = name;
-}
-/*!
- Constructs a new file object with the given \a parent to represent the
- file with the specified \a name.
-*/
-QSaveFile::QSaveFile(const QString &name, QObject *parent)
- : QIODevice(parent), d_ptr(new QSaveFilePrivate)
-{
- Q_D(QSaveFile);
- d->fileName = name;
-}
-
-/*!
- Destroys the file object, discarding the saved contents unless commit() was called.
-*/
-QSaveFile::~QSaveFile()
-{
- Q_D(QSaveFile);
- if (d->tempFile) {
- d->tempFile->setAutoRemove(true);
- delete d->tempFile;
- }
- QIODevice::close();
- delete d;
-}
-
-/*!
- Returns false since temporary files support random access.
-
- \sa QIODevice::isSequential()
-*/
-bool QSaveFile::isSequential() const
-{
- return false;
-}
-
-/*!
- Returns the file error status.
-
- The I/O device status returns an error code. For example, if open()
- returns false, or a read/write operation returns -1, this function can
- be called to find out the reason why the operation failed.
-
- Unlike QFile which clears the error on the next operation, QSaveFile remembers
- the error until the file is closed, in order to discard the file contents in close().
-
- \sa unsetError()
-*/
-
-QFile::FileError QSaveFile::error() const
-{
- return d_func()->error;
-}
-
-/*!
- Sets the file's error to QFile::NoError.
-
- This will make QSaveFile forget that an error happened during saving, so you
- probably don't want to call this, unless you're really sure that you want to
- save the file anyway.
-
- \sa error()
-*/
-void QSaveFile::unsetError()
-{
- d_func()->error = QFile::NoError;
- setErrorString(QString());
-}
-
-/*!
- Returns the name set by setFileName() or to the QSaveFile
- constructor.
-
- \sa setFileName()
-*/
-QString QSaveFile::fileName() const
-{
- return d_func()->fileName;
-}
-
-/*!
- Sets the \a name of the file. The name can have no path, a
- relative path, or an absolute path.
-
- \sa QFile::setFileName(), fileName()
-*/
-void QSaveFile::setFileName(const QString &name)
-{
- d_func()->fileName = name;
-}
-
-/*!
- Opens the file using OpenMode \a mode, returning true if successful;
- otherwise false.
-
- Important: the \a mode must be QIODevice::WriteOnly.
- It may also have additional flags, such as QIODevice::Text and QIODevice::Unbuffered.
-
- QIODevice::ReadWrite and QIODevice::Append are not supported at the moment.
-
- \sa QIODevice::OpenMode, setFileName()
-*/
-bool QSaveFile::open(OpenMode mode)
-{
- Q_D(QSaveFile);
- if (isOpen()) {
- qWarning("QSaveFile::open: File (%s) already open", qPrintable(fileName()));
- return false;
- }
- unsetError();
- if ((mode & (ReadOnly | WriteOnly)) == 0) {
- qWarning("QSaveFile::open: Open mode not specified");
- return false;
- }
- // In the future we could implement Append and ReadWrite by copying from the existing file to the temp file...
- if ((mode & ReadOnly) || (mode & Append)) {
- qWarning("QSaveFile::open: Unsupported open mode %d", int(mode));
- return false;
- }
-
- // check if existing file is writable
- QFileInfo existingFile(d->fileName);
- if (existingFile.exists() && !existingFile.isWritable()) {
- d->error = QFile::WriteError;
- setErrorString(QSaveFile::tr("Existing file %1 is not writable").arg(d->fileName));
- return false;
- }
- d->tempFile = new QTemporaryFile;
- d->tempFile->setAutoRemove(false);
- d->tempFile->setFileTemplate(d->fileName);
- if (!d->tempFile->open()) {
- d->error = d->tempFile->error();
- setErrorString(d->tempFile->errorString());
- delete d->tempFile;
- d->tempFile = 0;
- return false;
- }
- QIODevice::open(mode);
- if (existingFile.exists())
- d->tempFile->setPermissions(existingFile.permissions());
- return true;
-}
-
-/*!
- \reimp
- Cannot be called.
- Call commit() instead.
-*/
-void QSaveFile::close()
-{
- qFatal("QSaveFile::close called");
-}
-
-/*
- Commits the changes to disk, if all previous writes were successful.
-
- It is mandatory to call this at the end of the saving operation, otherwise the file will be
- discarded.
-
- If an error happened during writing, deletes the temporary file and returns false.
- Otherwise, renames it to the final fileName and returns true on success.
- Finally, closes the device.
-
- \sa cancelWriting()
-*/
-bool QSaveFile::commit()
-{
- Q_D(QSaveFile);
- if (!d->tempFile)
- return false;
- if (!isOpen()) {
- qWarning("QSaveFile::commit: File (%s) is not open", qPrintable(fileName()));
- return false;
- }
- flush();
-#ifdef Q_OS_WIN
- FlushFileBuffers(reinterpret_cast<HANDLE>(handle()));
-#elif defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
- fdatasync(d->tempFile->handle());
-#else
- fsync(d->tempFile->handle());
-#endif
- QIODevice::close();
- if (d->error != QFile::NoError) {
- d->tempFile->remove();
- unsetError();
- delete d->tempFile;
- d->tempFile = 0;
- return false;
- }
- d->tempFile->close();
-#ifdef Q_OS_WIN
- // On Windows QAbstractFileEngine::rename() fails if the the target exists,
- // so we have to rename the target.
- // Ideally the winapi ReplaceFile() method should be used.
- QString bakname = d->fileName + "~";
- QFile::remove(bakname);
- QFile::rename(d->fileName, bakname);
-#endif
- QAbstractFileEngine* fileEngine = d->tempFile->fileEngine();
- Q_ASSERT(fileEngine);
- if (!fileEngine->rename(d->fileName)) {
- d->error = fileEngine->error();
- setErrorString(fileEngine->errorString());
- d->tempFile->remove();
- delete d->tempFile;
- d->tempFile = 0;
-#ifdef Q_OS_WIN
- QFile::rename(bakname, d->fileName);
-#endif
- return false;
- }
- delete d->tempFile;
- d->tempFile = 0;
-#ifdef Q_OS_WIN
- QFile::remove(bakname);
-#endif
- return true;
-}
-
-/*!
- Sets an error code so that commit() discards the temporary file.
-
- Further write operations are possible after calling this method, but none
- of it will have any effect, the written file will be discarded.
-
- \sa commit()
-*/
-void QSaveFile::cancelWriting()
-{
- if (!isOpen())
- return;
- d_func()->error = QFile::WriteError;
- setErrorString(QSaveFile::tr("Writing canceled by application"));
-}
-
-/*!
- Returns the size of the file.
- \sa QFile::size()
-*/
-qint64 QSaveFile::size() const
-{
- Q_D(const QSaveFile);
- return d->tempFile ? d->tempFile->size() : qint64(-1);
-}
-
-/*!
- \reimp
-*/
-qint64 QSaveFile::pos() const
-{
- Q_D(const QSaveFile);
- return d->tempFile ? d->tempFile->pos() : qint64(-1);
-}
-
-/*!
- \reimp
-*/
-bool QSaveFile::seek(qint64 offset)
-{
- Q_D(QSaveFile);
- return d->tempFile ? d->tempFile->seek(offset) : false;
-}
-
-/*!
- \reimp
-*/
-bool QSaveFile::atEnd() const
-{
- Q_D(const QSaveFile);
- return d->tempFile ? d->tempFile->atEnd() : true;
-}
-
-/*!
- Flushes any buffered data to the file. Returns true if successful;
- otherwise returns false.
-*/
-bool QSaveFile::flush()
-{
- Q_D(QSaveFile);
- if (d->tempFile) {
- if (!d->tempFile->flush()) {
- d->error = d->tempFile->error();
- setErrorString(d->tempFile->errorString());
- return false;
- }
- return true;
- }
- return false;
-}
-
-/*!
- Returns the file handle of the temporary file.
-
- \sa QFile::handle()
-*/
-int QSaveFile::handle() const
-{
- Q_D(const QSaveFile);
- return d->tempFile ? d->tempFile->handle() : -1;
-}
-
-/*!
- \reimp
-*/
-qint64 QSaveFile::readData(char *data, qint64 maxlen)
-{
- Q_D(QSaveFile);
- return d->tempFile ? d->tempFile->read(data, maxlen) : -1;
-}
-
-/*!
- \reimp
-*/
-qint64 QSaveFile::writeData(const char *data, qint64 len)
-{
- Q_D(QSaveFile);
- if (!d->tempFile)
- return -1;
- const qint64 written = d->tempFile->write(data, len);
- if (written != len) {
- d->error = QFile::WriteError;
- setErrorString(QSaveFile::tr("Partial write. Partition full?"));
- }
- return written;
-}
-
-/*!
- \reimp
-*/
-qint64 QSaveFile::readLineData(char *data, qint64 maxlen)
-{
- Q_D(QSaveFile);
- return d->tempFile ? d->tempFile->readLine(data, maxlen) : -1;
-}
diff --git a/src/core/qsavefile.h b/src/core/qsavefile.h
deleted file mode 100644
index 84d5a24..0000000
--- a/src/core/qsavefile.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSAVEFILE_H
-#define QSAVEFILE_H
-
-#include <QFile>
-#include <QString>
-
-#ifdef open
-#error qsavefile.h must be included before any header file that defines open
-#endif
-
-class QAbstractFileEngine;
-class QSaveFilePrivate;
-
-class QSaveFile : public QIODevice
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QSaveFile)
-
-public:
-
- QSaveFile();
- explicit QSaveFile(const QString &name);
- explicit QSaveFile(QObject *parent);
- QSaveFile(const QString &name, QObject *parent);
- ~QSaveFile();
-
- QFile::FileError error() const;
- void unsetError();
-
- QString fileName() const;
- void setFileName(const QString &name);
-
- bool isSequential() const;
-
- virtual bool open(OpenMode flags);
- bool commit();
-
- void cancelWriting();
-
- qint64 size() const;
- qint64 pos() const;
- bool seek(qint64 offset);
- bool atEnd() const;
- bool flush();
-
- bool resize(qint64 sz);
-
- int handle() const;
-
-protected:
- qint64 readData(char *data, qint64 maxlen);
- qint64 writeData(const char *data, qint64 len);
- qint64 readLineData(char *data, qint64 maxlen);
-
-private:
- virtual void close();
-
-private:
- Q_DISABLE_COPY(QSaveFile)
-
- QSaveFilePrivate* const d_ptr;
-};
-
-#endif // QSAVEFILE_H
diff --git a/src/core/qsavefile_p.h b/src/core/qsavefile_p.h
deleted file mode 100644
index 549ecc1..0000000
--- a/src/core/qsavefile_p.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSAVEFILE_P_H
-#define QSAVEFILE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QTemporaryFile>
-
-class QSaveFilePrivate
-{
-public:
- QSaveFilePrivate();
- ~QSaveFilePrivate();
-
- QString fileName;
- QTemporaryFile *tempFile;
-
- QFile::FileError error;
-};
-
-#endif // QSAVEFILE_P_H
-
diff --git a/src/crypto/Crypto.cpp b/src/crypto/Crypto.cpp
index 40ec7ea..4669de6 100644
--- a/src/crypto/Crypto.cpp
+++ b/src/crypto/Crypto.cpp
@@ -29,43 +29,6 @@ bool Crypto::m_initalized(false);
QString Crypto::m_errorStr;
QString Crypto::m_backendVersion;
-#if !defined(GCRYPT_VERSION_NUMBER) || (GCRYPT_VERSION_NUMBER < 0x010600)
-static int gcry_qt_mutex_init(void** p_sys)
-{
- *p_sys = new QMutex();
- return 0;
-}
-
-static int gcry_qt_mutex_destroy(void** p_sys)
-{
- delete reinterpret_cast<QMutex*>(*p_sys);
- return 0;
-}
-
-static int gcry_qt_mutex_lock(void** p_sys)
-{
- reinterpret_cast<QMutex*>(*p_sys)->lock();
- return 0;
-}
-
-static int gcry_qt_mutex_unlock(void** p_sys)
-{
- reinterpret_cast<QMutex*>(*p_sys)->unlock();
- return 0;
-}
-
-static const struct gcry_thread_cbs gcry_threads_qt =
-{
- GCRY_THREAD_OPTION_USER,
- 0,
- gcry_qt_mutex_init,
- gcry_qt_mutex_destroy,
- gcry_qt_mutex_lock,
- gcry_qt_mutex_unlock,
- 0, 0, 0, 0, 0, 0, 0, 0
-};
-#endif
-
Crypto::Crypto()
{
}
@@ -77,10 +40,6 @@ bool Crypto::init()
return true;
}
- // libgcrypt >= 1.6 doesn't allow custom thread callbacks anymore.
-#if !defined(GCRYPT_VERSION_NUMBER) || (GCRYPT_VERSION_NUMBER < 0x010600)
- gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_qt);
-#endif
m_backendVersion = QString::fromLocal8Bit(gcry_check_version(0));
gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
@@ -121,23 +80,21 @@ bool Crypto::backendSelfTest()
bool Crypto::checkAlgorithms()
{
- if (gcry_cipher_algo_info(GCRY_CIPHER_AES256, GCRYCTL_TEST_ALGO, Q_NULLPTR, Q_NULLPTR) != 0) {
+ if (gcry_cipher_algo_info(GCRY_CIPHER_AES256, GCRYCTL_TEST_ALGO, nullptr, nullptr) != 0) {
m_errorStr = "GCRY_CIPHER_AES256 not found.";
qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr));
return false;
}
- if (gcry_cipher_algo_info(GCRY_CIPHER_TWOFISH, GCRYCTL_TEST_ALGO, Q_NULLPTR, Q_NULLPTR) != 0) {
+ if (gcry_cipher_algo_info(GCRY_CIPHER_TWOFISH, GCRYCTL_TEST_ALGO, nullptr, nullptr) != 0) {
m_errorStr = "GCRY_CIPHER_TWOFISH not found.";
qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr));
return false;
}
-#ifdef GCRYPT_HAS_SALSA20
- if (gcry_cipher_algo_info(GCRY_CIPHER_SALSA20, GCRYCTL_TEST_ALGO, Q_NULLPTR, Q_NULLPTR) != 0) {
+ if (gcry_cipher_algo_info(GCRY_CIPHER_SALSA20, GCRYCTL_TEST_ALGO, nullptr, nullptr) != 0) {
m_errorStr = "GCRY_CIPHER_SALSA20 not found.";
qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr));
return false;
}
-#endif
if (gcry_md_test_algo(GCRY_MD_SHA256) != 0) {
m_errorStr = "GCRY_MD_SHA256 not found.";
qWarning("Crypto::checkAlgorithms: %s", qPrintable(m_errorStr));
diff --git a/src/crypto/Crypto.h b/src/crypto/Crypto.h
index 1726865..0ce2903 100644
--- a/src/crypto/Crypto.h
+++ b/src/crypto/Crypto.h
@@ -20,8 +20,6 @@
#include <QString>
-#include "core/Global.h"
-
class Crypto
{
public:
diff --git a/src/crypto/Random.cpp b/src/crypto/Random.cpp
index 2a375f3..dc0667f 100644
--- a/src/crypto/Random.cpp
+++ b/src/crypto/Random.cpp
@@ -19,15 +19,16 @@
#include <gcrypt.h>
+#include "core/Global.h"
#include "crypto/Crypto.h"
class RandomBackendGcrypt : public RandomBackend
{
public:
- void randomize(void* data, int len) Q_DECL_OVERRIDE;
+ void randomize(void* data, int len) override;
};
-Random* Random::m_instance(Q_NULLPTR);
+Random* Random::m_instance(nullptr);
void Random::randomize(QByteArray& ba)
{
diff --git a/src/crypto/SymmetricCipher.cpp b/src/crypto/SymmetricCipher.cpp
index 454548c..12ec264 100644
--- a/src/crypto/SymmetricCipher.cpp
+++ b/src/crypto/SymmetricCipher.cpp
@@ -19,7 +19,6 @@
#include "config-keepassx.h"
#include "crypto/SymmetricCipherGcrypt.h"
-#include "crypto/SymmetricCipherSalsa20.h"
SymmetricCipher::SymmetricCipher(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode,
SymmetricCipher::Direction direction)
@@ -61,19 +60,12 @@ SymmetricCipherBackend* SymmetricCipher::createBackend(SymmetricCipher::Algorith
switch (algo) {
case SymmetricCipher::Aes256:
case SymmetricCipher::Twofish:
-#if defined(GCRYPT_HAS_SALSA20)
case SymmetricCipher::Salsa20:
-#endif
return new SymmetricCipherGcrypt(algo, mode, direction);
-#if !defined(GCRYPT_HAS_SALSA20)
- case SymmetricCipher::Salsa20:
- return new SymmetricCipherSalsa20(algo, mode, direction);
-#endif
-
default:
Q_ASSERT(false);
- return Q_NULLPTR;
+ return nullptr;
}
}
diff --git a/src/crypto/SymmetricCipher.h b/src/crypto/SymmetricCipher.h
index b8b3eb1..1ac8e14 100644
--- a/src/crypto/SymmetricCipher.h
+++ b/src/crypto/SymmetricCipher.h
@@ -22,7 +22,6 @@
#include <QScopedPointer>
#include <QString>
-#include "core/Global.h"
#include "crypto/SymmetricCipherBackend.h"
class SymmetricCipher
@@ -59,11 +58,11 @@ public:
return m_backend->process(data, ok);
}
- inline bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT {
+ Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data) {
return m_backend->processInPlace(data);
}
- inline bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT {
+ Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data, quint64 rounds) {
Q_ASSERT(rounds > 0);
return m_backend->processInPlace(data, rounds);
}
diff --git a/src/crypto/SymmetricCipherBackend.h b/src/crypto/SymmetricCipherBackend.h
index 8f19b8e..78ec60c 100644
--- a/src/crypto/SymmetricCipherBackend.h
+++ b/src/crypto/SymmetricCipherBackend.h
@@ -29,8 +29,8 @@ public:
virtual bool setIv(const QByteArray& iv) = 0;
virtual QByteArray process(const QByteArray& data, bool* ok) = 0;
- virtual bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT = 0;
- virtual bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT = 0;
+ Q_REQUIRED_RESULT virtual bool processInPlace(QByteArray& data) = 0;
+ Q_REQUIRED_RESULT virtual bool processInPlace(QByteArray& data, quint64 rounds) = 0;
virtual bool reset() = 0;
virtual int blockSize() const = 0;
diff --git a/src/crypto/SymmetricCipherGcrypt.cpp b/src/crypto/SymmetricCipherGcrypt.cpp
index 5c4fe6a..b59f0c0 100644
--- a/src/crypto/SymmetricCipherGcrypt.cpp
+++ b/src/crypto/SymmetricCipherGcrypt.cpp
@@ -22,7 +22,7 @@
SymmetricCipherGcrypt::SymmetricCipherGcrypt(SymmetricCipher::Algorithm algo, SymmetricCipher::Mode mode,
SymmetricCipher::Direction direction)
- : m_ctx(Q_NULLPTR)
+ : m_ctx(nullptr)
, m_algo(gcryptAlgo(algo))
, m_mode(gcryptMode(mode))
, m_direction(direction)
@@ -44,10 +44,8 @@ int SymmetricCipherGcrypt::gcryptAlgo(SymmetricCipher::Algorithm algo)
case SymmetricCipher::Twofish:
return GCRY_CIPHER_TWOFISH;
-#ifdef GCRYPT_HAS_SALSA20
case SymmetricCipher::Salsa20:
return GCRY_CIPHER_SALSA20;
-#endif
default:
Q_ASSERT(false);
@@ -95,7 +93,7 @@ bool SymmetricCipherGcrypt::init()
}
size_t blockSizeT;
- error = gcry_cipher_algo_info(m_algo, GCRYCTL_GET_BLKLEN, Q_NULLPTR, &blockSizeT);
+ error = gcry_cipher_algo_info(m_algo, GCRYCTL_GET_BLKLEN, nullptr, &blockSizeT);
if (error != 0) {
setErrorString(error);
return false;
@@ -150,6 +148,7 @@ QByteArray SymmetricCipherGcrypt::process(const QByteArray& data, bool* ok)
if (error != 0) {
setErrorString(error);
*ok = false;
+ return QByteArray();
}
*ok = true;
@@ -163,10 +162,10 @@ bool SymmetricCipherGcrypt::processInPlace(QByteArray& data)
gcry_error_t error;
if (m_direction == SymmetricCipher::Decrypt) {
- error = gcry_cipher_decrypt(m_ctx, data.data(), data.size(), Q_NULLPTR, 0);
+ error = gcry_cipher_decrypt(m_ctx, data.data(), data.size(), nullptr, 0);
}
else {
- error = gcry_cipher_encrypt(m_ctx, data.data(), data.size(), Q_NULLPTR, 0);
+ error = gcry_cipher_encrypt(m_ctx, data.data(), data.size(), nullptr, 0);
}
if (error != 0) {
@@ -188,7 +187,7 @@ bool SymmetricCipherGcrypt::processInPlace(QByteArray& data, quint64 rounds)
if (m_direction == SymmetricCipher::Decrypt) {
for (quint64 i = 0; i != rounds; ++i) {
- error = gcry_cipher_decrypt(m_ctx, rawData, size, Q_NULLPTR, 0);
+ error = gcry_cipher_decrypt(m_ctx, rawData, size, nullptr, 0);
if (error != 0) {
setErrorString(error);
@@ -198,7 +197,7 @@ bool SymmetricCipherGcrypt::processInPlace(QByteArray& data, quint64 rounds)
}
else {
for (quint64 i = 0; i != rounds; ++i) {
- error = gcry_cipher_encrypt(m_ctx, rawData, size, Q_NULLPTR, 0);
+ error = gcry_cipher_encrypt(m_ctx, rawData, size, nullptr, 0);
if (error != 0) {
setErrorString(error);
diff --git a/src/crypto/SymmetricCipherGcrypt.h b/src/crypto/SymmetricCipherGcrypt.h
index 367ee5b..d3ad8d1 100644
--- a/src/crypto/SymmetricCipherGcrypt.h
+++ b/src/crypto/SymmetricCipherGcrypt.h
@@ -35,8 +35,8 @@ public:
bool setIv(const QByteArray& iv);
QByteArray process(const QByteArray& data, bool* ok);
- bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT;
- bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT;
+ Q_REQUIRED_RESULT bool processInPlace(QByteArray& data);
+ Q_REQUIRED_RESULT bool processInPlace(QByteArray& data, quint64 rounds);
bool reset();
int blockSize() const;
diff --git a/src/crypto/salsa20/ecrypt-config.h b/src/crypto/salsa20/ecrypt-config.h
deleted file mode 100644
index 0914fbc..0000000
--- a/src/crypto/salsa20/ecrypt-config.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/* ecrypt-config.h */
-
-/* *** Normally, it should not be necessary to edit this file. *** */
-
-#ifndef ECRYPT_CONFIG
-#define ECRYPT_CONFIG
-
-/* ------------------------------------------------------------------------- */
-
-/* Guess the endianness of the target architecture. */
-
-#include <QtGlobal>
-
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
-#define ECRYPT_LITTLE_ENDIAN
-#elif Q_BYTE_ORDER == Q_BIG_ENDIAN
-#define ECRYPT_BIG_ENDIAN
-#else
-#define ECRYPT_UNKNOWN
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-/*
- * Find minimal-width types to store 8-bit, 16-bit, 32-bit, and 64-bit
- * integers.
- *
- * Note: to enable 64-bit types on 32-bit compilers, it might be
- * necessary to switch from ISO C90 mode to ISO C99 mode (e.g., gcc
- * -std=c99), or to allow compiler-specific extensions.
- */
-
-#include <limits.h>
-
-/* --- check char --- */
-
-#if (UCHAR_MAX / 0xFU > 0xFU)
-#ifndef I8T
-#define I8T char
-#define U8C(v) (v##U)
-
-#if (UCHAR_MAX == 0xFFU)
-#define ECRYPT_I8T_IS_BYTE
-#endif
-
-#endif
-
-#if (UCHAR_MAX / 0xFFU > 0xFFU)
-#ifndef I16T
-#define I16T char
-#define U16C(v) (v##U)
-#endif
-
-#if (UCHAR_MAX / 0xFFFFU > 0xFFFFU)
-#ifndef I32T
-#define I32T char
-#define U32C(v) (v##U)
-#endif
-
-#if (UCHAR_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
-#ifndef I64T
-#define I64T char
-#define U64C(v) (v##U)
-#define ECRYPT_NATIVE64
-#endif
-
-#endif
-#endif
-#endif
-#endif
-
-/* --- check short --- */
-
-#if (USHRT_MAX / 0xFU > 0xFU)
-#ifndef I8T
-#define I8T short
-#define U8C(v) (v##U)
-
-#if (USHRT_MAX == 0xFFU)
-#define ECRYPT_I8T_IS_BYTE
-#endif
-
-#endif
-
-#if (USHRT_MAX / 0xFFU > 0xFFU)
-#ifndef I16T
-#define I16T short
-#define U16C(v) (v##U)
-#endif
-
-#if (USHRT_MAX / 0xFFFFU > 0xFFFFU)
-#ifndef I32T
-#define I32T short
-#define U32C(v) (v##U)
-#endif
-
-#if (USHRT_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
-#ifndef I64T
-#define I64T short
-#define U64C(v) (v##U)
-#define ECRYPT_NATIVE64
-#endif
-
-#endif
-#endif
-#endif
-#endif
-
-/* --- check int --- */
-
-#if (UINT_MAX / 0xFU > 0xFU)
-#ifndef I8T
-#define I8T int
-#define U8C(v) (v##U)
-
-#if (ULONG_MAX == 0xFFU)
-#define ECRYPT_I8T_IS_BYTE
-#endif
-
-#endif
-
-#if (UINT_MAX / 0xFFU > 0xFFU)
-#ifndef I16T
-#define I16T int
-#define U16C(v) (v##U)
-#endif
-
-#if (UINT_MAX / 0xFFFFU > 0xFFFFU)
-#ifndef I32T
-#define I32T int
-#define U32C(v) (v##U)
-#endif
-
-#if (UINT_MAX / 0xFFFFFFFFU > 0xFFFFFFFFU)
-#ifndef I64T
-#define I64T int
-#define U64C(v) (v##U)
-#define ECRYPT_NATIVE64
-#endif
-
-#endif
-#endif
-#endif
-#endif
-
-/* --- check long --- */
-
-#if (ULONG_MAX / 0xFUL > 0xFUL)
-#ifndef I8T
-#define I8T long
-#define U8C(v) (v##UL)
-
-#if (ULONG_MAX == 0xFFUL)
-#define ECRYPT_I8T_IS_BYTE
-#endif
-
-#endif
-
-#if (ULONG_MAX / 0xFFUL > 0xFFUL)
-#ifndef I16T
-#define I16T long
-#define U16C(v) (v##UL)
-#endif
-
-#if (ULONG_MAX / 0xFFFFUL > 0xFFFFUL)
-#ifndef I32T
-#define I32T long
-#define U32C(v) (v##UL)
-#endif
-
-#if (ULONG_MAX / 0xFFFFFFFFUL > 0xFFFFFFFFUL)
-#ifndef I64T
-#define I64T long
-#define U64C(v) (v##UL)
-#define ECRYPT_NATIVE64
-#endif
-
-#endif
-#endif
-#endif
-#endif
-
-/* --- check long long --- */
-
-#ifdef ULLONG_MAX
-
-#if (ULLONG_MAX / 0xFULL > 0xFULL)
-#ifndef I8T
-#define I8T long long
-#define U8C(v) (v##ULL)
-
-#if (ULLONG_MAX == 0xFFULL)
-#define ECRYPT_I8T_IS_BYTE
-#endif
-
-#endif
-
-#if (ULLONG_MAX / 0xFFULL > 0xFFULL)
-#ifndef I16T
-#define I16T long long
-#define U16C(v) (v##ULL)
-#endif
-
-#if (ULLONG_MAX / 0xFFFFULL > 0xFFFFULL)
-#ifndef I32T
-#define I32T long long
-#define U32C(v) (v##ULL)
-#endif
-
-#if (ULLONG_MAX / 0xFFFFFFFFULL > 0xFFFFFFFFULL)
-#ifndef I64T
-#define I64T long long
-#define U64C(v) (v##ULL)
-#endif
-
-#endif
-#endif
-#endif
-#endif
-
-#endif
-
-/* --- check __int64 --- */
-
-#if !defined(__STDC__) && defined(_UI64_MAX)
-
-#ifndef I64T
-#define I64T __int64
-#define U64C(v) (v##ui64)
-#endif
-
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-/* find the largest type on this platform (used for alignment) */
-
-#if defined(__SSE__) || (defined(_MSC_VER) && (_MSC_VER >= 1300))
-
-#include <xmmintrin.h>
-#define MAXT __m128
-
-#elif defined(__MMX__)
-
-#include <mmintrin.h>
-#define MAXT __m64
-
-#elif defined(__ALTIVEC__)
-
-#define MAXT __vector int
-
-#else
-
-#define MAXT long
-
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-#endif
diff --git a/src/crypto/salsa20/ecrypt-machine.h b/src/crypto/salsa20/ecrypt-machine.h
deleted file mode 100644
index d006bed..0000000
--- a/src/crypto/salsa20/ecrypt-machine.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* ecrypt-machine.h */
-
-/*
- * This file is included by 'ecrypt-portable.h'. It allows to override
- * the default macros for specific platforms. Please carefully check
- * the machine code generated by your compiler (with optimisations
- * turned on) before deciding to edit this file.
- */
-
-/* ------------------------------------------------------------------------- */
-
-#if (defined(ECRYPT_DEFAULT_ROT) && !defined(ECRYPT_MACHINE_ROT))
-
-#define ECRYPT_MACHINE_ROT
-
-#if (defined(WIN32) && defined(_MSC_VER))
-
-#undef ROTL32
-#undef ROTR32
-#undef ROTL64
-#undef ROTR64
-
-#include <stdlib.h>
-
-#pragma intrinsic(_lrotl) /* compile rotations "inline" */
-#pragma intrinsic(_lrotr)
-
-#define ROTL32(v, n) _lrotl(v, n)
-#define ROTR32(v, n) _lrotr(v, n)
-#define ROTL64(v, n) _rotl64(v, n)
-#define ROTR64(v, n) _rotr64(v, n)
-
-#endif
-
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-#if (defined(ECRYPT_DEFAULT_SWAP) && !defined(ECRYPT_MACHINE_SWAP))
-
-#define ECRYPT_MACHINE_SWAP
-
-/*
- * If you want to overwrite the default swap macros, put it here. And so on.
- */
-
-#endif
-
-/* ------------------------------------------------------------------------- */
diff --git a/src/crypto/salsa20/ecrypt-portable.h b/src/crypto/salsa20/ecrypt-portable.h
deleted file mode 100644
index 438a464..0000000
--- a/src/crypto/salsa20/ecrypt-portable.h
+++ /dev/null
@@ -1,310 +0,0 @@
-/* ecrypt-portable.h */
-
-/*
- * WARNING: the conversions defined below are implemented as macros,
- * and should be used carefully. They should NOT be used with
- * parameters which perform some action. E.g., the following two lines
- * are not equivalent:
- *
- * 1) ++x; y = ROTL32(x, n);
- * 2) y = ROTL32(++x, n);
- */
-
-/*
- * *** Please do not edit this file. ***
- *
- * The default macros can be overridden for specific architectures by
- * editing 'ecrypt-machine.h'.
- */
-
-#ifndef ECRYPT_PORTABLE
-#define ECRYPT_PORTABLE
-
-#include "ecrypt-config.h"
-
-/* ------------------------------------------------------------------------- */
-
-/*
- * The following types are defined (if available):
- *
- * u8: unsigned integer type, at least 8 bits
- * u16: unsigned integer type, at least 16 bits
- * u32: unsigned integer type, at least 32 bits
- * u64: unsigned integer type, at least 64 bits
- *
- * s8, s16, s32, s64 -> signed counterparts of u8, u16, u32, u64
- *
- * The selection of minimum-width integer types is taken care of by
- * 'ecrypt-config.h'. Note: to enable 64-bit types on 32-bit
- * compilers, it might be necessary to switch from ISO C90 mode to ISO
- * C99 mode (e.g., gcc -std=c99).
- */
-
-#ifdef I8T
-typedef signed I8T s8;
-typedef unsigned I8T u8;
-#endif
-
-#ifdef I16T
-typedef signed I16T s16;
-typedef unsigned I16T u16;
-#endif
-
-#ifdef I32T
-typedef signed I32T s32;
-typedef unsigned I32T u32;
-#endif
-
-#ifdef I64T
-typedef signed I64T s64;
-typedef unsigned I64T u64;
-#endif
-
-/*
- * The following macros are used to obtain exact-width results.
- */
-
-#define U8V(v) ((u8)(v) & U8C(0xFF))
-#define U16V(v) ((u16)(v) & U16C(0xFFFF))
-#define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF))
-#define U64V(v) ((u64)(v) & U64C(0xFFFFFFFFFFFFFFFF))
-
-/* ------------------------------------------------------------------------- */
-
-/*
- * The following macros return words with their bits rotated over n
- * positions to the left/right.
- */
-
-#define ECRYPT_DEFAULT_ROT
-
-#define ROTL8(v, n) \
- (U8V((v) << (n)) | ((v) >> (8 - (n))))
-
-#define ROTL16(v, n) \
- (U16V((v) << (n)) | ((v) >> (16 - (n))))
-
-#define ROTL32(v, n) \
- (U32V((v) << (n)) | ((v) >> (32 - (n))))
-
-#define ROTL64(v, n) \
- (U64V((v) << (n)) | ((v) >> (64 - (n))))
-
-#define ROTR8(v, n) ROTL8(v, 8 - (n))
-#define ROTR16(v, n) ROTL16(v, 16 - (n))
-#define ROTR32(v, n) ROTL32(v, 32 - (n))
-#define ROTR64(v, n) ROTL64(v, 64 - (n))
-
-#include "ecrypt-machine.h"
-
-/* ------------------------------------------------------------------------- */
-
-/*
- * The following macros return a word with bytes in reverse order.
- */
-
-#define ECRYPT_DEFAULT_SWAP
-
-#define SWAP16(v) \
- ROTL16(v, 8)
-
-#define SWAP32(v) \
- ((ROTL32(v, 8) & U32C(0x00FF00FF)) | \
- (ROTL32(v, 24) & U32C(0xFF00FF00)))
-
-#ifdef ECRYPT_NATIVE64
-#define SWAP64(v) \
- ((ROTL64(v, 8) & U64C(0x000000FF000000FF)) | \
- (ROTL64(v, 24) & U64C(0x0000FF000000FF00)) | \
- (ROTL64(v, 40) & U64C(0x00FF000000FF0000)) | \
- (ROTL64(v, 56) & U64C(0xFF000000FF000000)))
-#else
-#define SWAP64(v) \
- (((u64)SWAP32(U32V(v)) << 32) | (u64)SWAP32(U32V(v >> 32)))
-#endif
-
-#include "ecrypt-machine.h"
-
-#define ECRYPT_DEFAULT_WTOW
-
-#ifdef ECRYPT_LITTLE_ENDIAN
-#define U16TO16_LITTLE(v) (v)
-#define U32TO32_LITTLE(v) (v)
-#define U64TO64_LITTLE(v) (v)
-
-#define U16TO16_BIG(v) SWAP16(v)
-#define U32TO32_BIG(v) SWAP32(v)
-#define U64TO64_BIG(v) SWAP64(v)
-#endif
-
-#ifdef ECRYPT_BIG_ENDIAN
-#define U16TO16_LITTLE(v) SWAP16(v)
-#define U32TO32_LITTLE(v) SWAP32(v)
-#define U64TO64_LITTLE(v) SWAP64(v)
-
-#define U16TO16_BIG(v) (v)
-#define U32TO32_BIG(v) (v)
-#define U64TO64_BIG(v) (v)
-#endif
-
-#include "ecrypt-machine.h"
-
-/*
- * The following macros load words from an array of bytes with
- * different types of endianness, and vice versa.
- */
-
-#define ECRYPT_DEFAULT_BTOW
-
-#if (!defined(ECRYPT_UNKNOWN) && defined(ECRYPT_I8T_IS_BYTE))
-
-#define U8TO16_LITTLE(p) U16TO16_LITTLE(((u16*)(p))[0])
-#define U8TO32_LITTLE(p) U32TO32_LITTLE(((u32*)(p))[0])
-#define U8TO64_LITTLE(p) U64TO64_LITTLE(((u64*)(p))[0])
-
-#define U8TO16_BIG(p) U16TO16_BIG(((u16*)(p))[0])
-#define U8TO32_BIG(p) U32TO32_BIG(((u32*)(p))[0])
-#define U8TO64_BIG(p) U64TO64_BIG(((u64*)(p))[0])
-
-#define U16TO8_LITTLE(p, v) (((u16*)(p))[0] = U16TO16_LITTLE(v))
-#define U32TO8_LITTLE(p, v) (((u32*)(p))[0] = U32TO32_LITTLE(v))
-#define U64TO8_LITTLE(p, v) (((u64*)(p))[0] = U64TO64_LITTLE(v))
-
-#define U16TO8_BIG(p, v) (((u16*)(p))[0] = U16TO16_BIG(v))
-#define U32TO8_BIG(p, v) (((u32*)(p))[0] = U32TO32_BIG(v))
-#define U64TO8_BIG(p, v) (((u64*)(p))[0] = U64TO64_BIG(v))
-
-#else
-
-#define U8TO16_LITTLE(p) \
- (((u16)((p)[0]) ) | \
- ((u16)((p)[1]) << 8))
-
-#define U8TO32_LITTLE(p) \
- (((u32)((p)[0]) ) | \
- ((u32)((p)[1]) << 8) | \
- ((u32)((p)[2]) << 16) | \
- ((u32)((p)[3]) << 24))
-
-#ifdef ECRYPT_NATIVE64
-#define U8TO64_LITTLE(p) \
- (((u64)((p)[0]) ) | \
- ((u64)((p)[1]) << 8) | \
- ((u64)((p)[2]) << 16) | \
- ((u64)((p)[3]) << 24) | \
- ((u64)((p)[4]) << 32) | \
- ((u64)((p)[5]) << 40) | \
- ((u64)((p)[6]) << 48) | \
- ((u64)((p)[7]) << 56))
-#else
-#define U8TO64_LITTLE(p) \
- ((u64)U8TO32_LITTLE(p) | ((u64)U8TO32_LITTLE((p) + 4) << 32))
-#endif
-
-#define U8TO16_BIG(p) \
- (((u16)((p)[0]) << 8) | \
- ((u16)((p)[1]) ))
-
-#define U8TO32_BIG(p) \
- (((u32)((p)[0]) << 24) | \
- ((u32)((p)[1]) << 16) | \
- ((u32)((p)[2]) << 8) | \
- ((u32)((p)[3]) ))
-
-#ifdef ECRYPT_NATIVE64
-#define U8TO64_BIG(p) \
- (((u64)((p)[0]) << 56) | \
- ((u64)((p)[1]) << 48) | \
- ((u64)((p)[2]) << 40) | \
- ((u64)((p)[3]) << 32) | \
- ((u64)((p)[4]) << 24) | \
- ((u64)((p)[5]) << 16) | \
- ((u64)((p)[6]) << 8) | \
- ((u64)((p)[7]) ))
-#else
-#define U8TO64_BIG(p) \
- (((u64)U8TO32_BIG(p) << 32) | (u64)U8TO32_BIG((p) + 4))
-#endif
-
-#define U16TO8_LITTLE(p, v) \
- do { \
- (p)[0] = U8V((v) ); \
- (p)[1] = U8V((v) >> 8); \
- } while (0)
-
-#define U32TO8_LITTLE(p, v) \
- do { \
- (p)[0] = U8V((v) ); \
- (p)[1] = U8V((v) >> 8); \
- (p)[2] = U8V((v) >> 16); \
- (p)[3] = U8V((v) >> 24); \
- } while (0)
-
-#ifdef ECRYPT_NATIVE64
-#define U64TO8_LITTLE(p, v) \
- do { \
- (p)[0] = U8V((v) ); \
- (p)[1] = U8V((v) >> 8); \
- (p)[2] = U8V((v) >> 16); \
- (p)[3] = U8V((v) >> 24); \
- (p)[4] = U8V((v) >> 32); \
- (p)[5] = U8V((v) >> 40); \
- (p)[6] = U8V((v) >> 48); \
- (p)[7] = U8V((v) >> 56); \
- } while (0)
-#else
-#define U64TO8_LITTLE(p, v) \
- do { \
- U32TO8_LITTLE((p), U32V((v) )); \
- U32TO8_LITTLE((p) + 4, U32V((v) >> 32)); \
- } while (0)
-#endif
-
-#define U16TO8_BIG(p, v) \
- do { \
- (p)[0] = U8V((v) ); \
- (p)[1] = U8V((v) >> 8); \
- } while (0)
-
-#define U32TO8_BIG(p, v) \
- do { \
- (p)[0] = U8V((v) >> 24); \
- (p)[1] = U8V((v) >> 16); \
- (p)[2] = U8V((v) >> 8); \
- (p)[3] = U8V((v) ); \
- } while (0)
-
-#ifdef ECRYPT_NATIVE64
-#define U64TO8_BIG(p, v) \
- do { \
- (p)[0] = U8V((v) >> 56); \
- (p)[1] = U8V((v) >> 48); \
- (p)[2] = U8V((v) >> 40); \
- (p)[3] = U8V((v) >> 32); \
- (p)[4] = U8V((v) >> 24); \
- (p)[5] = U8V((v) >> 16); \
- (p)[6] = U8V((v) >> 8); \
- (p)[7] = U8V((v) ); \
- } while (0)
-#else
-#define U64TO8_BIG(p, v) \
- do { \
- U32TO8_BIG((p), U32V((v) >> 32)); \
- U32TO8_BIG((p) + 4, U32V((v) )); \
- } while (0)
-#endif
-
-#endif
-
-#include "ecrypt-machine.h"
-
-/* ------------------------------------------------------------------------- */
-
-#define AT_LEAST_ONE(n) (((n) < 1) ? 1 : (n))
-
-#define ALIGN(t, v, n) \
- union { t b[n]; MAXT l[AT_LEAST_ONE(n * sizeof(t) / sizeof(MAXT))]; } v
-
-/* ------------------------------------------------------------------------- */
-
-#endif
diff --git a/src/crypto/salsa20/ecrypt-sync.h b/src/crypto/salsa20/ecrypt-sync.h
deleted file mode 100644
index 245793e..0000000
--- a/src/crypto/salsa20/ecrypt-sync.h
+++ /dev/null
@@ -1,287 +0,0 @@
-/* ecrypt-sync.h */
-
-/*
- * Header file for synchronous stream ciphers without authentication
- * mechanism.
- *
- * *** Please only edit parts marked with "[edit]". ***
- */
-
-#ifndef ECRYPT_SYNC
-#define ECRYPT_SYNC
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "ecrypt-portable.h"
-
-/* ------------------------------------------------------------------------- */
-
-/* Cipher parameters */
-
-/*
- * The name of your cipher.
- */
-#define ECRYPT_NAME "Salsa20" /* [edit] */
-#define ECRYPT_PROFILE "S!_H."
-
-/*
- * Specify which key and IV sizes are supported by your cipher. A user
- * should be able to enumerate the supported sizes by running the
- * following code:
- *
- * for (i = 0; ECRYPT_KEYSIZE(i) <= ECRYPT_MAXKEYSIZE; ++i)
- * {
- * keysize = ECRYPT_KEYSIZE(i);
- *
- * ...
- * }
- *
- * All sizes are in bits.
- */
-
-#define ECRYPT_MAXKEYSIZE 256 /* [edit] */
-#define ECRYPT_KEYSIZE(i) (128 + (i)*128) /* [edit] */
-
-#define ECRYPT_MAXIVSIZE 64 /* [edit] */
-#define ECRYPT_IVSIZE(i) (64 + (i)*64) /* [edit] */
-
-/* ------------------------------------------------------------------------- */
-
-/* Data structures */
-
-/*
- * ECRYPT_ctx is the structure containing the representation of the
- * internal state of your cipher.
- */
-
-typedef struct
-{
- u32 input[16]; /* could be compressed */
- /*
- * [edit]
- *
- * Put here all state variable needed during the encryption process.
- */
-} ECRYPT_ctx;
-
-/* ------------------------------------------------------------------------- */
-
-/* Mandatory functions */
-
-/*
- * Key and message independent initialization. This function will be
- * called once when the program starts (e.g., to build expanded S-box
- * tables).
- */
-void ECRYPT_init();
-
-/*
- * Key setup. It is the user's responsibility to select the values of
- * keysize and ivsize from the set of supported values specified
- * above.
- */
-void ECRYPT_keysetup(
- ECRYPT_ctx* ctx,
- const u8* key,
- u32 keysize, /* Key size in bits. */
- u32 ivsize); /* IV size in bits. */
-
-/*
- * IV setup. After having called ECRYPT_keysetup(), the user is
- * allowed to call ECRYPT_ivsetup() different times in order to
- * encrypt/decrypt different messages with the same key but different
- * IV's.
- */
-void ECRYPT_ivsetup(
- ECRYPT_ctx* ctx,
- const u8* iv);
-
-/*
- * Encryption/decryption of arbitrary length messages.
- *
- * For efficiency reasons, the API provides two types of
- * encrypt/decrypt functions. The ECRYPT_encrypt_bytes() function
- * (declared here) encrypts byte strings of arbitrary length, while
- * the ECRYPT_encrypt_blocks() function (defined later) only accepts
- * lengths which are multiples of ECRYPT_BLOCKLENGTH.
- *
- * The user is allowed to make multiple calls to
- * ECRYPT_encrypt_blocks() to incrementally encrypt a long message,
- * but he is NOT allowed to make additional encryption calls once he
- * has called ECRYPT_encrypt_bytes() (unless he starts a new message
- * of course). For example, this sequence of calls is acceptable:
- *
- * ECRYPT_keysetup();
- *
- * ECRYPT_ivsetup();
- * ECRYPT_encrypt_blocks();
- * ECRYPT_encrypt_blocks();
- * ECRYPT_encrypt_bytes();
- *
- * ECRYPT_ivsetup();
- * ECRYPT_encrypt_blocks();
- * ECRYPT_encrypt_blocks();
- *
- * ECRYPT_ivsetup();
- * ECRYPT_encrypt_bytes();
- *
- * The following sequence is not:
- *
- * ECRYPT_keysetup();
- * ECRYPT_ivsetup();
- * ECRYPT_encrypt_blocks();
- * ECRYPT_encrypt_bytes();
- * ECRYPT_encrypt_blocks();
- */
-
-void ECRYPT_encrypt_bytes(
- ECRYPT_ctx* ctx,
- const u8* plaintext,
- u8* ciphertext,
- u32 msglen); /* Message length in bytes. */
-
-void ECRYPT_decrypt_bytes(
- ECRYPT_ctx* ctx,
- const u8* ciphertext,
- u8* plaintext,
- u32 msglen); /* Message length in bytes. */
-
-/* ------------------------------------------------------------------------- */
-
-/* Optional features */
-
-/*
- * For testing purposes it can sometimes be useful to have a function
- * which immediately generates keystream without having to provide it
- * with a zero plaintext. If your cipher cannot provide this function
- * (e.g., because it is not strictly a synchronous cipher), please
- * reset the ECRYPT_GENERATES_KEYSTREAM flag.
- */
-
-#define ECRYPT_GENERATES_KEYSTREAM
-#ifdef ECRYPT_GENERATES_KEYSTREAM
-
-void ECRYPT_keystream_bytes(
- ECRYPT_ctx* ctx,
- u8* keystream,
- u32 length); /* Length of keystream in bytes. */
-
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-/* Optional optimizations */
-
-/*
- * By default, the functions in this section are implemented using
- * calls to functions declared above. However, you might want to
- * implement them differently for performance reasons.
- */
-
-/*
- * All-in-one encryption/decryption of (short) packets.
- *
- * The default definitions of these functions can be found in
- * "ecrypt-sync.c". If you want to implement them differently, please
- * undef the ECRYPT_USES_DEFAULT_ALL_IN_ONE flag.
- */
-#define ECRYPT_USES_DEFAULT_ALL_IN_ONE /* [edit] */
-
-void ECRYPT_encrypt_packet(
- ECRYPT_ctx* ctx,
- const u8* iv,
- const u8* plaintext,
- u8* ciphertext,
- u32 msglen);
-
-void ECRYPT_decrypt_packet(
- ECRYPT_ctx* ctx,
- const u8* iv,
- const u8* ciphertext,
- u8* plaintext,
- u32 msglen);
-
-/*
- * Encryption/decryption of blocks.
- *
- * By default, these functions are defined as macros. If you want to
- * provide a different implementation, please undef the
- * ECRYPT_USES_DEFAULT_BLOCK_MACROS flag and implement the functions
- * declared below.
- */
-
-#define ECRYPT_BLOCKLENGTH 64 /* [edit] */
-
-#define ECRYPT_USES_DEFAULT_BLOCK_MACROS /* [edit] */
-#ifdef ECRYPT_USES_DEFAULT_BLOCK_MACROS
-
-#define ECRYPT_encrypt_blocks(ctx, plaintext, ciphertext, blocks) \
- ECRYPT_encrypt_bytes(ctx, plaintext, ciphertext, \
- (blocks) * ECRYPT_BLOCKLENGTH)
-
-#define ECRYPT_decrypt_blocks(ctx, ciphertext, plaintext, blocks) \
- ECRYPT_decrypt_bytes(ctx, ciphertext, plaintext, \
- (blocks) * ECRYPT_BLOCKLENGTH)
-
-#ifdef ECRYPT_GENERATES_KEYSTREAM
-
-#define ECRYPT_keystream_blocks(ctx, keystream, blocks) \
- ECRYPT_keystream_bytes(ctx, keystream, \
- (blocks) * ECRYPT_BLOCKLENGTH)
-
-#endif
-
-#else
-
-void ECRYPT_encrypt_blocks(
- ECRYPT_ctx* ctx,
- const u8* plaintext,
- u8* ciphertext,
- u32 blocks); /* Message length in blocks. */
-
-void ECRYPT_decrypt_blocks(
- ECRYPT_ctx* ctx,
- const u8* ciphertext,
- u8* plaintext,
- u32 blocks); /* Message length in blocks. */
-
-#ifdef ECRYPT_GENERATES_KEYSTREAM
-
-void ECRYPT_keystream_blocks(
- ECRYPT_ctx* ctx,
- const u8* keystream,
- u32 blocks); /* Keystream length in blocks. */
-
-#endif
-
-#endif
-
-/*
- * If your cipher can be implemented in different ways, you can use
- * the ECRYPT_VARIANT parameter to allow the user to choose between
- * them at compile time (e.g., gcc -DECRYPT_VARIANT=3 ...). Please
- * only use this possibility if you really think it could make a
- * significant difference and keep the number of variants
- * (ECRYPT_MAXVARIANT) as small as possible (definitely not more than
- * 10). Note also that all variants should have exactly the same
- * external interface (i.e., the same ECRYPT_BLOCKLENGTH, etc.).
- */
-#define ECRYPT_MAXVARIANT 1 /* [edit] */
-
-#ifndef ECRYPT_VARIANT
-#define ECRYPT_VARIANT 1
-#endif
-
-#if (ECRYPT_VARIANT > ECRYPT_MAXVARIANT)
-#error this variant does not exist
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/crypto/salsa20/salsa20.c b/src/crypto/salsa20/salsa20.c
deleted file mode 100644
index 74f806c..0000000
--- a/src/crypto/salsa20/salsa20.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
-salsa20-ref.c version 20051118
-D. J. Bernstein
-Public domain.
-*/
-
-#include "ecrypt-sync.h"
-
-#define ROTATE(v,c) (ROTL32(v,c))
-#define XOR(v,w) ((v) ^ (w))
-#define PLUS(v,w) (U32V((v) + (w)))
-#define PLUSONE(v) (PLUS((v),1))
-
-static void salsa20_wordtobyte(u8 output[64],const u32 input[16])
-{
- u32 x[16];
- int i;
-
- for (i = 0;i < 16;++i) x[i] = input[i];
- for (i = 20;i > 0;i -= 2) {
- x[ 4] = XOR(x[ 4],ROTATE(PLUS(x[ 0],x[12]), 7));
- x[ 8] = XOR(x[ 8],ROTATE(PLUS(x[ 4],x[ 0]), 9));
- x[12] = XOR(x[12],ROTATE(PLUS(x[ 8],x[ 4]),13));
- x[ 0] = XOR(x[ 0],ROTATE(PLUS(x[12],x[ 8]),18));
- x[ 9] = XOR(x[ 9],ROTATE(PLUS(x[ 5],x[ 1]), 7));
- x[13] = XOR(x[13],ROTATE(PLUS(x[ 9],x[ 5]), 9));
- x[ 1] = XOR(x[ 1],ROTATE(PLUS(x[13],x[ 9]),13));
- x[ 5] = XOR(x[ 5],ROTATE(PLUS(x[ 1],x[13]),18));
- x[14] = XOR(x[14],ROTATE(PLUS(x[10],x[ 6]), 7));
- x[ 2] = XOR(x[ 2],ROTATE(PLUS(x[14],x[10]), 9));
- x[ 6] = XOR(x[ 6],ROTATE(PLUS(x[ 2],x[14]),13));
- x[10] = XOR(x[10],ROTATE(PLUS(x[ 6],x[ 2]),18));
- x[ 3] = XOR(x[ 3],ROTATE(PLUS(x[15],x[11]), 7));
- x[ 7] = XOR(x[ 7],ROTATE(PLUS(x[ 3],x[15]), 9));
- x[11] = XOR(x[11],ROTATE(PLUS(x[ 7],x[ 3]),13));
- x[15] = XOR(x[15],ROTATE(PLUS(x[11],x[ 7]),18));
- x[ 1] = XOR(x[ 1],ROTATE(PLUS(x[ 0],x[ 3]), 7));
- x[ 2] = XOR(x[ 2],ROTATE(PLUS(x[ 1],x[ 0]), 9));
- x[ 3] = XOR(x[ 3],ROTATE(PLUS(x[ 2],x[ 1]),13));
- x[ 0] = XOR(x[ 0],ROTATE(PLUS(x[ 3],x[ 2]),18));
- x[ 6] = XOR(x[ 6],ROTATE(PLUS(x[ 5],x[ 4]), 7));
- x[ 7] = XOR(x[ 7],ROTATE(PLUS(x[ 6],x[ 5]), 9));
- x[ 4] = XOR(x[ 4],ROTATE(PLUS(x[ 7],x[ 6]),13));
- x[ 5] = XOR(x[ 5],ROTATE(PLUS(x[ 4],x[ 7]),18));
- x[11] = XOR(x[11],ROTATE(PLUS(x[10],x[ 9]), 7));
- x[ 8] = XOR(x[ 8],ROTATE(PLUS(x[11],x[10]), 9));
- x[ 9] = XOR(x[ 9],ROTATE(PLUS(x[ 8],x[11]),13));
- x[10] = XOR(x[10],ROTATE(PLUS(x[ 9],x[ 8]),18));
- x[12] = XOR(x[12],ROTATE(PLUS(x[15],x[14]), 7));
- x[13] = XOR(x[13],ROTATE(PLUS(x[12],x[15]), 9));
- x[14] = XOR(x[14],ROTATE(PLUS(x[13],x[12]),13));
- x[15] = XOR(x[15],ROTATE(PLUS(x[14],x[13]),18));
- }
- for (i = 0;i < 16;++i) x[i] = PLUS(x[i],input[i]);
- for (i = 0;i < 16;++i) U32TO8_LITTLE(output + 4 * i,x[i]);
-}
-
-void ECRYPT_init(void)
-{
- return;
-}
-
-static const char sigma[16] = "expand 32-byte k";
-static const char tau[16] = "expand 16-byte k";
-
-void ECRYPT_keysetup(ECRYPT_ctx *x,const u8 *k,u32 kbits,u32 ivbits)
-{
- (void)ivbits;
- const char *constants;
-
- x->input[1] = U8TO32_LITTLE(k + 0);
- x->input[2] = U8TO32_LITTLE(k + 4);
- x->input[3] = U8TO32_LITTLE(k + 8);
- x->input[4] = U8TO32_LITTLE(k + 12);
- if (kbits == 256) { /* recommended */
- k += 16;
- constants = sigma;
- } else { /* kbits == 128 */
- constants = tau;
- }
- x->input[11] = U8TO32_LITTLE(k + 0);
- x->input[12] = U8TO32_LITTLE(k + 4);
- x->input[13] = U8TO32_LITTLE(k + 8);
- x->input[14] = U8TO32_LITTLE(k + 12);
- x->input[0] = U8TO32_LITTLE(constants + 0);
- x->input[5] = U8TO32_LITTLE(constants + 4);
- x->input[10] = U8TO32_LITTLE(constants + 8);
- x->input[15] = U8TO32_LITTLE(constants + 12);
-}
-
-void ECRYPT_ivsetup(ECRYPT_ctx *x,const u8 *iv)
-{
- x->input[6] = U8TO32_LITTLE(iv + 0);
- x->input[7] = U8TO32_LITTLE(iv + 4);
- x->input[8] = 0;
- x->input[9] = 0;
-}
-
-void ECRYPT_encrypt_bytes(ECRYPT_ctx *x,const u8 *m,u8 *c,u32 bytes)
-{
- u8 output[64];
- u32 i;
-
- if (!bytes) return;
- for (;;) {
- salsa20_wordtobyte(output,x->input);
- x->input[8] = PLUSONE(x->input[8]);
- if (!x->input[8]) {
- x->input[9] = PLUSONE(x->input[9]);
- /* stopping at 2^70 bytes per nonce is user's responsibility */
- }
- if (bytes <= 64) {
- for (i = 0;i < bytes;++i) c[i] = m[i] ^ output[i];
- return;
- }
- for (i = 0;i < 64;++i) c[i] = m[i] ^ output[i];
- bytes -= 64;
- c += 64;
- m += 64;
- }
-}
-
-void ECRYPT_decrypt_bytes(ECRYPT_ctx *x,const u8 *c,u8 *m,u32 bytes)
-{
- ECRYPT_encrypt_bytes(x,c,m,bytes);
-}
-
-void ECRYPT_keystream_bytes(ECRYPT_ctx *x,u8 *stream,u32 bytes)
-{
- u32 i;
- for (i = 0;i < bytes;++i) stream[i] = 0;
- ECRYPT_encrypt_bytes(x,stream,stream,bytes);
-}
diff --git a/src/format/CsvExporter.cpp b/src/format/CsvExporter.cpp
index 1137864..c444afe 100644
--- a/src/format/CsvExporter.cpp
+++ b/src/format/CsvExporter.cpp
@@ -64,7 +64,8 @@ bool CsvExporter::writeGroup(QIODevice* device, const Group* group, QString grou
}
groupPath.append(group->name());
- Q_FOREACH (const Entry* entry, group->entries()) {
+ const QList<Entry*> entryList = group->entries();
+ for (const Entry* entry : entryList) {
QString line;
addColumn(line, groupPath);
@@ -82,7 +83,8 @@ bool CsvExporter::writeGroup(QIODevice* device, const Group* group, QString grou
}
}
- Q_FOREACH (const Group* child, group->children()) {
+ const QList<Group*> children = group->children();
+ for (const Group* child : children) {
if (!writeGroup(device, child, groupPath)) {
return false;
}
diff --git a/src/format/KeePass1Reader.cpp b/src/format/KeePass1Reader.cpp
index 0175a62..4747d7f 100644
--- a/src/format/KeePass1Reader.cpp
+++ b/src/format/KeePass1Reader.cpp
@@ -49,9 +49,9 @@ private:
KeePass1Reader::KeePass1Reader()
- : m_db(Q_NULLPTR)
- , m_tmpParent(Q_NULLPTR)
- , m_device(Q_NULLPTR)
+ : m_db(nullptr)
+ , m_tmpParent(nullptr)
+ , m_device(nullptr)
, m_encryptionFlags(0)
, m_transformRounds(0)
, m_error(false)
@@ -72,16 +72,16 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
if (keyfileData.isEmpty()) {
raiseError(tr("Unable to read keyfile.").append("\n").append(keyfileDevice->errorString()));
- return Q_NULLPTR;
+ return nullptr;
}
if (!keyfileDevice->seek(0)) {
raiseError(tr("Unable to read keyfile.").append("\n").append(keyfileDevice->errorString()));
- return Q_NULLPTR;
+ return nullptr;
}
if (!newFileKey.load(keyfileDevice)) {
raiseError(tr("Unable to read keyfile.").append("\n").append(keyfileDevice->errorString()));
- return Q_NULLPTR;
+ return nullptr;
}
}
@@ -96,72 +96,72 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
quint32 signature1 = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok);
if (!ok || signature1 != KeePass1::SIGNATURE_1) {
raiseError(tr("Not a KeePass database."));
- return Q_NULLPTR;
+ return nullptr;
}
quint32 signature2 = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok);
if (!ok || signature2 != KeePass1::SIGNATURE_2) {
raiseError(tr("Not a KeePass database."));
- return Q_NULLPTR;
+ return nullptr;
}
m_encryptionFlags = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok);
if (!ok || !(m_encryptionFlags & KeePass1::Rijndael || m_encryptionFlags & KeePass1::Twofish)) {
raiseError(tr("Unsupported encryption algorithm."));
- return Q_NULLPTR;
+ return nullptr;
}
quint32 version = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok);
if (!ok || (version & KeePass1::FILE_VERSION_CRITICAL_MASK)
!= (KeePass1::FILE_VERSION & KeePass1::FILE_VERSION_CRITICAL_MASK)) {
raiseError(tr("Unsupported KeePass database version."));
- return Q_NULLPTR;
+ return nullptr;
}
m_masterSeed = m_device->read(16);
if (m_masterSeed.size() != 16) {
raiseError("Unable to read master seed");
- return Q_NULLPTR;
+ return nullptr;
}
m_encryptionIV = m_device->read(16);
if (m_encryptionIV.size() != 16) {
raiseError("Unable to read encryption IV");
- return Q_NULLPTR;
+ return nullptr;
}
quint32 numGroups = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok);
if (!ok) {
raiseError("Invalid number of groups");
- return Q_NULLPTR;
+ return nullptr;
}
quint32 numEntries = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok);
if (!ok) {
raiseError("Invalid number of entries");
- return Q_NULLPTR;
+ return nullptr;
}
m_contentHashHeader = m_device->read(32);
if (m_contentHashHeader.size() != 32) {
raiseError("Invalid content hash size");
- return Q_NULLPTR;
+ return nullptr;
}
m_transformSeed = m_device->read(32);
if (m_transformSeed.size() != 32) {
raiseError("Invalid transform seed size");
- return Q_NULLPTR;
+ return nullptr;
}
m_transformRounds = Endian::readUInt32(m_device, KeePass1::BYTEORDER, &ok);
if (!ok) {
raiseError("Invalid number of transform rounds");
- return Q_NULLPTR;
+ return nullptr;
}
if (!m_db->setTransformRounds(m_transformRounds)) {
raiseError(tr("Unable to calculate master key"));
- return Q_NULLPTR;
+ return nullptr;
}
qint64 contentPos = m_device->pos();
@@ -169,14 +169,14 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
QScopedPointer<SymmetricCipherStream> cipherStream(testKeys(password, keyfileData, contentPos));
if (!cipherStream) {
- return Q_NULLPTR;
+ return nullptr;
}
QList<Group*> groups;
for (quint32 i = 0; i < numGroups; i++) {
Group* group = readGroup(cipherStream.data());
if (!group) {
- return Q_NULLPTR;
+ return nullptr;
}
groups.append(group);
}
@@ -185,17 +185,17 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
for (quint32 i = 0; i < numEntries; i++) {
Entry* entry = readEntry(cipherStream.data());
if (!entry) {
- return Q_NULLPTR;
+ return nullptr;
}
entries.append(entry);
}
if (!constructGroupTree(groups)) {
raiseError("Unable to construct group tree");
- return Q_NULLPTR;
+ return nullptr;
}
- Q_FOREACH (Entry* entry, entries) {
+ for (Entry* entry : asConst(entries)) {
if (isMetaStream(entry)) {
parseMetaStream(entry);
@@ -215,7 +215,8 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
db->rootGroup()->setName(tr("Root"));
- Q_FOREACH (Group* group, db->rootGroup()->children()) {
+ const QList<Group*> children = db->rootGroup()->children();
+ for (Group* group : children) {
if (group->name() == "Backup") {
group->setSearchingEnabled(Group::Disable);
group->setAutoTypeEnabled(Group::Disable);
@@ -225,11 +226,12 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
Q_ASSERT(m_tmpParent->children().isEmpty());
Q_ASSERT(m_tmpParent->entries().isEmpty());
- Q_FOREACH (Group* group, groups) {
+ for (Group* group : asConst(groups)) {
group->setUpdateTimeinfo(true);
}
- Q_FOREACH (Entry* entry, m_db->rootGroup()->entriesRecursive()) {
+ const QList<Entry*> dbEntries = m_db->rootGroup()->entriesRecursive();
+ for (Entry* entry : dbEntries) {
entry->setUpdateTimeinfo(true);
}
@@ -243,7 +245,7 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
if (!db->setKey(key)) {
raiseError(tr("Unable to calculate master key"));
- return Q_NULLPTR;
+ return nullptr;
}
return db.take();
@@ -257,7 +259,7 @@ Database* KeePass1Reader::readDatabase(QIODevice* device, const QString& passwor
keyFile.reset(new QFile(keyfileName));
if (!keyFile->open(QFile::ReadOnly)) {
raiseError(keyFile->errorString());
- return Q_NULLPTR;
+ return nullptr;
}
}
@@ -272,14 +274,14 @@ Database* KeePass1Reader::readDatabase(const QString& filename, const QString& p
QFile dbFile(filename);
if (!dbFile.open(QFile::ReadOnly)) {
raiseError(dbFile.errorString());
- return Q_NULLPTR;
+ return nullptr;
}
Database* db = readDatabase(&dbFile, password, keyfileName);
if (dbFile.error() != QFile::NoError) {
raiseError(dbFile.errorString());
- return Q_NULLPTR;
+ return nullptr;
}
return db;
@@ -298,15 +300,14 @@ QString KeePass1Reader::errorString()
SymmetricCipherStream* KeePass1Reader::testKeys(const QString& password, const QByteArray& keyfileData,
qint64 contentPos)
{
- QList<PasswordEncoding> encodings;
- encodings << Windows1252 << Latin1 << UTF8;
+ const QList<PasswordEncoding> encodings = { Windows1252, Latin1, UTF8 };
QScopedPointer<SymmetricCipherStream> cipherStream;
QByteArray passwordData;
QTextCodec* codec = QTextCodec::codecForName("Windows-1252");
QByteArray passwordDataCorrect = codec->fromUnicode(password);
- Q_FOREACH (PasswordEncoding encoding, encodings) {
+ for (PasswordEncoding encoding : encodings) {
if (encoding == Windows1252) {
passwordData = passwordDataCorrect;
}
@@ -337,7 +338,7 @@ SymmetricCipherStream* KeePass1Reader::testKeys(const QString& password, const Q
QByteArray finalKey = key(passwordData, keyfileData);
if (finalKey.isEmpty()) {
- return Q_NULLPTR;
+ return nullptr;
}
if (m_encryptionFlags & KeePass1::Rijndael) {
cipherStream.reset(new SymmetricCipherStream(m_device, SymmetricCipher::Aes256,
@@ -350,11 +351,11 @@ SymmetricCipherStream* KeePass1Reader::testKeys(const QString& password, const Q
if (!cipherStream->init(finalKey, m_encryptionIV)) {
raiseError(cipherStream->errorString());
- return Q_NULLPTR;
+ return nullptr;
}
if (!cipherStream->open(QIODevice::ReadOnly)) {
raiseError(cipherStream->errorString());
- return Q_NULLPTR;
+ return nullptr;
}
bool success = verifyKey(cipherStream.data());
@@ -368,7 +369,7 @@ SymmetricCipherStream* KeePass1Reader::testKeys(const QString& password, const Q
}
raiseError(msg);
- return Q_NULLPTR;
+ return nullptr;
}
cipherStream->open(QIODevice::ReadOnly);
@@ -446,19 +447,19 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
quint16 fieldType = Endian::readUInt16(cipherStream, KeePass1::BYTEORDER, &ok);
if (!ok) {
raiseError("Invalid group field type number");
- return Q_NULLPTR;
+ return nullptr;
}
int fieldSize = static_cast<int>(Endian::readUInt32(cipherStream, KeePass1::BYTEORDER, &ok));
if (!ok) {
raiseError("Invalid group field size");
- return Q_NULLPTR;
+ return nullptr;
}
QByteArray fieldData = cipherStream->read(fieldSize);
if (fieldData.size() != fieldSize) {
raiseError("Read group field data doesn't match size");
- return Q_NULLPTR;
+ return nullptr;
}
switch (fieldType) {
@@ -468,7 +469,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
case 0x0001:
if (fieldSize != 4) {
raiseError("Incorrect group id field size");
- return Q_NULLPTR;
+ return nullptr;
}
groupId = Endian::bytesToUInt32(fieldData, KeePass1::BYTEORDER);
groupIdSet = true;
@@ -480,7 +481,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
{
if (fieldSize != 5) {
raiseError("Incorrect group creation time field size");
- return Q_NULLPTR;
+ return nullptr;
}
QDateTime dateTime = dateFromPackedStruct(fieldData);
if (dateTime.isValid()) {
@@ -492,7 +493,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
{
if (fieldSize != 5) {
raiseError("Incorrect group modification time field size");
- return Q_NULLPTR;
+ return nullptr;
}
QDateTime dateTime = dateFromPackedStruct(fieldData);
if (dateTime.isValid()) {
@@ -527,7 +528,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
{
if (fieldSize != 4) {
raiseError("Incorrect group icon field size");
- return Q_NULLPTR;
+ return nullptr;
}
quint32 iconNumber = Endian::bytesToUInt32(fieldData, KeePass1::BYTEORDER);
group->setIcon(iconNumber);
@@ -537,7 +538,7 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
{
if (fieldSize != 2) {
raiseError("Incorrect group level field size");
- return Q_NULLPTR;
+ return nullptr;
}
groupLevel = Endian::bytesToUInt16(fieldData, KeePass1::BYTEORDER);
groupLevelSet = true;
@@ -552,13 +553,13 @@ Group* KeePass1Reader::readGroup(QIODevice* cipherStream)
default:
// invalid field
raiseError("Invalid group field type");
- return Q_NULLPTR;
+ return nullptr;
}
} while (!reachedEnd);
if (!groupIdSet || !groupLevelSet) {
raiseError("Missing group id or level");
- return Q_NULLPTR;
+ return nullptr;
}
group->setUuid(Uuid::random());
@@ -584,19 +585,19 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
quint16 fieldType = Endian::readUInt16(cipherStream, KeePass1::BYTEORDER, &ok);
if (!ok) {
raiseError("Missing entry field type number");
- return Q_NULLPTR;
+ return nullptr;
}
int fieldSize = static_cast<int>(Endian::readUInt32(cipherStream, KeePass1::BYTEORDER, &ok));
if (!ok) {
raiseError("Invalid entry field size");
- return Q_NULLPTR;
+ return nullptr;
}
QByteArray fieldData = cipherStream->read(fieldSize);
if (fieldData.size() != fieldSize) {
raiseError("Read entry field data doesn't match size");
- return Q_NULLPTR;
+ return nullptr;
}
switch (fieldType) {
@@ -606,7 +607,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
case 0x0001:
if (fieldSize != 16) {
raiseError("Invalid entry uuid field size");
- return Q_NULLPTR;
+ return nullptr;
}
m_entryUuids.insert(fieldData, entry.data());
break;
@@ -614,7 +615,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
{
if (fieldSize != 4) {
raiseError("Invalid entry group id field size");
- return Q_NULLPTR;
+ return nullptr;
}
quint32 groupId = Endian::bytesToUInt32(fieldData, KeePass1::BYTEORDER);
m_entryGroupIds.insert(entry.data(), groupId);
@@ -624,7 +625,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
{
if (fieldSize != 4) {
raiseError("Invalid entry icon field size");
- return Q_NULLPTR;
+ return nullptr;
}
quint32 iconNumber = Endian::bytesToUInt32(fieldData, KeePass1::BYTEORDER);
entry->setIcon(iconNumber);
@@ -649,7 +650,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
{
if (fieldSize != 5) {
raiseError("Invalid entry creation time field size");
- return Q_NULLPTR;
+ return nullptr;
}
QDateTime dateTime = dateFromPackedStruct(fieldData);
if (dateTime.isValid()) {
@@ -661,7 +662,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
{
if (fieldSize != 5) {
raiseError("Invalid entry modification time field size");
- return Q_NULLPTR;
+ return nullptr;
}
QDateTime dateTime = dateFromPackedStruct(fieldData);
if (dateTime.isValid()) {
@@ -673,7 +674,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
{
if (fieldSize != 5) {
raiseError("Invalid entry creation time field size");
- return Q_NULLPTR;
+ return nullptr;
}
QDateTime dateTime = dateFromPackedStruct(fieldData);
if (dateTime.isValid()) {
@@ -685,7 +686,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
{
if (fieldSize != 5) {
raiseError("Invalid entry expiry time field size");
- return Q_NULLPTR;
+ return nullptr;
}
QDateTime dateTime = dateFromPackedStruct(fieldData);
if (dateTime.isValid()) {
@@ -708,7 +709,7 @@ Entry* KeePass1Reader::readEntry(QIODevice* cipherStream)
default:
// invalid field
raiseError("Invalid entry field type");
- return Q_NULLPTR;
+ return nullptr;
}
} while (!reachedEnd);
@@ -727,7 +728,8 @@ void KeePass1Reader::parseNotes(const QString& rawNotes, Entry* entry)
QStringList notes;
bool lastLineAutoType = false;
- Q_FOREACH (QString line, rawNotes.split("\n")) {
+ const QStringList rawNotesLines = rawNotes.split("\n");
+ for (QString line : rawNotesLines) {
line.remove("\r");
if (sequenceRegexp.exactMatch(line)) {
@@ -769,8 +771,9 @@ void KeePass1Reader::parseNotes(const QString& rawNotes, Entry* entry)
i.next();
QString sequence = sequences.value(i.key());
+ const QStringList windowList = i.value();
- Q_FOREACH (const QString& window, i.value()) {
+ for (const QString& window : windowList) {
AutoTypeAssociations::Association assoc;
assoc.window = window;
assoc.sequence = sequence;
diff --git a/src/format/KeePass2RandomStream.h b/src/format/KeePass2RandomStream.h
index 022c839..584d738 100644
--- a/src/format/KeePass2RandomStream.h
+++ b/src/format/KeePass2RandomStream.h
@@ -29,7 +29,7 @@ public:
bool init(const QByteArray& key);
QByteArray randomBytes(int size, bool* ok);
QByteArray process(const QByteArray& data, bool* ok);
- bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT;
+ Q_REQUIRED_RESULT bool processInPlace(QByteArray& data);
QString errorString() const;
private:
diff --git a/src/format/KeePass2Reader.cpp b/src/format/KeePass2Reader.cpp
index d665bf5..b0247f7 100644
--- a/src/format/KeePass2Reader.cpp
+++ b/src/format/KeePass2Reader.cpp
@@ -34,12 +34,12 @@
#include "streams/SymmetricCipherStream.h"
KeePass2Reader::KeePass2Reader()
- : m_device(Q_NULLPTR)
- , m_headerStream(Q_NULLPTR)
+ : m_device(nullptr)
+ , m_headerStream(nullptr)
, m_error(false)
, m_headerEnd(false)
, m_saveXml(false)
- , m_db(Q_NULLPTR)
+ , m_db(nullptr)
{
}
@@ -67,7 +67,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
quint32 signature1 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok);
if (!ok || signature1 != KeePass2::SIGNATURE_1) {
raiseError(tr("Not a KeePass database."));
- return Q_NULLPTR;
+ return nullptr;
}
quint32 signature2 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok);
@@ -76,11 +76,11 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
"You can import it by clicking on Database > 'Import KeePass 1 database'.\n"
"This is a one-way migration. You won't be able to open the imported "
"database with the old KeePassX 0.4 version."));
- return Q_NULLPTR;
+ return nullptr;
}
else if (!ok || signature2 != KeePass2::SIGNATURE_2) {
raiseError(tr("Not a KeePass database."));
- return Q_NULLPTR;
+ return nullptr;
}
quint32 version = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok)
@@ -88,7 +88,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
quint32 maxVersion = KeePass2::FILE_VERSION & KeePass2::FILE_VERSION_CRITICAL_MASK;
if (!ok || (version < KeePass2::FILE_VERSION_MIN) || (version > maxVersion)) {
raiseError(tr("Unsupported KeePass database version."));
- return Q_NULLPTR;
+ return nullptr;
}
while (readHeaderField() && !hasError()) {
@@ -97,7 +97,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
headerStream.close();
if (hasError()) {
- return Q_NULLPTR;
+ return nullptr;
}
// check if all required headers were present
@@ -105,12 +105,12 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
|| m_streamStartBytes.isEmpty() || m_protectedStreamKey.isEmpty()
|| m_db->cipher().isNull()) {
raiseError("missing database headers");
- return Q_NULLPTR;
+ return nullptr;
}
if (!m_db->setKey(key, m_transformSeed, false)) {
raiseError(tr("Unable to calculate master key"));
- return Q_NULLPTR;
+ return nullptr;
}
CryptoHash hash(CryptoHash::Sha256);
@@ -122,24 +122,24 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
SymmetricCipher::Cbc, SymmetricCipher::Decrypt);
if (!cipherStream.init(finalKey, m_encryptionIV)) {
raiseError(cipherStream.errorString());
- return Q_NULLPTR;
+ return nullptr;
}
if (!cipherStream.open(QIODevice::ReadOnly)) {
raiseError(cipherStream.errorString());
- return Q_NULLPTR;
+ return nullptr;
}
QByteArray realStart = cipherStream.read(32);
if (realStart != m_streamStartBytes) {
raiseError(tr("Wrong key or database file is corrupt."));
- return Q_NULLPTR;
+ return nullptr;
}
HashedBlockStream hashedStream(&cipherStream);
if (!hashedStream.open(QIODevice::ReadOnly)) {
raiseError(hashedStream.errorString());
- return Q_NULLPTR;
+ return nullptr;
}
QIODevice* xmlDevice;
@@ -153,7 +153,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
ioCompressor->setStreamFormat(QtIOCompressor::GzipFormat);
if (!ioCompressor->open(QIODevice::ReadOnly)) {
raiseError(ioCompressor->errorString());
- return Q_NULLPTR;
+ return nullptr;
}
xmlDevice = ioCompressor.data();
}
@@ -161,7 +161,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
KeePass2RandomStream randomStream;
if (!randomStream.init(m_protectedStreamKey)) {
raiseError(randomStream.errorString());
- return Q_NULLPTR;
+ return nullptr;
}
QScopedPointer<QBuffer> buffer;
@@ -182,7 +182,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
return db.take();
}
else {
- return Q_NULLPTR;
+ return nullptr;
}
}
@@ -192,7 +192,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
QByteArray headerHash = CryptoHash::hash(headerStream.storedData(), CryptoHash::Sha256);
if (headerHash != xmlReader.headerHash()) {
raiseError("Header doesn't match hash");
- return Q_NULLPTR;
+ return nullptr;
}
}
@@ -204,14 +204,14 @@ Database* KeePass2Reader::readDatabase(const QString& filename, const CompositeK
QFile file(filename);
if (!file.open(QFile::ReadOnly)) {
raiseError(file.errorString());
- return Q_NULLPTR;
+ return nullptr;
}
QScopedPointer<Database> db(readDatabase(&file, key));
if (file.error() != QFile::NoError) {
raiseError(file.errorString());
- return Q_NULLPTR;
+ return nullptr;
}
return db.take();
diff --git a/src/format/KeePass2Repair.cpp b/src/format/KeePass2Repair.cpp
index f435a7d..81ada2f 100644
--- a/src/format/KeePass2Repair.cpp
+++ b/src/format/KeePass2Repair.cpp
@@ -25,13 +25,13 @@
#include "format/KeePass2XmlReader.h"
KeePass2Repair::KeePass2Repair()
- : m_db(Q_NULLPTR)
+ : m_db(nullptr)
{
}
KeePass2Repair::RepairResult KeePass2Repair::repairDatabase(QIODevice* device, const CompositeKey& key)
{
- m_db = Q_NULLPTR;
+ m_db = nullptr;
m_errorStr.clear();
KeePass2Reader reader;
diff --git a/src/format/KeePass2XmlReader.cpp b/src/format/KeePass2XmlReader.cpp
index 2e76c2a..659c706 100644
--- a/src/format/KeePass2XmlReader.cpp
+++ b/src/format/KeePass2XmlReader.cpp
@@ -31,10 +31,10 @@
typedef QPair<QString, QString> StringPair;
KeePass2XmlReader::KeePass2XmlReader()
- : m_randomStream(Q_NULLPTR)
- , m_db(Q_NULLPTR)
- , m_meta(Q_NULLPTR)
- , m_tmpParent(Q_NULLPTR)
+ : m_randomStream(nullptr)
+ , m_db(nullptr)
+ , m_meta(nullptr)
+ , m_tmpParent(nullptr)
, m_error(false)
, m_strictMode(false)
{
@@ -86,17 +86,17 @@ void KeePass2XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Ra
}
}
- QSet<QString> poolKeys = m_binaryPool.keys().toSet();
- QSet<QString> entryKeys = m_binaryMap.keys().toSet();
- QSet<QString> unmappedKeys = entryKeys - poolKeys;
- QSet<QString> unusedKeys = poolKeys - entryKeys;
+ const QSet<QString> poolKeys = m_binaryPool.keys().toSet();
+ const QSet<QString> entryKeys = m_binaryMap.keys().toSet();
+ const QSet<QString> unmappedKeys = entryKeys - poolKeys;
+ const QSet<QString> unusedKeys = poolKeys - entryKeys;
if (!unmappedKeys.isEmpty()) {
raiseError("Unmapped keys left.");
}
if (!m_xml.error()) {
- Q_FOREACH (const QString& key, unusedKeys) {
+ for (const QString& key : unusedKeys) {
qWarning("KeePass2XmlReader::readDatabase: found unused key \"%s\"", qPrintable(key));
}
}
@@ -118,7 +118,8 @@ void KeePass2XmlReader::readDatabase(QIODevice* device, Database* db, KeePass2Ra
for (iEntry = m_entries.constBegin(); iEntry != m_entries.constEnd(); ++iEntry) {
iEntry.value()->setUpdateTimeinfo(true);
- Q_FOREACH (Entry* histEntry, iEntry.value()->historyItems()) {
+ const QList<Entry*> historyItems = iEntry.value()->historyItems();
+ for (Entry* histEntry : historyItems) {
histEntry->setUpdateTimeinfo(true);
}
}
@@ -387,7 +388,7 @@ void KeePass2XmlReader::parseBinaries()
QString id = attr.value("ID").toString();
QByteArray data;
- if (attr.value("Compressed").compare("True", Qt::CaseInsensitive) == 0) {
+ if (attr.value("Compressed").compare(QLatin1String("True"), Qt::CaseInsensitive) == 0) {
data = readCompressedBinary();
}
else {
@@ -614,11 +615,11 @@ Group* KeePass2XmlReader::parseGroup()
raiseError("No group uuid found");
}
- Q_FOREACH (Group* child, children) {
+ for (Group* child : asConst(children)) {
child->setParent(group);
}
- Q_FOREACH (Entry* entry, entries) {
+ for (Entry* entry : asConst(entries)) {
entry->setGroup(group);
}
@@ -777,7 +778,7 @@ Entry* KeePass2XmlReader::parseEntry(bool history)
raiseError("No entry uuid found");
}
- Q_FOREACH (Entry* historyItem, historyItems) {
+ for (Entry* historyItem : asConst(historyItems)) {
if (historyItem->uuid() != entry->uuid()) {
if (m_strictMode) {
raiseError("History element with different uuid");
@@ -788,7 +789,7 @@ Entry* KeePass2XmlReader::parseEntry(bool history)
entry->addHistoryItem(historyItem);
}
- Q_FOREACH (const StringPair& ref, binaryRefs) {
+ for (const StringPair& ref : asConst(binaryRefs)) {
m_binaryMap.insertMulti(ref.first, qMakePair(entry, ref.second));
}
@@ -1052,7 +1053,7 @@ QDateTime KeePass2XmlReader::readDateTime()
raiseError("Invalid date time value");
}
else {
- dt = Tools::currentDateTimeUtc();
+ dt = QDateTime::currentDateTimeUtc();
}
}
@@ -1153,7 +1154,7 @@ QByteArray KeePass2XmlReader::readCompressedBinary()
Group* KeePass2XmlReader::getGroup(const Uuid& uuid)
{
if (uuid.isNull()) {
- return Q_NULLPTR;
+ return nullptr;
}
if (m_groups.contains(uuid)) {
@@ -1172,7 +1173,7 @@ Group* KeePass2XmlReader::getGroup(const Uuid& uuid)
Entry* KeePass2XmlReader::getEntry(const Uuid& uuid)
{
if (uuid.isNull()) {
- return Q_NULLPTR;
+ return nullptr;
}
if (m_entries.contains(uuid)) {
diff --git a/src/format/KeePass2XmlReader.h b/src/format/KeePass2XmlReader.h
index ca311b0..d2e0e00 100644
--- a/src/format/KeePass2XmlReader.h
+++ b/src/format/KeePass2XmlReader.h
@@ -25,7 +25,6 @@
#include <QPair>
#include <QXmlStreamReader>
-#include "core/Global.h"
#include "core/TimeInfo.h"
#include "core/Uuid.h"
@@ -42,7 +41,7 @@ class KeePass2XmlReader
public:
KeePass2XmlReader();
Database* readDatabase(QIODevice* device);
- void readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = Q_NULLPTR);
+ void readDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr);
Database* readDatabase(const QString& filename);
bool hasError();
QString errorString();
diff --git a/src/format/KeePass2XmlWriter.cpp b/src/format/KeePass2XmlWriter.cpp
index 1eb8dc1..6c92c4b 100644
--- a/src/format/KeePass2XmlWriter.cpp
+++ b/src/format/KeePass2XmlWriter.cpp
@@ -25,9 +25,9 @@
#include "streams/QtIOCompressor"
KeePass2XmlWriter::KeePass2XmlWriter()
- : m_db(Q_NULLPTR)
- , m_meta(Q_NULLPTR)
- , m_randomStream(Q_NULLPTR)
+ : m_db(nullptr)
+ , m_meta(nullptr)
+ , m_randomStream(nullptr)
, m_error(false)
{
m_xml.setAutoFormatting(true);
@@ -58,11 +58,9 @@ void KeePass2XmlWriter::writeDatabase(QIODevice* device, Database* db, KeePass2R
m_xml.writeEndDocument();
-#if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0)
if (m_xml.hasError()) {
raiseError(device->errorString());
}
-#endif
}
void KeePass2XmlWriter::writeDatabase(const QString& filename, Database* db)
@@ -84,11 +82,12 @@ QString KeePass2XmlWriter::errorString()
void KeePass2XmlWriter::generateIdMap()
{
- QList<Entry*> allEntries = m_db->rootGroup()->entriesRecursive(true);
+ const QList<Entry*> allEntries = m_db->rootGroup()->entriesRecursive(true);
int nextId = 0;
- Q_FOREACH (Entry* entry, allEntries) {
- Q_FOREACH (const QString& key, entry->attachments()->keys()) {
+ for (Entry* entry : allEntries) {
+ const QList<QString> attachmentKeys = entry->attachments()->keys();
+ for (const QString& key : attachmentKeys) {
QByteArray data = entry->attachments()->value(key);
if (!m_idMap.contains(data)) {
m_idMap.insert(data, nextId++);
@@ -151,7 +150,8 @@ void KeePass2XmlWriter::writeCustomIcons()
{
m_xml.writeStartElement("CustomIcons");
- Q_FOREACH (const Uuid& uuid, m_meta->customIconsOrder()) {
+ const QList<Uuid> customIconsOrder = m_meta->customIconsOrder();
+ for (const Uuid& uuid : customIconsOrder) {
writeIcon(uuid, m_meta->customIcon(uuid));
}
@@ -222,7 +222,8 @@ void KeePass2XmlWriter::writeCustomData()
m_xml.writeStartElement("CustomData");
QHash<QString, QString> customFields = m_meta->customFields();
- Q_FOREACH (const QString& key, customFields.keys()) {
+ const QList<QString> keyList = customFields.keys();
+ for (const QString& key : keyList) {
writeCustomDataItem(key, customFields.value(key));
}
@@ -275,11 +276,13 @@ void KeePass2XmlWriter::writeGroup(const Group* group)
writeUuid("LastTopVisibleEntry", group->lastTopVisibleEntry());
- Q_FOREACH (const Entry* entry, group->entries()) {
+ const QList<Entry*> entryList = group->entries();
+ for (const Entry* entry : entryList) {
writeEntry(entry);
}
- Q_FOREACH (const Group* child, group->children()) {
+ const QList<Group*> children = group->children();
+ for (const Group* child : children) {
writeGroup(child);
}
@@ -305,7 +308,8 @@ void KeePass2XmlWriter::writeDeletedObjects()
{
m_xml.writeStartElement("DeletedObjects");
- Q_FOREACH (const DeletedObject& delObj, m_db->deletedObjects()) {
+ const QList<DeletedObject> delObjList = m_db->deletedObjects();
+ for (const DeletedObject& delObj : delObjList) {
writeDeletedObject(delObj);
}
@@ -339,7 +343,8 @@ void KeePass2XmlWriter::writeEntry(const Entry* entry)
writeString("Tags", entry->tags());
writeTimes(entry->timeInfo());
- Q_FOREACH (const QString& key, entry->attributes()->keys()) {
+ const QList<QString> attributesKeyList = entry->attributes()->keys();
+ for (const QString& key : attributesKeyList) {
m_xml.writeStartElement("String");
bool protect = ( ((key == "Title") && m_meta->protectTitle()) ||
@@ -381,7 +386,8 @@ void KeePass2XmlWriter::writeEntry(const Entry* entry)
m_xml.writeEndElement();
}
- Q_FOREACH (const QString& key, entry->attachments()->keys()) {
+ const QList<QString> attachmentsKeyList = entry->attachments()->keys();
+ for (const QString& key : attachmentsKeyList) {
m_xml.writeStartElement("Binary");
writeString("Key", key);
@@ -410,7 +416,8 @@ void KeePass2XmlWriter::writeAutoType(const Entry* entry)
writeNumber("DataTransferObfuscation", entry->autoTypeObfuscation());
writeString("DefaultSequence", entry->defaultAutoTypeSequence());
- Q_FOREACH (const AutoTypeAssociations::Association& assoc, entry->autoTypeAssociations()->getAll()) {
+ const QList<AutoTypeAssociations::Association> autoTypeAssociations = entry->autoTypeAssociations()->getAll();
+ for (const AutoTypeAssociations::Association& assoc : autoTypeAssociations) {
writeAutoTypeAssoc(assoc);
}
@@ -432,7 +439,7 @@ void KeePass2XmlWriter::writeEntryHistory(const Entry* entry)
m_xml.writeStartElement("History");
const QList<Entry*>& historyItems = entry->historyItems();
- Q_FOREACH (const Entry* item, historyItems) {
+ for (const Entry* item : historyItems) {
writeEntry(item);
}
diff --git a/src/format/KeePass2XmlWriter.h b/src/format/KeePass2XmlWriter.h
index 48dde6a..23e148d 100644
--- a/src/format/KeePass2XmlWriter.h
+++ b/src/format/KeePass2XmlWriter.h
@@ -36,7 +36,7 @@ class KeePass2XmlWriter
{
public:
KeePass2XmlWriter();
- void writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = Q_NULLPTR,
+ void writeDatabase(QIODevice* device, Database* db, KeePass2RandomStream* randomStream = nullptr,
const QByteArray& headerHash = QByteArray());
void writeDatabase(const QString& filename, Database* db);
bool hasError();
diff --git a/src/gui/AboutDialog.h b/src/gui/AboutDialog.h
index 1436aee..08db6c8 100644
--- a/src/gui/AboutDialog.h
+++ b/src/gui/AboutDialog.h
@@ -21,8 +21,6 @@
#include <QDialog>
#include <QScopedPointer>
-#include "core/Global.h"
-
namespace Ui {
class AboutDialog;
}
@@ -32,7 +30,7 @@ class AboutDialog : public QDialog
Q_OBJECT
public:
- explicit AboutDialog(QWidget* parent = Q_NULLPTR);
+ explicit AboutDialog(QWidget* parent = nullptr);
~AboutDialog();
private:
diff --git a/src/gui/Application.cpp b/src/gui/Application.cpp
index ae6931f..70550c5 100644
--- a/src/gui/Application.cpp
+++ b/src/gui/Application.cpp
@@ -18,14 +18,38 @@
#include "Application.h"
+#include <QAbstractNativeEventFilter>
#include <QFileOpenEvent>
#include "autotype/AutoType.h"
+#if defined(Q_OS_UNIX) && !defined(Q_OS_OSX)
+class XcbEventFilter : public QAbstractNativeEventFilter
+{
+public:
+ bool nativeEventFilter(const QByteArray& eventType, void* message, long* result) override
+ {
+ Q_UNUSED(result)
+
+ if (eventType == QByteArrayLiteral("xcb_generic_event_t")) {
+ int retCode = autoType()->callEventFilter(message);
+ if (retCode == 1) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+};
+#endif
+
Application::Application(int& argc, char** argv)
: QApplication(argc, argv)
- , m_mainWindow(Q_NULLPTR)
+ , m_mainWindow(nullptr)
{
+#if defined(Q_OS_UNIX) && !defined(Q_OS_OSX)
+ installNativeEventFilter(new XcbEventFilter());
+#endif
}
void Application::setMainWindow(QWidget* mainWindow)
@@ -53,19 +77,3 @@ bool Application::event(QEvent* event)
return QApplication::event(event);
}
-
-#ifdef Q_WS_X11
-bool Application::x11EventFilter(XEvent* event)
-{
- int retCode = autoType()->callEventFilter(event);
-
- if (retCode == 0) {
- return false;
- }
- else if (retCode == 1) {
- return true;
- }
-
- return QApplication::x11EventFilter(event);
-}
-#endif
diff --git a/src/gui/Application.h b/src/gui/Application.h
index 2b78998..149b61d 100644
--- a/src/gui/Application.h
+++ b/src/gui/Application.h
@@ -21,8 +21,6 @@
#include <QApplication>
-#include "core/Global.h"
-
class Application : public QApplication
{
Q_OBJECT
@@ -31,10 +29,7 @@ public:
Application(int& argc, char** argv);
void setMainWindow(QWidget* mainWindow);
- bool event(QEvent* event) Q_DECL_OVERRIDE;
-#ifdef Q_WS_X11
- bool x11EventFilter(XEvent* event) Q_DECL_OVERRIDE;
-#endif
+ bool event(QEvent* event) override;
Q_SIGNALS:
void openFile(const QString& filename);
diff --git a/src/gui/ChangeMasterKeyWidget.h b/src/gui/ChangeMasterKeyWidget.h
index 46fc3ef..8985ff7 100644
--- a/src/gui/ChangeMasterKeyWidget.h
+++ b/src/gui/ChangeMasterKeyWidget.h
@@ -33,7 +33,7 @@ class ChangeMasterKeyWidget : public DialogyWidget
Q_OBJECT
public:
- explicit ChangeMasterKeyWidget(QWidget* parent = Q_NULLPTR);
+ explicit ChangeMasterKeyWidget(QWidget* parent = nullptr);
~ChangeMasterKeyWidget();
void clearForms();
CompositeKey newMasterKey();
diff --git a/src/gui/Clipboard.cpp b/src/gui/Clipboard.cpp
index 698ca89..bf4db8f 100644
--- a/src/gui/Clipboard.cpp
+++ b/src/gui/Clipboard.cpp
@@ -23,7 +23,7 @@
#include "core/Config.h"
-Clipboard* Clipboard::m_instance(Q_NULLPTR);
+Clipboard* Clipboard::m_instance(nullptr);
Clipboard::Clipboard(QObject* parent)
: QObject(parent)
diff --git a/src/gui/Clipboard.h b/src/gui/Clipboard.h
index 8c234a2..dafce70 100644
--- a/src/gui/Clipboard.h
+++ b/src/gui/Clipboard.h
@@ -20,8 +20,6 @@
#include <QObject>
-#include "core/Global.h"
-
class QTimer;
class Clipboard : public QObject
@@ -40,7 +38,7 @@ private Q_SLOTS:
void clearClipboard();
private:
- explicit Clipboard(QObject* parent = Q_NULLPTR);
+ explicit Clipboard(QObject* parent = nullptr);
static Clipboard* m_instance;
diff --git a/src/gui/DatabaseOpenWidget.cpp b/src/gui/DatabaseOpenWidget.cpp
index 9647f88..6b90893 100644
--- a/src/gui/DatabaseOpenWidget.cpp
+++ b/src/gui/DatabaseOpenWidget.cpp
@@ -30,7 +30,7 @@
DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
: DialogyWidget(parent)
, m_ui(new Ui::DatabaseOpenWidget())
- , m_db(Q_NULLPTR)
+ , m_db(nullptr)
{
m_ui->setupUi(this);
diff --git a/src/gui/DatabaseOpenWidget.h b/src/gui/DatabaseOpenWidget.h
index 9c9a062..ba55e4c 100644
--- a/src/gui/DatabaseOpenWidget.h
+++ b/src/gui/DatabaseOpenWidget.h
@@ -35,7 +35,7 @@ class DatabaseOpenWidget : public DialogyWidget
Q_OBJECT
public:
- explicit DatabaseOpenWidget(QWidget* parent = Q_NULLPTR);
+ explicit DatabaseOpenWidget(QWidget* parent = nullptr);
~DatabaseOpenWidget();
void load(const QString& filename);
void enterKey(const QString& pw, const QString& keyFile);
diff --git a/src/gui/DatabaseRepairWidget.h b/src/gui/DatabaseRepairWidget.h
index 56c5c96..6775d2d 100644
--- a/src/gui/DatabaseRepairWidget.h
+++ b/src/gui/DatabaseRepairWidget.h
@@ -25,14 +25,14 @@ class DatabaseRepairWidget : public DatabaseOpenWidget
Q_OBJECT
public:
- explicit DatabaseRepairWidget(QWidget* parent = Q_NULLPTR);
+ explicit DatabaseRepairWidget(QWidget* parent = nullptr);
Q_SIGNALS:
void success();
void error();
protected:
- void openDatabase() Q_DECL_OVERRIDE;
+ void openDatabase() override;
private Q_SLOTS:
void processEditFinished(bool result);
diff --git a/src/gui/DatabaseSettingsWidget.cpp b/src/gui/DatabaseSettingsWidget.cpp
index 007c44a..b0759bf 100644
--- a/src/gui/DatabaseSettingsWidget.cpp
+++ b/src/gui/DatabaseSettingsWidget.cpp
@@ -26,7 +26,7 @@
DatabaseSettingsWidget::DatabaseSettingsWidget(QWidget* parent)
: DialogyWidget(parent)
, m_ui(new Ui::DatabaseSettingsWidget())
- , m_db(Q_NULLPTR)
+ , m_db(nullptr)
{
m_ui->setupUi(this);
@@ -139,8 +139,8 @@ void DatabaseSettingsWidget::transformRoundsBenchmark()
void DatabaseSettingsWidget::truncateHistories()
{
- QList<Entry*> allEntries = m_db->rootGroup()->entriesRecursive(false);
- Q_FOREACH (Entry* entry, allEntries) {
+ const QList<Entry*> allEntries = m_db->rootGroup()->entriesRecursive(false);
+ for (Entry* entry : allEntries) {
entry->truncateHistory();
}
}
diff --git a/src/gui/DatabaseSettingsWidget.h b/src/gui/DatabaseSettingsWidget.h
index a7d2832..040e0db 100644
--- a/src/gui/DatabaseSettingsWidget.h
+++ b/src/gui/DatabaseSettingsWidget.h
@@ -33,7 +33,7 @@ class DatabaseSettingsWidget : public DialogyWidget
Q_OBJECT
public:
- explicit DatabaseSettingsWidget(QWidget* parent = Q_NULLPTR);
+ explicit DatabaseSettingsWidget(QWidget* parent = nullptr);
~DatabaseSettingsWidget();
void load(Database* db);
diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp
index 65c5430..1abb6b4 100644
--- a/src/gui/DatabaseTabWidget.cpp
+++ b/src/gui/DatabaseTabWidget.cpp
@@ -18,6 +18,8 @@
#include "DatabaseTabWidget.h"
#include <QFileInfo>
+#include <QLockFile>
+#include <QSaveFile>
#include <QTabWidget>
#include "autotype/AutoType.h"
@@ -25,7 +27,6 @@
#include "core/Database.h"
#include "core/Group.h"
#include "core/Metadata.h"
-#include "core/qsavefile.h"
#include "format/CsvExporter.h"
#include "gui/Clipboard.h"
#include "gui/DatabaseWidget.h"
@@ -37,8 +38,8 @@
#include "gui/group/GroupView.h"
DatabaseManagerStruct::DatabaseManagerStruct()
- : dbWidget(Q_NULLPTR)
- , lockFile(Q_NULLPTR)
+ : dbWidget(nullptr)
+ , lockFile(nullptr)
, saveToFilename(false)
, modified(false)
, readOnly(false)
@@ -159,7 +160,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
if (result == QMessageBox::No) {
dbStruct.readOnly = true;
delete lockFile;
- lockFile = Q_NULLPTR;
+ lockFile = nullptr;
}
else {
// take over the lock file if possible
@@ -222,7 +223,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db)
if (dbName.right(1) == "*") {
dbName.chop(1);
}
- if (dbStruct.dbWidget->isInEditMode() && db->hasKey()) {
+ if (dbStruct.dbWidget->isInEditMode() && db->hasKey() && dbStruct.dbWidget->isEditWidgetModified()) {
QMessageBox::StandardButton result =
MessageBox::question(
this, tr("Close?"),
@@ -336,7 +337,7 @@ bool DatabaseTabWidget::saveDatabaseAs(Database* db)
}
QString fileName = fileDialog()->getSaveFileName(this, tr("Save database as"),
oldFileName, tr("KeePass 2 Database").append(" (*.kdbx)"),
- Q_NULLPTR, 0, "kdbx");
+ nullptr, 0, "kdbx");
if (!fileName.isEmpty()) {
QFileInfo fileInfo(fileName);
QString lockFilePath;
@@ -460,7 +461,7 @@ void DatabaseTabWidget::exportToCsv()
QString fileName = fileDialog()->getSaveFileName(this, tr("Export database to CSV file"),
QString(), tr("CSV file").append(" (*.csv)"),
- Q_NULLPTR, 0, "csv");
+ nullptr, 0, "csv");
if (fileName.isEmpty()) {
return;
}
@@ -565,7 +566,7 @@ Database* DatabaseTabWidget::indexDatabase(int index)
}
}
- return Q_NULLPTR;
+ return nullptr;
}
DatabaseManagerStruct DatabaseTabWidget::indexDatabaseManagerStruct(int index)
@@ -593,7 +594,7 @@ Database* DatabaseTabWidget::databaseFromDatabaseWidget(DatabaseWidget* dbWidget
}
}
- return Q_NULLPTR;
+ return nullptr;
}
void DatabaseTabWidget::insertDatabase(Database* db, const DatabaseManagerStruct& dbStruct)
@@ -618,7 +619,7 @@ DatabaseWidget* DatabaseTabWidget::currentDatabaseWidget()
return m_dbList[db].dbWidget;
}
else {
- return Q_NULLPTR;
+ return nullptr;
}
}
@@ -656,7 +657,7 @@ void DatabaseTabWidget::lockDatabases()
// show the correct tab widget before we are asking questions about it
setCurrentWidget(dbWidget);
- if (mode == DatabaseWidget::EditMode) {
+ if (mode == DatabaseWidget::EditMode && dbWidget->isEditWidgetModified()) {
QMessageBox::StandardButton result =
MessageBox::question(
this, tr("Lock database"),
diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h
index c15408d..de4a9ca 100644
--- a/src/gui/DatabaseTabWidget.h
+++ b/src/gui/DatabaseTabWidget.h
@@ -21,7 +21,6 @@
#include <QHash>
#include <QTabWidget>
-#include "core/qlockfile.h"
#include "format/KeePass2Writer.h"
#include "gui/DatabaseWidget.h"
@@ -29,6 +28,7 @@ class DatabaseWidget;
class DatabaseWidgetStateSync;
class DatabaseOpenWidget;
class QFile;
+class QLockFile;
struct DatabaseManagerStruct
{
@@ -51,7 +51,7 @@ class DatabaseTabWidget : public QTabWidget
Q_OBJECT
public:
- explicit DatabaseTabWidget(QWidget* parent = Q_NULLPTR);
+ explicit DatabaseTabWidget(QWidget* parent = nullptr);
~DatabaseTabWidget();
void openDatabase(const QString& fileName, const QString& pw = QString(),
const QString& keyFile = QString());
@@ -101,7 +101,7 @@ private:
Database* databaseFromDatabaseWidget(DatabaseWidget* dbWidget);
void insertDatabase(Database* db, const DatabaseManagerStruct& dbStruct);
void updateLastDatabases(const QString& filename);
- void connectDatabase(Database* newDb, Database* oldDb = Q_NULLPTR);
+ void connectDatabase(Database* newDb, Database* oldDb = nullptr);
KeePass2Writer m_writer;
QHash<Database*, DatabaseManagerStruct> m_dbList;
diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp
index 257bcb6..499ef09 100644
--- a/src/gui/DatabaseWidget.cpp
+++ b/src/gui/DatabaseWidget.cpp
@@ -21,6 +21,7 @@
#include <QAction>
#include <QDesktopServices>
#include <QHBoxLayout>
+#include <QHeaderView>
#include <QLabel>
#include <QLineEdit>
#include <QKeyEvent>
@@ -52,9 +53,9 @@ DatabaseWidget::DatabaseWidget(Database* db, QWidget* parent)
, m_db(db)
, m_searchUi(new Ui::SearchWidget())
, m_searchWidget(new QWidget())
- , m_newGroup(Q_NULLPTR)
- , m_newEntry(Q_NULLPTR)
- , m_newParent(Q_NULLPTR)
+ , m_newGroup(nullptr)
+ , m_newEntry(nullptr)
+ , m_newParent(nullptr)
{
m_searchUi->setupUi(m_searchWidget);
@@ -175,7 +176,7 @@ DatabaseWidget::~DatabaseWidget()
DatabaseWidget::Mode DatabaseWidget::currentMode() const
{
- if (currentWidget() == Q_NULLPTR) {
+ if (currentWidget() == nullptr) {
return DatabaseWidget::None;
}
else if (currentWidget() == m_mainWidget) {
@@ -194,6 +195,18 @@ bool DatabaseWidget::isInEditMode() const
return currentMode() == DatabaseWidget::EditMode;
}
+bool DatabaseWidget::isEditWidgetModified() const
+{
+ if (currentWidget() == m_editEntryWidget) {
+ return m_editEntryWidget->hasBeenModified();
+ }
+ else {
+ // other edit widget don't have a hasBeenModified() method yet
+ // assume that they already have been modified
+ return true;
+ }
+}
+
QList<int> DatabaseWidget::splitterSizes() const
{
return m_splitter->sizes();
@@ -311,7 +324,7 @@ void DatabaseWidget::deleteEntries()
// get all entry pointers as the indexes change when removing multiple entries
QList<Entry*> selectedEntries;
- Q_FOREACH (const QModelIndex& index, selected) {
+ for (const QModelIndex& index : selected) {
selectedEntries.append(m_entryView->entryFromIndex(index));
}
@@ -335,7 +348,7 @@ void DatabaseWidget::deleteEntries()
}
if (result == QMessageBox::Yes) {
- Q_FOREACH (Entry* entry, selectedEntries) {
+ for (Entry* entry : asConst(selectedEntries)) {
delete entry;
}
}
@@ -361,7 +374,7 @@ void DatabaseWidget::deleteEntries()
return;
}
- Q_FOREACH (Entry* entry, selectedEntries) {
+ for (Entry* entry : asConst(selectedEntries)) {
m_db->recycleEntry(entry);
}
}
@@ -566,8 +579,8 @@ void DatabaseWidget::switchToView(bool accepted)
delete m_newGroup;
}
- m_newGroup = Q_NULLPTR;
- m_newParent = Q_NULLPTR;
+ m_newGroup = nullptr;
+ m_newParent = nullptr;
}
else if (m_newEntry) {
if (accepted) {
@@ -579,8 +592,8 @@ void DatabaseWidget::switchToView(bool accepted)
delete m_newEntry;
}
- m_newEntry = Q_NULLPTR;
- m_newParent = Q_NULLPTR;
+ m_newEntry = nullptr;
+ m_newParent = nullptr;
}
setCurrentWidget(m_mainWidget);
@@ -650,9 +663,9 @@ void DatabaseWidget::openDatabase(bool accepted)
// We won't need those anymore and KeePass1OpenWidget closes
// the file in its dtor.
delete m_databaseOpenWidget;
- m_databaseOpenWidget = Q_NULLPTR;
+ m_databaseOpenWidget = nullptr;
delete m_keepass1OpenWidget;
- m_keepass1OpenWidget = Q_NULLPTR;
+ m_keepass1OpenWidget = nullptr;
}
else {
if (m_databaseOpenWidget->database()) {
@@ -671,8 +684,8 @@ void DatabaseWidget::unlockDatabase(bool accepted)
replaceDatabase(static_cast<DatabaseOpenWidget*>(sender())->database());
- QList<Group*> groups = m_db->rootGroup()->groupsRecursive(true);
- Q_FOREACH (Group* group, groups) {
+ const QList<Group*> groups = m_db->rootGroup()->groupsRecursive(true);
+ for (Group* group : groups) {
if (group->uuid() == m_groupBeforeLock) {
m_groupView->setCurrentGroup(group);
break;
@@ -894,7 +907,7 @@ bool DatabaseWidget::isInSearchMode() const
void DatabaseWidget::clearLastGroup(Group* group)
{
if (group) {
- m_lastGroup = Q_NULLPTR;
+ m_lastGroup = nullptr;
m_searchWidget->hide();
}
}
@@ -943,7 +956,7 @@ QStringList DatabaseWidget::customEntryAttributes() const
bool DatabaseWidget::isGroupSelected() const
{
- return m_groupView->currentGroup() != Q_NULLPTR;
+ return m_groupView->currentGroup() != nullptr;
}
bool DatabaseWidget::currentEntryHasTitle()
diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h
index a925606..e49ee86 100644
--- a/src/gui/DatabaseWidget.h
+++ b/src/gui/DatabaseWidget.h
@@ -21,7 +21,6 @@
#include <QScopedPointer>
#include <QStackedWidget>
-#include "core/Global.h"
#include "core/Uuid.h"
#include "gui/entry/EntryModel.h"
@@ -59,7 +58,7 @@ public:
LockedMode
};
- explicit DatabaseWidget(Database* db, QWidget* parent = Q_NULLPTR);
+ explicit DatabaseWidget(Database* db, QWidget* parent = nullptr);
~DatabaseWidget();
Database* database();
bool dbHasKey() const;
@@ -75,6 +74,7 @@ public:
QStringList customEntryAttributes() const;
bool isGroupSelected() const;
bool isInEditMode() const;
+ bool isEditWidgetModified() const;
QList<int> splitterSizes() const;
void setSplitterSizes(const QList<int>& sizes);
QList<int> entryHeaderViewSizes() const;
@@ -103,7 +103,7 @@ Q_SIGNALS:
void entryColumnSizesChanged();
protected:
- bool eventFilter(QObject* object, QEvent* event) Q_DECL_OVERRIDE;
+ bool eventFilter(QObject* object, QEvent* event) override;
public Q_SLOTS:
void createEntry();
diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp
index 66b8492..f2359fe 100644
--- a/src/gui/DatabaseWidgetStateSync.cpp
+++ b/src/gui/DatabaseWidgetStateSync.cpp
@@ -22,7 +22,7 @@
DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent)
: QObject(parent)
- , m_activeDbWidget(Q_NULLPTR)
+ , m_activeDbWidget(nullptr)
, m_blockUpdates(false)
{
m_splitterSizes = variantToIntList(config()->get("GUI/SplitterState"));
@@ -124,10 +124,10 @@ void DatabaseWidgetStateSync::updateColumnSizes()
QList<int> DatabaseWidgetStateSync::variantToIntList(const QVariant& variant)
{
- QVariantList list = variant.toList();
+ const QVariantList list = variant.toList();
QList<int> result;
- Q_FOREACH (const QVariant& var, list) {
+ for (const QVariant& var : list) {
bool ok;
int size = var.toInt(&ok);
if (ok) {
@@ -146,7 +146,7 @@ QVariant DatabaseWidgetStateSync::intListToVariant(const QList<int>& list)
{
QVariantList result;
- Q_FOREACH (int value, list) {
+ for (int value : list) {
result.append(value);
}
diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h
index f6a87cd..a486117 100644
--- a/src/gui/DatabaseWidgetStateSync.h
+++ b/src/gui/DatabaseWidgetStateSync.h
@@ -16,8 +16,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef KEEPASSX_HEADERVIEWSYNC_H
-#define KEEPASSX_HEADERVIEWSYNC_H
+#ifndef KEEPASSX_DATABASEWIDGETSTATESYNC_H
+#define KEEPASSX_DATABASEWIDGETSTATESYNC_H
#include "gui/DatabaseWidget.h"
@@ -26,7 +26,7 @@ class DatabaseWidgetStateSync : public QObject
Q_OBJECT
public:
- explicit DatabaseWidgetStateSync(QObject* parent = Q_NULLPTR);
+ explicit DatabaseWidgetStateSync(QObject* parent = nullptr);
~DatabaseWidgetStateSync();
public Q_SLOTS:
@@ -51,4 +51,4 @@ private:
QList<int> m_columnSizesSearch;
};
-#endif // KEEPASSX_HEADERVIEWSYNC_H
+#endif // KEEPASSX_DATABASEWIDGETSTATESYNC_H
diff --git a/src/gui/DialogyWidget.h b/src/gui/DialogyWidget.h
index 9dd0528..b0915a2 100644
--- a/src/gui/DialogyWidget.h
+++ b/src/gui/DialogyWidget.h
@@ -21,17 +21,15 @@
#include <QDialogButtonBox>
#include <QWidget>
-#include "core/Global.h"
-
class DialogyWidget : public QWidget
{
Q_OBJECT
public:
- explicit DialogyWidget(QWidget* parent = Q_NULLPTR);
+ explicit DialogyWidget(QWidget* parent = nullptr);
protected:
- virtual void keyPressEvent(QKeyEvent* e) Q_DECL_OVERRIDE;
+ void keyPressEvent(QKeyEvent* e) override;
private:
bool clickButton(QDialogButtonBox::StandardButton standardButton);
diff --git a/src/gui/DragTabBar.h b/src/gui/DragTabBar.h
index 1b6005d..a6117a0 100644
--- a/src/gui/DragTabBar.h
+++ b/src/gui/DragTabBar.h
@@ -20,21 +20,19 @@
#include <QTabBar>
-#include "core/Global.h"
-
class DragTabBar : public QTabBar
{
Q_OBJECT
public:
- explicit DragTabBar(QWidget* parent = Q_NULLPTR);
+ explicit DragTabBar(QWidget* parent = nullptr);
protected:
- void dragEnterEvent(QDragEnterEvent* event) Q_DECL_OVERRIDE;
- void dragMoveEvent(QDragMoveEvent* event) Q_DECL_OVERRIDE;
- void dragLeaveEvent(QDragLeaveEvent* event) Q_DECL_OVERRIDE;
- void dropEvent(QDropEvent* event) Q_DECL_OVERRIDE;
- void tabLayoutChange() Q_DECL_OVERRIDE;
+ void dragEnterEvent(QDragEnterEvent* event) override;
+ void dragMoveEvent(QDragMoveEvent* event) override;
+ void dragLeaveEvent(QDragLeaveEvent* event) override;
+ void dropEvent(QDropEvent* event) override;
+ void tabLayoutChange() override;
private Q_SLOTS:
void dragSwitchTab();
diff --git a/src/gui/EditWidget.h b/src/gui/EditWidget.h
index d27abe9..c5f507a 100644
--- a/src/gui/EditWidget.h
+++ b/src/gui/EditWidget.h
@@ -33,7 +33,7 @@ class EditWidget : public DialogyWidget
Q_OBJECT
public:
- explicit EditWidget(QWidget* parent = Q_NULLPTR);
+ explicit EditWidget(QWidget* parent = nullptr);
~EditWidget();
void add(const QString& labelText, QWidget* widget);
diff --git a/src/gui/EditWidgetIcons.cpp b/src/gui/EditWidgetIcons.cpp
index 6bca81c..ba1d9b2 100644
--- a/src/gui/EditWidgetIcons.cpp
+++ b/src/gui/EditWidgetIcons.cpp
@@ -36,7 +36,7 @@ IconStruct::IconStruct()
EditWidgetIcons::EditWidgetIcons(QWidget* parent)
: QWidget(parent)
, m_ui(new Ui::EditWidgetIcons())
- , m_database(Q_NULLPTR)
+ , m_database(nullptr)
, m_defaultIconModel(new DefaultIconModel(this))
, m_customIconModel(new CustomIconModel(this))
{
@@ -61,11 +61,8 @@ EditWidgetIcons::~EditWidgetIcons()
{
}
-IconStruct EditWidgetIcons::save()
+IconStruct EditWidgetIcons::state() const
{
- Q_ASSERT(m_database);
- Q_ASSERT(!m_currentUuid.isNull());
-
IconStruct iconStruct;
if (m_ui->defaultIconsRadio->isChecked()) {
QModelIndex index = m_ui->defaultIconsView->currentIndex();
@@ -86,11 +83,15 @@ IconStruct EditWidgetIcons::save()
}
}
- m_database = Q_NULLPTR;
- m_currentUuid = Uuid();
return iconStruct;
}
+void EditWidgetIcons::reset()
+{
+ m_database = nullptr;
+ m_currentUuid = Uuid();
+}
+
void EditWidgetIcons::load(Uuid currentUuid, Database* database, IconStruct iconStruct)
{
Q_ASSERT(database);
@@ -158,10 +159,10 @@ void EditWidgetIcons::removeCustomIcon()
Uuid iconUuid = m_customIconModel->uuidFromIndex(index);
int iconUsedCount = 0;
- QList<Entry*> allEntries = m_database->rootGroup()->entriesRecursive(true);
+ const QList<Entry*> allEntries = m_database->rootGroup()->entriesRecursive(true);
QList<Entry*> historyEntriesWithSameIcon;
- Q_FOREACH (Entry* entry, allEntries) {
+ for (Entry* entry : allEntries) {
bool isHistoryEntry = !entry->group();
if (iconUuid == entry->iconUuid()) {
if (isHistoryEntry) {
@@ -173,15 +174,15 @@ void EditWidgetIcons::removeCustomIcon()
}
}
- QList<Group*> allGroups = m_database->rootGroup()->groupsRecursive(true);
- Q_FOREACH (const Group* group, allGroups) {
+ const QList<Group*> allGroups = m_database->rootGroup()->groupsRecursive(true);
+ for (const Group* group : allGroups) {
if (iconUuid == group->iconUuid() && m_currentUuid != group->uuid()) {
iconUsedCount++;
}
}
if (iconUsedCount == 0) {
- Q_FOREACH (Entry* entry, historyEntriesWithSameIcon) {
+ for (Entry* entry : asConst(historyEntriesWithSameIcon)) {
entry->setUpdateTimeinfo(false);
entry->setIcon(0);
entry->setUpdateTimeinfo(true);
diff --git a/src/gui/EditWidgetIcons.h b/src/gui/EditWidgetIcons.h
index e18f444..db58801 100644
--- a/src/gui/EditWidgetIcons.h
+++ b/src/gui/EditWidgetIcons.h
@@ -20,7 +20,6 @@
#include <QWidget>
-#include "core/Global.h"
#include "core/Uuid.h"
class Database;
@@ -44,10 +43,11 @@ class EditWidgetIcons : public QWidget
Q_OBJECT
public:
- explicit EditWidgetIcons(QWidget* parent = Q_NULLPTR);
+ explicit EditWidgetIcons(QWidget* parent = nullptr);
~EditWidgetIcons();
- IconStruct save();
+ IconStruct state() const;
+ void reset();
void load(Uuid currentUuid, Database* database, IconStruct iconStruct);
private Q_SLOTS:
diff --git a/src/gui/EditWidgetProperties.h b/src/gui/EditWidgetProperties.h
index c5d0eb0..4a2c059 100644
--- a/src/gui/EditWidgetProperties.h
+++ b/src/gui/EditWidgetProperties.h
@@ -20,7 +20,6 @@
#include <QWidget>
-#include "core/Global.h"
#include "core/TimeInfo.h"
#include "core/Uuid.h"
@@ -33,7 +32,7 @@ class EditWidgetProperties : public QWidget
Q_OBJECT
public:
- explicit EditWidgetProperties(QWidget* parent = Q_NULLPTR);
+ explicit EditWidgetProperties(QWidget* parent = nullptr);
~EditWidgetProperties();
void setFields(TimeInfo timeInfo, Uuid uuid);
diff --git a/src/gui/FileDialog.cpp b/src/gui/FileDialog.cpp
index 8448258..e293db2 100644
--- a/src/gui/FileDialog.cpp
+++ b/src/gui/FileDialog.cpp
@@ -19,7 +19,7 @@
#include "core/Config.h"
-FileDialog* FileDialog::m_instance(Q_NULLPTR);
+FileDialog* FileDialog::m_instance(nullptr);
QString FileDialog::getOpenFileName(QWidget* parent, const QString& caption, QString dir,
const QString& filter, QString* selectedFilter,
diff --git a/src/gui/FileDialog.h b/src/gui/FileDialog.h
index 46c6353..9f8fbb5 100644
--- a/src/gui/FileDialog.h
+++ b/src/gui/FileDialog.h
@@ -20,17 +20,15 @@
#include <QFileDialog>
-#include "core/Global.h"
-
class FileDialog
{
public:
- QString getOpenFileName(QWidget* parent = Q_NULLPTR, const QString& caption = QString(),
+ QString getOpenFileName(QWidget* parent = nullptr, const QString& caption = QString(),
QString dir = QString(), const QString& filter = QString(),
- QString* selectedFilter = Q_NULLPTR, QFileDialog::Options options = 0);
- QString getSaveFileName(QWidget* parent = Q_NULLPTR, const QString& caption = QString(),
+ QString* selectedFilter = nullptr, QFileDialog::Options options = 0);
+ QString getSaveFileName(QWidget* parent = nullptr, const QString& caption = QString(),
QString dir = QString(), const QString& filter = QString(),
- QString* selectedFilter = Q_NULLPTR, QFileDialog::Options options = 0,
+ QString* selectedFilter = nullptr, QFileDialog::Options options = 0,
const QString& defaultExtension = QString());
/**
diff --git a/src/gui/IconModels.h b/src/gui/IconModels.h
index 8a24707..868ce44 100644
--- a/src/gui/IconModels.h
+++ b/src/gui/IconModels.h
@@ -21,7 +21,6 @@
#include <QAbstractListModel>
#include <QPixmap>
-#include "core/Global.h"
#include "core/Uuid.h"
class DefaultIconModel : public QAbstractListModel
@@ -29,10 +28,10 @@ class DefaultIconModel : public QAbstractListModel
Q_OBJECT
public:
- explicit DefaultIconModel(QObject* parent = Q_NULLPTR);
+ explicit DefaultIconModel(QObject* parent = nullptr);
- int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
};
class CustomIconModel : public QAbstractListModel
@@ -40,10 +39,10 @@ class CustomIconModel : public QAbstractListModel
Q_OBJECT
public:
- explicit CustomIconModel(QObject* parent = Q_NULLPTR);
+ explicit CustomIconModel(QObject* parent = nullptr);
- virtual int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
void setIcons(const QHash<Uuid, QPixmap>& icons, const QList<Uuid>& iconsOrder);
Uuid uuidFromIndex(const QModelIndex& index) const;
QModelIndex indexFromUuid(const Uuid& uuid) const;
diff --git a/src/gui/KeePass1OpenWidget.h b/src/gui/KeePass1OpenWidget.h
index a398f9a..203b786 100644
--- a/src/gui/KeePass1OpenWidget.h
+++ b/src/gui/KeePass1OpenWidget.h
@@ -25,10 +25,10 @@ class KeePass1OpenWidget : public DatabaseOpenWidget
Q_OBJECT
public:
- explicit KeePass1OpenWidget(QWidget* parent = Q_NULLPTR);
+ explicit KeePass1OpenWidget(QWidget* parent = nullptr);
protected:
- void openDatabase() Q_DECL_OVERRIDE;
+ void openDatabase() override;
};
#endif // KEEPASSX_KEEPASS1OPENWIDGET_H
diff --git a/src/gui/LineEdit.h b/src/gui/LineEdit.h
index 2672aae..f5f0584 100644
--- a/src/gui/LineEdit.h
+++ b/src/gui/LineEdit.h
@@ -22,8 +22,6 @@
#include <QLineEdit>
-#include "core/Global.h"
-
class QToolButton;
class LineEdit : public QLineEdit
@@ -31,10 +29,10 @@ class LineEdit : public QLineEdit
Q_OBJECT
public:
- explicit LineEdit(QWidget* parent = Q_NULLPTR);
+ explicit LineEdit(QWidget* parent = nullptr);
protected:
- void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE;
+ void resizeEvent(QResizeEvent* event) override;
private Q_SLOTS:
void updateCloseButton(const QString& text);
diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp
index b6dc1df..c2701c2 100644
--- a/src/gui/MainWindow.cpp
+++ b/src/gui/MainWindow.cpp
@@ -38,7 +38,7 @@ const QString MainWindow::BaseWindowTitle = "KeePassX";
MainWindow::MainWindow()
: m_ui(new Ui::MainWindow())
- , m_trayIcon(Q_NULLPTR)
+ , m_trayIcon(nullptr)
{
m_ui->setupUi(this);
@@ -224,9 +224,10 @@ void MainWindow::updateLastDatabasesMenu()
{
m_ui->menuRecentDatabases->clear();
- QStringList lastDatabases = config()->get("LastDatabases", QVariant()).toStringList();
- Q_FOREACH (const QString& database, lastDatabases) {
+ const QStringList lastDatabases = config()->get("LastDatabases", QVariant()).toStringList();
+ for (const QString& database : lastDatabases) {
QAction* action = m_ui->menuRecentDatabases->addAction(database);
+ action->setData(database);
m_lastDatabasesActions->addAction(action);
}
m_ui->menuRecentDatabases->addSeparator();
@@ -249,7 +250,8 @@ void MainWindow::updateCopyAttributesMenu()
delete actions[i];
}
- Q_FOREACH (const QString& key, dbWidget->customEntryAttributes()) {
+ const QStringList customEntryAttributes = dbWidget->customEntryAttributes();
+ for (const QString& key : customEntryAttributes) {
QAction* action = m_ui->menuEntryCopyAttribute->addAction(key);
m_copyAdditionalAttributeActions->addAction(action);
}
@@ -257,7 +259,7 @@ void MainWindow::updateCopyAttributesMenu()
void MainWindow::openRecentDatabase(QAction* action)
{
- openDatabase(action->text());
+ openDatabase(action->data().toString());
}
void MainWindow::clearLastDatabases()
@@ -315,12 +317,14 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
break;
}
case DatabaseWidget::EditMode:
- case DatabaseWidget::LockedMode:
- Q_FOREACH (QAction* action, m_ui->menuEntries->actions()) {
+ case DatabaseWidget::LockedMode: {
+ const QList<QAction*> entryActions = m_ui->menuEntries->actions();
+ for (QAction* action : entryActions) {
action->setEnabled(false);
}
- Q_FOREACH (QAction* action, m_ui->menuGroups->actions()) {
+ const QList<QAction*> groupActions = m_ui->menuGroups->actions();
+ for (QAction* action : groupActions) {
action->setEnabled(false);
}
m_ui->actionEntryCopyTitle->setEnabled(false);
@@ -337,17 +341,20 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
m_ui->actionDatabaseSaveAs->setEnabled(false);
m_ui->actionExportCsv->setEnabled(false);
break;
+ }
default:
Q_ASSERT(false);
}
m_ui->actionDatabaseClose->setEnabled(true);
}
else {
- Q_FOREACH (QAction* action, m_ui->menuEntries->actions()) {
+ const QList<QAction*> entryActions = m_ui->menuEntries->actions();
+ for (QAction* action : entryActions) {
action->setEnabled(false);
}
- Q_FOREACH (QAction* action, m_ui->menuGroups->actions()) {
+ const QList<QAction*> groupActions = m_ui->menuGroups->actions();
+ for (QAction* action : groupActions) {
action->setEnabled(false);
}
m_ui->actionEntryCopyTitle->setEnabled(false);
@@ -450,7 +457,7 @@ void MainWindow::closeEvent(QCloseEvent* event)
}
}
-void MainWindow::changeEvent(QEvent *event)
+void MainWindow::changeEvent(QEvent* event)
{
if ((event->type() == QEvent::WindowStateChange) && isMinimized()
&& isTrayIconEnabled() && m_trayIcon && m_trayIcon->isVisible()
@@ -521,7 +528,7 @@ void MainWindow::updateTrayIcon()
if (m_trayIcon) {
m_trayIcon->hide();
delete m_trayIcon;
- m_trayIcon = Q_NULLPTR;
+ m_trayIcon = nullptr;
}
}
}
@@ -622,7 +629,7 @@ void MainWindow::repairDatabase()
if (dialog->exec() == QDialog::Accepted && dbRepairWidget->database()) {
QString saveFileName = fileDialog()->getSaveFileName(this, tr("Save repaired database"), QString(),
tr("KeePass 2 Database").append(" (*.kdbx)"),
- Q_NULLPTR, 0, "kdbx");
+ nullptr, 0, "kdbx");
if (!saveFileName.isEmpty()) {
KeePass2Writer writer;
diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h
index 5aa39ca..c52cfba 100644
--- a/src/gui/MainWindow.h
+++ b/src/gui/MainWindow.h
@@ -44,8 +44,8 @@ public Q_SLOTS:
const QString& keyFile = QString());
protected:
- void closeEvent(QCloseEvent* event) Q_DECL_OVERRIDE;
- void changeEvent(QEvent* event) Q_DECL_OVERRIDE;
+ void closeEvent(QCloseEvent* event) override;
+ void changeEvent(QEvent* event) override;
private Q_SLOTS:
void setMenuActionState(DatabaseWidget::Mode mode = DatabaseWidget::None);
diff --git a/src/gui/MessageBox.h b/src/gui/MessageBox.h
index abb12c0..1ea4022 100644
--- a/src/gui/MessageBox.h
+++ b/src/gui/MessageBox.h
@@ -20,8 +20,6 @@
#include <QMessageBox>
-#include "core/Global.h"
-
class MessageBox
{
public:
diff --git a/src/gui/PasswordComboBox.cpp b/src/gui/PasswordComboBox.cpp
index 2fad2ab..1f6c068 100644
--- a/src/gui/PasswordComboBox.cpp
+++ b/src/gui/PasswordComboBox.cpp
@@ -24,7 +24,7 @@
PasswordComboBox::PasswordComboBox(QWidget* parent)
: QComboBox(parent)
- , m_generator(Q_NULLPTR)
+ , m_generator(nullptr)
, m_alternatives(10)
{
setEditable(true);
@@ -51,7 +51,6 @@ void PasswordComboBox::setEcho(bool echo)
#else
setStyleSheet("QComboBox { font-family: monospace,Courier New; }");
#endif
-
}
else {
// clear items so the combobox indicates that no popup menu is available
diff --git a/src/gui/PasswordComboBox.h b/src/gui/PasswordComboBox.h
index 69ce152..7c54e27 100644
--- a/src/gui/PasswordComboBox.h
+++ b/src/gui/PasswordComboBox.h
@@ -21,8 +21,6 @@
#include <QComboBox>
-#include "core/Global.h"
-
class PasswordGenerator;
class PasswordComboBox : public QComboBox
@@ -30,7 +28,7 @@ class PasswordComboBox : public QComboBox
Q_OBJECT
public:
- explicit PasswordComboBox(QWidget* parent = Q_NULLPTR);
+ explicit PasswordComboBox(QWidget* parent = nullptr);
~PasswordComboBox();
void setGenerator(PasswordGenerator* generator);
diff --git a/src/gui/PasswordEdit.cpp b/src/gui/PasswordEdit.cpp
index 77b523a..3fd5d47 100644
--- a/src/gui/PasswordEdit.cpp
+++ b/src/gui/PasswordEdit.cpp
@@ -17,14 +17,12 @@
#include "PasswordEdit.h"
-#include "core/Global.h"
-
const QColor PasswordEdit::CorrectSoFarColor = QColor(255, 205, 15);
const QColor PasswordEdit::ErrorColor = QColor(255, 125, 125);
PasswordEdit::PasswordEdit(QWidget* parent)
: QLineEdit(parent)
- , m_basePasswordEdit(Q_NULLPTR)
+ , m_basePasswordEdit(nullptr)
{
}
diff --git a/src/gui/PasswordEdit.h b/src/gui/PasswordEdit.h
index cfb4a76..7ce4908 100644
--- a/src/gui/PasswordEdit.h
+++ b/src/gui/PasswordEdit.h
@@ -20,8 +20,6 @@
#include <QLineEdit>
-#include "core/Global.h"
-
class PasswordEdit : public QLineEdit
{
Q_OBJECT
@@ -30,7 +28,7 @@ public:
static const QColor CorrectSoFarColor;
static const QColor ErrorColor;
- explicit PasswordEdit(QWidget* parent = Q_NULLPTR);
+ explicit PasswordEdit(QWidget* parent = nullptr);
void enableVerifyMode(PasswordEdit* baseEdit);
public Q_SLOTS:
diff --git a/src/gui/PasswordGeneratorWidget.h b/src/gui/PasswordGeneratorWidget.h
index 8759672..46ef08c 100644
--- a/src/gui/PasswordGeneratorWidget.h
+++ b/src/gui/PasswordGeneratorWidget.h
@@ -21,7 +21,6 @@
#include <QWidget>
#include <QComboBox>
-#include "core/Global.h"
#include "core/PasswordGenerator.h"
namespace Ui {
@@ -35,7 +34,7 @@ class PasswordGeneratorWidget : public QWidget
Q_OBJECT
public:
- explicit PasswordGeneratorWidget(QWidget* parent = Q_NULLPTR);
+ explicit PasswordGeneratorWidget(QWidget* parent = nullptr);
~PasswordGeneratorWidget();
void loadSettings();
void reset();
diff --git a/src/gui/SettingsWidget.h b/src/gui/SettingsWidget.h
index cefbf6d..3fe621d 100644
--- a/src/gui/SettingsWidget.h
+++ b/src/gui/SettingsWidget.h
@@ -30,7 +30,7 @@ class SettingsWidget : public EditWidget
Q_OBJECT
public:
- explicit SettingsWidget(QWidget* parent = Q_NULLPTR);
+ explicit SettingsWidget(QWidget* parent = nullptr);
~SettingsWidget();
void loadSettings();
diff --git a/src/gui/SortFilterHideProxyModel.cpp b/src/gui/SortFilterHideProxyModel.cpp
index 0902361..0193d95 100644
--- a/src/gui/SortFilterHideProxyModel.cpp
+++ b/src/gui/SortFilterHideProxyModel.cpp
@@ -22,6 +22,11 @@ SortFilterHideProxyModel::SortFilterHideProxyModel(QObject* parent)
{
}
+Qt::DropActions SortFilterHideProxyModel::supportedDragActions() const
+{
+ return sourceModel()->supportedDragActions();
+}
+
void SortFilterHideProxyModel::hideColumn(int column, bool hide)
{
m_hiddenColumns.resize(column + 1);
diff --git a/src/gui/SortFilterHideProxyModel.h b/src/gui/SortFilterHideProxyModel.h
index a6f1e71..58d9ff7 100644
--- a/src/gui/SortFilterHideProxyModel.h
+++ b/src/gui/SortFilterHideProxyModel.h
@@ -21,18 +21,17 @@
#include <QBitArray>
#include <QSortFilterProxyModel>
-#include "core/Global.h"
-
class SortFilterHideProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
- explicit SortFilterHideProxyModel(QObject* parent = Q_NULLPTR);
+ explicit SortFilterHideProxyModel(QObject* parent = nullptr);
+ Qt::DropActions supportedDragActions() const override;
void hideColumn(int column, bool hide);
protected:
- bool filterAcceptsColumn(int sourceColumn, const QModelIndex& sourceParent) const Q_DECL_OVERRIDE;
+ bool filterAcceptsColumn(int sourceColumn, const QModelIndex& sourceParent) const override;
private:
QBitArray m_hiddenColumns;
diff --git a/src/gui/UnlockDatabaseWidget.cpp b/src/gui/UnlockDatabaseWidget.cpp
index 242b07a..a005d0e 100644
--- a/src/gui/UnlockDatabaseWidget.cpp
+++ b/src/gui/UnlockDatabaseWidget.cpp
@@ -34,5 +34,5 @@ void UnlockDatabaseWidget::clearForms()
m_ui->checkPassword->setChecked(false);
m_ui->checkKeyFile->setChecked(false);
m_ui->buttonTogglePassword->setChecked(false);
- m_db = Q_NULLPTR;
+ m_db = nullptr;
}
diff --git a/src/gui/UnlockDatabaseWidget.h b/src/gui/UnlockDatabaseWidget.h
index 052578b..adb5efb 100644
--- a/src/gui/UnlockDatabaseWidget.h
+++ b/src/gui/UnlockDatabaseWidget.h
@@ -25,7 +25,7 @@ class UnlockDatabaseWidget : public DatabaseOpenWidget
Q_OBJECT
public:
- explicit UnlockDatabaseWidget(QWidget* parent = Q_NULLPTR);
+ explicit UnlockDatabaseWidget(QWidget* parent = nullptr);
void clearForms();
};
diff --git a/src/gui/WelcomeWidget.h b/src/gui/WelcomeWidget.h
index 983aaa0..80a0dde 100644
--- a/src/gui/WelcomeWidget.h
+++ b/src/gui/WelcomeWidget.h
@@ -20,8 +20,6 @@
#include <QWidget>
-#include "core/Global.h"
-
namespace Ui {
class WelcomeWidget;
}
@@ -31,7 +29,7 @@ class WelcomeWidget : public QWidget
Q_OBJECT
public:
- explicit WelcomeWidget(QWidget* parent = Q_NULLPTR);
+ explicit WelcomeWidget(QWidget* parent = nullptr);
~WelcomeWidget();
private:
diff --git a/src/gui/entry/AutoTypeAssociationsModel.cpp b/src/gui/entry/AutoTypeAssociationsModel.cpp
index 6d6dc97..49f6786 100644
--- a/src/gui/entry/AutoTypeAssociationsModel.cpp
+++ b/src/gui/entry/AutoTypeAssociationsModel.cpp
@@ -19,7 +19,7 @@
AutoTypeAssociationsModel::AutoTypeAssociationsModel(QObject* parent)
: QAbstractListModel(parent)
- , m_autoTypeAssociations(Q_NULLPTR)
+ , m_autoTypeAssociations(nullptr)
{
}
diff --git a/src/gui/entry/AutoTypeAssociationsModel.h b/src/gui/entry/AutoTypeAssociationsModel.h
index ecb4247..c75168c 100644
--- a/src/gui/entry/AutoTypeAssociationsModel.h
+++ b/src/gui/entry/AutoTypeAssociationsModel.h
@@ -29,12 +29,12 @@ class AutoTypeAssociationsModel : public QAbstractListModel
Q_OBJECT
public:
- explicit AutoTypeAssociationsModel(QObject* parent = Q_NULLPTR);
+ explicit AutoTypeAssociationsModel(QObject* parent = nullptr);
void setAutoTypeAssociations(AutoTypeAssociations* autoTypeAssociations);
- int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
public Q_SLOTS:
void associationChange(int i);
diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp
index 035abad..b65c5b4 100644
--- a/src/gui/entry/EditEntryWidget.cpp
+++ b/src/gui/entry/EditEntryWidget.cpp
@@ -21,8 +21,10 @@
#include "ui_EditEntryWidgetHistory.h"
#include "ui_EditEntryWidgetMain.h"
+#include <QButtonGroup>
#include <QDesktopServices>
#include <QStackedLayout>
+#include <QStandardPaths>
#include <QMenu>
#include <QSortFilterProxyModel>
#include <QTemporaryFile>
@@ -45,7 +47,7 @@
EditEntryWidget::EditEntryWidget(QWidget* parent)
: EditWidget(parent)
- , m_entry(Q_NULLPTR)
+ , m_entry(nullptr)
, m_mainUi(new Ui::EditEntryWidgetMain())
, m_advancedUi(new Ui::EditEntryWidgetAdvanced())
, m_autoTypeUi(new Ui::EditEntryWidgetAutoType())
@@ -232,7 +234,7 @@ void EditEntryWidget::useExpiryPreset(QAction* action)
{
m_mainUi->expireCheck->setChecked(true);
TimeDelta delta = action->data().value<TimeDelta>();
- QDateTime now = Tools::currentDateTimeUtc().toLocalTime();
+ QDateTime now = QDateTime::currentDateTime();
QDateTime expiryDateTime = now + delta;
m_mainUi->expireDatePicker->setDateTime(expiryDateTime);
}
@@ -408,53 +410,58 @@ void EditEntryWidget::saveEntry()
// we don't want to create a new history item, if only the history has changed
m_entry->removeHistoryItems(m_historyModel->deletedEntries());
+ m_autoTypeAssoc->removeEmpty();
+
if (!m_create) {
m_entry->beginUpdate();
}
- m_entry->setTitle(m_mainUi->titleEdit->text());
- m_entry->setUsername(m_mainUi->usernameEdit->text());
- m_entry->setUrl(m_mainUi->urlEdit->text());
- m_entry->setPassword(m_mainUi->passwordEdit->text());
- m_entry->setExpires(m_mainUi->expireCheck->isChecked());
- m_entry->setExpiryTime(m_mainUi->expireDatePicker->dateTime().toUTC());
+ updateEntryData(m_entry);
- m_entry->setNotes(m_mainUi->notesEdit->toPlainText());
+ if (!m_create) {
+ m_entry->endUpdate();
+ }
- m_entry->attributes()->copyCustomKeysFrom(m_entryAttributes);
- m_entry->attachments()->copyDataFrom(m_entryAttachments);
+ clear();
- IconStruct iconStruct = m_iconsWidget->save();
+ Q_EMIT editFinished(true);
+}
+
+void EditEntryWidget::updateEntryData(Entry* entry) const
+{
+ entry->setTitle(m_mainUi->titleEdit->text());
+ entry->setUsername(m_mainUi->usernameEdit->text());
+ entry->setUrl(m_mainUi->urlEdit->text());
+ entry->setPassword(m_mainUi->passwordEdit->text());
+ entry->setExpires(m_mainUi->expireCheck->isChecked());
+ entry->setExpiryTime(m_mainUi->expireDatePicker->dateTime().toUTC());
+
+ entry->setNotes(m_mainUi->notesEdit->toPlainText());
+
+ entry->attributes()->copyCustomKeysFrom(m_entryAttributes);
+ entry->attachments()->copyDataFrom(m_entryAttachments);
+
+ IconStruct iconStruct = m_iconsWidget->state();
if (iconStruct.number < 0) {
- m_entry->setIcon(Entry::DefaultIconNumber);
+ entry->setIcon(Entry::DefaultIconNumber);
}
else if (iconStruct.uuid.isNull()) {
- m_entry->setIcon(iconStruct.number);
+ entry->setIcon(iconStruct.number);
}
else {
- m_entry->setIcon(iconStruct.uuid);
+ entry->setIcon(iconStruct.uuid);
}
- m_entry->setAutoTypeEnabled(m_autoTypeUi->enableButton->isChecked());
+ entry->setAutoTypeEnabled(m_autoTypeUi->enableButton->isChecked());
if (m_autoTypeUi->inheritSequenceButton->isChecked()) {
- m_entry->setDefaultAutoTypeSequence(QString());
+ entry->setDefaultAutoTypeSequence(QString());
}
else {
- m_entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text());
- }
-
- m_autoTypeAssoc->removeEmpty();
- m_entry->autoTypeAssociations()->copyDataFrom(m_autoTypeAssoc);
-
- if (!m_create) {
- m_entry->endUpdate();
+ entry->setDefaultAutoTypeSequence(m_autoTypeUi->sequenceEdit->text());
}
-
- clear();
-
- Q_EMIT editFinished(true);
+ entry->autoTypeAssociations()->copyDataFrom(m_autoTypeAssoc);
}
void EditEntryWidget::cancel()
@@ -477,12 +484,29 @@ void EditEntryWidget::cancel()
void EditEntryWidget::clear()
{
- m_entry = Q_NULLPTR;
- m_database = Q_NULLPTR;
+ m_entry = nullptr;
+ m_database = nullptr;
m_entryAttributes->clear();
m_entryAttachments->clear();
m_autoTypeAssoc->clear();
m_historyModel->clear();
+ m_iconsWidget->reset();
+}
+
+bool EditEntryWidget::hasBeenModified() const
+{
+ // entry has been modified if a history item is to be deleted
+ if (!m_historyModel->deletedEntries().isEmpty()) {
+ return true;
+ }
+
+ // check if updating the entry would modify it
+ QScopedPointer<Entry> entry(new Entry());
+ entry->copyDataFrom(m_entry);
+
+ entry->beginUpdate();
+ updateEntryData(entry.data());
+ return entry->endUpdate();
}
void EditEntryWidget::togglePasswordGeneratorButton(bool checked)
@@ -591,7 +615,7 @@ void EditEntryWidget::insertAttachment()
QString defaultDir = config()->get("LastAttachmentDir").toString();
if (defaultDir.isEmpty() || !QDir(defaultDir).exists()) {
- defaultDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+ defaultDir = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).value(0);
}
QString filename = fileDialog()->getOpenFileName(this, tr("Select file"), defaultDir);
if (filename.isEmpty() || !QFile::exists(filename)) {
@@ -625,7 +649,7 @@ void EditEntryWidget::saveCurrentAttachment()
QString filename = m_attachmentsModel->keyByIndex(index);
QString defaultDirName = config()->get("LastAttachmentDir").toString();
if (defaultDirName.isEmpty() || !QDir(defaultDirName).exists()) {
- defaultDirName = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+ defaultDirName = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
}
QDir dir(defaultDirName);
QString savePath = fileDialog()->getSaveFileName(this, tr("Save attachment"),
diff --git a/src/gui/entry/EditEntryWidget.h b/src/gui/entry/EditEntryWidget.h
index 03811bf..c8045d9 100644
--- a/src/gui/entry/EditEntryWidget.h
+++ b/src/gui/entry/EditEntryWidget.h
@@ -52,7 +52,7 @@ class EditEntryWidget : public EditWidget
Q_OBJECT
public:
- explicit EditEntryWidget(QWidget* parent = Q_NULLPTR);
+ explicit EditEntryWidget(QWidget* parent = nullptr);
~EditEntryWidget();
void loadEntry(Entry* entry, bool create, bool history, const QString& parentName,
@@ -61,6 +61,7 @@ public:
void createPresetsMenu(QMenu* expirePresetsMenu);
QString entryTitle() const;
void clear();
+ bool hasBeenModified() const;
Q_SIGNALS:
void editFinished(bool accepted);
@@ -107,6 +108,7 @@ private:
bool passwordsEqual();
void setForms(const Entry* entry, bool restore = false);
QMenu* createPresetsMenu();
+ void updateEntryData(Entry* entry) const;
Entry* m_entry;
Database* m_database;
diff --git a/src/gui/entry/EntryAttachmentsModel.cpp b/src/gui/entry/EntryAttachmentsModel.cpp
index e072d17..39ed69f 100644
--- a/src/gui/entry/EntryAttachmentsModel.cpp
+++ b/src/gui/entry/EntryAttachmentsModel.cpp
@@ -20,9 +20,11 @@
#include "core/Entry.h"
#include "core/Tools.h"
+#include <algorithm>
+
EntryAttachmentsModel::EntryAttachmentsModel(QObject* parent)
: QAbstractListModel(parent)
- , m_entryAttachments(Q_NULLPTR)
+ , m_entryAttachments(nullptr)
{
}
@@ -102,7 +104,7 @@ void EntryAttachmentsModel::attachmentAboutToAdd(const QString& key)
{
QList<QString> rows = m_entryAttachments->keys();
rows.append(key);
- qSort(rows);
+ std::sort(rows.begin(), rows.end());
int row = rows.indexOf(key);
beginInsertRows(QModelIndex(), row, row);
}
diff --git a/src/gui/entry/EntryAttachmentsModel.h b/src/gui/entry/EntryAttachmentsModel.h
index 177cde0..c2e238a 100644
--- a/src/gui/entry/EntryAttachmentsModel.h
+++ b/src/gui/entry/EntryAttachmentsModel.h
@@ -20,8 +20,6 @@
#include <QAbstractListModel>
-#include "core/Global.h"
-
class EntryAttachments;
class EntryAttachmentsModel : public QAbstractListModel
@@ -29,11 +27,11 @@ class EntryAttachmentsModel : public QAbstractListModel
Q_OBJECT
public:
- explicit EntryAttachmentsModel(QObject* parent = Q_NULLPTR);
+ explicit EntryAttachmentsModel(QObject* parent = nullptr);
void setEntryAttachments(EntryAttachments* entry);
- int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
QString keyByIndex(const QModelIndex& index) const;
private Q_SLOTS:
diff --git a/src/gui/entry/EntryAttributesModel.cpp b/src/gui/entry/EntryAttributesModel.cpp
index f73a2d2..b22380a 100644
--- a/src/gui/entry/EntryAttributesModel.cpp
+++ b/src/gui/entry/EntryAttributesModel.cpp
@@ -20,9 +20,11 @@
#include "core/Entry.h"
#include "core/Tools.h"
+#include <algorithm>
+
EntryAttributesModel::EntryAttributesModel(QObject* parent)
: QAbstractListModel(parent)
- , m_entryAttributes(Q_NULLPTR)
+ , m_entryAttributes(nullptr)
, m_nextRenameDataChange(false)
{
}
@@ -152,7 +154,7 @@ void EntryAttributesModel::attributeAboutToAdd(const QString& key)
{
QList<QString> rows = m_attributes;
rows.append(key);
- qSort(rows);
+ std::sort(rows.begin(), rows.end());
int row = rows.indexOf(key);
beginInsertRows(QModelIndex(), row, row);
}
@@ -182,7 +184,7 @@ void EntryAttributesModel::attributeAboutToRename(const QString& oldKey, const Q
QList<QString> rows = m_attributes;
rows.removeOne(oldKey);
rows.append(newKey);
- qSort(rows);
+ std::sort(rows.begin(), rows.end());
int newRow = rows.indexOf(newKey);
if (newRow > oldRow) {
newRow++;
@@ -230,7 +232,8 @@ void EntryAttributesModel::updateAttributes()
{
m_attributes.clear();
- Q_FOREACH (const QString& key, m_entryAttributes->keys()) {
+ const QList<QString> attributesKeyList = m_entryAttributes->keys();
+ for (const QString& key : attributesKeyList) {
if (!EntryAttributes::isDefaultAttribute(key)) {
m_attributes.append(key);
}
diff --git a/src/gui/entry/EntryAttributesModel.h b/src/gui/entry/EntryAttributesModel.h
index f6ac651..1eec8bf 100644
--- a/src/gui/entry/EntryAttributesModel.h
+++ b/src/gui/entry/EntryAttributesModel.h
@@ -20,8 +20,6 @@
#include <QAbstractListModel>
-#include "core/Global.h"
-
class EntryAttributes;
class EntryAttributesModel : public QAbstractListModel
@@ -29,14 +27,14 @@ class EntryAttributesModel : public QAbstractListModel
Q_OBJECT
public:
- explicit EntryAttributesModel(QObject* parent = Q_NULLPTR);
+ explicit EntryAttributesModel(QObject* parent = nullptr);
void setEntryAttributes(EntryAttributes* entryAttributes);
- int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
- bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) Q_DECL_OVERRIDE;
- Qt::ItemFlags flags(const QModelIndex& index) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
+ bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
+ Qt::ItemFlags flags(const QModelIndex& index) const override;
QModelIndex indexByKey(const QString& key) const;
QString keyByIndex(const QModelIndex& index) const;
diff --git a/src/gui/entry/EntryHistoryModel.cpp b/src/gui/entry/EntryHistoryModel.cpp
index 58aa49a..ca21055 100644
--- a/src/gui/entry/EntryHistoryModel.cpp
+++ b/src/gui/entry/EntryHistoryModel.cpp
@@ -18,6 +18,7 @@
#include "EntryHistoryModel.h"
#include "core/Entry.h"
+#include "core/Global.h"
EntryHistoryModel::EntryHistoryModel(QObject* parent)
: QAbstractTableModel(parent)
@@ -136,7 +137,7 @@ void EntryHistoryModel::deleteAll()
beginRemoveRows(QModelIndex(), 0, m_historyEntries.size() - 1);
- Q_FOREACH (Entry* entry, m_historyEntries) {
+ for (Entry* entry : asConst(m_historyEntries)) {
m_deletedHistoryEntries << entry;
}
m_historyEntries.clear();
diff --git a/src/gui/entry/EntryHistoryModel.h b/src/gui/entry/EntryHistoryModel.h
index 6c8073a..a7434e0 100644
--- a/src/gui/entry/EntryHistoryModel.h
+++ b/src/gui/entry/EntryHistoryModel.h
@@ -20,8 +20,6 @@
#include <QAbstractTableModel>
-#include "core/Global.h"
-
class Entry;
class EntryHistoryModel : public QAbstractTableModel
@@ -29,13 +27,13 @@ class EntryHistoryModel : public QAbstractTableModel
Q_OBJECT
public:
- explicit EntryHistoryModel(QObject* parent = Q_NULLPTR);
+ explicit EntryHistoryModel(QObject* parent = nullptr);
Entry* entryFromIndex(const QModelIndex& index) const;
- int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
- QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
void setEntries(const QList<Entry*>& entries);
void clear();
diff --git a/src/gui/entry/EntryModel.cpp b/src/gui/entry/EntryModel.cpp
index 084ad72..d606a77 100644
--- a/src/gui/entry/EntryModel.cpp
+++ b/src/gui/entry/EntryModel.cpp
@@ -22,14 +22,14 @@
#include "core/DatabaseIcons.h"
#include "core/Entry.h"
+#include "core/Global.h"
#include "core/Group.h"
#include "core/Metadata.h"
EntryModel::EntryModel(QObject* parent)
: QAbstractTableModel(parent)
- , m_group(Q_NULLPTR)
+ , m_group(nullptr)
{
- setSupportedDragActions(Qt::MoveAction | Qt::CopyAction);
}
Entry* EntryModel::entryFromIndex(const QModelIndex& index) const
@@ -72,20 +72,21 @@ void EntryModel::setEntryList(const QList<Entry*>& entries)
severConnections();
- m_group = Q_NULLPTR;
+ m_group = nullptr;
m_allGroups.clear();
m_entries = entries;
m_orgEntries = entries;
QSet<Database*> databases;
- Q_FOREACH (Entry* entry, m_entries) {
+ for (Entry* entry : asConst(m_entries)) {
databases.insert(entry->group()->database());
}
- Q_FOREACH (Database* db, databases) {
+ for (Database* db : asConst(databases)) {
Q_ASSERT(db);
- Q_FOREACH (const Group* group, db->rootGroup()->groupsRecursive(true)) {
+ const QList<Group*> groupList = db->rootGroup()->groupsRecursive(true);
+ for (const Group* group : groupList) {
m_allGroups.append(group);
}
@@ -94,7 +95,7 @@ void EntryModel::setEntryList(const QList<Entry*>& entries)
}
}
- Q_FOREACH (const Group* group, m_allGroups) {
+ for (const Group* group : asConst(m_allGroups)) {
makeConnections(group);
}
@@ -191,6 +192,11 @@ Qt::DropActions EntryModel::supportedDropActions() const
return 0;
}
+Qt::DropActions EntryModel::supportedDragActions() const
+{
+ return (Qt::MoveAction | Qt::CopyAction);
+}
+
Qt::ItemFlags EntryModel::flags(const QModelIndex& modelIndex) const
{
if (!modelIndex.isValid()) {
@@ -211,7 +217,7 @@ QStringList EntryModel::mimeTypes() const
QMimeData* EntryModel::mimeData(const QModelIndexList& indexes) const
{
if (indexes.isEmpty()) {
- return Q_NULLPTR;
+ return nullptr;
}
QMimeData* data = new QMimeData();
@@ -220,7 +226,7 @@ QMimeData* EntryModel::mimeData(const QModelIndexList& indexes) const
QSet<Entry*> seenEntries;
- Q_FOREACH (const QModelIndex& index, indexes) {
+ for (const QModelIndex& index : indexes) {
if (!index.isValid()) {
continue;
}
@@ -236,7 +242,7 @@ QMimeData* EntryModel::mimeData(const QModelIndexList& indexes) const
if (seenEntries.isEmpty()) {
delete data;
- return Q_NULLPTR;
+ return nullptr;
}
else {
data->setData(mimeTypes().at(0), encoded);
@@ -294,11 +300,11 @@ void EntryModel::entryDataChanged(Entry* entry)
void EntryModel::severConnections()
{
if (m_group) {
- disconnect(m_group, Q_NULLPTR, this, Q_NULLPTR);
+ disconnect(m_group, nullptr, this, nullptr);
}
- Q_FOREACH (const Group* group, m_allGroups) {
- disconnect(group, Q_NULLPTR, this, Q_NULLPTR);
+ for (const Group* group : asConst(m_allGroups)) {
+ disconnect(group, nullptr, this, nullptr);
}
}
diff --git a/src/gui/entry/EntryModel.h b/src/gui/entry/EntryModel.h
index 20bcad9..0183c47 100644
--- a/src/gui/entry/EntryModel.h
+++ b/src/gui/entry/EntryModel.h
@@ -20,8 +20,6 @@
#include <QAbstractTableModel>
-#include "core/Global.h"
-
class Entry;
class Group;
@@ -38,18 +36,19 @@ public:
Url = 3
};
- explicit EntryModel(QObject* parent = Q_NULLPTR);
+ explicit EntryModel(QObject* parent = nullptr);
Entry* entryFromIndex(const QModelIndex& index) const;
QModelIndex indexFromEntry(Entry* entry) const;
- int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
- QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
- Qt::DropActions supportedDropActions() const Q_DECL_OVERRIDE;
- Qt::ItemFlags flags(const QModelIndex& modelIndex) const Q_DECL_OVERRIDE;
- QStringList mimeTypes() const Q_DECL_OVERRIDE;
- QMimeData* mimeData(const QModelIndexList& indexes) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
+ Qt::DropActions supportedDropActions() const override;
+ Qt::DropActions supportedDragActions() const override;
+ Qt::ItemFlags flags(const QModelIndex& modelIndex) const override;
+ QStringList mimeTypes() const override;
+ QMimeData* mimeData(const QModelIndexList& indexes) const override;
void setEntryList(const QList<Entry*>& entries);
diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp
index cd2c6fb..1c900a5 100644
--- a/src/gui/entry/EntryView.cpp
+++ b/src/gui/entry/EntryView.cpp
@@ -32,7 +32,6 @@ EntryView::EntryView(QWidget* parent)
m_sortModel->setDynamicSortFilter(true);
m_sortModel->setSortLocaleAware(true);
m_sortModel->setSortCaseSensitivity(Qt::CaseInsensitive);
- m_sortModel->setSupportedDragActions(m_model->supportedDragActions());
QTreeView::setModel(m_sortModel);
setUniformRowHeights(true);
@@ -75,7 +74,7 @@ void EntryView::setEntryList(const QList<Entry*>& entries)
void EntryView::setFirstEntryActive()
{
- if(m_model->rowCount() > 0) {
+ if (m_model->rowCount() > 0) {
QModelIndex index = m_sortModel->mapToSource(m_sortModel->index(0, 0));
setCurrentEntry(m_model->entryFromIndex(index));
}
@@ -109,7 +108,7 @@ Entry* EntryView::currentEntry()
return m_model->entryFromIndex(m_sortModel->mapToSource(list.first()));
}
else {
- return Q_NULLPTR;
+ return nullptr;
}
}
@@ -130,7 +129,7 @@ Entry* EntryView::entryFromIndex(const QModelIndex& index)
return m_model->entryFromIndex(m_sortModel->mapToSource(index));
}
else {
- return Q_NULLPTR;
+ return nullptr;
}
}
diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h
index c11d041..fb9e356 100644
--- a/src/gui/entry/EntryView.h
+++ b/src/gui/entry/EntryView.h
@@ -20,8 +20,6 @@
#include <QTreeView>
-#include "core/Global.h"
-
#include "gui/entry/EntryModel.h"
class Entry;
@@ -34,8 +32,8 @@ class EntryView : public QTreeView
Q_OBJECT
public:
- explicit EntryView(QWidget* parent = Q_NULLPTR);
- void setModel(QAbstractItemModel* model) Q_DECL_OVERRIDE;
+ explicit EntryView(QWidget* parent = nullptr);
+ void setModel(QAbstractItemModel* model) override;
Entry* currentEntry();
void setCurrentEntry(Entry* entry);
Entry* entryFromIndex(const QModelIndex& index);
@@ -52,7 +50,7 @@ Q_SIGNALS:
void entrySelectionChanged();
protected:
- void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
+ void keyPressEvent(QKeyEvent* event) override;
private Q_SLOTS:
void emitEntryActivated(const QModelIndex& index);
diff --git a/src/gui/group/EditGroupWidget.cpp b/src/gui/group/EditGroupWidget.cpp
index ebe5cb9..a5b426b 100644
--- a/src/gui/group/EditGroupWidget.cpp
+++ b/src/gui/group/EditGroupWidget.cpp
@@ -28,8 +28,8 @@ EditGroupWidget::EditGroupWidget(QWidget* parent)
, m_editGroupWidgetMain(new QWidget())
, m_editGroupWidgetIcons(new EditWidgetIcons())
, m_editWidgetProperties(new EditWidgetProperties())
- , m_group(Q_NULLPTR)
- , m_database(Q_NULLPTR)
+ , m_group(nullptr)
+ , m_database(nullptr)
{
m_mainUi->setupUi(m_editGroupWidgetMain);
@@ -113,7 +113,7 @@ void EditGroupWidget::save()
m_group->setDefaultAutoTypeSequence(m_mainUi->autoTypeSequenceCustomEdit->text());
}
- IconStruct iconStruct = m_editGroupWidgetIcons->save();
+ IconStruct iconStruct = m_editGroupWidgetIcons->state();
if (iconStruct.number < 0) {
m_group->setIcon(Group::DefaultIconNumber);
@@ -142,8 +142,9 @@ void EditGroupWidget::cancel()
void EditGroupWidget::clear()
{
- m_group = Q_NULLPTR;
- m_database = Q_NULLPTR;
+ m_group = nullptr;
+ m_database = nullptr;
+ m_editGroupWidgetIcons->reset();
}
void EditGroupWidget::addTriStateItems(QComboBox* comboBox, bool inheritDefault)
diff --git a/src/gui/group/EditGroupWidget.h b/src/gui/group/EditGroupWidget.h
index c6d91a5..94ad891 100644
--- a/src/gui/group/EditGroupWidget.h
+++ b/src/gui/group/EditGroupWidget.h
@@ -37,7 +37,7 @@ class EditGroupWidget : public EditWidget
Q_OBJECT
public:
- explicit EditGroupWidget(QWidget* parent = Q_NULLPTR);
+ explicit EditGroupWidget(QWidget* parent = nullptr);
~EditGroupWidget();
void loadGroup(Group* group, bool create, Database* database);
diff --git a/src/gui/group/GroupModel.cpp b/src/gui/group/GroupModel.cpp
index 1244ad7..5aafc1a 100644
--- a/src/gui/group/GroupModel.cpp
+++ b/src/gui/group/GroupModel.cpp
@@ -28,7 +28,7 @@
GroupModel::GroupModel(Database* db, QObject* parent)
: QAbstractItemModel(parent)
- , m_db(Q_NULLPTR)
+ , m_db(nullptr)
{
changeDatabase(db);
}
@@ -329,7 +329,7 @@ QStringList GroupModel::mimeTypes() const
QMimeData* GroupModel::mimeData(const QModelIndexList& indexes) const
{
if (indexes.isEmpty()) {
- return Q_NULLPTR;
+ return nullptr;
}
QMimeData* data = new QMimeData();
@@ -338,7 +338,7 @@ QMimeData* GroupModel::mimeData(const QModelIndexList& indexes) const
QSet<Group*> seenGroups;
- Q_FOREACH (const QModelIndex& index, indexes) {
+ for (const QModelIndex& index : indexes) {
if (!index.isValid()) {
continue;
}
@@ -354,7 +354,7 @@ QMimeData* GroupModel::mimeData(const QModelIndexList& indexes) const
if (seenGroups.isEmpty()) {
delete data;
- return Q_NULLPTR;
+ return nullptr;
}
else {
data->setData(mimeTypes().at(0), encoded);
diff --git a/src/gui/group/GroupModel.h b/src/gui/group/GroupModel.h
index 752eb2b..0ef0ba9 100644
--- a/src/gui/group/GroupModel.h
+++ b/src/gui/group/GroupModel.h
@@ -20,8 +20,6 @@
#include <QAbstractItemModel>
-#include "core/Global.h"
-
class Database;
class Group;
@@ -30,23 +28,23 @@ class GroupModel : public QAbstractItemModel
Q_OBJECT
public:
- explicit GroupModel(Database* db, QObject* parent = Q_NULLPTR);
+ explicit GroupModel(Database* db, QObject* parent = nullptr);
void changeDatabase(Database* newDb);
QModelIndex index(Group* group) const;
Group* groupFromIndex(const QModelIndex& index) const;
- int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE;
- QModelIndex parent(const QModelIndex& index) const Q_DECL_OVERRIDE;
- QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
- QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
- Qt::DropActions supportedDropActions() const Q_DECL_OVERRIDE;
- Qt::ItemFlags flags(const QModelIndex& modelIndex) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+ QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override;
+ QModelIndex parent(const QModelIndex& index) const override;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
+ Qt::DropActions supportedDropActions() const override;
+ Qt::ItemFlags flags(const QModelIndex& modelIndex) const override;
bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column,
- const QModelIndex& parent) Q_DECL_OVERRIDE;
- QStringList mimeTypes() const Q_DECL_OVERRIDE;
- QMimeData* mimeData(const QModelIndexList& indexes) const Q_DECL_OVERRIDE;
+ const QModelIndex& parent) override;
+ QStringList mimeTypes() const override;
+ QMimeData* mimeData(const QModelIndexList& indexes) const override;
private:
QModelIndex parent(Group* group) const;
diff --git a/src/gui/group/GroupView.cpp b/src/gui/group/GroupView.cpp
index 3c93662..31f5639 100644
--- a/src/gui/group/GroupView.cpp
+++ b/src/gui/group/GroupView.cpp
@@ -19,6 +19,7 @@
#include <QDragMoveEvent>
#include <QMetaObject>
+#include <QMimeData>
#include "core/Database.h"
#include "core/Group.h"
@@ -74,7 +75,7 @@ void GroupView::dragMoveEvent(QDragMoveEvent* event)
Group* GroupView::currentGroup()
{
if (currentIndex() == QModelIndex()) {
- return Q_NULLPTR;
+ return nullptr;
}
else {
return m_model->groupFromIndex(currentIndex());
@@ -97,7 +98,8 @@ void GroupView::recInitExpanded(Group* group)
expandGroup(group, group->isExpanded());
m_updatingExpanded = false;
- Q_FOREACH (Group* child, group->children()) {
+ const QList<Group*> children = group->children();
+ for (Group* child : children) {
recInitExpanded(child);
}
}
diff --git a/src/gui/group/GroupView.h b/src/gui/group/GroupView.h
index 06bdbaf..69ca828 100644
--- a/src/gui/group/GroupView.h
+++ b/src/gui/group/GroupView.h
@@ -20,8 +20,6 @@
#include <QTreeView>
-#include "core/Global.h"
-
class Database;
class Group;
class GroupModel;
@@ -31,9 +29,9 @@ class GroupView : public QTreeView
Q_OBJECT
public:
- explicit GroupView(Database* db, QWidget* parent = Q_NULLPTR);
+ explicit GroupView(Database* db, QWidget* parent = nullptr);
void changeDatabase(Database* newDb);
- void setModel(QAbstractItemModel* model) Q_DECL_OVERRIDE;
+ void setModel(QAbstractItemModel* model) override;
Group* currentGroup();
void setCurrentGroup(Group* group);
void expandGroup(Group* group, bool expand = true);
@@ -49,7 +47,7 @@ private Q_SLOTS:
void modelReset();
protected:
- void dragMoveEvent(QDragMoveEvent* event) Q_DECL_OVERRIDE;
+ void dragMoveEvent(QDragMoveEvent* event) override;
private:
void recInitExpanded(Group* group);
diff --git a/src/keys/CompositeKey.cpp b/src/keys/CompositeKey.cpp
index 5bf9cae..16b4859 100644
--- a/src/keys/CompositeKey.cpp
+++ b/src/keys/CompositeKey.cpp
@@ -18,9 +18,10 @@
#include "CompositeKey.h"
#include "CompositeKey_p.h"
-#include <QtConcurrentRun>
-#include <QTime>
+#include <QtConcurrent>
+#include <QElapsedTimer>
+#include "core/Global.h"
#include "crypto/CryptoHash.h"
#include "crypto/SymmetricCipher.h"
@@ -63,7 +64,7 @@ CompositeKey& CompositeKey::operator=(const CompositeKey& key)
clear();
- Q_FOREACH (const Key* subKey, key.m_keys) {
+ for (const Key* subKey : asConst(key.m_keys)) {
addKey(*subKey);
}
@@ -74,7 +75,7 @@ QByteArray CompositeKey::rawKey() const
{
CryptoHash cryptoHash(CryptoHash::Sha256);
- Q_FOREACH (const Key* key, m_keys) {
+ for (const Key* key : m_keys) {
cryptoHash.addData(key->rawKey());
}
@@ -94,7 +95,8 @@ QByteArray CompositeKey::transform(const QByteArray& seed, quint64 rounds,
QByteArray key = rawKey();
- QFuture<QByteArray> future = QtConcurrent::run(transformKeyRaw, key.left(16), seed, rounds, &okLeft, &errorStringLeft);
+ QFuture<QByteArray> future = QtConcurrent::run(transformKeyRaw, key.left(16), seed, rounds,
+ &okLeft, &errorStringLeft);
QByteArray result2 = transformKeyRaw(key.right(16), seed, rounds, &okRight, &errorStringRight);
QByteArray transformed;
@@ -182,7 +184,7 @@ void TransformKeyBenchmarkThread::run()
SymmetricCipher::Encrypt);
cipher.init(seed, iv);
- QTime t;
+ QElapsedTimer t;
t.start();
do {
@@ -191,5 +193,5 @@ void TransformKeyBenchmarkThread::run()
return;
}
m_rounds += 10000;
- } while (t.elapsed() < m_msec);
+ } while (!t.hasExpired(m_msec));
}
diff --git a/src/keys/FileKey.h b/src/keys/FileKey.h
index f985433..7a9b1ca 100644
--- a/src/keys/FileKey.h
+++ b/src/keys/FileKey.h
@@ -20,7 +20,6 @@
#include <QXmlStreamReader>
-#include "core/Global.h"
#include "keys/Key.h"
class QIODevice;
@@ -30,11 +29,11 @@ class FileKey : public Key
public:
FileKey();
bool load(QIODevice* device);
- bool load(const QString& fileName, QString* errorMsg = Q_NULLPTR);
+ bool load(const QString& fileName, QString* errorMsg = nullptr);
QByteArray rawKey() const;
FileKey* clone() const;
static void create(QIODevice* device);
- static bool create(const QString& fileName, QString* errorMsg = Q_NULLPTR);
+ static bool create(const QString& fileName, QString* errorMsg = nullptr);
private:
bool loadXml(QIODevice* device);
diff --git a/src/main.cpp b/src/main.cpp
index bf558f1..d6b1b2d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -15,11 +15,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <QCommandLineParser>
#include <QFile>
#include "config-keepassx.h"
#include "core/Config.h"
-#include "core/qcommandlineparser.h"
#include "core/Tools.h"
#include "core/Translator.h"
#include "crypto/Crypto.h"
@@ -38,7 +38,7 @@ int main(int argc, char** argv)
Application::setApplicationName("keepassx");
Application::setApplicationVersion(KEEPASSX_VERSION);
// don't set organizationName as that changes the return value of
- // QDesktopServices::storageLocation(QDesktopServices::DataLocation)
+ // QStandardPaths::writableLocation(QDesktopServices::DataLocation)
QApplication::setQuitOnLastWindowClosed(false);
@@ -47,7 +47,7 @@ int main(int argc, char** argv)
"Fatal error while testing the cryptographic functions.");
error.append("\n");
error.append(Crypto::errorString());
- MessageBox::critical(Q_NULLPTR, QCoreApplication::translate("Main", "KeePassX - Error"), error);
+ MessageBox::critical(nullptr, QCoreApplication::translate("Main", "KeePassX - Error"), error);
return 1;
}
@@ -95,8 +95,8 @@ int main(int argc, char** argv)
}
if (config()->get("OpenPreviousDatabasesOnStartup").toBool()) {
- QStringList filenames = config()->get("LastOpenedDatabases").toStringList();
- Q_FOREACH (const QString& filename, filenames) {
+ const QStringList filenames = config()->get("LastOpenedDatabases").toStringList();
+ for (const QString& filename : filenames) {
if (!filename.isEmpty() && QFile::exists(filename)) {
mainWindow.openDatabase(filename, QString(), QString());
}
diff --git a/src/streams/HashedBlockStream.h b/src/streams/HashedBlockStream.h
index cae4eb4..93e4af5 100644
--- a/src/streams/HashedBlockStream.h
+++ b/src/streams/HashedBlockStream.h
@@ -31,12 +31,12 @@ public:
HashedBlockStream(QIODevice* baseDevice, qint32 blockSize);
~HashedBlockStream();
- bool reset() Q_DECL_OVERRIDE;
- void close() Q_DECL_OVERRIDE;
+ bool reset() override;
+ void close() override;
protected:
- qint64 readData(char* data, qint64 maxSize) Q_DECL_OVERRIDE;
- qint64 writeData(const char* data, qint64 maxSize) Q_DECL_OVERRIDE;
+ qint64 readData(char* data, qint64 maxSize) override;
+ qint64 writeData(const char* data, qint64 maxSize) override;
private:
void init();
diff --git a/src/streams/LayeredStream.h b/src/streams/LayeredStream.h
index b243e55..8586b41 100644
--- a/src/streams/LayeredStream.h
+++ b/src/streams/LayeredStream.h
@@ -20,8 +20,6 @@
#include <QIODevice>
-#include "core/Global.h"
-
class LayeredStream : public QIODevice
{
Q_OBJECT
@@ -30,12 +28,12 @@ public:
explicit LayeredStream(QIODevice* baseDevice);
virtual ~LayeredStream();
- bool isSequential() const Q_DECL_OVERRIDE;
- bool open(QIODevice::OpenMode mode) Q_DECL_OVERRIDE;
+ bool isSequential() const override;
+ bool open(QIODevice::OpenMode mode) override;
protected:
- qint64 readData(char* data, qint64 maxSize) Q_DECL_OVERRIDE;
- qint64 writeData(const char* data, qint64 maxSize) Q_DECL_OVERRIDE;
+ qint64 readData(char* data, qint64 maxSize) override;
+ qint64 writeData(const char* data, qint64 maxSize) override;
QIODevice* const m_baseDevice;
diff --git a/src/streams/StoreDataStream.h b/src/streams/StoreDataStream.h
index 4143438..9f39d6a 100644
--- a/src/streams/StoreDataStream.h
+++ b/src/streams/StoreDataStream.h
@@ -26,11 +26,11 @@ class StoreDataStream : public LayeredStream
public:
explicit StoreDataStream(QIODevice* baseDevice);
- bool open(QIODevice::OpenMode mode) Q_DECL_OVERRIDE;
+ bool open(QIODevice::OpenMode mode) override;
QByteArray storedData() const;
protected:
- qint64 readData(char* data, qint64 maxSize) Q_DECL_OVERRIDE;
+ qint64 readData(char* data, qint64 maxSize) override;
private:
QByteArray m_storedData;
diff --git a/src/streams/SymmetricCipherStream.h b/src/streams/SymmetricCipherStream.h
index fa44605..b6228e1 100644
--- a/src/streams/SymmetricCipherStream.h
+++ b/src/streams/SymmetricCipherStream.h
@@ -33,13 +33,13 @@ public:
SymmetricCipher::Mode mode, SymmetricCipher::Direction direction);
~SymmetricCipherStream();
bool init(const QByteArray& key, const QByteArray& iv);
- bool open(QIODevice::OpenMode mode) Q_DECL_OVERRIDE;
- bool reset() Q_DECL_OVERRIDE;
- void close() Q_DECL_OVERRIDE;
+ bool open(QIODevice::OpenMode mode) override;
+ bool reset() override;
+ void close() override;
protected:
- qint64 readData(char* data, qint64 maxSize) Q_DECL_OVERRIDE;
- qint64 writeData(const char* data, qint64 maxSize) Q_DECL_OVERRIDE;
+ qint64 readData(char* data, qint64 maxSize) override;
+ qint64 writeData(const char* data, qint64 maxSize) override;
private:
void resetInternalState();
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 2de7094..7ea399f 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -52,10 +52,9 @@ macro(parse_arguments prefix arg_names option_names)
endmacro(parse_arguments)
macro(add_unit_test)
- parse_arguments(TEST "NAME;SOURCES;MOCS;LIBS" "" ${ARGN})
+ parse_arguments(TEST "NAME;SOURCES;LIBS" "" ${ARGN})
set(_test_NAME ${TEST_NAME})
set(_srcList ${TEST_SOURCES})
- qt4_wrap_cpp(_srcList ${TEST_MOCS})
add_executable(${_test_NAME} ${_srcList})
target_link_libraries(${_test_NAME} ${TEST_LIBS})
@@ -86,85 +85,80 @@ endmacro(add_unit_test)
set(TEST_LIBRARIES
keepassx_core
- ${QT_QTCORE_LIBRARY}
- ${QT_QTGUI_LIBRARY}
- ${QT_QTTEST_LIBRARY}
+ Qt5::Core
+ Qt5::Concurrent
+ Qt5::Widgets
+ Qt5::Test
${GCRYPT_LIBRARIES}
${ZLIB_LIBRARIES}
)
set(testsupport_SOURCES modeltest.cpp FailDevice.cpp)
-qt4_wrap_cpp(testsupport_SOURCES modeltest.h FailDevice.h)
add_library(testsupport STATIC ${testsupport_SOURCES})
+target_link_libraries(testsupport Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Test)
-add_unit_test(NAME testgroup SOURCES TestGroup.cpp MOCS TestGroup.h
+add_unit_test(NAME testgroup SOURCES TestGroup.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testkeepass2xmlreader SOURCES TestKeePass2XmlReader.cpp MOCS TestKeePass2XmlReader.h
+add_unit_test(NAME testkeepass2xmlreader SOURCES TestKeePass2XmlReader.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testkeys SOURCES TestKeys.cpp MOCS TestKeys.h
+add_unit_test(NAME testkeys SOURCES TestKeys.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testkeepass2reader SOURCES TestKeePass2Reader.cpp MOCS TestKeePass2Reader.h
+add_unit_test(NAME testkeepass2reader SOURCES TestKeePass2Reader.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testkeepass2writer SOURCES TestKeePass2Writer.cpp MOCS TestKeePass2Writer.h
+add_unit_test(NAME testkeepass2writer SOURCES TestKeePass2Writer.cpp
LIBS testsupport ${TEST_LIBRARIES})
-add_unit_test(NAME testgroupmodel SOURCES TestGroupModel.cpp MOCS TestGroupModel.h
+add_unit_test(NAME testgroupmodel SOURCES TestGroupModel.cpp
LIBS testsupport ${TEST_LIBRARIES})
-add_unit_test(NAME testentrymodel SOURCES TestEntryModel.cpp MOCS TestEntryModel.h
+add_unit_test(NAME testentrymodel SOURCES TestEntryModel.cpp
LIBS testsupport ${TEST_LIBRARIES})
-add_unit_test(NAME testcryptohash SOURCES TestCryptoHash.cpp MOCS TestCryptoHash.h
+add_unit_test(NAME testcryptohash SOURCES TestCryptoHash.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testsymmetriccipher SOURCES TestSymmetricCipher.cpp MOCS TestSymmetricCipher.h
+add_unit_test(NAME testsymmetriccipher SOURCES TestSymmetricCipher.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testhashedblockstream SOURCES TestHashedBlockStream.cpp MOCS TestHashedBlockStream.h
+add_unit_test(NAME testhashedblockstream SOURCES TestHashedBlockStream.cpp
LIBS testsupport ${TEST_LIBRARIES})
-add_unit_test(NAME testkeepass2randomstream SOURCES TestKeePass2RandomStream.cpp MOCS TestKeePass2RandomStream.h
+add_unit_test(NAME testkeepass2randomstream SOURCES TestKeePass2RandomStream.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testmodified SOURCES TestModified.cpp MOCS TestModified.h
+add_unit_test(NAME testmodified SOURCES TestModified.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testdeletedobjects SOURCES TestDeletedObjects.cpp MOCS TestDeletedObjects.h
+add_unit_test(NAME testdeletedobjects SOURCES TestDeletedObjects.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testkeepass1reader SOURCES TestKeePass1Reader.cpp MOCS TestKeePass1Reader.h
+add_unit_test(NAME testkeepass1reader SOURCES TestKeePass1Reader.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testqsavefile SOURCES TestQSaveFile.cpp MOCS TestQSaveFile.h
+add_unit_test(NAME testwildcardmatcher SOURCES TestWildcardMatcher.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testwildcardmatcher SOURCES TestWildcardMatcher.cpp MOCS TestWildcardMatcher.h
- LIBS ${TEST_LIBRARIES})
-
-add_unit_test(NAME testautotype SOURCES TestAutoType.cpp MOCS TestAutoType.h
+add_unit_test(NAME testautotype SOURCES TestAutoType.cpp
LIBS ${TEST_LIBRARIES})
set_target_properties(testautotype PROPERTIES ENABLE_EXPORTS ON)
-add_unit_test(NAME testentry SOURCES TestEntry.cpp MOCS TestEntry.h
- LIBS ${TEST_LIBRARIES})
-
-add_unit_test(NAME testqcommandlineparser SOURCES TestQCommandLineParser.cpp MOCS TestQCommandLineParser.h
+add_unit_test(NAME testentry SOURCES TestEntry.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testrandom SOURCES TestRandom.cpp MOCS TestRandom.h
+add_unit_test(NAME testrandom SOURCES TestRandom.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testentrysearcher SOURCES TestEntrySearcher.cpp MOCS TestEntrySearcher.h
+add_unit_test(NAME testentrysearcher SOURCES TestEntrySearcher.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testexporter SOURCES TestExporter.cpp MOCS TestExporter.h
+add_unit_test(NAME testexporter SOURCES TestExporter.cpp
LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testcsvexporter SOURCES TestCsvExporter.cpp MOCS TestCsvExporter.h
+add_unit_test(NAME testcsvexporter SOURCES TestCsvExporter.cpp
LIBS ${TEST_LIBRARIES})
if(WITH_GUI_TESTS)
diff --git a/tests/FailDevice.h b/tests/FailDevice.h
index f812593..194d617 100644
--- a/tests/FailDevice.h
+++ b/tests/FailDevice.h
@@ -20,19 +20,17 @@
#include <QBuffer>
-#include "core/Global.h"
-
class FailDevice : public QBuffer
{
Q_OBJECT
public:
- explicit FailDevice(int failAfter, QObject* parent = Q_NULLPTR);
- bool open(QIODevice::OpenMode openMode) Q_DECL_OVERRIDE;
+ explicit FailDevice(int failAfter, QObject* parent = nullptr);
+ bool open(QIODevice::OpenMode openMode) override;
protected:
- qint64 readData(char* data, qint64 len) Q_DECL_OVERRIDE;
- qint64 writeData(const char* data, qint64 len) Q_DECL_OVERRIDE;
+ qint64 readData(char* data, qint64 len) override;
+ qint64 writeData(const char* data, qint64 len) override;
private:
int m_failAfter;
diff --git a/tests/TestAutoType.cpp b/tests/TestAutoType.cpp
index 8968348..cbd927f 100644
--- a/tests/TestAutoType.cpp
+++ b/tests/TestAutoType.cpp
@@ -20,7 +20,6 @@
#include <QPluginLoader>
#include <QTest>
-#include "tests.h"
#include "core/Config.h"
#include "core/FilePath.h"
#include "core/Entry.h"
@@ -108,7 +107,7 @@ void TestAutoType::testInternal()
void TestAutoType::testAutoTypeWithoutSequence()
{
- m_autoType->performAutoType(m_entry1, Q_NULLPTR);
+ m_autoType->performAutoType(m_entry1, nullptr);
QCOMPARE(m_test->actionCount(), 14);
QCOMPARE(m_test->actionChars(),
@@ -119,7 +118,7 @@ void TestAutoType::testAutoTypeWithoutSequence()
void TestAutoType::testAutoTypeWithSequence()
{
- m_autoType->performAutoType(m_entry1, Q_NULLPTR, "{Username}abc{PaSsWoRd}");
+ m_autoType->performAutoType(m_entry1, nullptr, "{Username}abc{PaSsWoRd}");
QCOMPARE(m_test->actionCount(), 15);
QCOMPARE(m_test->actionChars(),
diff --git a/tests/TestCryptoHash.cpp b/tests/TestCryptoHash.cpp
index 4002aea..c166f55 100644
--- a/tests/TestCryptoHash.cpp
+++ b/tests/TestCryptoHash.cpp
@@ -19,7 +19,6 @@
#include <QTest>
-#include "tests.h"
#include "crypto/Crypto.h"
#include "crypto/CryptoHash.h"
diff --git a/tests/TestCsvExporter.cpp b/tests/TestCsvExporter.cpp
index 5965e60..1fa6634 100644
--- a/tests/TestCsvExporter.cpp
+++ b/tests/TestCsvExporter.cpp
@@ -21,8 +21,6 @@
#include <QBuffer>
#include <QTest>
-#include "tests.h"
-
#include "core/Database.h"
#include "core/Entry.h"
#include "core/Group.h"
@@ -53,7 +51,7 @@ void TestCsvExporter::cleanUp()
void TestCsvExporter::testExport()
{
Group* groupRoot = m_db->rootGroup();
- Group* group= new Group();
+ Group* group = new Group();
group->setName("Test Group Name");
group->setParent(groupRoot);
Entry* entry = new Entry();
@@ -85,10 +83,10 @@ void TestCsvExporter::testEmptyDatabase()
void TestCsvExporter::testNestedGroups()
{
Group* groupRoot = m_db->rootGroup();
- Group* group= new Group();
+ Group* group = new Group();
group->setName("Test Group Name");
group->setParent(groupRoot);
- Group* childGroup= new Group();
+ Group* childGroup = new Group();
childGroup->setName("Test Sub Group Name");
childGroup->setParent(group);
Entry* entry = new Entry();
diff --git a/tests/TestCsvExporter.h b/tests/TestCsvExporter.h
index a71c936..c8cc4dc 100644
--- a/tests/TestCsvExporter.h
+++ b/tests/TestCsvExporter.h
@@ -42,7 +42,6 @@ private Q_SLOTS:
private:
Database* m_db;
CsvExporter* m_csvExporter;
-
};
#endif // KEEPASSX_TESTCSVEXPORTER_H
diff --git a/tests/TestDeletedObjects.cpp b/tests/TestDeletedObjects.cpp
index cf9e3d1..5af0178 100644
--- a/tests/TestDeletedObjects.cpp
+++ b/tests/TestDeletedObjects.cpp
@@ -19,7 +19,6 @@
#include <QTest>
-#include "tests.h"
#include "core/Database.h"
#include "core/Group.h"
#include "crypto/Crypto.h"
diff --git a/tests/TestEntry.cpp b/tests/TestEntry.cpp
index f918b6c..1eaca32 100644
--- a/tests/TestEntry.cpp
+++ b/tests/TestEntry.cpp
@@ -19,7 +19,6 @@
#include <QTest>
-#include "tests.h"
#include "core/Entry.h"
#include "crypto/Crypto.h"
diff --git a/tests/TestEntryModel.cpp b/tests/TestEntryModel.cpp
index b323a73..3f956d7 100644
--- a/tests/TestEntryModel.cpp
+++ b/tests/TestEntryModel.cpp
@@ -21,7 +21,6 @@
#include <QTest>
#include "modeltest.h"
-#include "tests.h"
#include "core/DatabaseIcons.h"
#include "core/Entry.h"
#include "core/Group.h"
diff --git a/tests/TestEntrySearcher.cpp b/tests/TestEntrySearcher.cpp
index 9f7ca13..6b951c7 100644
--- a/tests/TestEntrySearcher.cpp
+++ b/tests/TestEntrySearcher.cpp
@@ -19,8 +19,6 @@
#include <QTest>
-#include "tests.h"
-
QTEST_GUILESS_MAIN(TestEntrySearcher)
void TestEntrySearcher::initTestCase()
diff --git a/tests/TestExporter.cpp b/tests/TestExporter.cpp
index 76a6f75..656b76c 100644
--- a/tests/TestExporter.cpp
+++ b/tests/TestExporter.cpp
@@ -20,7 +20,6 @@
#include <QTest>
-#include "tests.h"
#include "core/ToDbExporter.h"
#include "core/Group.h"
#include "core/Metadata.h"
@@ -77,6 +76,3 @@ void TestExporter::testToDbExporter()
delete dbOrg;
delete dbExp;
}
-
-
-
diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp
index 514ef6d..a923776 100644
--- a/tests/TestGroup.cpp
+++ b/tests/TestGroup.cpp
@@ -21,7 +21,6 @@
#include <QSignalSpy>
#include <QTest>
-#include "tests.h"
#include "core/Database.h"
#include "core/Group.h"
#include "core/Metadata.h"
diff --git a/tests/TestGroupModel.cpp b/tests/TestGroupModel.cpp
index 32a4b8e..3608cc4 100644
--- a/tests/TestGroupModel.cpp
+++ b/tests/TestGroupModel.cpp
@@ -21,7 +21,6 @@
#include <QTest>
#include "modeltest.h"
-#include "tests.h"
#include "core/Database.h"
#include "core/Group.h"
#include "crypto/Crypto.h"
diff --git a/tests/TestHashedBlockStream.cpp b/tests/TestHashedBlockStream.cpp
index d5a0cea..b78a46b 100644
--- a/tests/TestHashedBlockStream.cpp
+++ b/tests/TestHashedBlockStream.cpp
@@ -20,7 +20,6 @@
#include <QBuffer>
#include <QTest>
-#include "tests.h"
#include "FailDevice.h"
#include "crypto/Crypto.h"
#include "streams/HashedBlockStream.h"
diff --git a/tests/TestKeePass1Reader.cpp b/tests/TestKeePass1Reader.cpp
index d9dff9e..f60846d 100644
--- a/tests/TestKeePass1Reader.cpp
+++ b/tests/TestKeePass1Reader.cpp
@@ -21,7 +21,6 @@
#include <QTest>
#include "config-keepassx-tests.h"
-#include "tests.h"
#include "core/Database.h"
#include "core/Entry.h"
#include "core/Group.h"
diff --git a/tests/TestKeePass2RandomStream.cpp b/tests/TestKeePass2RandomStream.cpp
index cb88133..03dfbe5 100644
--- a/tests/TestKeePass2RandomStream.cpp
+++ b/tests/TestKeePass2RandomStream.cpp
@@ -19,7 +19,6 @@
#include <QTest>
-#include "tests.h"
#include "crypto/Crypto.h"
#include "crypto/CryptoHash.h"
#include "crypto/SymmetricCipher.h"
diff --git a/tests/TestKeePass2Reader.cpp b/tests/TestKeePass2Reader.cpp
index d6cb70c..22973ee 100644
--- a/tests/TestKeePass2Reader.cpp
+++ b/tests/TestKeePass2Reader.cpp
@@ -20,7 +20,6 @@
#include <QTest>
#include "config-keepassx-tests.h"
-#include "tests.h"
#include "core/Database.h"
#include "core/Group.h"
#include "core/Metadata.h"
diff --git a/tests/TestKeePass2Writer.cpp b/tests/TestKeePass2Writer.cpp
index d56d98d..9f0c87b 100644
--- a/tests/TestKeePass2Writer.cpp
+++ b/tests/TestKeePass2Writer.cpp
@@ -22,7 +22,6 @@
#include <QTest>
#include "config-keepassx-tests.h"
-#include "tests.h"
#include "FailDevice.h"
#include "core/Database.h"
#include "core/Group.h"
diff --git a/tests/TestKeePass2XmlReader.cpp b/tests/TestKeePass2XmlReader.cpp
index 014587f..495b39a 100644
--- a/tests/TestKeePass2XmlReader.cpp
+++ b/tests/TestKeePass2XmlReader.cpp
@@ -21,7 +21,6 @@
#include <QFile>
#include <QTest>
-#include "tests.h"
#include "core/Database.h"
#include "core/Group.h"
#include "core/Metadata.h"
@@ -112,12 +111,12 @@ void TestKeePass2XmlReader::testMetadata()
QCOMPARE(m_db->metadata()->protectUrl(), true);
QCOMPARE(m_db->metadata()->protectNotes(), false);
QCOMPARE(m_db->metadata()->recycleBinEnabled(), true);
- QVERIFY(m_db->metadata()->recycleBin() != Q_NULLPTR);
+ QVERIFY(m_db->metadata()->recycleBin() != nullptr);
QCOMPARE(m_db->metadata()->recycleBin()->name(), QString("Recycle Bin"));
QCOMPARE(m_db->metadata()->recycleBinChanged(), genDT(2010, 8, 25, 16, 12, 57));
- QVERIFY(m_db->metadata()->entryTemplatesGroup() == Q_NULLPTR);
+ QVERIFY(m_db->metadata()->entryTemplatesGroup() == nullptr);
QCOMPARE(m_db->metadata()->entryTemplatesGroupChanged(), genDT(2010, 8, 8, 17, 24, 19));
- QVERIFY(m_db->metadata()->lastSelectedGroup() != Q_NULLPTR);
+ QVERIFY(m_db->metadata()->lastSelectedGroup() != nullptr);
QCOMPARE(m_db->metadata()->lastSelectedGroup()->name(), QString("NewDatabase"));
QVERIFY(m_db->metadata()->lastTopVisibleGroup() == m_db->metadata()->lastSelectedGroup());
QCOMPARE(m_db->metadata()->historyMaxItems(), -1);
diff --git a/tests/TestKeys.cpp b/tests/TestKeys.cpp
index b661775..6c1953f 100644
--- a/tests/TestKeys.cpp
+++ b/tests/TestKeys.cpp
@@ -21,7 +21,6 @@
#include <QTest>
#include "config-keepassx-tests.h"
-#include "tests.h"
#include "core/Database.h"
#include "core/Metadata.h"
#include "crypto/Crypto.h"
@@ -177,7 +176,7 @@ void TestKeys::benchmarkTransformKey()
QByteArray env = qgetenv("BENCHMARK");
if (env.isEmpty() || env == "0" || env == "no") {
- QSKIP("Benchmark skipped. Set env variable BENCHMARK=1 to enable.", SkipAll);
+ QSKIP("Benchmark skipped. Set env variable BENCHMARK=1 to enable.");
}
PasswordKey pwKey;
diff --git a/tests/TestModified.cpp b/tests/TestModified.cpp
index e275e83..70a4a48 100644
--- a/tests/TestModified.cpp
+++ b/tests/TestModified.cpp
@@ -20,7 +20,6 @@
#include <QSignalSpy>
#include <QTest>
-#include "tests.h"
#include "core/Database.h"
#include "core/Group.h"
#include "core/Metadata.h"
@@ -237,7 +236,7 @@ void TestModified::testEntrySets()
entry->setExpires(entry->timeInfo().expires());
QCOMPARE(spyModified.count(), spyCount);
- entry->setExpiryTime(Tools::currentDateTimeUtc().addYears(1));
+ entry->setExpiryTime(QDateTime::currentDateTimeUtc().addYears(1));
QCOMPARE(spyModified.count(), ++spyCount);
entry->setExpiryTime(entry->timeInfo().expiryTime());
QCOMPARE(spyModified.count(), spyCount);
diff --git a/tests/TestQCommandLineParser.cpp b/tests/TestQCommandLineParser.cpp
deleted file mode 100644
index 4e2c635..0000000
--- a/tests/TestQCommandLineParser.cpp
+++ /dev/null
@@ -1,416 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "TestQCommandLineParser.h"
-
-#include <QtTest>
-
-#include "tests.h"
-#include "core/qcommandlineparser.h"
-
-QTEST_GUILESS_MAIN(TestQCommandLineParser)
-
-Q_DECLARE_METATYPE(char**)
-
-static char *empty_argv[] = { 0 };
-static int empty_argc = 1;
-
-void TestQCommandLineParser::initTestCase()
-{
- Q_ASSERT(!empty_argv[0]);
- empty_argv[0] = const_cast<char*>("TestQCommandLineParser");
-}
-
-Q_DECLARE_METATYPE(QCommandLineParser::SingleDashWordOptionMode)
-
-void TestQCommandLineParser::parsingModes_data()
-{
- QTest::addColumn<QCommandLineParser::SingleDashWordOptionMode>("parsingMode");
-
- QTest::newRow("collapsed") << QCommandLineParser::ParseAsCompactedShortOptions;
- QTest::newRow("implicitlylong") << QCommandLineParser::ParseAsLongOptions;
-}
-
-void TestQCommandLineParser::testInvalidOptions()
-{
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- QTest::ignoreMessage(QtWarningMsg, "QCommandLineOption: Option names cannot start with a '-'");
- parser.addOption(QCommandLineOption("-v", "Displays version information."));
-}
-
-void TestQCommandLineParser::testPositionalArguments()
-{
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- QVERIFY(parser.parse(QStringList() << "TestQCommandLineParser" << "file.txt"));
- QCOMPARE(parser.positionalArguments(), QStringList() << "file.txt");
-}
-
-void TestQCommandLineParser::testBooleanOption_data()
-{
- QTest::addColumn<QStringList>("args");
- QTest::addColumn<QStringList>("expectedOptionNames");
- QTest::addColumn<bool>("expectedIsSet");
-
- QTest::newRow("set") << (QStringList() << "TestQCommandLineParser" << "-b") << (QStringList() << "b") << true;
- QTest::newRow("unset") << (QStringList() << "TestQCommandLineParser") << QStringList() << false;
-}
-
-void TestQCommandLineParser::testBooleanOption()
-{
- QFETCH(QStringList, args);
- QFETCH(QStringList, expectedOptionNames);
- QFETCH(bool, expectedIsSet);
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- QVERIFY(parser.addOption(QCommandLineOption("b", "a boolean option")));
- QVERIFY(parser.parse(args));
- QCOMPARE(parser.optionNames(), expectedOptionNames);
- QCOMPARE(parser.isSet("b"), expectedIsSet);
- QCOMPARE(parser.values("b"), QStringList());
- QCOMPARE(parser.positionalArguments(), QStringList());
- // Should warn on typos
- QTest::ignoreMessage(QtWarningMsg, "QCommandLineParser: option not defined: \"c\"");
- QVERIFY(!parser.isSet("c"));
-}
-
-void TestQCommandLineParser::testMultipleNames_data()
-{
- QTest::addColumn<QStringList>("args");
- QTest::addColumn<QStringList>("expectedOptionNames");
-
- QTest::newRow("short") << (QStringList() << "TestQCommandLineParser" << "-v") << (QStringList() << "v");
- QTest::newRow("long") << (QStringList() << "TestQCommandLineParser" << "--version") << (QStringList() << "version");
- QTest::newRow("not_set") << (QStringList() << "TestQCommandLineParser") << QStringList();
-}
-
-void TestQCommandLineParser::testMultipleNames()
-{
- QFETCH(QStringList, args);
- QFETCH(QStringList, expectedOptionNames);
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineOption option(QStringList() << "v" << "version", "Show version information");
- QCOMPARE(option.names(), QStringList() << "v" << "version");
- QCommandLineParser parser;
- QVERIFY(parser.addOption(option));
- QVERIFY(parser.parse(args));
- QCOMPARE(parser.optionNames(), expectedOptionNames);
- const bool expectedIsSet = !expectedOptionNames.isEmpty();
- QCOMPARE(parser.isSet("v"), expectedIsSet);
- QCOMPARE(parser.isSet("version"), expectedIsSet);
-}
-
-void TestQCommandLineParser::testSingleValueOption_data()
-{
- QTest::addColumn<QStringList>("args");
- QTest::addColumn<QStringList>("defaults");
- QTest::addColumn<bool>("expectedIsSet");
-
- QTest::newRow("short") << (QStringList() << "tst" << "-s" << "oxygen") << QStringList() << true;
- QTest::newRow("long") << (QStringList() << "tst" << "--style" << "oxygen") << QStringList() << true;
- QTest::newRow("longequal") << (QStringList() << "tst" << "--style=oxygen") << QStringList() << true;
- QTest::newRow("default") << (QStringList() << "tst") << (QStringList() << "oxygen") << false;
-}
-
-void TestQCommandLineParser::testSingleValueOption()
-{
- QFETCH(QStringList, args);
- QFETCH(QStringList, defaults);
- QFETCH(bool, expectedIsSet);
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- QCommandLineOption option(QStringList() << "s" << "style", "style name", "styleName");
- option.setDefaultValues(defaults);
- QVERIFY(parser.addOption(option));
- for (int mode = 0; mode < 2; ++mode) {
- parser.setSingleDashWordOptionMode(QCommandLineParser::SingleDashWordOptionMode(mode));
- QVERIFY(parser.parse(args));
- QCOMPARE(parser.isSet("s"), expectedIsSet);
- QCOMPARE(parser.isSet("style"), expectedIsSet);
- QCOMPARE(parser.isSet(option), expectedIsSet);
- QCOMPARE(parser.value("s"), QString("oxygen"));
- QCOMPARE(parser.value("style"), QString("oxygen"));
- QCOMPARE(parser.values("s"), QStringList() << "oxygen");
- QCOMPARE(parser.values("style"), QStringList() << "oxygen");
- QCOMPARE(parser.values(option), QStringList() << "oxygen");
- QCOMPARE(parser.positionalArguments(), QStringList());
- }
- // Should warn on typos
- QTest::ignoreMessage(QtWarningMsg, "QCommandLineParser: option not defined: \"c\"");
- QVERIFY(parser.values("c").isEmpty());
-}
-
-void TestQCommandLineParser::testValueNotSet()
-{
- QCoreApplication app(empty_argc, empty_argv);
- // Not set, no default value
- QCommandLineParser parser;
- QCommandLineOption option(QStringList() << "s" << "style", "style name");
- option.setValueName("styleName");
- QVERIFY(parser.addOption(option));
- QVERIFY(parser.parse(QStringList() << "tst"));
- QCOMPARE(parser.optionNames(), QStringList());
- QVERIFY(!parser.isSet("s"));
- QVERIFY(!parser.isSet("style"));
- QCOMPARE(parser.value("s"), QString());
- QCOMPARE(parser.value("style"), QString());
- QCOMPARE(parser.values("s"), QStringList());
- QCOMPARE(parser.values("style"), QStringList());
-}
-
-void TestQCommandLineParser::testMultipleValuesOption()
-{
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineOption option("param", "Pass parameter to the backend.");
- option.setValueName("key=value");
- QCommandLineParser parser;
- QVERIFY(parser.addOption(option));
- {
- QVERIFY(parser.parse(QStringList() << "tst" << "--param" << "key1=value1"));
- QVERIFY(parser.isSet("param"));
- QCOMPARE(parser.values("param"), QStringList() << "key1=value1");
- QCOMPARE(parser.value("param"), QString("key1=value1"));
- }
- {
- QVERIFY(parser.parse(QStringList() << "tst" << "--param" << "key1=value1" << "--param" << "key2=value2"));
- QVERIFY(parser.isSet("param"));
- QCOMPARE(parser.values("param"), QStringList() << "key1=value1" << "key2=value2");
- QCOMPARE(parser.value("param"), QString("key2=value2"));
- }
-
- QString expected =
- "Usage: TestQCommandLineParser [options]\n"
- "\n"
- "Options:\n"
- " --param <key=value> Pass parameter to the backend.\n";
-
- const QString exeName = QCoreApplication::instance()->arguments().first(); // e.g. debug\tst_qcommandlineparser.exe on Windows
- expected.replace("TestQCommandLineParser", exeName);
- QCOMPARE(parser.helpText(), expected);
-}
-
-void TestQCommandLineParser::testUnknownOptionErrorHandling_data()
-{
- QTest::addColumn<QCommandLineParser::SingleDashWordOptionMode>("parsingMode");
- QTest::addColumn<QStringList>("args");
- QTest::addColumn<QStringList>("expectedUnknownOptionNames");
- QTest::addColumn<QString>("expectedErrorText");
-
- const QStringList args_hello = QStringList() << "TestQCommandLineParser" << "--hello";
- const QString error_hello("Unknown option 'hello'.");
- QTest::newRow("unknown_name_collapsed") << QCommandLineParser::ParseAsCompactedShortOptions << args_hello << QStringList("hello") << error_hello;
- QTest::newRow("unknown_name_long") << QCommandLineParser::ParseAsLongOptions << args_hello << QStringList("hello") << error_hello;
-
- const QStringList args_value = QStringList() << "TestQCommandLineParser" << "-b=1";
- QTest::newRow("bool_with_value_collapsed") << QCommandLineParser::ParseAsCompactedShortOptions << args_value << QStringList() << QString("Unexpected value after '-b'.");
- QTest::newRow("bool_with_value_long") << QCommandLineParser::ParseAsLongOptions << args_value << QStringList() << QString("Unexpected value after '-b'.");
-
- const QStringList args_dash_long = QStringList() << "TestQCommandLineParser" << "-bool";
- const QString error_bool("Unknown options: o, o, l.");
- QTest::newRow("unknown_name_long_collapsed") << QCommandLineParser::ParseAsCompactedShortOptions << args_dash_long << (QStringList() << "o" << "o" << "l") << error_bool;
-}
-
-void TestQCommandLineParser::testUnknownOptionErrorHandling()
-{
- QFETCH(QCommandLineParser::SingleDashWordOptionMode, parsingMode);
- QFETCH(QStringList, args);
- QFETCH(QStringList, expectedUnknownOptionNames);
- QFETCH(QString, expectedErrorText);
-
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- parser.setSingleDashWordOptionMode(parsingMode);
- QVERIFY(parser.addOption(QCommandLineOption(QStringList() << "b" << "bool", "a boolean option")));
- QCOMPARE(parser.parse(args), expectedErrorText.isEmpty());
- QCOMPARE(parser.unknownOptionNames(), expectedUnknownOptionNames);
- QCOMPARE(parser.errorText(), expectedErrorText);
-}
-
-void TestQCommandLineParser::testDoubleDash_data()
-{
- parsingModes_data();
-}
-
-void TestQCommandLineParser::testDoubleDash()
-{
- QFETCH(QCommandLineParser::SingleDashWordOptionMode, parsingMode);
-
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- parser.addOption(QCommandLineOption(QStringList() << "o" << "output", "Output file", "filename"));
- parser.setSingleDashWordOptionMode(parsingMode);
- QVERIFY(parser.parse(QStringList() << "TestQCommandLineParser" << "--output" << "foo"));
- QCOMPARE(parser.value("output"), QString("foo"));
- QCOMPARE(parser.positionalArguments(), QStringList());
- QCOMPARE(parser.unknownOptionNames(), QStringList());
- QVERIFY(parser.parse(QStringList() << "TestQCommandLineParser" << "--" << "--output" << "bar" << "-b" << "bleh"));
- QCOMPARE(parser.value("output"), QString());
- QCOMPARE(parser.positionalArguments(), QStringList() << "--output" << "bar" << "-b" << "bleh");
- QCOMPARE(parser.unknownOptionNames(), QStringList());
-}
-
-void TestQCommandLineParser::testDefaultValue()
-{
- QCommandLineOption opt("name", "desc",
- "valueName", "default");
- QCOMPARE(opt.defaultValues(), QStringList("default"));
- opt.setDefaultValue("");
- QCOMPARE(opt.defaultValues(), QStringList());
- opt.setDefaultValue("default");
- QCOMPARE(opt.defaultValues(), QStringList("default"));
-}
-
-void TestQCommandLineParser::testProcessNotCalled()
-{
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- QVERIFY(parser.addOption(QCommandLineOption("b", "a boolean option")));
- QTest::ignoreMessage(QtWarningMsg, "QCommandLineParser: call process() or parse() before isSet");
- QVERIFY(!parser.isSet("b"));
- QTest::ignoreMessage(QtWarningMsg, "QCommandLineParser: call process() or parse() before values");
- QCOMPARE(parser.values("b"), QStringList());
-}
-
-void TestQCommandLineParser::testEmptyArgsList()
-{
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- QTest::ignoreMessage(QtWarningMsg, "QCommandLineParser: argument list cannot be empty, it should contain at least the executable name");
- QVERIFY(!parser.parse(QStringList())); // invalid call, argv[0] is missing
-}
-
-void TestQCommandLineParser::testMissingOptionValue()
-{
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- parser.addOption(QCommandLineOption("option", "An option", "value"));
- QVERIFY(!parser.parse(QStringList() << "argv0" << "--option")); // the user forgot to pass a value for --option
- QCOMPARE(parser.value("option"), QString());
- QCOMPARE(parser.errorText(), QString("Missing value after '--option'."));
-}
-
-void TestQCommandLineParser::testStdinArgument_data()
-{
- parsingModes_data();
-}
-
-void TestQCommandLineParser::testStdinArgument()
-{
- QFETCH(QCommandLineParser::SingleDashWordOptionMode, parsingMode);
-
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- parser.setSingleDashWordOptionMode(parsingMode);
- parser.addOption(QCommandLineOption(QStringList() << "i" << "input", "Input file.", "filename"));
- parser.addOption(QCommandLineOption("b", "Boolean option."));
- QVERIFY(parser.parse(QStringList() << "TestQCommandLineParser" << "--input" << "-"));
- QCOMPARE(parser.value("input"), QString("-"));
- QCOMPARE(parser.positionalArguments(), QStringList());
- QCOMPARE(parser.unknownOptionNames(), QStringList());
-
- QVERIFY(parser.parse(QStringList() << "TestQCommandLineParser" << "--input" << "-" << "-b" << "arg"));
- QCOMPARE(parser.value("input"), QString("-"));
- QVERIFY(parser.isSet("b"));
- QCOMPARE(parser.positionalArguments(), QStringList() << "arg");
- QCOMPARE(parser.unknownOptionNames(), QStringList());
-
- QVERIFY(parser.parse(QStringList() << "TestQCommandLineParser" << "-"));
- QCOMPARE(parser.value("input"), QString());
- QVERIFY(!parser.isSet("b"));
- QCOMPARE(parser.positionalArguments(), QStringList() << "-");
- QCOMPARE(parser.unknownOptionNames(), QStringList());
-}
-
-void TestQCommandLineParser::testSingleDashWordOptionModes_data()
-{
- QTest::addColumn<QCommandLineParser::SingleDashWordOptionMode>("parsingMode");
- QTest::addColumn<QStringList>("commandLine");
- QTest::addColumn<QStringList>("expectedOptionNames");
- QTest::addColumn<QStringList>("expectedOptionValues");
-
- QTest::newRow("collapsed") << QCommandLineParser::ParseAsCompactedShortOptions << (QStringList() << "-abc" << "val")
- << (QStringList() << "a" << "b" << "c") << (QStringList() << QString() << QString() << "val");
- QTest::newRow("collapsed_with_equalsign_value") << QCommandLineParser::ParseAsCompactedShortOptions << (QStringList() << "-abc=val")
- << (QStringList() << "a" << "b" << "c") << (QStringList() << QString() << QString() << "val");
- QTest::newRow("collapsed_explicit_longoption") << QCommandLineParser::ParseAsCompactedShortOptions << QStringList("--nn")
- << QStringList("nn") << QStringList();
- QTest::newRow("collapsed_longoption_value") << QCommandLineParser::ParseAsCompactedShortOptions << (QStringList() << "--abc" << "val")
- << QStringList("abc") << QStringList("val");
- QTest::newRow("compiler") << QCommandLineParser::ParseAsCompactedShortOptions << QStringList("-cab")
- << QStringList("c") << QStringList("ab");
- QTest::newRow("compiler_with_space") << QCommandLineParser::ParseAsCompactedShortOptions << (QStringList() << "-c" << "val")
- << QStringList("c") << QStringList("val");
-
- QTest::newRow("implicitlylong") << QCommandLineParser::ParseAsLongOptions << (QStringList() << "-abc" << "val")
- << QStringList("abc") << QStringList("val");
- QTest::newRow("implicitlylong_equal") << QCommandLineParser::ParseAsLongOptions << (QStringList() << "-abc=val")
- << QStringList("abc") << QStringList("val");
- QTest::newRow("implicitlylong_longoption") << QCommandLineParser::ParseAsLongOptions << (QStringList() << "--nn")
- << QStringList("nn") << QStringList();
- QTest::newRow("implicitlylong_longoption_value") << QCommandLineParser::ParseAsLongOptions << (QStringList() << "--abc" << "val")
- << QStringList("abc") << QStringList("val");
- QTest::newRow("implicitlylong_with_space") << QCommandLineParser::ParseAsCompactedShortOptions << (QStringList() << "-c" << "val")
- << QStringList("c") << QStringList("val");
-}
-
-void TestQCommandLineParser::testSingleDashWordOptionModes()
-{
- QFETCH(QCommandLineParser::SingleDashWordOptionMode, parsingMode);
- QFETCH(QStringList, commandLine);
- QFETCH(QStringList, expectedOptionNames);
- QFETCH(QStringList, expectedOptionValues);
-
- commandLine.prepend("TestQCommandLineParser");
-
- QCoreApplication app(empty_argc, empty_argv);
- QCommandLineParser parser;
- parser.setSingleDashWordOptionMode(parsingMode);
- parser.addOption(QCommandLineOption("a", "a option."));
- parser.addOption(QCommandLineOption("b", "b option."));
- parser.addOption(QCommandLineOption(QStringList() << "c" << "abc", "c option.", "value"));
- parser.addOption(QCommandLineOption("nn", "nn option."));
- QVERIFY(parser.parse(commandLine));
- QCOMPARE(parser.optionNames(), expectedOptionNames);
- for (int i = 0; i < expectedOptionValues.count(); ++i)
- QCOMPARE(parser.value(parser.optionNames().at(i)), expectedOptionValues.at(i));
- QCOMPARE(parser.unknownOptionNames(), QStringList());
-}
diff --git a/tests/TestQCommandLineParser.h b/tests/TestQCommandLineParser.h
deleted file mode 100644
index 46214cd..0000000
--- a/tests/TestQCommandLineParser.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 David Faure <faure@kde.org>
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef KEEPASSX_TESTQCOMMANDLINEPARSER_H
-#define KEEPASSX_TESTQCOMMANDLINEPARSER_H
-
-#include <QObject>
-
-class TestQCommandLineParser : public QObject
-{
- Q_OBJECT
-
-public Q_SLOTS:
- void initTestCase();
-
-private Q_SLOTS:
- void parsingModes_data();
-
- // In-process tests
- void testInvalidOptions();
- void testPositionalArguments();
- void testBooleanOption_data();
- void testBooleanOption();
- void testMultipleNames_data();
- void testMultipleNames();
- void testSingleValueOption_data();
- void testSingleValueOption();
- void testValueNotSet();
- void testMultipleValuesOption();
- void testUnknownOptionErrorHandling_data();
- void testUnknownOptionErrorHandling();
- void testDoubleDash_data();
- void testDoubleDash();
- void testDefaultValue();
- void testProcessNotCalled();
- void testEmptyArgsList();
- void testMissingOptionValue();
- void testStdinArgument_data();
- void testStdinArgument();
- void testSingleDashWordOptionModes_data();
- void testSingleDashWordOptionModes();
-};
-
-#endif // KEEPASSX_TESTQCOMMANDLINEPARSER_H
diff --git a/tests/TestQSaveFile.cpp b/tests/TestQSaveFile.cpp
deleted file mode 100644
index 443db52..0000000
--- a/tests/TestQSaveFile.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2012 Felix Geyer <debfx@fobos.de>
- * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 or (at your option)
- * version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "TestQSaveFile.h"
-
-#include <QtTest>
-
-#include <unistd.h>
-
-#if defined(Q_OS_WIN)
-# include <windows.h>
-#endif
-
-#include "tests.h"
-#include "core/qsavefile.h"
-
-QTEST_GUILESS_MAIN(TestQSaveFile)
-
-class DirCleanup
-{
-public:
- DirCleanup(const QString& dir, const QString& filePrefix) : m_dir(dir), m_filePrefix(filePrefix) {}
- ~DirCleanup() {
- QDir dir(m_dir);
- QStringList files = dir.entryList(QStringList() << (m_filePrefix + "*"), QDir::Files);
- Q_FOREACH (const QString& file, files) {
- QFile::remove(m_dir + "/" + file);
- }
-
- QDir().rmdir(m_dir);
- }
-
-private:
- QString m_dir;
- QString m_filePrefix;
-};
-
-void TestQSaveFile::transactionalWrite()
-{
- const QString dir = tmpDir();
- QVERIFY(!dir.isEmpty());
- const QString targetFile = dir + QString::fromLatin1("/outfile");
- DirCleanup dirCleanup(dir, "outfile");
- QFile::remove(targetFile);
- QSaveFile file(targetFile);
- QVERIFY(file.open(QIODevice::WriteOnly));
- QVERIFY(file.isOpen());
- QCOMPARE(file.fileName(), targetFile);
- QVERIFY(!QFile::exists(targetFile));
-
- QTextStream ts(&file);
- ts << "This is test data one.\n";
- ts.flush();
- QCOMPARE(file.error(), QFile::NoError);
- QVERIFY(!QFile::exists(targetFile));
-
- QVERIFY(file.commit());
- QVERIFY(QFile::exists(targetFile));
- QCOMPARE(file.fileName(), targetFile);
-
- // Check that we can reuse a QSaveFile object
- // (and test the case of an existing target file)
- QVERIFY(file.open(QIODevice::WriteOnly));
- QCOMPARE(file.write("Hello"), 5LL);
- QVERIFY(file.commit());
-
- QFile reader(targetFile);
- QVERIFY(reader.open(QIODevice::ReadOnly));
- QCOMPARE(QString::fromLatin1(reader.readAll().constData()), QString::fromLatin1("Hello"));
- reader.close();
-
- QVERIFY(QFile::remove(targetFile));
-}
-
-void TestQSaveFile::autoFlush()
-{
- const QString dir = tmpDir();
- QVERIFY(!dir.isEmpty());
- const QString targetFile = dir + QString::fromLatin1("/outfile");
- DirCleanup dirCleanup(dir, "outfile");
- QFile::remove(targetFile);
- QSaveFile file(targetFile);
- QVERIFY(file.open(QIODevice::WriteOnly));
-
- QTextStream ts(&file);
- ts << "Auto-flush.";
- // no flush
- QVERIFY(file.commit()); // close will emit aboutToClose, which will flush the stream
- QFile reader(targetFile);
- QVERIFY(reader.open(QIODevice::ReadOnly));
- QCOMPARE(QString::fromLatin1(reader.readAll().constData()), QString::fromLatin1("Auto-flush."));
- reader.close();
-
- QVERIFY(QFile::remove(targetFile));
-}
-
-void TestQSaveFile::transactionalWriteNoPermissions()
-{
-#ifdef Q_OS_UNIX
- if (::geteuid() == 0) {
- QSKIP("not valid running this test as root", SkipAll);
- }
-
- // You can write into /dev/zero, but you can't create a /dev/zero.XXXXXX temp file.
- QSaveFile file("/dev/zero");
- if (!QDir("/dev").exists()) {
- QSKIP("/dev doesn't exist on this system", SkipAll);
- }
-
- QVERIFY(!file.open(QIODevice::WriteOnly));
- QCOMPARE(static_cast<int>(file.error()), static_cast<int>(QFile::OpenError));
- QVERIFY(!file.commit());
-#endif
-}
-
-void TestQSaveFile::transactionalWriteCanceled()
-{
- const QString dir = tmpDir();
- QVERIFY(!dir.isEmpty());
- const QString targetFile = dir + QString::fromLatin1("/outfile");
- DirCleanup dirCleanup(dir, "outfile");
- QFile::remove(targetFile);
- QSaveFile file(targetFile);
- QVERIFY(file.open(QIODevice::WriteOnly));
-
- QTextStream ts(&file);
- ts << "This writing operation will soon be canceled.\n";
- ts.flush();
- QCOMPARE(file.error(), QFile::NoError);
- QVERIFY(!QFile::exists(targetFile));
-
- // We change our mind, let's abort writing
- file.cancelWriting();
-
- QVERIFY(!file.commit());
-
- QVERIFY(!QFile::exists(targetFile)); // temp file was discarded
- QCOMPARE(file.fileName(), targetFile);
-}
-
-void TestQSaveFile::transactionalWriteErrorRenaming()
-{
-#ifndef Q_OS_WIN
- if (::geteuid() == 0) {
- QSKIP("not valid running this test as root", SkipAll);
- }
- const QString dir = tmpDir();
- QVERIFY(!dir.isEmpty());
- const QString targetFile = dir + QString::fromLatin1("/outfile");
- DirCleanup dirCleanup(dir, "outfile");
- QSaveFile file(targetFile);
- QVERIFY(file.open(QIODevice::WriteOnly));
- QCOMPARE(file.write("Hello"), qint64(5));
- QVERIFY(!QFile::exists(targetFile));
-
-#ifdef Q_OS_UNIX
- QFile dirAsFile(dir); // yay, I have to use QFile to change a dir's permissions...
- QVERIFY(dirAsFile.setPermissions(QFile::Permissions(0))); // no permissions
-#else
- QVERIFY(file.setPermissions(QFile::ReadOwner));
-#endif
-
- QVERIFY(!file.commit());
- QVERIFY(!QFile::exists(targetFile)); // renaming failed
- QCOMPARE(file.error(), QFile::RenameError);
-
- // Restore permissions so that the cleanup can happen
-#ifdef Q_OS_UNIX
- QVERIFY(dirAsFile.setPermissions(QFile::Permissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner)));
-#else
- QVERIFY(file.setPermissions(QFile::ReadOwner | QFile::WriteOwner));
-#endif
-#endif // !Q_OS_WIN
-}
-
-QString TestQSaveFile::tmpDir()
-{
- QTemporaryFile* tmpFile = new QTemporaryFile(QDir::tempPath() + "/qttest_temp.XXXXXX");
- if (!tmpFile->open()) {
- return QString();
- }
- QString dirName = tmpFile->fileName();
- delete tmpFile;
- if (!QDir().mkdir(dirName)) {
- return QString();
- }
-
- return dirName;
-}
diff --git a/tests/TestQSaveFile.h b/tests/TestQSaveFile.h
deleted file mode 100644
index 8e1caf0..0000000
--- a/tests/TestQSaveFile.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2012 Felix Geyer <debfx@fobos.de>
- * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 or (at your option)
- * version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef KEEPASSX_TESTQSAVEFILE_H
-#define KEEPASSX_TESTQSAVEFILE_H
-
-#include <QObject>
-
-class TestQSaveFile : public QObject
-{
- Q_OBJECT
-
-private Q_SLOTS:
- void transactionalWrite();
- void autoFlush();
- void transactionalWriteNoPermissions();
- void transactionalWriteCanceled();
- void transactionalWriteErrorRenaming();
-
-private:
- QString tmpDir();
-};
-
-#endif // KEEPASSX_TESTQSAVEFILE_H
diff --git a/tests/TestRandom.cpp b/tests/TestRandom.cpp
index 40ab702..6c5b1f7 100644
--- a/tests/TestRandom.cpp
+++ b/tests/TestRandom.cpp
@@ -17,8 +17,8 @@
#include "TestRandom.h"
-#include "tests.h"
#include "core/Endian.h"
+#include "core/Global.h"
#include <QTest>
diff --git a/tests/TestRandom.h b/tests/TestRandom.h
index a308f36..c879f94 100644
--- a/tests/TestRandom.h
+++ b/tests/TestRandom.h
@@ -18,7 +18,6 @@
#ifndef KEEPASSX_TESTRANDOM_H
#define KEEPASSX_TESTRANDOM_H
-#include "core/Global.h"
#include "crypto/Random.h"
#include <QObject>
@@ -27,7 +26,7 @@ class RandomBackendTest : public RandomBackend
{
public:
RandomBackendTest();
- void randomize(void* data, int len) Q_DECL_OVERRIDE;
+ void randomize(void* data, int len) override;
void setNextBytes(const QByteArray& nextBytes);
private:
diff --git a/tests/TestSymmetricCipher.cpp b/tests/TestSymmetricCipher.cpp
index 578d250..698ecb2 100644
--- a/tests/TestSymmetricCipher.cpp
+++ b/tests/TestSymmetricCipher.cpp
@@ -20,7 +20,6 @@
#include <QBuffer>
#include <QTest>
-#include "tests.h"
#include "crypto/Crypto.h"
#include "crypto/SymmetricCipher.h"
#include "streams/SymmetricCipherStream.h"
diff --git a/tests/TestWildcardMatcher.cpp b/tests/TestWildcardMatcher.cpp
index dc9991d..dffe1c8 100644
--- a/tests/TestWildcardMatcher.cpp
+++ b/tests/TestWildcardMatcher.cpp
@@ -19,7 +19,6 @@
#include <QTest>
-#include "tests.h"
#include "autotype/WildcardMatcher.h"
QTEST_GUILESS_MAIN(TestWildcardMatcher)
diff --git a/tests/gui/CMakeLists.txt b/tests/gui/CMakeLists.txt
index 91fcd69..a1ca914 100644
--- a/tests/gui/CMakeLists.txt
+++ b/tests/gui/CMakeLists.txt
@@ -13,6 +13,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-add_unit_test(NAME testgui SOURCES TestGui.cpp MOCS TestGui.h LIBS ${TEST_LIBRARIES})
+add_unit_test(NAME testgui SOURCES TestGui.cpp LIBS ${TEST_LIBRARIES})
-add_unit_test(NAME testguipixmaps SOURCES TestGuiPixmaps.cpp MOCS TestGuiPixmaps.h LIBS ${TEST_LIBRARIES})
+add_unit_test(NAME testguipixmaps SOURCES TestGuiPixmaps.cpp LIBS ${TEST_LIBRARIES})
diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp
index 8845c60..90d7fc2 100644
--- a/tests/gui/TestGui.cpp
+++ b/tests/gui/TestGui.cpp
@@ -21,6 +21,7 @@
#include <QApplication>
#include <QDialogButtonBox>
#include <QLineEdit>
+#include <QMimeData>
#include <QPushButton>
#include <QSpinBox>
#include <QTemporaryFile>
@@ -29,7 +30,6 @@
#include <QToolButton>
#include "config-keepassx-tests.h"
-#include "tests.h"
#include "core/Config.h"
#include "core/Database.h"
#include "core/Entry.h"
@@ -56,6 +56,7 @@ void TestGui::initTestCase()
m_mainWindow = new MainWindow();
m_tabWidget = m_mainWindow->findChild<DatabaseTabWidget*>("tabWidget");
m_mainWindow->show();
+ m_mainWindow->activateWindow();
Tools::wait(50);
QByteArray tmpData;
@@ -184,7 +185,7 @@ void TestGui::testSearch()
QLineEdit* searchEdit = m_dbWidget->findChild<QLineEdit*>("searchEdit");
QToolButton* clearSearch = m_dbWidget->findChild<QToolButton*>("clearButton");
- QVERIFY(!searchEdit->hasFocus());
+ QVERIFY(!searchEdit->isVisible());
// Enter search
QTest::mouseClick(searchActionWidget, Qt::LeftButton);
@@ -440,8 +441,8 @@ void TestGui::testDatabaseLocking()
triggerAction("actionLockDatabases");
- QCOMPARE(m_tabWidget->tabText(0), QString("Save [locked]"));
- QCOMPARE(m_tabWidget->tabText(1), QString("basic [New database]*"));
+ QCOMPARE(m_tabWidget->tabText(0).remove('&'), QString("Save [locked]"));
+ QCOMPARE(m_tabWidget->tabText(1).remove('&'), QString("basic [New database]*"));
QWidget* dbWidget = m_tabWidget->currentDatabaseWidget();
QWidget* unlockDatabaseWidget = dbWidget->findChild<QWidget*>("unlockDatabaseWidget");
@@ -451,7 +452,7 @@ void TestGui::testDatabaseLocking()
QTest::keyClicks(editPassword, "masterpw");
QTest::keyClick(editPassword, Qt::Key_Enter);
- QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()), QString("basic [New database]*"));
+ QCOMPARE(m_tabWidget->tabText(m_tabWidget->currentIndex()).remove('&'), QString("basic [New database]*"));
}
void TestGui::cleanupTestCase()
diff --git a/tests/gui/TestGuiPixmaps.cpp b/tests/gui/TestGuiPixmaps.cpp
index 87e3f24..3637494 100644
--- a/tests/gui/TestGuiPixmaps.cpp
+++ b/tests/gui/TestGuiPixmaps.cpp
@@ -19,7 +19,6 @@
#include <QTest>
-#include "tests.h"
#include "core/Database.h"
#include "core/DatabaseIcons.h"
#include "core/Entry.h"
diff --git a/tests/modeltest.cpp b/tests/modeltest.cpp
index 19f02d9..4d8b184 100644
--- a/tests/modeltest.cpp
+++ b/tests/modeltest.cpp
@@ -1,50 +1,40 @@
/****************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
** $QT_END_LICENSE$
**
****************************************************************************/
-
#include "modeltest.h"
-#include <QDebug>
-#include <QTest>
-
-Q_DECLARE_METATYPE ( QModelIndex )
+#include <QtCore>
+#include <QtTest>
/*!
Connect to all of the models signals. Whenever anything happens recheck everything.
@@ -54,50 +44,52 @@ ModelTest::ModelTest ( QAbstractItemModel *_model, QObject *parent ) : QObject (
if (!model)
qFatal("%s: model must not be null", Q_FUNC_INFO);
- connect ( model, SIGNAL ( columnsAboutToBeInserted ( const QModelIndex &, int, int ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( columnsAboutToBeRemoved ( const QModelIndex &, int, int ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( columnsInserted ( const QModelIndex &, int, int ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( columnsRemoved ( const QModelIndex &, int, int ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( dataChanged ( const QModelIndex &, const QModelIndex & ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( headerDataChanged ( Qt::Orientation, int, int ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( layoutAboutToBeChanged () ), this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( layoutChanged () ), this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( modelReset () ), this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( rowsAboutToBeInserted ( const QModelIndex &, int, int ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( rowsAboutToBeRemoved ( const QModelIndex &, int, int ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( rowsInserted ( const QModelIndex &, int, int ) ),
- this, SLOT ( runAllTests() ) );
- connect ( model, SIGNAL ( rowsRemoved ( const QModelIndex &, int, int ) ),
- this, SLOT ( runAllTests() ) );
-
- // Special checks for inserting/removing
- connect ( model, SIGNAL ( layoutAboutToBeChanged() ),
- this, SLOT ( layoutAboutToBeChanged() ) );
- connect ( model, SIGNAL ( layoutChanged() ),
- this, SLOT ( layoutChanged() ) );
-
- connect ( model, SIGNAL ( rowsAboutToBeInserted ( const QModelIndex &, int, int ) ),
- this, SLOT ( rowsAboutToBeInserted ( const QModelIndex &, int, int ) ) );
- connect ( model, SIGNAL ( rowsAboutToBeRemoved ( const QModelIndex &, int, int ) ),
- this, SLOT ( rowsAboutToBeRemoved ( const QModelIndex &, int, int ) ) );
- connect ( model, SIGNAL ( rowsInserted ( const QModelIndex &, int, int ) ),
- this, SLOT ( rowsInserted ( const QModelIndex &, int, int ) ) );
- connect ( model, SIGNAL ( rowsRemoved ( const QModelIndex &, int, int ) ),
- this, SLOT ( rowsRemoved ( const QModelIndex &, int, int ) ) );
-
- connect ( model, SIGNAL (rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT (rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)) );
- connect ( model, SIGNAL (rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- this, SLOT (rowsMoved(QModelIndex,int,int,QModelIndex,int)) );
-
+ connect(model, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(columnsInserted(QModelIndex,int,int)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(columnsRemoved(QModelIndex,int,int)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(layoutAboutToBeChanged()), this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(layoutChanged()), this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(modelReset()), this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
+ this, SLOT(runAllTests()) );
+ connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+ this, SLOT(runAllTests()) );
+
+ // Special checks for changes
+ connect(model, SIGNAL(layoutAboutToBeChanged()),
+ this, SLOT(layoutAboutToBeChanged()) );
+ connect(model, SIGNAL(layoutChanged()),
+ this, SLOT(layoutChanged()) );
+
+ connect(model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
+ this, SLOT(rowsAboutToBeInserted(QModelIndex,int,int)) );
+ connect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+ this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int)) );
+ connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
+ this, SLOT(rowsInserted(QModelIndex,int,int)) );
+ connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)),
+ this, SLOT(rowsRemoved(QModelIndex,int,int)) );
+ connect(model, SIGNAL (rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
+ this, SLOT (rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)) );
+ connect(model, SIGNAL (rowsMoved(QModelIndex,int,int,QModelIndex,int)),
+ this, SLOT (rowsMoved(QModelIndex,int,int,QModelIndex,int)) );
+ connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
+ this, SLOT(dataChanged(QModelIndex,QModelIndex)) );
+ connect(model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)),
+ this, SLOT(headerDataChanged(Qt::Orientation,int,int)) );
runAllTests();
}
@@ -257,7 +249,7 @@ void ModelTest::index()
void ModelTest::parent()
{
// qDebug() << "p";
- // Make sure the model wont crash and will return an invalid QModelIndex
+ // Make sure the model won't crash and will return an invalid QModelIndex
// when asked for the parent of an invalid index.
QVERIFY( model->parent ( QModelIndex() ) == QModelIndex() );
@@ -339,6 +331,8 @@ void ModelTest::checkChildren ( const QModelIndex &parent, int currentDepth )
//qDebug() << "parent:" << model->data(parent).toString() << "rows:" << rows
// << "columns:" << columns << "parent column:" << parent.column();
+ const QModelIndex topLeftChild = model->index( 0, 0, parent );
+
QVERIFY( !model->hasIndex ( rows + 1, 0, parent ) );
for ( int r = 0; r < rows; ++r ) {
if ( model->canFetchMore ( parent ) ) {
@@ -362,6 +356,15 @@ void ModelTest::checkChildren ( const QModelIndex &parent, int currentDepth )
QModelIndex b = model->index ( r, c, parent );
QVERIFY( a == b );
+ {
+ const QModelIndex sibling = model->sibling( r, c, topLeftChild );
+ QVERIFY( index == sibling );
+ }
+ {
+ const QModelIndex sibling = topLeftChild.sibling( r, c );
+ QVERIFY( index == sibling );
+ }
+
// Some basic checking on the index that is returned
QVERIFY( index.model() == model );
QCOMPARE( index.row(), r );
@@ -445,7 +448,7 @@ void ModelTest::data()
QVariant textAlignmentVariant = model->data ( model->index ( 0, 0 ), Qt::TextAlignmentRole );
if ( textAlignmentVariant.isValid() ) {
int alignment = textAlignmentVariant.toInt();
- QCOMPARE( alignment, ( alignment & ( Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask ) ) );
+ QCOMPARE( alignment, ( alignment & static_cast<int>( Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask ) ) );
}
// General Purpose roles that should return a QColor
@@ -474,9 +477,9 @@ void ModelTest::data()
\sa rowsInserted()
*/
-void ModelTest::rowsAboutToBeInserted ( const QModelIndex &parent, int start, int end )
+void ModelTest::rowsAboutToBeInserted ( const QModelIndex &parent, int start, int /* end */)
{
- Q_UNUSED(end);
+// Q_UNUSED(end);
// qDebug() << "rowsAboutToBeInserted" << "start=" << start << "end=" << end << "parent=" << model->data ( parent ).toString()
// << "current count of parent=" << model->rowCount ( parent ); // << "display of last=" << model->data( model->index(start-1, 0, parent) );
// qDebug() << model->index(start-1, 0, parent) << model->data( model->index(start-1, 0, parent) );
@@ -565,6 +568,30 @@ void ModelTest::rowsRemoved ( const QModelIndex & parent, int start, int end )
QVERIFY( c.next == model->data ( model->index ( start, 0, c.parent ) ) );
}
+void ModelTest::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+{
+ QVERIFY(topLeft.isValid());
+ QVERIFY(bottomRight.isValid());
+ QModelIndex commonParent = bottomRight.parent();
+ QVERIFY(topLeft.parent() == commonParent);
+ QVERIFY(topLeft.row() <= bottomRight.row());
+ QVERIFY(topLeft.column() <= bottomRight.column());
+ int rowCount = model->rowCount(commonParent);
+ int columnCount = model->columnCount(commonParent);
+ QVERIFY(bottomRight.row() < rowCount);
+ QVERIFY(bottomRight.column() < columnCount);
+}
+
+void ModelTest::headerDataChanged(Qt::Orientation orientation, int start, int end)
+{
+ QVERIFY(start >= 0);
+ QVERIFY(end >= 0);
+ QVERIFY(start <= end);
+ int itemCount = orientation == Qt::Vertical ? model->rowCount() : model->columnCount();
+ QVERIFY(start < itemCount);
+ QVERIFY(end < itemCount);
+}
+
void ModelTest::rowsAboutToBeMoved( const QModelIndex &srcParent, int start, int end, const QModelIndex &destParent, int destinationRow )
{
Changing cs;
@@ -589,8 +616,8 @@ void ModelTest::rowsMoved( const QModelIndex &srcParent, int start, int end, con
QVERIFY ( cd.oldSize == model->rowCount ( destParent ) );
// TODO: Find out what I can assert here about last and next.
- // QVERIFY ( cd.last == model->data ( model->index ( destinationRow - 1, 0, cd.parent ) ) );
- // QVERIFY ( cd.next == model->data ( model->index ( destinationRow + (end - start + 1), 0, cd.parent ) ) );
+ // Q_ASSERT ( cd.last == model->data ( model->index ( destinationRow - 1, 0, cd.parent ) ) );
+ // Q_ASSERT ( cd.next == model->data ( model->index ( destinationRow + (end - start + 1), 0, cd.parent ) ) );
}
else {
QVERIFY ( cd.oldSize + ( end - start + 1 ) == model->rowCount ( destParent ) );
@@ -602,12 +629,12 @@ void ModelTest::rowsMoved( const QModelIndex &srcParent, int start, int end, con
Changing cs = remove.pop();
QVERIFY ( cs.parent == srcParent );
if (srcParent == destParent) {
- QVERIFY ( cs.oldSize == model->rowCount ( srcParent ) );
+ QVERIFY ( cs.oldSize == model->rowCount ( srcParent ) );
}
else {
- QVERIFY ( cs.oldSize - ( end - start + 1 ) == model->rowCount ( srcParent ) );
+ QVERIFY ( cs.oldSize - ( end - start + 1 ) == model->rowCount ( srcParent ) );
- QVERIFY ( cs.last == model->data ( model->index ( start - 1, 0, srcParent ) ) );
- QVERIFY ( cs.next == model->data ( model->index ( start, 0, srcParent ) ) );
+ QVERIFY ( cs.last == model->data ( model->index ( start - 1, 0, srcParent ) ) );
+ QVERIFY ( cs.next == model->data ( model->index ( start, 0, srcParent ) ) );
}
}
diff --git a/tests/modeltest.h b/tests/modeltest.h
index 9eb343d..3dcf18c 100644
--- a/tests/modeltest.h
+++ b/tests/modeltest.h
@@ -1,40 +1,32 @@
/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
-** $QT_BEGIN_LICENSE:LGPL$
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
** $QT_END_LICENSE$
**
****************************************************************************/
@@ -43,8 +35,8 @@
#ifndef MODELTEST_H
#define MODELTEST_H
-#include <QAbstractItemModel>
#include <QObject>
+#include <QAbstractItemModel>
#include <QStack>
class ModelTest : public QObject
@@ -73,7 +65,8 @@ protected Q_SLOTS:
void rowsRemoved( const QModelIndex & parent, int start, int end );
void rowsAboutToBeMoved ( const QModelIndex &srcParent, int start, int end, const QModelIndex &destParent, int destinationRow );
void rowsMoved ( const QModelIndex &srcParent, int start, int end, const QModelIndex &destParent, int destinationRow );
-
+ void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
+ void headerDataChanged(Qt::Orientation orientation, int start, int end);
private:
void checkChildren( const QModelIndex &parent, int currentDepth = 0 );
diff --git a/tests/tests.h b/tests/tests.h
deleted file mode 100644
index e719a0b..0000000
--- a/tests/tests.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2011 Felix Geyer <debfx@fobos.de>
- * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 or (at your option)
- * version 3 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef KEEPASSX_TESTS_H
-#define KEEPASSX_TESTS_H
-
-#include <QTest>
-
-// backport QTEST_GUILESS_MAIN, QTRY_VERIFY and QTRY_COMPARE from Qt 5
-
-#ifndef QTEST_GUILESS_MAIN
-#define QTEST_GUILESS_MAIN(TestObject) \
-int main(int argc, char* argv[]) \
-{ \
- QCoreApplication app(argc, argv); \
- TestObject tc; \
- return QTest::qExec(&tc, argc, argv); \
-}
-#endif // QTEST_GUILESS_MAIN
-
-
-#ifndef QTRY_VERIFY
-#define KEEPASSX_VERIFY_WITH_TIMEOUT(__expr, __timeout) \
-do { \
- const int __step = 50; \
- const int __timeoutValue = __timeout; \
- if (!(__expr)) { \
- QTest::qWait(0); \
- } \
- for (int __i = 0; __i < __timeoutValue && !(__expr); __i+=__step) { \
- QTest::qWait(__step); \
- } \
- QVERIFY(__expr); \
-} while (0)
-
-#define QTRY_VERIFY(__expr) KEEPASSX_VERIFY_WITH_TIMEOUT(__expr, 5000)
-#endif // QTRY_VERIFY
-
-
-#ifndef QTRY_COMPARE
-#define KEEPASSX_COMPARE_WITH_TIMEOUT(__expr, __expected, __timeout) \
-do { \
- const int __step = 50; \
- const int __timeoutValue = __timeout; \
- if ((__expr) != (__expected)) { \
- QTest::qWait(0); \
- } \
- for (int __i = 0; __i < __timeoutValue && ((__expr) != (__expected)); __i+=__step) { \
- QTest::qWait(__step); \
- } \
- QCOMPARE(__expr, __expected); \
-} while (0)
-
-#define QTRY_COMPARE(__expr, __expected) KEEPASSX_COMPARE_WITH_TIMEOUT(__expr, __expected, 5000)
-#endif // QTRY_COMPARE
-
-#endif // KEEPASSX_TESTS_H
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index c4aa5fa..7988467 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -18,7 +18,8 @@ include_directories(../src)
add_executable(kdbx-extract kdbx-extract.cpp)
target_link_libraries(kdbx-extract
keepassx_core
- ${QT_QTCORE_LIBRARY}
- ${QT_QTGUI_LIBRARY}
+ Qt5::Core
+ Qt5::Concurrent
+ Qt5::Widgets
${GCRYPT_LIBRARIES}
${ZLIB_LIBRARIES})