summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--pwmanager/pwmanager/pwmdoc.cpp46
1 files changed, 39 insertions, 7 deletions
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp
index 4e8a603..6c1a9c0 100644
--- a/pwmanager/pwmanager/pwmdoc.cpp
+++ b/pwmanager/pwmanager/pwmdoc.cpp
@@ -2895,2 +2895,4 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s
uid = er[ incCounter ];
+ qDebug("sync uid %s from remote file", uid.latin1());
+
qApp->processEvents();
@@ -2899,2 +2901,3 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s
inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote );
+ PWM_ASSERT(inRemote);
if ( inLocal != 0 ) { // maybe conflict - same uid in both files
@@ -3096,9 +3099,29 @@ bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode)
- // construct on the stack = automatic cleanup.
+ //1) unlock local file first if necessary (ask for password)
+ if (this->isDeepLocked()) {
+ PwMerror ret = this->deepLock(false);
+ if (ret != e_success)
+ return false;
+ }
+
+ //2) construct and open a new doc on the stack(automatic cleanup) for remote file.
PwMDoc syncTarget(this, "synctarget");
+ PwMDoc* pSyncTarget = &syncTarget;
- PwMerror err = syncTarget.openDoc(&filename, 2 /*== deeplocked*/);
- if (err != e_success)
+ PwMerror err = pSyncTarget->openDoc(&filename, 1 /*== open with all entries locked*/);
+
+ if (err == e_alreadyOpen) {
+ PwMDocList::listItem li;
+ if (getOpenDocList()->find(filename.latin1(), &li))
+ pSyncTarget = li.doc;
+ else {
+ qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1());
+ return false;
+ }
+ }
+ else if (err != e_success) {
+ qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1());
return false;
+ }
@@ -3107,3 +3130,11 @@ bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode)
- err = syncronize(manager, this, &syncTarget, mode );
+ //3) unlock remote file first if necessary (ask for password)
+ if (pSyncTarget->isDeepLocked()) {
+ PwMerror ret = pSyncTarget->deepLock(false);
+ if (ret != e_success)
+ return false;
+ }
+
+
+ err = syncronize(manager, this, pSyncTarget, mode );
@@ -3112,6 +3143,7 @@ bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode)
qDebug("Saving remote PWManager file");
- err = syncTarget.saveDoc(conf()->confGlobCompression());
- if (err != e_success)
+ err = pSyncTarget->saveDoc(conf()->confGlobCompression());
+ if (err != e_success) {
+ qDebug("PwmDoc::sync: Sync failed. Error %i while storing file %s",err, filename.latin1());
return false;
-
+ }
}