-rw-r--r-- | pwmanager/pwmanager/pwm.cpp | 57 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwm.h | 8 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmdoc.cpp | 85 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmdoc.h | 39 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmview.cpp | 92 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmview.h | 25 | ||||
-rw-r--r-- | pwmanager/pwmanager/serializer.cpp | 126 |
7 files changed, 287 insertions, 145 deletions
diff --git a/pwmanager/pwmanager/pwm.cpp b/pwmanager/pwmanager/pwm.cpp index 014e809..57b4432 100644 --- a/pwmanager/pwmanager/pwm.cpp +++ b/pwmanager/pwmanager/pwm.cpp | |||
@@ -133,5 +133,6 @@ enum { | |||
133 | BUTTON_POPUP_HELP_LICENSE = 0, | 133 | BUTTON_POPUP_HELP_LICENSE = 0, |
134 | BUTTON_POPUP_HELP_FAQ, | 134 | BUTTON_POPUP_HELP_FAQ, |
135 | BUTTON_POPUP_HELP_ABOUT | 135 | BUTTON_POPUP_HELP_ABOUT, |
136 | BUTTON_POPUP_HELP_SYNC | ||
136 | }; | 137 | }; |
137 | #endif | 138 | #endif |
@@ -157,5 +158,5 @@ PwM::PwM(PwMInit *_init, PwMDoc *doc, | |||
157 | bool virginity, | 158 | bool virginity, |
158 | QWidget *parent, const char *name) | 159 | QWidget *parent, const char *name) |
159 | : KMainWindow(parent, name) | 160 | : KMainWindow(parent, "HALLO") |
160 | , forceQuit (false) | 161 | , forceQuit (false) |
161 | , forceMinimizeToTray (false) | 162 | , forceMinimizeToTray (false) |
@@ -359,4 +360,8 @@ void PwM::initMenubar() | |||
359 | BUTTON_POPUP_HELP_ABOUT); | 360 | BUTTON_POPUP_HELP_ABOUT); |
360 | 361 | ||
362 | helpPopup->insertItem(i18n("&Sync HowTo"), this, | ||
363 | SLOT(syncHowTo_slot()), 0, | ||
364 | BUTTON_POPUP_HELP_SYNC); | ||
365 | |||
361 | #endif | 366 | #endif |
362 | menuBar()->insertItem(i18n("&Help"), helpPopup); | 367 | menuBar()->insertItem(i18n("&Help"), helpPopup); |
@@ -610,4 +615,10 @@ void PwM::addPwd_slot(QString *pw, PwMDoc *_doc) | |||
610 | { | 615 | { |
611 | PwMDataItem d; | 616 | PwMDataItem d; |
617 | |||
618 | //US BUG: to initialize all values of curEntr with meaningfulldata, | ||
619 | // we call clear on it. Reason: Metadata will be uninitialized otherwise. | ||
620 | // another option would be to create a constructor for PwMDataItem | ||
621 | d.clear(true); | ||
622 | |||
612 | d.desc = w.getDescription().latin1(); | 623 | d.desc = w.getDescription().latin1(); |
613 | d.name = w.getUsername().latin1(); | 624 | d.name = w.getUsername().latin1(); |
@@ -620,5 +631,5 @@ void PwM::addPwd_slot(QString *pw, PwMDoc *_doc) | |||
620 | KMessageBox::error(this, | 631 | KMessageBox::error(this, |
621 | i18n | 632 | i18n |
622 | ("An entry with this \"Description\", " | 633 | ("An entry with this \"Description\",\n" |
623 | "does already exist.\n" | 634 | "does already exist.\n" |
624 | "Please select another description."), | 635 | "Please select another description."), |
@@ -626,6 +637,6 @@ void PwM::addPwd_slot(QString *pw, PwMDoc *_doc) | |||
626 | goto tryAgain; | 637 | goto tryAgain; |
627 | } else if (ret == e_maxAllowedEntr) { | 638 | } else if (ret == e_maxAllowedEntr) { |
628 | KMessageBox::error(this, i18n("The maximum possible number of entries " | 639 | KMessageBox::error(this, i18n("The maximum possible number of\nentries" |
629 | "has been reached. You can't add more entries."), | 640 | "has been reached.\nYou can't add more entries."), |
630 | i18n("maximum number of entries")); | 641 | i18n("maximum number of entries")); |
631 | doc->timer()->putLock(DocTimer::id_autoLockTimer); | 642 | doc->timer()->putLock(DocTimer::id_autoLockTimer); |
@@ -1288,4 +1299,11 @@ void PwM::faq_slot() | |||
1288 | } | 1299 | } |
1289 | 1300 | ||
1301 | void PwM::syncHowTo_slot() | ||
1302 | { | ||
1303 | qDebug("PwM::syncHowTo_slot"); | ||
1304 | KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" ); | ||
1305 | } | ||
1306 | |||
1307 | |||
1290 | void PwM::createAboutData_slot() | 1308 | void PwM::createAboutData_slot() |
1291 | { | 1309 | { |
@@ -1327,35 +1345,16 @@ bool PwM::sync(KSyncManager* manager, QString filename, int mode) | |||
1327 | bool ret = curDoc()->sync(manager, filename, mode); | 1345 | bool ret = curDoc()->sync(manager, filename, mode); |
1328 | 1346 | ||
1347 | qDebug("PwM::sync save now: ret=%i", ret); | ||
1348 | |||
1329 | if (ret == true) { | 1349 | if (ret == true) { |
1330 | //US BUG: what can we call here to update the view of the current doc? | 1350 | //US BUG: what can we call here to update the view of the current doc? |
1331 | //mViewManager->refreshView(); | 1351 | //mViewManager->refreshView(); |
1352 | |||
1353 | //US curDoc()->sync sets the dirtyFlag in case the sync was successfull. | ||
1354 | save(); | ||
1332 | } | 1355 | } |
1333 | 1356 | ||
1334 | return ret; | 1357 | return ret; |
1335 | } | 1358 | } |
1336 | |||
1337 | //called by the syncmanager to indicate that the work has to be marked as dirty. | ||
1338 | void PwM::sync_setModified() | ||
1339 | { | ||
1340 | PWM_ASSERT(curDoc()); | ||
1341 | curDoc()->sync_setModified(); | ||
1342 | } | ||
1343 | |||
1344 | //called by the syncmanager to ask if the dirty flag is set. | ||
1345 | bool PwM::sync_isModified() | ||
1346 | { | ||
1347 | PWM_ASSERT(curDoc()); | ||
1348 | return curDoc()->sync_isModified(); | ||
1349 | } | ||
1350 | |||
1351 | //called by the syncmanager to indicate that the work has to be saved. | ||
1352 | void PwM::sync_save() | ||
1353 | { | ||
1354 | PWM_ASSERT(curDoc()); | ||
1355 | return curDoc()->sync_save(); | ||
1356 | } | ||
1357 | |||
1358 | |||
1359 | |||
1360 | #endif | 1359 | #endif |
1361 | 1360 | ||
diff --git a/pwmanager/pwmanager/pwm.h b/pwmanager/pwmanager/pwm.h index 7c6bf0d..6ed9d34 100644 --- a/pwmanager/pwmanager/pwm.h +++ b/pwmanager/pwmanager/pwm.h | |||
@@ -178,4 +178,5 @@ public slots: | |||
178 | void faq_slot(); | 178 | void faq_slot(); |
179 | void createAboutData_slot(); | 179 | void createAboutData_slot(); |
180 | void syncHowTo_slot(); | ||
180 | #endif | 181 | #endif |
181 | 182 | ||
@@ -273,11 +274,4 @@ protected: | |||
273 | virtual bool sync(KSyncManager* manager, QString filename, int mode); | 274 | virtual bool sync(KSyncManager* manager, QString filename, int mode); |
274 | 275 | ||
275 | //called by the syncmanager to indicate that the work has to marked as dirty. | ||
276 | virtual void sync_setModified(); | ||
277 | //called by the syncmanager to ask if the dirty flag is set. | ||
278 | virtual bool sync_isModified(); | ||
279 | //called by the syncmanager to indicate that the work has to be saved. | ||
280 | virtual void sync_save(); | ||
281 | |||
282 | // LR ******************************* | 276 | // LR ******************************* |
283 | // sync stuff! | 277 | // sync stuff! |
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp index 0ac5517..2a7b11d 100644 --- a/pwmanager/pwmanager/pwmdoc.cpp +++ b/pwmanager/pwmanager/pwmdoc.cpp | |||
@@ -488,5 +488,6 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file) | |||
488 | } | 488 | } |
489 | ret = e_success; | 489 | ret = e_success; |
490 | printDebug(string("writing file { compress: ") | 490 | printDebug(string("writing file { name: ") |
491 | + filename.latin1() + " compress: " | ||
491 | + tostr(static_cast<int>(compress)) + " cryptAlgo: " | 492 | + tostr(static_cast<int>(compress)) + " cryptAlgo: " |
492 | + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: " | 493 | + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: " |
@@ -606,5 +607,7 @@ PwMerror PwMDoc::writeFileHeader(char keyHash, char dataHash, char crypt, char c | |||
606 | PWM_ASSERT(pw); | 607 | PWM_ASSERT(pw); |
607 | PWM_ASSERT(f); | 608 | PWM_ASSERT(f); |
608 | PWM_ASSERT(listView); | 609 | //US ENH: or maybe a bug: checking here for listView does not make sense because we do not check anywhere else |
610 | //Wenn I sync, I open a doc without a view => listView is 0 => Assertion | ||
611 | //USPWM_ASSERT(listView); | ||
609 | if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) != | 612 | if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) != |
610 | static_cast<Q_LONG>(strlen(FILE_ID_HEADER))) { | 613 | static_cast<Q_LONG>(strlen(FILE_ID_HEADER))) { |
@@ -2805,8 +2808,17 @@ void PwMDoc::ensureLvp() | |||
2805 | return; | 2808 | return; |
2806 | 2809 | ||
2810 | //US ENH BUG: when using syncronizing, this way of sorting | ||
2811 | //is not sufficient, because there might be empty spaces | ||
2812 | // at the beginning. But this algorythm only can add elements | ||
2813 | //to the end.The result are crashes because of listoverflows | ||
2814 | //we need something to fill all gaps. | ||
2807 | vector< vector<PwMDataItem>::iterator > undefined; | 2815 | vector< vector<PwMDataItem>::iterator > undefined; |
2816 | vector< vector<PwMDataItem>::iterator > sorted; | ||
2808 | vector< vector<PwMDataItem>::iterator >::iterator undefBegin, | 2817 | vector< vector<PwMDataItem>::iterator >::iterator undefBegin, |
2809 | undefEnd, | 2818 | undefEnd, |
2810 | undefI; | 2819 | undefI; |
2820 | vector< vector<PwMDataItem>::iterator >::iterator sortedBegin, | ||
2821 | sortedEnd, | ||
2822 | sortedI; | ||
2811 | vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), | 2823 | vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), |
2812 | catEnd = dti.dta.end(), | 2824 | catEnd = dti.dta.end(), |
@@ -2827,8 +2839,22 @@ void PwMDoc::ensureLvp() | |||
2827 | if (tmpLvp == -1) | 2839 | if (tmpLvp == -1) |
2828 | undefined.push_back(entrI); | 2840 | undefined.push_back(entrI); |
2829 | else if (tmpLvp > lvpTop) | 2841 | else |
2830 | lvpTop = tmpLvp; | 2842 | sorted[tmpLvp] = entrI; |
2843 | //US else if (tmpLvp > lvpTop) | ||
2844 | //US lvpTop = tmpLvp; | ||
2831 | ++entrI; | 2845 | ++entrI; |
2832 | } | 2846 | } |
2847 | |||
2848 | //now we have all undefied in the collection. Now insert the existing | ||
2849 | sortedBegin = sorted.begin(); | ||
2850 | sortedEnd = sorted.end(); | ||
2851 | sortedI = sortedBegin; | ||
2852 | |||
2853 | while (sortedI != sortedEnd) { | ||
2854 | tmpLvp = (*sortedI)->listViewPos; | ||
2855 | undefined[tmpLvp] = *sortedI; | ||
2856 | ++sortedI; | ||
2857 | } | ||
2858 | |||
2833 | undefBegin = undefined.begin(); | 2859 | undefBegin = undefined.begin(); |
2834 | undefEnd = undefined.end(); | 2860 | undefEnd = undefined.end(); |
@@ -2849,4 +2875,14 @@ QString PwMDoc::getTitle() | |||
2849 | */ | 2875 | */ |
2850 | QString title(getFilename()); | 2876 | QString title(getFilename()); |
2877 | |||
2878 | //US ENH: The whole filename on PDAs is too long. So use only the last characters | ||
2879 | if (QApplication::desktop()->width() < 640) | ||
2880 | { | ||
2881 | if (title.length() > 30) | ||
2882 | title = "..." + title.right(30); | ||
2883 | |||
2884 | } | ||
2885 | |||
2886 | |||
2851 | if (title.isEmpty()) { | 2887 | if (title.isEmpty()) { |
2852 | if (unnamedNum == 0) { | 2888 | if (unnamedNum == 0) { |
@@ -2928,5 +2964,5 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s | |||
2928 | 2964 | ||
2929 | syncItemLocal = syncLocal->getSyncDataEntry(index); | 2965 | syncItemLocal = syncLocal->getSyncDataEntry(index); |
2930 | qDebug("Last Sync %s ", syncItemLocal->lastSyncDate.toString().latin1()); | 2966 | qDebug("Last Sync Local %s ", syncItemLocal->lastSyncDate.toString().latin1()); |
2931 | 2967 | ||
2932 | //Step 2. Find syncinfo in remote file and create if not existent. | 2968 | //Step 2. Find syncinfo in remote file and create if not existent. |
@@ -2948,4 +2984,5 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s | |||
2948 | 2984 | ||
2949 | syncItemRemote = syncRemote->getSyncDataEntry(index); | 2985 | syncItemRemote = syncRemote->getSyncDataEntry(index); |
2986 | qDebug("Last Sync Remote %s ", syncItemRemote->lastSyncDate.toString().latin1()); | ||
2950 | //and remove the found entry here. We will reenter it later again. | 2987 | //and remove the found entry here. We will reenter it later again. |
2951 | //US syncRemote->delSyncDataEntry(index, true); | 2988 | //US syncRemote->delSyncDataEntry(index, true); |
@@ -2960,6 +2997,6 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s | |||
2960 | if ( syncItemLocal->lastSyncDate != syncItemRemote->lastSyncDate ) { | 2997 | if ( syncItemLocal->lastSyncDate != syncItemRemote->lastSyncDate ) { |
2961 | 2998 | ||
2962 | // qDebug("set fulldate to true %s %s" ,addresseeLSync->dtStart().toString().latin1(), addresseeRSync->dtStart().toString().latin1() ); | 2999 | // qDebug("set fulldate to true %s %s" ,syncItemLocal->lastSyncDate.toString().latin1(), syncItemRemote->lastSyncDate.toString().latin1() ); |
2963 | //qDebug("%d %d %d %d ", addresseeLSync->dtStart().time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec()); | 3000 | // qDebug("%d %d %d %d ", syncItemLocal->lastSyncDate.time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec()); |
2964 | fullDateRange = true; | 3001 | fullDateRange = true; |
2965 | qDebug("FULLDATE 3 %s %s", syncItemLocal->lastSyncDate.toString().latin1() , syncItemRemote->lastSyncDate.toString().latin1() ); | 3002 | qDebug("FULLDATE 3 %s %s", syncItemLocal->lastSyncDate.toString().latin1() , syncItemRemote->lastSyncDate.toString().latin1() ); |
@@ -2974,5 +3011,5 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s | |||
2974 | 3011 | ||
2975 | qDebug("*************************** "); | 3012 | qDebug("*************************** "); |
2976 | // qDebug("mLastAddressbookSync %s ",mLastAddressbookSync.toString().latin1() ); | 3013 | qDebug("mLastSync %s ",mLastSync.toString().latin1() ); |
2977 | QStringList er = syncRemote->getIDEntryList(); | 3014 | QStringList er = syncRemote->getIDEntryList(); |
2978 | PwMDataItem* inRemote ;//= er.first(); | 3015 | PwMDataItem* inRemote ;//= er.first(); |
@@ -3002,5 +3039,5 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s | |||
3002 | if ( inLocal != 0 ) { // maybe conflict - same uid in both files | 3039 | if ( inLocal != 0 ) { // maybe conflict - same uid in both files |
3003 | if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) { | 3040 | if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) { |
3004 | //qDebug("take %d %s ", take, inL.summary().latin1()); | 3041 | qDebug("take %d %s ", take, inLocal->desc.c_str()); |
3005 | if ( take == 3 ) | 3042 | if ( take == 3 ) |
3006 | return e_syncError; | 3043 | return e_syncError; |
@@ -3053,4 +3090,5 @@ PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* s | |||
3053 | manager->showProgressBar(incCounter); | 3090 | manager->showProgressBar(incCounter); |
3054 | uid = el[ incCounter ]; | 3091 | uid = el[ incCounter ]; |
3092 | qDebug("sync uid %s from local file", uid.latin1()); | ||
3055 | 3093 | ||
3056 | inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); | 3094 | inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); |
@@ -3133,14 +3171,14 @@ int PwMDoc::takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime | |||
3133 | //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , localMod, remote->lastModified().toString().latin1(), remoteMod); | 3171 | //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , localMod, remote->lastModified().toString().latin1(), remoteMod); |
3134 | //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() ); | 3172 | //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() ); |
3135 | //full = true; //debug only | 3173 | full = true; //debug only |
3136 | if ( full ) { | 3174 | if ( full ) { |
3137 | bool equ = true;//US ( (*local) == (*remote) ); | 3175 | bool equ = ( (*local) == (*remote) ); |
3138 | if ( equ ) { | 3176 | if ( equ ) { |
3139 | //qDebug("equal "); | 3177 | qDebug("equal "); |
3140 | if ( mode < SYNC_PREF_FORCE_LOCAL ) | 3178 | if ( mode < SYNC_PREF_FORCE_LOCAL ) |
3141 | return 0; | 3179 | return 0; |
3142 | 3180 | ||
3143 | }//else //debug only | 3181 | }else //debug only |
3144 | //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); | 3182 | qDebug("not equal %s %s ", local->desc.c_str(), remote->desc.c_str()); |
3145 | } | 3183 | } |
3146 | 3184 | ||
@@ -3216,5 +3254,5 @@ bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode) | |||
3216 | } | 3254 | } |
3217 | 3255 | ||
3218 | //2) construct and open a new doc on the stack(automatic cleanup) for remote file. | 3256 | //2) construct and open a new doc on the stack(automatic cleanup of remote file). |
3219 | PwMDoc syncTarget(this, "synctarget"); | 3257 | PwMDoc syncTarget(this, "synctarget"); |
3220 | PwMDoc* pSyncTarget = &syncTarget; | 3258 | PwMDoc* pSyncTarget = &syncTarget; |
@@ -3268,21 +3306,4 @@ bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode) | |||
3268 | } | 3306 | } |
3269 | 3307 | ||
3270 | //called by the syncmanager to indicate that the work has to marked as dirty. | ||
3271 | void PwMDoc::sync_setModified() | ||
3272 | { | ||
3273 | flagDirty(); | ||
3274 | } | ||
3275 | |||
3276 | //called by the syncmanager to ask if the dirty flag is set. | ||
3277 | bool PwMDoc::sync_isModified() | ||
3278 | { | ||
3279 | return isDirty(); | ||
3280 | } | ||
3281 | |||
3282 | //called by the syncmanager to indicate that the work has to be saved. | ||
3283 | void PwMDoc::sync_save() | ||
3284 | { | ||
3285 | saveDoc(conf()->confGlobCompression()); | ||
3286 | } | ||
3287 | #endif | 3308 | #endif |
3288 | 3309 | ||
diff --git a/pwmanager/pwmanager/pwmdoc.h b/pwmanager/pwmanager/pwmdoc.h index 2e9547e..6a1dd30 100644 --- a/pwmanager/pwmanager/pwmdoc.h +++ b/pwmanager/pwmanager/pwmdoc.h | |||
@@ -131,14 +131,4 @@ struct PwMMetaData | |||
131 | } | 131 | } |
132 | 132 | ||
133 | PwMMetaData& operator = (const PwMMetaData& x) | ||
134 | { | ||
135 | create = x.create; | ||
136 | expire = x.expire; | ||
137 | update = x.update; | ||
138 | updateInt = x.updateInt; | ||
139 | uniqueid = x.uniqueid; | ||
140 | return *this; | ||
141 | } | ||
142 | |||
143 | inline bool isValid() const | 133 | inline bool isValid() const |
144 | { | 134 | { |
@@ -218,8 +208,24 @@ struct PwMDataItem | |||
218 | meta.clear(); | 208 | meta.clear(); |
219 | } | 209 | } |
220 | 210 | //US ENH: we need this operator to compare two items if we have no unique ids | |
211 | //available. Generaly this happens before the first sync | ||
212 | bool PwMDataItem::operator==( const PwMDataItem &a ) const | ||
213 | { | ||
214 | qDebug("oper==%s", a.desc.c_str()); | ||
215 | if ( desc != a.desc ) return false; | ||
216 | if ( name != a.name ) return false; | ||
217 | if ( pw != a.pw ) return false; | ||
218 | if ( comment != a.comment ) return false; | ||
219 | if ( url != a.url ) return false; | ||
220 | if ( launcher != a.launcher ) return false; | ||
221 | //all other field will not be checked. | ||
222 | return true; | ||
223 | } | ||
224 | |||
225 | //US ENH:this operator is used to copy an elements data during syncronization | ||
226 | //Attention: listViewPos will not be copied. So the position will stay the same. | ||
221 | PwMDataItem& operator = (const PwMDataItem& x) | 227 | PwMDataItem& operator = (const PwMDataItem& x) |
222 | { | 228 | { |
223 | qDebug("oper=%s", x.desc.c_str()); | 229 | // qDebug("oper=%s", x.desc.c_str()); |
224 | desc = x.desc; | 230 | desc = x.desc; |
225 | name = x.name; | 231 | name = x.name; |
@@ -229,5 +235,5 @@ struct PwMDataItem | |||
229 | launcher = x.launcher; | 235 | launcher = x.launcher; |
230 | lockStat = x.lockStat; | 236 | lockStat = x.lockStat; |
231 | listViewPos = x.listViewPos; | 237 | //Do not copy listViewPos!!! listViewPos = x.listViewPos; |
232 | binary = x.binary; | 238 | binary = x.binary; |
233 | meta = x.meta; | 239 | meta = x.meta; |
@@ -775,11 +781,4 @@ protected: | |||
775 | virtual bool sync(KSyncManager* manager, QString filename, int mode); | 781 | virtual bool sync(KSyncManager* manager, QString filename, int mode); |
776 | 782 | ||
777 | //called by the syncmanager to indicate that the work has to be marked as dirty. | ||
778 | virtual void sync_setModified(); | ||
779 | //called by the syncmanager to ask if the dirty flag is set. | ||
780 | virtual bool sync_isModified(); | ||
781 | //called by the syncmanager to indicate that the work has to be saved. | ||
782 | virtual void sync_save(); | ||
783 | |||
784 | #endif | 783 | #endif |
785 | private: | 784 | private: |
diff --git a/pwmanager/pwmanager/pwmview.cpp b/pwmanager/pwmanager/pwmview.cpp index e23ce25..e53124f 100644 --- a/pwmanager/pwmanager/pwmview.cpp +++ b/pwmanager/pwmanager/pwmview.cpp | |||
@@ -457,9 +457,89 @@ void PwMView::copyCommentToClip() | |||
457 | } | 457 | } |
458 | 458 | ||
459 | /************************************************************************ | ||
460 | * | ||
461 | * | ||
462 | * | ||
463 | ************************************************************************/ | ||
464 | |||
465 | |||
466 | PwMDataItemView::PwMDataItemView( QWidget *parent, const char *name ) | ||
467 | : QTextBrowser( parent, name ) | ||
468 | |||
469 | |||
470 | { | ||
471 | //US setWrapPolicy( QTextEdit::AtWordBoundary ); | ||
472 | setLinkUnderline( false ); | ||
473 | // setVScrollBarMode( QScrollView::AlwaysOff ); | ||
474 | //setHScrollBarMode( QScrollView::AlwaysOff ); | ||
475 | |||
476 | //US QStyleSheet *sheet = styleSheet(); | ||
477 | //US QStyleSheetItem *link = sheet->item( "a" ); | ||
478 | //US link->setColor( KGlobalSettings::linkColor() ); | ||
479 | |||
480 | } | ||
481 | |||
482 | void PwMDataItemView::setPwMDataItem( const PwMDataItem& a ) | ||
483 | |||
484 | { | ||
485 | mItem = a; | ||
486 | // clear view | ||
487 | setText( QString::null ); | ||
488 | |||
489 | |||
490 | QString dynamicPart; | ||
491 | QString format = "<tr><td align=\"right\"><b>%1</b></td>" | ||
492 | "<td align=\"left\">%2</td></tr>"; | ||
493 | |||
494 | dynamicPart += format | ||
495 | .arg( i18n("Description") ) | ||
496 | .arg( mItem.desc.c_str() ); | ||
459 | 497 | ||
498 | dynamicPart += format | ||
499 | .arg( i18n("Name") ) | ||
500 | .arg( mItem.name.c_str() ); | ||
501 | |||
502 | dynamicPart += format | ||
503 | .arg( i18n("Password") ) | ||
504 | .arg( mItem.pw.c_str() ); | ||
505 | |||
506 | QString comment(mItem.pw.c_str()); | ||
507 | dynamicPart += format | ||
508 | .arg( i18n("Comment") ) | ||
509 | .arg( comment.replace( QRegExp("\n"), "<br>" ) ); | ||
510 | |||
511 | dynamicPart += format | ||
512 | .arg( i18n("URL") ) | ||
513 | .arg( mItem.url.c_str() ); | ||
514 | |||
515 | dynamicPart += format | ||
516 | .arg( i18n("Launcher") ) | ||
517 | .arg( mItem.launcher.c_str() ); | ||
518 | |||
519 | QString mText = "<table><td colspan=\"2\"> </td>"; | ||
520 | |||
521 | mText += dynamicPart; | ||
522 | mText += "</table>"; | ||
523 | |||
524 | // at last display it... | ||
525 | setText( mText ); | ||
526 | |||
527 | } | ||
528 | |||
529 | PwMDataItem PwMDataItemView::pwmdataitem() const | ||
530 | { | ||
531 | return mItem; | ||
532 | } | ||
533 | |||
534 | /************************************************************************ | ||
535 | * | ||
536 | * | ||
537 | * | ||
538 | ************************************************************************/ | ||
460 | 539 | ||
461 | 540 | ||
462 | PwMDataItemChooser::PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool takeloc, QWidget *parent, const char *name ) : KDialogBase(parent,name, | 541 | PwMDataItemChooser::PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool takeloc, QWidget *parent, const char *name ) |
463 | true ,i18n("Conflict! Please choose Entry!"),Ok|User1|Close,Close, false) | 542 | : KDialogBase(parent, name, true , |
543 | i18n("Conflict! Please choose Entry!"),Ok|User1|Close,Close, false) | ||
464 | { | 544 | { |
465 | findButton( Close )->setText( i18n("Cancel Sync")); | 545 | findButton( Close )->setText( i18n("Cancel Sync")); |
@@ -479,6 +559,6 @@ PwMDataItemChooser::PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool t | |||
479 | if ( takeloc ) | 559 | if ( takeloc ) |
480 | lab->setBackgroundColor(Qt::green.light() ); | 560 | lab->setBackgroundColor(Qt::green.light() ); |
481 | // AddresseeView * av = new AddresseeView( subframe ); | 561 | PwMDataItemView * av = new PwMDataItemView( subframe ); |
482 | // av->setAddressee( loc ); | 562 | av->setPwMDataItem( loc ); |
483 | subframe = new QVBox( topframe ); | 563 | subframe = new QVBox( topframe ); |
484 | bl->addWidget(subframe ); | 564 | bl->addWidget(subframe ); |
@@ -486,6 +566,6 @@ PwMDataItemChooser::PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool t | |||
486 | if ( !takeloc ) | 566 | if ( !takeloc ) |
487 | lab->setBackgroundColor(Qt::green.light() ); | 567 | lab->setBackgroundColor(Qt::green.light() ); |
488 | // av = new AddresseeView( subframe ); | 568 | av = new PwMDataItemView( subframe ); |
489 | // av->setAddressee( rem ); | 569 | av->setPwMDataItem( rem ); |
490 | QObject::connect(findButton( Ok ),SIGNAL(clicked()),this, SLOT(slot_remote())); | 570 | QObject::connect(findButton( Ok ),SIGNAL(clicked()),this, SLOT(slot_remote())); |
491 | QObject::connect(this,SIGNAL(user1Clicked()),this, SLOT(slot_local())); | 571 | QObject::connect(this,SIGNAL(user1Clicked()),this, SLOT(slot_local())); |
diff --git a/pwmanager/pwmanager/pwmview.h b/pwmanager/pwmanager/pwmview.h index 75cce51..e42b17a 100644 --- a/pwmanager/pwmanager/pwmview.h +++ b/pwmanager/pwmanager/pwmview.h | |||
@@ -42,4 +42,5 @@ | |||
42 | #include <qfont.h> | 42 | #include <qfont.h> |
43 | #include <qobject.h> | 43 | #include <qobject.h> |
44 | #include <qtextbrowser.h> | ||
44 | 45 | ||
45 | #include <vector> | 46 | #include <vector> |
@@ -150,4 +151,28 @@ private: | |||
150 | 151 | ||
151 | 152 | ||
153 | //US ENH basic widget to view an password entry. We need it for the sync stuff. | ||
154 | //But might be oif interest for other functionalities as well. | ||
155 | class PwMDataItemView : public QTextBrowser | ||
156 | { | ||
157 | public: | ||
158 | PwMDataItemView( QWidget *parent = 0, const char *name = 0 ); | ||
159 | |||
160 | /** | ||
161 | Sets the PwMDataItem object. It is displayed immediately. | ||
162 | |||
163 | @param a The PwMDataItem object. | ||
164 | */ | ||
165 | void setPwMDataItem( const PwMDataItem& a ); | ||
166 | |||
167 | /** | ||
168 | Returns the current PwMDataItem object. | ||
169 | */ | ||
170 | PwMDataItem pwmdataitem() const; | ||
171 | |||
172 | private: | ||
173 | PwMDataItem mItem; | ||
174 | }; | ||
175 | |||
176 | |||
152 | //US ENH we need this chooser when syncing results in a conflict | 177 | //US ENH we need this chooser when syncing results in a conflict |
153 | class PwMDataItemChooser : public KDialogBase | 178 | class PwMDataItemChooser : public KDialogBase |
diff --git a/pwmanager/pwmanager/serializer.cpp b/pwmanager/pwmanager/serializer.cpp index 203f82c..5c6568f 100644 --- a/pwmanager/pwmanager/serializer.cpp +++ b/pwmanager/pwmanager/serializer.cpp | |||
@@ -28,5 +28,5 @@ | |||
28 | 28 | ||
29 | /* enable/disable serializer debugging (0/1) */ | 29 | /* enable/disable serializer debugging (0/1) */ |
30 | #define SERIALIZER_DEBUG0 | 30 | #define SERIALIZER_DEBUG1 |
31 | /* use the old xml tags for writing (0/1) */ | 31 | /* use the old xml tags for writing (0/1) */ |
32 | #define USE_OLD_TAGS 0 | 32 | #define USE_OLD_TAGS 0 |
@@ -305,4 +305,8 @@ bool Serializer::readEntries(const QDomNode &n, | |||
305 | unsigned int numEntr = nl.count(), i; | 305 | unsigned int numEntr = nl.count(), i; |
306 | PwMDataItem curEntr; | 306 | PwMDataItem curEntr; |
307 | //US BUG: to initialize all values of curEntr with meaningfulldata, | ||
308 | // we call clear on it. Reason: Information in the file we will read might be incomplete. | ||
309 | // e.g. the metadata is missing. | ||
310 | curEntr.clear(true); | ||
307 | 311 | ||
308 | dta->clear(); | 312 | dta->clear(); |
@@ -402,34 +406,40 @@ bool Serializer::extractMeta(const QDomNode &n, | |||
402 | continue; | 406 | continue; |
403 | } | 407 | } |
408 | |||
409 | //US BUG: The transformation of an empty date into an ISO date and back is different on different systems/compilers. | ||
410 | //because of that it is possible that here some values are not set, which means they are null. | ||
411 | //US ENH: at the same moment we need backwardcompatibility. So older versions might have stored invalid dates. | ||
412 | |||
413 | QDateTime dtval; //dtval should be invalid by definition. | ||
414 | |||
415 | if ((name == META_CREATE_DATE) || | ||
416 | (name == META_VALID_DATE) || | ||
417 | (name == META_EXPIRE_DATE) || | ||
418 | (name == META_UPDATE_DATE)) | ||
419 | { | ||
420 | //qDebug("Serializer::extractMeta:: val:%s, empty:%i, length:%i",val.utf8(), val.isEmpty(), val.length()); | ||
421 | |||
404 | #ifndef PWM_EMBEDDED | 422 | #ifndef PWM_EMBEDDED |
405 | if (name == META_CREATE_DATE) { | 423 | dtval = QDateTime::fromString(val, Qt::ISODate); |
406 | dta->create = QDateTime::fromString(val, Qt::ISODate); | ||
407 | } else if (name == META_VALID_DATE) { | ||
408 | dta->valid = QDateTime::fromString(val, Qt::ISODate); | ||
409 | } else if (name == META_EXPIRE_DATE) { | ||
410 | dta->expire = QDateTime::fromString(val, Qt::ISODate); | ||
411 | } else if (name == META_UPDATE_DATE) { | ||
412 | dta->update = QDateTime::fromString(val, Qt::ISODate); | ||
413 | } else if (name == META_UPDATE_INT) { | ||
414 | dta->updateInt = strtoul(val.latin1(), 0, 10); | ||
415 | } else if (name == META_UNIQUEID) { | ||
416 | dta->uniqueid = unescapeEntryData(val).latin1(); | ||
417 | } else { | ||
418 | printDebug(string("extractMeta(): invalid: ") | ||
419 | + name.latin1()); | ||
420 | } | ||
421 | #else | 424 | #else |
425 | bool ok; | ||
426 | dtval = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); | ||
427 | |||
428 | if (ok == false) | ||
429 | qDebug("Serializer::extractMeta invalid date or time !!!!!!!!!!!!!"); | ||
430 | #endif | ||
422 | 431 | ||
432 | //if the parsed data is wrong, dtval should be invalid at this time. | ||
423 | 433 | ||
424 | bool ok = true; | 434 | } |
425 | 435 | ||
426 | if (name == META_CREATE_DATE) { | 436 | if (name == META_CREATE_DATE) { |
427 | dta->create = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); | 437 | dta->create = dtval; |
428 | } else if (name == META_VALID_DATE) { | 438 | } else if (name == META_VALID_DATE) { |
429 | dta->valid = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); | 439 | dta->valid = dtval; |
430 | } else if (name == META_EXPIRE_DATE) { | 440 | } else if (name == META_EXPIRE_DATE) { |
431 | dta->expire = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); | 441 | dta->expire = dtval; |
432 | } else if (name == META_UPDATE_DATE) { | 442 | } else if (name == META_UPDATE_DATE) { |
433 | dta->update = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); | 443 | dta->update = dtval; |
434 | } else if (name == META_UPDATE_INT) { | 444 | } else if (name == META_UPDATE_INT) { |
435 | dta->updateInt = strtoul(val.latin1(), 0, 10); | 445 | dta->updateInt = strtoul(val.latin1(), 0, 10); |
@@ -441,9 +451,4 @@ bool Serializer::extractMeta(const QDomNode &n, | |||
441 | } | 451 | } |
442 | 452 | ||
443 | if (ok == false) | ||
444 | qDebug("Serializer::extractMeta invalid date or time !!!!!!!!!!!!!"); | ||
445 | |||
446 | |||
447 | #endif | ||
448 | cur = cur.nextSibling(); | 453 | cur = cur.nextSibling(); |
449 | } | 454 | } |
@@ -605,39 +610,59 @@ bool Serializer::writeMeta(QDomElement *e, | |||
605 | QDomElement tag; | 610 | QDomElement tag; |
606 | 611 | ||
607 | tag = domDoc->createElement(META_CREATE_DATE); | 612 | //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers. |
613 | //So do not transform an empty value at all. | ||
614 | if (dta.create.isValid()) | ||
615 | { | ||
616 | tag = domDoc->createElement(META_CREATE_DATE); | ||
608 | #ifndef PWM_EMBEDDED | 617 | #ifndef PWM_EMBEDDED |
609 | text = domDoc->createTextNode(dta.create.toString(Qt::ISODate)); | 618 | text = domDoc->createTextNode(dta.create.toString(Qt::ISODate)); |
610 | #else | 619 | #else |
611 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.create, KLocale::ISODate)); | 620 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.create, KLocale::ISODate)); |
612 | #endif | 621 | #endif |
613 | tag.appendChild(text); | 622 | tag.appendChild(text); |
614 | e->appendChild(tag); | 623 | e->appendChild(tag); |
624 | } | ||
615 | 625 | ||
616 | tag = domDoc->createElement(META_VALID_DATE); | 626 | //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers. |
627 | //So do not transform an empty value at all. | ||
628 | if (dta.valid.isValid()) | ||
629 | { | ||
630 | tag = domDoc->createElement(META_VALID_DATE); | ||
617 | #ifndef PWM_EMBEDDED | 631 | #ifndef PWM_EMBEDDED |
618 | text = domDoc->createTextNode(dta.valid.toString(Qt::ISODate)); | 632 | text = domDoc->createTextNode(dta.valid.toString(Qt::ISODate)); |
619 | #else | 633 | #else |
620 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.valid, KLocale::ISODate)); | 634 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.valid, KLocale::ISODate)); |
621 | #endif | 635 | #endif |
622 | tag.appendChild(text); | 636 | tag.appendChild(text); |
623 | e->appendChild(tag); | 637 | e->appendChild(tag); |
638 | } | ||
624 | 639 | ||
625 | tag = domDoc->createElement(META_EXPIRE_DATE); | 640 | //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers. |
641 | //So do not transform an empty value at all. | ||
642 | if (dta.expire.isValid()) | ||
643 | { | ||
644 | tag = domDoc->createElement(META_EXPIRE_DATE); | ||
626 | #ifndef PWM_EMBEDDED | 645 | #ifndef PWM_EMBEDDED |
627 | text = domDoc->createTextNode(dta.expire.toString(Qt::ISODate)); | 646 | text = domDoc->createTextNode(dta.expire.toString(Qt::ISODate)); |
628 | #else | 647 | #else |
629 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.expire, KLocale::ISODate)); | 648 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.expire, KLocale::ISODate)); |
630 | #endif | 649 | #endif |
631 | tag.appendChild(text); | 650 | tag.appendChild(text); |
632 | e->appendChild(tag); | 651 | e->appendChild(tag); |
652 | } | ||
633 | 653 | ||
634 | tag = domDoc->createElement(META_UPDATE_DATE); | 654 | //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers. |
655 | //So do not transform an empty value at all. | ||
656 | if (dta.update.isValid()) | ||
657 | { | ||
658 | tag = domDoc->createElement(META_UPDATE_DATE); | ||
635 | #ifndef PWM_EMBEDDED | 659 | #ifndef PWM_EMBEDDED |
636 | text = domDoc->createTextNode(dta.update.toString(Qt::ISODate)); | 660 | text = domDoc->createTextNode(dta.update.toString(Qt::ISODate)); |
637 | #else | 661 | #else |
638 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.update, KLocale::ISODate)); | 662 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.update, KLocale::ISODate)); |
639 | #endif | 663 | #endif |
640 | tag.appendChild(text); | 664 | tag.appendChild(text); |
641 | e->appendChild(tag); | 665 | e->appendChild(tag); |
666 | } | ||
642 | 667 | ||
643 | tag = domDoc->createElement(META_UPDATE_INT); | 668 | tag = domDoc->createElement(META_UPDATE_INT); |
@@ -673,5 +698,5 @@ QString Serializer::unescapeEntryData(QString dta) | |||
673 | dta.replace("||>", "]]>"); | 698 | dta.replace("||>", "]]>"); |
674 | #else | 699 | #else |
675 | dta.replace(QRegExp("$>--endl--<$"), "\n"); | 700 | dta.replace(QRegExp("\\$>--endl--<\\$"), "\n"); |
676 | dta.replace(QRegExp("||>"), "]]>"); | 701 | dta.replace(QRegExp("||>"), "]]>"); |
677 | #endif | 702 | #endif |
@@ -731,5 +756,5 @@ bool Serializer::addSyncData(QDomElement *e, | |||
731 | unsigned int numSync = dta.size(), i; | 756 | unsigned int numSync = dta.size(), i; |
732 | QString curId, curDeviceName; | 757 | QString curId, curDeviceName; |
733 | QDomElement curSync, curSyncDate; | 758 | QDomElement curSync; |
734 | QDomText text; | 759 | QDomText text; |
735 | 760 | ||
@@ -746,6 +771,5 @@ bool Serializer::addSyncData(QDomElement *e, | |||
746 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta[i].lastSyncDate, KLocale::ISODate)); | 771 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta[i].lastSyncDate, KLocale::ISODate)); |
747 | #endif | 772 | #endif |
748 | curSyncDate.appendChild(text); | 773 | curSync.appendChild(text); |
749 | curSync.appendChild(curSyncDate); | ||
750 | 774 | ||
751 | e->appendChild(curSync); | 775 | e->appendChild(curSync); |