Use QSaveFile to save databases.

This commit is contained in:
Felix Geyer 2012-07-06 18:50:52 +02:00
parent 78849c43f1
commit b579eb954e
8 changed files with 76 additions and 69 deletions

View file

@ -31,7 +31,6 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
: DialogyWidget(parent) : DialogyWidget(parent)
, m_ui(new Ui::DatabaseOpenWidget()) , m_ui(new Ui::DatabaseOpenWidget())
, m_db(Q_NULLPTR) , m_db(Q_NULLPTR)
, m_file(Q_NULLPTR)
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
@ -60,9 +59,8 @@ DatabaseOpenWidget::~DatabaseOpenWidget()
{ {
} }
void DatabaseOpenWidget::load(QFile* file, const QString& filename) void DatabaseOpenWidget::load(const QString& filename)
{ {
m_file = file;
m_filename = filename; m_filename = filename;
m_ui->labelFilename->setText(filename); m_ui->labelFilename->setText(filename);
@ -121,11 +119,15 @@ void DatabaseOpenWidget::openDatabase()
config()->set("LastKeyFiles", lastKeyFiles); config()->set("LastKeyFiles", lastKeyFiles);
m_file->reset(); QFile file(m_filename);
if (!file.open(QIODevice::ReadOnly)) {
// TODO: error message
return;
}
if (m_db) { if (m_db) {
delete m_db; delete m_db;
} }
m_db = reader.readDatabase(m_file, masterKey); m_db = reader.readDatabase(&file, masterKey);
if (m_db) { if (m_db) {
Q_EMIT editFinished(true); Q_EMIT editFinished(true);

View file

@ -36,7 +36,7 @@ class DatabaseOpenWidget : public DialogyWidget
public: public:
explicit DatabaseOpenWidget(QWidget* parent = Q_NULLPTR); explicit DatabaseOpenWidget(QWidget* parent = Q_NULLPTR);
~DatabaseOpenWidget(); ~DatabaseOpenWidget();
void load(QFile* file, const QString& filename); void load(const QString& filename);
void enterKey(const QString& pw, const QString& keyFile); void enterKey(const QString& pw, const QString& keyFile);
Database* database(); Database* database();
@ -57,7 +57,6 @@ private Q_SLOTS:
protected: protected:
const QScopedPointer<Ui::DatabaseOpenWidget> m_ui; const QScopedPointer<Ui::DatabaseOpenWidget> m_ui;
Database* m_db; Database* m_db;
QFile* m_file;
QString m_filename; QString m_filename;
private: private:

View file

@ -25,6 +25,7 @@
#include "core/Database.h" #include "core/Database.h"
#include "core/Group.h" #include "core/Group.h"
#include "core/Metadata.h" #include "core/Metadata.h"
#include "core/qsavefile.h"
#include "gui/DatabaseWidget.h" #include "gui/DatabaseWidget.h"
#include "gui/DragTabBar.h" #include "gui/DragTabBar.h"
#include "gui/FileDialog.h" #include "gui/FileDialog.h"
@ -32,8 +33,8 @@
#include "gui/group/GroupView.h" #include "gui/group/GroupView.h"
DatabaseManagerStruct::DatabaseManagerStruct() DatabaseManagerStruct::DatabaseManagerStruct()
: file(Q_NULLPTR) : dbWidget(Q_NULLPTR)
, dbWidget(Q_NULLPTR) , saveToFilename(false)
, modified(false) , modified(false)
, readOnly(false) , readOnly(false)
{ {
@ -103,11 +104,13 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
{ {
DatabaseManagerStruct dbStruct; DatabaseManagerStruct dbStruct;
QScopedPointer<QFile> file(new QFile(fileName)); // test if we can read/write or read the file
QFile file(fileName);
// TODO: error handling // TODO: error handling
if (!file->open(QIODevice::ReadWrite)) { if (!file.open(QIODevice::ReadWrite)) {
if (!file->open(QIODevice::ReadOnly)) { if (!file.open(QIODevice::ReadOnly)) {
// can't open // can't open
// TODO: error message
return; return;
} }
else { else {
@ -115,21 +118,22 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
dbStruct.readOnly = true; dbStruct.readOnly = true;
} }
} }
file.close();
Database* db = new Database(); Database* db = new Database();
dbStruct.dbWidget = new DatabaseWidget(db, this); dbStruct.dbWidget = new DatabaseWidget(db, this);
dbStruct.file = file.take();
dbStruct.fileName = QFileInfo(fileName).absoluteFilePath(); dbStruct.fileName = QFileInfo(fileName).absoluteFilePath();
dbStruct.saveToFilename = !dbStruct.readOnly;
insertDatabase(db, dbStruct); insertDatabase(db, dbStruct);
updateLastDatabases(dbStruct.fileName); updateLastDatabases(dbStruct.fileName);
if (!pw.isNull() || !keyFile.isEmpty()) { if (!pw.isNull() || !keyFile.isEmpty()) {
dbStruct.dbWidget->switchToOpenDatabase(dbStruct.file, dbStruct.fileName, pw, keyFile); dbStruct.dbWidget->switchToOpenDatabase(dbStruct.fileName, pw, keyFile);
} }
else { else {
dbStruct.dbWidget->switchToOpenDatabase(dbStruct.file, dbStruct.fileName); dbStruct.dbWidget->switchToOpenDatabase(dbStruct.fileName);
} }
} }
@ -142,12 +146,6 @@ void DatabaseTabWidget::importKeePass1Database()
return; return;
} }
QScopedPointer<QFile> file(new QFile(fileName));
// TODO: error handling
if (!file->open(QIODevice::ReadOnly)) {
return;
}
Database* db = new Database(); Database* db = new Database();
DatabaseManagerStruct dbStruct; DatabaseManagerStruct dbStruct;
dbStruct.dbWidget = new DatabaseWidget(db, this); dbStruct.dbWidget = new DatabaseWidget(db, this);
@ -155,7 +153,7 @@ void DatabaseTabWidget::importKeePass1Database()
insertDatabase(db, dbStruct); insertDatabase(db, dbStruct);
dbStruct.dbWidget->switchToImportKeepass1(file.take(), fileName); dbStruct.dbWidget->switchToImportKeepass1(fileName);
} }
void DatabaseTabWidget::emitEntrySelectionChanged() void DatabaseTabWidget::emitEntrySelectionChanged()
@ -224,7 +222,6 @@ void DatabaseTabWidget::deleteDatabase(Database* db)
removeTab(index); removeTab(index);
toggleTabbar(); toggleTabbar();
m_dbList.remove(db); m_dbList.remove(db);
delete dbStruct.file;
delete dbStruct.dbWidget; delete dbStruct.dbWidget;
delete db; delete db;
} }
@ -243,16 +240,24 @@ void DatabaseTabWidget::saveDatabase(Database* db)
{ {
DatabaseManagerStruct& dbStruct = m_dbList[db]; DatabaseManagerStruct& dbStruct = m_dbList[db];
// TODO: ensure that the data is actually written to disk if (dbStruct.saveToFilename) {
if (dbStruct.file) { bool result = false;
dbStruct.file->reset();
m_writer.writeDatabase(dbStruct.file, db);
dbStruct.file->resize(dbStruct.file->pos());
dbStruct.file->flush();
QSaveFile saveFile(dbStruct.fileName);
if (saveFile.open(QIODevice::WriteOnly)) {
m_writer.writeDatabase(&saveFile, db);
result = saveFile.commit();
}
if (result) {
dbStruct.modified = false; dbStruct.modified = false;
updateTabName(db); updateTabName(db);
} }
else {
QMessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ saveFile.errorString());
}
}
else { else {
saveDatabaseAs(db); saveDatabaseAs(db);
} }
@ -262,29 +267,32 @@ void DatabaseTabWidget::saveDatabaseAs(Database* db)
{ {
DatabaseManagerStruct& dbStruct = m_dbList[db]; DatabaseManagerStruct& dbStruct = m_dbList[db];
QString oldFileName; QString oldFileName;
if (dbStruct.file) { if (dbStruct.saveToFilename) {
oldFileName = dbStruct.fileName; oldFileName = dbStruct.fileName;
} }
QString fileName = fileDialog()->getSaveFileName(m_window, tr("Save database as"), QString fileName = fileDialog()->getSaveFileName(m_window, tr("Save database as"),
oldFileName, tr("KeePass 2 Database").append(" (*.kdbx)")); oldFileName, tr("KeePass 2 Database").append(" (*.kdbx)"));
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
QFile* oldFile = dbStruct.file; bool result = false;
QScopedPointer<QFile> file(new QFile(fileName));
// TODO: error handling
if (!file->open(QIODevice::ReadWrite)) {
return;
}
dbStruct.file = file.take();
// TODO: ensure that the data is actually written to disk
m_writer.writeDatabase(dbStruct.file, db);
dbStruct.file->flush();
delete oldFile;
QSaveFile saveFile(fileName);
if (saveFile.open(QIODevice::WriteOnly)) {
m_writer.writeDatabase(&saveFile, db);
result = saveFile.commit();
}
if (result) {
dbStruct.modified = false; dbStruct.modified = false;
dbStruct.fileName = QFileInfo(fileName).absoluteFilePath(); dbStruct.fileName = QFileInfo(fileName).absoluteFilePath();
dbStruct.saveToFilename = true;
updateTabName(db); updateTabName(db);
updateLastDatabases(dbStruct.fileName); updateLastDatabases(dbStruct.fileName);
} }
else {
QMessageBox::critical(this, tr("Error"), tr("Writing the database failed.") + "\n\n"
+ saveFile.errorString());
}
}
} }
bool DatabaseTabWidget::closeDatabase(int index) bool DatabaseTabWidget::closeDatabase(int index)
@ -403,8 +411,8 @@ void DatabaseTabWidget::updateTabName(Database* db)
QString tabName; QString tabName;
if (dbStruct.file) { if (dbStruct.saveToFilename) {
QFileInfo fileInfo(*dbStruct.file); QFileInfo fileInfo(dbStruct.fileName);
if (db->metadata()->name().isEmpty()) { if (db->metadata()->name().isEmpty()) {
tabName = fileInfo.fileName(); tabName = fileInfo.fileName();
@ -522,7 +530,7 @@ void DatabaseTabWidget::modified()
Database* db = static_cast<Database*>(sender()); Database* db = static_cast<Database*>(sender());
DatabaseManagerStruct& dbStruct = m_dbList[db]; DatabaseManagerStruct& dbStruct = m_dbList[db];
if (config()->get("AutoSaveAfterEveryChange").toBool() && dbStruct.file) { if (config()->get("AutoSaveAfterEveryChange").toBool() && dbStruct.saveToFilename) {
saveDatabase(db); saveDatabase(db);
return; return;
} }

View file

@ -32,9 +32,9 @@ struct DatabaseManagerStruct
{ {
DatabaseManagerStruct(); DatabaseManagerStruct();
QFile* file;
DatabaseWidget* dbWidget; DatabaseWidget* dbWidget;
QString fileName; QString fileName;
bool saveToFilename;
bool modified; bool modified;
bool readOnly; bool readOnly;
}; };

View file

@ -509,22 +509,22 @@ void DatabaseWidget::switchToDatabaseSettings()
setCurrentIndex(4); setCurrentIndex(4);
} }
void DatabaseWidget::switchToOpenDatabase(QFile* file, const QString& fileName) void DatabaseWidget::switchToOpenDatabase(const QString& fileName)
{ {
m_databaseOpenWidget->load(file, fileName); m_databaseOpenWidget->load(fileName);
setCurrentIndex(6); setCurrentIndex(6);
} }
void DatabaseWidget::switchToOpenDatabase(QFile* file, const QString& fileName, void DatabaseWidget::switchToOpenDatabase(const QString& fileName, const QString& password,
const QString& password, const QString& keyFile) const QString& keyFile)
{ {
switchToOpenDatabase(file, fileName); switchToOpenDatabase(fileName);
m_databaseOpenWidget->enterKey(password, keyFile); m_databaseOpenWidget->enterKey(password, keyFile);
} }
void DatabaseWidget::switchToImportKeepass1(QFile* file, const QString& fileName) void DatabaseWidget::switchToImportKeepass1(const QString& fileName)
{ {
m_keepass1OpenWidget->load(file, fileName); m_keepass1OpenWidget->load(fileName);
setCurrentIndex(7); setCurrentIndex(7);
} }

View file

@ -93,9 +93,9 @@ public Q_SLOTS:
void switchToGroupEdit(); void switchToGroupEdit();
void switchToMasterKeyChange(); void switchToMasterKeyChange();
void switchToDatabaseSettings(); void switchToDatabaseSettings();
void switchToOpenDatabase(QFile* file, const QString& fileName); void switchToOpenDatabase(const QString& fileName);
void switchToOpenDatabase(QFile* file, const QString& fileName, const QString& password, const QString& keyFile); void switchToOpenDatabase(const QString& fileName, const QString& password, const QString& keyFile);
void switchToImportKeepass1(QFile* file, const QString& fileName); void switchToImportKeepass1(const QString& fileName);
void toggleSearch(); void toggleSearch();
private Q_SLOTS: private Q_SLOTS:

View file

@ -32,11 +32,6 @@ KeePass1OpenWidget::KeePass1OpenWidget(QWidget* parent)
setWindowTitle(tr("Import KeePass1 database")); setWindowTitle(tr("Import KeePass1 database"));
} }
KeePass1OpenWidget::~KeePass1OpenWidget()
{
delete m_file;
}
void KeePass1OpenWidget::openDatabase() void KeePass1OpenWidget::openDatabase()
{ {
KeePass1Reader reader; KeePass1Reader reader;
@ -52,11 +47,15 @@ void KeePass1OpenWidget::openDatabase()
keyFileName = m_ui->comboKeyFile->currentText(); keyFileName = m_ui->comboKeyFile->currentText();
} }
m_file->reset(); QFile file(m_filename);
if (!file.open(QIODevice::ReadOnly)) {
// TODO: error message
return;
}
if (m_db) { if (m_db) {
delete m_db; delete m_db;
} }
m_db = reader.readDatabase(m_file, password, keyFileName); m_db = reader.readDatabase(&file, password, keyFileName);
if (m_db) { if (m_db) {
m_db->metadata()->setName(QFileInfo(m_filename).completeBaseName()); m_db->metadata()->setName(QFileInfo(m_filename).completeBaseName());

View file

@ -26,7 +26,6 @@ class KeePass1OpenWidget : public DatabaseOpenWidget
public: public:
explicit KeePass1OpenWidget(QWidget* parent = Q_NULLPTR); explicit KeePass1OpenWidget(QWidget* parent = Q_NULLPTR);
~KeePass1OpenWidget();
protected: protected:
void openDatabase() Q_DECL_OVERRIDE; void openDatabase() Q_DECL_OVERRIDE;