-rw-r--r-- | pwmanager/pwmanager/pwmdoc.cpp | 65 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmdoc.h | 2 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmdocui.cpp | 12 |
3 files changed, 67 insertions, 12 deletions
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp index e9906a4..f4a1636 100644 --- a/pwmanager/pwmanager/pwmdoc.cpp +++ b/pwmanager/pwmanager/pwmdoc.cpp @@ -10,9 +10,9 @@ ***************************************************************************/ /*************************************************************************** * copyright (C) 2004 by Ulf Schenk - * This file is originaly based on version 2.0 of pwmanager + * This file is originaly based on version 1.1 of pwmanager * and was modified to run on embedded devices that run microkde * * $Id$ **************************************************************************/ @@ -329,22 +329,58 @@ PwMDoc::~PwMDoc() PwMerror PwMDoc::saveDoc(char compress, const QString *file) { PwMerror ret, e; + string serialized; + QFile f; + QString tmpFileMoved(QString::null); + bool wasDeepLocked; + QString savedFilename(filename); + if (!file) { if (filename == "") return e_filename; - } else { + if (isDeepLocked()) { + /* We don't need to save any data. + * It's already all on disk, because + * we are deeplocked. + */ + unsetDocStatFlag(DOC_STAT_DISK_DIRTY); + ret = e_success; + goto out; + } + } else { if (*file == "" && filename == "") return e_filename; if (*file != "") filename = *file; } - bool wasDeepLocked = isDeepLocked(); + wasDeepLocked = isDeepLocked(); if (wasDeepLocked) { - if (deepLock(false) != e_success) - return e_noPw; + /* We are deeplocked. That means all data is already + * on disk. BUT we need to do saving procedure, + * because *file != savedFilename. + * Additionally we need to tempoarly restore + * the old "filename", because deepLock() references it. + */ + QString newFilename(filename); + filename = savedFilename; + getDataChangedLock(); + e = deepLock(false); + putDataChangedLock(); + filename = newFilename; + switch (e) { + case e_success: + break; + case e_wrongPw: + case e_noPw: + emitDataChanged(this); + return e; + default: + emitDataChanged(this); + return e_openFile; + } } if (!isPwAvailable()) { /* password is not available. This means, the @@ -388,9 +424,8 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file) if (conf()->confGlobMakeFileBackup()) { if (!backupFile(filename)) return e_fileBackup; } - QString tmpFileMoved(QString::null); if (QFile::exists(filename)) { /* Move the existing file to some tmp file. * When saving file succeeds, delete tmp file. Otherwise * move tmp file back. See below. @@ -407,10 +442,9 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file) + filename.latin1() + " failed!"); } } - QFile f(filename); - string serialized; + f.setName(filename); if (!f.open(IO_ReadWrite)) { ret = e_openFile; goto out_moveback; } @@ -475,10 +509,18 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file) conf()->confGlobFilePermissions())) { printWarn(string("chmod failed: ") + strerror(errno)); } openDocList.edit(this, getTitle().latin1()); - if (wasDeepLocked) - deepLock(true); + if (wasDeepLocked) { + /* Do _not_ save the data with the deepLock() + * call, because this will recurse + * into saveDoc() + */ + deepLock(true, false); + /* We don't check return value here, because + * it won't fail. See NOTE in deepLock() + */ + } if (tmpFileMoved != QString::null) { // now remove the moved file. if (!QFile::remove(tmpFileMoved)) { printWarn(string("removing file ") @@ -1768,8 +1810,11 @@ bool PwMDoc::unlockAll_tempoary(bool revert) PwMerror PwMDoc::deepLock(bool lock, bool saveToFile) { PwMerror ret; + /* NOTE: saveDoc() depends on this function to return + * e_success if saveToFile == false + */ if (lock) { if (isDeepLocked()) return e_lock; diff --git a/pwmanager/pwmanager/pwmdoc.h b/pwmanager/pwmanager/pwmdoc.h index 535fb92..a6e5f58 100644 --- a/pwmanager/pwmanager/pwmdoc.h +++ b/pwmanager/pwmanager/pwmdoc.h @@ -10,9 +10,9 @@ ***************************************************************************/ /*************************************************************************** * copyright (C) 2004 by Ulf Schenk - * This file is originaly based on version 2.0 of pwmanager + * This file is originaly based on version 1.1 of pwmanager * and was modified to run on embedded devices that run microkde * * $Id$ **************************************************************************/ diff --git a/pwmanager/pwmanager/pwmdocui.cpp b/pwmanager/pwmanager/pwmdocui.cpp index 7b8e0ee..6ddb6f5 100644 --- a/pwmanager/pwmanager/pwmdocui.cpp +++ b/pwmanager/pwmanager/pwmdocui.cpp @@ -272,8 +272,13 @@ bool PwMDocUi::saveDocUi(PwMDoc *doc) i18n("Error: Couldn't make backup-file!"), i18n("backup failed")); doc->timer()->putLock(DocTimer::id_autoLockTimer); return false; + } else if (ret == e_noPw || + ret == e_wrongPw || + ret == e_openFile) { + doc->timer()->putLock(DocTimer::id_autoLockTimer); + return false; } else if (ret != e_success) { KMessageBox::error(currentView, i18n("Error: Couldn't write to file.\n" "Please check if you have permission to\n" @@ -317,9 +322,14 @@ bool PwMDocUi::saveAsDocUi(PwMDoc *doc) if (fn.right(4) != ".pwm") fn += ".pwm"; PwMerror ret = doc->saveDoc(conf()->confGlobCompression(), &fn); - if (ret != e_success) { + if (ret == e_noPw || + ret == e_wrongPw || + ret == e_openFile) { + doc->timer()->putLock(DocTimer::id_autoLockTimer); + return false; + } else if (ret != e_success) { KMessageBox::error(currentView, i18n("Error: Couldn't write to file.\n" "Please check if you have permission to\n" "write to the file in that directory."), |