summaryrefslogtreecommitdiffabout
path: root/pwmanager
Unidiff
Diffstat (limited to 'pwmanager') (more/less context) (show whitespace changes)
-rw-r--r--pwmanager/pwmanager/pwmdoc.cpp63
-rw-r--r--pwmanager/pwmanager/pwmdoc.h2
-rw-r--r--pwmanager/pwmanager/pwmdocui.cpp12
3 files changed, 66 insertions, 11 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
@@ -11,7 +11,7 @@
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 2.0 of pwmanager 14 * This file is originaly based on version 1.1 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
@@ -330,9 +330,24 @@ PwMDoc::~PwMDoc()
330PwMerror PwMDoc::saveDoc(char compress, const QString *file) 330PwMerror PwMDoc::saveDoc(char compress, const QString *file)
331{ 331{
332 PwMerror ret, e; 332 PwMerror ret, e;
333 string serialized;
334 QFile f;
335 QString tmpFileMoved(QString::null);
336 bool wasDeepLocked;
337 QString savedFilename(filename);
338
333 if (!file) { 339 if (!file) {
334 if (filename == "") 340 if (filename == "")
335 return e_filename; 341 return e_filename;
342 if (isDeepLocked()) {
343 /* We don't need to save any data.
344 * It's already all on disk, because
345 * we are deeplocked.
346 */
347 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
348 ret = e_success;
349 goto out;
350 }
336 } else { 351 } else {
337 if (*file == "" && filename == "") 352 if (*file == "" && filename == "")
338 return e_filename; 353 return e_filename;
@@ -340,10 +355,31 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file)
340 filename = *file; 355 filename = *file;
341 } 356 }
342 357
343 bool wasDeepLocked = isDeepLocked(); 358 wasDeepLocked = isDeepLocked();
344 if (wasDeepLocked) { 359 if (wasDeepLocked) {
345 if (deepLock(false) != e_success) 360 /* We are deeplocked. That means all data is already
346 return e_noPw; 361 * on disk. BUT we need to do saving procedure,
362 * because *file != savedFilename.
363 * Additionally we need to tempoarly restore
364 * the old "filename", because deepLock() references it.
365 */
366 QString newFilename(filename);
367 filename = savedFilename;
368 getDataChangedLock();
369 e = deepLock(false);
370 putDataChangedLock();
371 filename = newFilename;
372 switch (e) {
373 case e_success:
374 break;
375 case e_wrongPw:
376 case e_noPw:
377 emitDataChanged(this);
378 return e;
379 default:
380 emitDataChanged(this);
381 return e_openFile;
382 }
347 } 383 }
348 384
349 if (!isPwAvailable()) { 385 if (!isPwAvailable()) {
@@ -389,7 +425,6 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file)
389 if (!backupFile(filename)) 425 if (!backupFile(filename))
390 return e_fileBackup; 426 return e_fileBackup;
391 } 427 }
392 QString tmpFileMoved(QString::null);
393 if (QFile::exists(filename)) { 428 if (QFile::exists(filename)) {
394 /* Move the existing file to some tmp file. 429 /* Move the existing file to some tmp file.
395 * When saving file succeeds, delete tmp file. Otherwise 430 * When saving file succeeds, delete tmp file. Otherwise
@@ -408,8 +443,7 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file)
408 + " failed!"); 443 + " failed!");
409 } 444 }
410 } 445 }
411 QFile f(filename); 446 f.setName(filename);
412 string serialized;
413 if (!f.open(IO_ReadWrite)) { 447 if (!f.open(IO_ReadWrite)) {
414 ret = e_openFile; 448 ret = e_openFile;
415 goto out_moveback; 449 goto out_moveback;
@@ -476,8 +510,16 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file)
476 printWarn(string("chmod failed: ") + strerror(errno)); 510 printWarn(string("chmod failed: ") + strerror(errno));
477 } 511 }
478 openDocList.edit(this, getTitle().latin1()); 512 openDocList.edit(this, getTitle().latin1());
479 if (wasDeepLocked) 513 if (wasDeepLocked) {
480 deepLock(true); 514 /* Do _not_ save the data with the deepLock()
515 * call, because this will recurse
516 * into saveDoc()
517 */
518 deepLock(true, false);
519 /* We don't check return value here, because
520 * it won't fail. See NOTE in deepLock()
521 */
522 }
481 if (tmpFileMoved != QString::null) { 523 if (tmpFileMoved != QString::null) {
482 // now remove the moved file. 524 // now remove the moved file.
483 if (!QFile::remove(tmpFileMoved)) { 525 if (!QFile::remove(tmpFileMoved)) {
@@ -1769,6 +1811,9 @@ bool PwMDoc::unlockAll_tempoary(bool revert)
1769PwMerror PwMDoc::deepLock(bool lock, bool saveToFile) 1811PwMerror PwMDoc::deepLock(bool lock, bool saveToFile)
1770{ 1812{
1771 PwMerror ret; 1813 PwMerror ret;
1814 /* NOTE: saveDoc() depends on this function to return
1815 * e_success if saveToFile == false
1816 */
1772 1817
1773 if (lock) { 1818 if (lock) {
1774 if (isDeepLocked()) 1819 if (isDeepLocked())
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
@@ -11,7 +11,7 @@
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 2.0 of pwmanager 14 * This file is originaly based on version 1.1 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $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
@@ -273,6 +273,11 @@ bool PwMDocUi::saveDocUi(PwMDoc *doc)
273 i18n("backup failed")); 273 i18n("backup failed"));
274 doc->timer()->putLock(DocTimer::id_autoLockTimer); 274 doc->timer()->putLock(DocTimer::id_autoLockTimer);
275 return false; 275 return false;
276 } else if (ret == e_noPw ||
277 ret == e_wrongPw ||
278 ret == e_openFile) {
279 doc->timer()->putLock(DocTimer::id_autoLockTimer);
280 return false;
276 } else if (ret != e_success) { 281 } else if (ret != e_success) {
277 KMessageBox::error(currentView, 282 KMessageBox::error(currentView,
278 i18n("Error: Couldn't write to file.\n" 283 i18n("Error: Couldn't write to file.\n"
@@ -318,7 +323,12 @@ bool PwMDocUi::saveAsDocUi(PwMDoc *doc)
318 fn += ".pwm"; 323 fn += ".pwm";
319 324
320 PwMerror ret = doc->saveDoc(conf()->confGlobCompression(), &fn); 325 PwMerror ret = doc->saveDoc(conf()->confGlobCompression(), &fn);
321 if (ret != e_success) { 326 if (ret == e_noPw ||
327 ret == e_wrongPw ||
328 ret == e_openFile) {
329 doc->timer()->putLock(DocTimer::id_autoLockTimer);
330 return false;
331 } else if (ret != e_success) {
322 KMessageBox::error(currentView, 332 KMessageBox::error(currentView,
323 i18n("Error: Couldn't write to file.\n" 333 i18n("Error: Couldn't write to file.\n"
324 "Please check if you have permission to\n" 334 "Please check if you have permission to\n"