diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 0572f5d72..aab9b5571 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -19,6 +19,7 @@ #include "Database.h" #include +#include #include #include #include @@ -28,6 +29,7 @@ #include "crypto/Random.h" #include "format/KeePass2.h" #include "format/KeePass2Reader.h" +#include "format/KeePass2Writer.h" QHash Database::m_uuidMap; @@ -412,3 +414,28 @@ Database* Database::unlockFromStdin(QString databaseFilename) return Database::openDatabaseFile(databaseFilename, key); } + +QString Database::saveToFile(QString filePath) +{ + KeePass2Writer writer; + QSaveFile saveFile(filePath); + if (saveFile.open(QIODevice::WriteOnly)) { + + // write the database to the file + writer.writeDatabase(&saveFile, this); + + if (writer.hasError()) { + return writer.errorString(); + } + + if (saveFile.commit()) { + // successfully saved database file + return QString(); + } else { + return saveFile.errorString(); + } + } else { + return saveFile.errorString(); + } + +} diff --git a/src/core/Database.h b/src/core/Database.h index 8e62e5357..a799e0b3b 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -113,6 +113,7 @@ public: void setEmitModified(bool value); void copyAttributesFrom(const Database* other); void merge(const Database* other); + QString saveToFile(QString filePath); /** * Returns a unique id that is only valid as long as the Database exists. diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 038174617..e13158eac 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -20,7 +20,6 @@ #include #include -#include #include #include @@ -351,36 +350,24 @@ bool DatabaseTabWidget::saveDatabase(Database* db) DatabaseManagerStruct& dbStruct = m_dbList[db]; if (dbStruct.saveToFilename) { - QSaveFile saveFile(dbStruct.canonicalFilePath); - if (saveFile.open(QIODevice::WriteOnly)) { - // write the database to the file - dbStruct.dbWidget->blockAutoReload(true); - m_writer.writeDatabase(&saveFile, db); - dbStruct.dbWidget->blockAutoReload(false); - if (m_writer.hasError()) { - emit messageTab(tr("Writing the database failed.").append("\n") - .append(m_writer.errorString()), MessageWidget::Error); - return false; - } + dbStruct.dbWidget->blockAutoReload(true); + QString errorMessage = db->saveToFile(dbStruct.canonicalFilePath); + dbStruct.dbWidget->blockAutoReload(false); - if (saveFile.commit()) { - // successfully saved database file - dbStruct.modified = false; - dbStruct.dbWidget->databaseSaved(); - updateTabName(db); - emit messageDismissTab(); - return true; - } else { - emit messageTab(tr("Writing the database failed.").append("\n") - .append(saveFile.errorString()), MessageWidget::Error); - return false; - } + if (errorMessage.isEmpty()) { + // successfully saved database file + dbStruct.modified = false; + dbStruct.dbWidget->databaseSaved(); + updateTabName(db); + emit messageDismissTab(); + return true; } else { - emit messageTab(tr("Writing the database failed.").append("\n") - .append(saveFile.errorString()), MessageWidget::Error); + emit messageTab(tr("Writing the database failed.").append("\n").append(errorMessage), + MessageWidget::Error); return false; } + } else { return saveDatabaseAs(db); } diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index 85b3f3af6..847eaef05 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -22,7 +22,6 @@ #include #include -#include "format/KeePass2Writer.h" #include "gui/DatabaseWidget.h" #include "gui/MessageWidget.h" @@ -118,7 +117,6 @@ private: void updateLastDatabases(const QString& filename); void connectDatabase(Database* newDb, Database* oldDb = nullptr); - KeePass2Writer m_writer; QHash m_dbList; DatabaseWidgetStateSync* m_dbWidgetStateSync; };