summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--pwmanager/pwmanager/pwmdoc.cpp10
-rw-r--r--pwmanager/pwmanager/pwmdoc.h20
2 files changed, 24 insertions, 6 deletions
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp
index fd17ce5..9043acc 100644
--- a/pwmanager/pwmanager/pwmdoc.cpp
+++ b/pwmanager/pwmanager/pwmdoc.cpp
@@ -2999,48 +2999,50 @@ out_accept:
2999out_ignore: 2999out_ignore:
3000 return false; 3000 return false;
3001} 3001}
3002 3002
3003 3003
3004 3004
3005#ifdef PWM_EMBEDDED 3005#ifdef PWM_EMBEDDED
3006//US ENH: this is the magic function that syncronizes the this doc with the remote doc 3006//US ENH: this is the magic function that syncronizes the this doc with the remote doc
3007//US it could have been defined as static, but I did not want to. 3007//US it could have been defined as static, but I did not want to.
3008PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* syncRemote, int mode ) 3008PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* syncRemote, int mode )
3009{ 3009{
3010 int addedPasswordsLocal = 0; 3010 int addedPasswordsLocal = 0;
3011 int addedPasswordsRemote = 0; 3011 int addedPasswordsRemote = 0;
3012 int deletedPasswordsRemote = 0; 3012 int deletedPasswordsRemote = 0;
3013 int deletedPasswordsLocal = 0; 3013 int deletedPasswordsLocal = 0;
3014 int changedLocal = 0; 3014 int changedLocal = 0;
3015 int changedRemote = 0; 3015 int changedRemote = 0;
3016 3016
3017 PwMSyncItem* syncItemLocal; 3017 PwMSyncItem* syncItemLocal;
3018 PwMSyncItem* syncItemRemote; 3018 PwMSyncItem* syncItemRemote;
3019 3019
3020 QString mCurrentSyncName = manager->getCurrentSyncName(); 3020 QString mCurrentSyncName = manager->getCurrentSyncName();
3021 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 3021 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
3022 3022
3023 bool mSyncLauncher = true;
3024
3023 bool fullDateRange = false; 3025 bool fullDateRange = false;
3024 int take; 3026 int take;
3025 // local->resetTempSyncStat(); 3027 // local->resetTempSyncStat();
3026 QDateTime mLastSync = QDateTime::currentDateTime(); 3028 QDateTime mLastSync = QDateTime::currentDateTime();
3027 QDateTime modifiedSync = mLastSync; 3029 QDateTime modifiedSync = mLastSync;
3028 3030
3029 unsigned int index; 3031 unsigned int index;
3030 //Step 1. Find syncinfo in Local file and create if not existent. 3032 //Step 1. Find syncinfo in Local file and create if not existent.
3031 bool found = syncLocal->findSyncData(mCurrentSyncDevice, &index); 3033 bool found = syncLocal->findSyncData(mCurrentSyncDevice, &index);
3032 if (found == false) 3034 if (found == false)
3033 { 3035 {
3034 PwMSyncItem newSyncItemLocal; 3036 PwMSyncItem newSyncItemLocal;
3035 newSyncItemLocal.syncName = mCurrentSyncDevice.latin1(); 3037 newSyncItemLocal.syncName = mCurrentSyncDevice.latin1();
3036 newSyncItemLocal.lastSyncDate = mLastSync; 3038 newSyncItemLocal.lastSyncDate = mLastSync;
3037 syncLocal->addSyncDataEntry(&newSyncItemLocal, true); 3039 syncLocal->addSyncDataEntry(&newSyncItemLocal, true);
3038 found = syncLocal->findSyncData(mCurrentSyncDevice, &index); 3040 found = syncLocal->findSyncData(mCurrentSyncDevice, &index);
3039 if (found == false) { 3041 if (found == false) {
3040 qDebug("PwMDoc::syncronize : newly created local sync data could not be found"); 3042 qDebug("PwMDoc::syncronize : newly created local sync data could not be found");
3041 return e_syncError; 3043 return e_syncError;
3042 } 3044 }
3043 } 3045 }
3044 3046
3045 syncItemLocal = syncLocal->getSyncDataEntry(index); 3047 syncItemLocal = syncLocal->getSyncDataEntry(index);
3046 qDebug("Last Sync Local %s ", syncItemLocal->lastSyncDate.toString().latin1()); 3048 qDebug("Last Sync Local %s ", syncItemLocal->lastSyncDate.toString().latin1());
@@ -3099,56 +3101,52 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s
3099 manager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count()); 3101 manager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count());
3100 3102
3101 int modulo = (er.count()/10)+1; 3103 int modulo = (er.count()/10)+1;
3102 unsigned int incCounter = 0; 3104 unsigned int incCounter = 0;
3103 while ( incCounter < er.count()) { 3105 while ( incCounter < er.count()) {
3104 if (manager->isProgressBarCanceled()) 3106 if (manager->isProgressBarCanceled())
3105 return e_syncError; 3107 return e_syncError;
3106 if ( incCounter % modulo == 0 ) 3108 if ( incCounter % modulo == 0 )
3107 manager->showProgressBar(incCounter); 3109 manager->showProgressBar(incCounter);
3108 3110
3109 uid = er[ incCounter ]; 3111 uid = er[ incCounter ];
3110 qDebug("sync uid %s from remote file", uid.latin1()); 3112 qDebug("sync uid %s from remote file", uid.latin1());
3111 3113
3112 qApp->processEvents(); 3114 qApp->processEvents();
3113 3115
3114 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); 3116 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal );
3115 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote ); 3117 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote );
3116 PWM_ASSERT(inRemote); 3118 PWM_ASSERT(inRemote);
3117 if ( inLocal != 0 ) { // maybe conflict - same uid in both files 3119 if ( inLocal != 0 ) { // maybe conflict - same uid in both files
3118 if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) { 3120 if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) {
3119 qDebug("take %d %s ", take, inLocal->desc.c_str()); 3121 qDebug("take %d %s ", take, inLocal->desc.c_str());
3120 if ( take == 3 ) 3122 if ( take == 3 )
3121 return e_syncError; 3123 return e_syncError;
3122 if ( take == 1 ) {// take local 3124 if ( take == 1 ) {// take local
3123 int oldlistpos = inRemote->listViewPos; 3125 inRemote->syncItem(*inLocal, mSyncLauncher);
3124 (*inRemote) = (*inLocal);
3125 inRemote->listViewPos = oldlistpos;
3126 ++changedRemote; 3126 ++changedRemote;
3127 } else { // take == 2 take remote 3127 } else { // take == 2 take remote
3128 int oldlistpos = inLocal->listViewPos; 3128 inLocal->syncItem(*inRemote, mSyncLauncher);
3129 (*inLocal) = (*inRemote);
3130 inLocal->listViewPos = oldlistpos;
3131 ++changedLocal; 3129 ++changedLocal;
3132 } 3130 }
3133 } 3131 }
3134 } else { // no conflict 3132 } else { // no conflict
3135 if ( inRemote->meta.update > mLastSync || mode == 5 ) { 3133 if ( inRemote->meta.update > mLastSync || mode == 5 ) {
3136 inRemote->meta.update = modifiedSync; 3134 inRemote->meta.update = modifiedSync;
3137 3135
3138 //first check if we have a matching category in the local file 3136 //first check if we have a matching category in the local file
3139 const string* remotecat = syncRemote->getCategory(catRemote); 3137 const string* remotecat = syncRemote->getCategory(catRemote);
3140 syncLocal->addEntry(remotecat->c_str(), inRemote, true, false); 3138 syncLocal->addEntry(remotecat->c_str(), inRemote, true, false);
3141 3139
3142 ++addedPasswordsLocal; 3140 ++addedPasswordsLocal;
3143 } else { 3141 } else {
3144 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR); 3142 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR);
3145 syncRemote->delEntry(catRemote, indexRemote, true); 3143 syncRemote->delEntry(catRemote, indexRemote, true);
3146 ++deletedPasswordsRemote; 3144 ++deletedPasswordsRemote;
3147 } 3145 }
3148 } 3146 }
3149 3147
3150 ++incCounter; 3148 ++incCounter;
3151 } 3149 }
3152 3150
3153 3151
3154 er.clear(); 3152 er.clear();
diff --git a/pwmanager/pwmanager/pwmdoc.h b/pwmanager/pwmanager/pwmdoc.h
index e419c24..09923ab 100644
--- a/pwmanager/pwmanager/pwmdoc.h
+++ b/pwmanager/pwmanager/pwmdoc.h
@@ -203,48 +203,68 @@ struct PwMDataItem
203 comment = ""; 203 comment = "";
204 url = ""; 204 url = "";
205 launcher = ""; 205 launcher = "";
206 lockStat = true; 206 lockStat = true;
207 listViewPos = -1; 207 listViewPos = -1;
208 binary = false; 208 binary = false;
209 if (clearMeta) 209 if (clearMeta)
210 meta.clear(); 210 meta.clear();
211 } 211 }
212 //US ENH: we need this operator to compare two items if we have no unique ids 212 //US ENH: we need this operator to compare two items if we have no unique ids
213 //available. Generaly this happens before the first sync 213 //available. Generaly this happens before the first sync
214 214
215 bool PwMDataItem::operator==( const PwMDataItem &a ) const 215 bool PwMDataItem::operator==( const PwMDataItem &a ) const
216 { 216 {
217 //qDebug("oper==%s", a.desc.c_str()); 217 //qDebug("oper==%s", a.desc.c_str());
218 if ( desc != a.desc ) return false; 218 if ( desc != a.desc ) return false;
219 if ( name != a.name ) return false; 219 if ( name != a.name ) return false;
220 if ( pw != a.pw ) return false; 220 if ( pw != a.pw ) return false;
221 if ( comment != a.comment ) return false; 221 if ( comment != a.comment ) return false;
222 if ( url != a.url ) return false; 222 if ( url != a.url ) return false;
223 if ( launcher != a.launcher ) return false; 223 if ( launcher != a.launcher ) return false;
224 //all other field will not be checked. 224 //all other field will not be checked.
225 return true; 225 return true;
226 } 226 }
227
228 //US ENH: this sync method actually copies all values from the parameter like the =operator
229 //does with two exceptions: listViewPos will not be changed, and the launcher only if required.
230 bool PwMDataItem::syncItem(const PwMDataItem &a, bool syncLauncher=true )
231 {
232 desc = a.desc;
233 name = a.name;
234 pw = a.pw;
235 comment = a.comment;
236 url = a.url;
237 if (syncLauncher == true)
238 launcher = a.launcher;
239 meta = a.meta;
240 binary = a.binary;
241 lockStat = a.lockStat;
242 rev = a.rev;
243
244 return true;
245 }
246
227}; 247};
228 248
229struct PwMCategoryItem 249struct PwMCategoryItem
230{ 250{
231 /** all PwMDataItems (all passwords) within this category */ 251 /** all PwMDataItems (all passwords) within this category */
232 vector<PwMDataItem>d; 252 vector<PwMDataItem>d;
233 /** category name/description */ 253 /** category name/description */
234 string name; 254 string name;
235 255
236 void clear() 256 void clear()
237 { 257 {
238 d.clear(); 258 d.clear();
239 name = ""; 259 name = "";
240 } 260 }
241}; 261};
242 262
243struct PwMSyncItem 263struct PwMSyncItem
244{ 264{
245 string syncName; 265 string syncName;
246 QDateTime lastSyncDate; 266 QDateTime lastSyncDate;
247 267
248 void clear() 268 void clear()
249 { 269 {
250 lastSyncDate = QDateTime(); 270 lastSyncDate = QDateTime();