author | ulf69 <ulf69> | 2004-10-06 00:35:59 (UTC) |
---|---|---|
committer | ulf69 <ulf69> | 2004-10-06 00:35:59 (UTC) |
commit | 904cbf4f2a418d3cadc74a6168a4565ae6ebc3c5 (patch) (unidiff) | |
tree | 22bb491b5886234a0ed21b882df73732ea99bf84 | |
parent | 07fa092b413b7cde1bd4fc797ce0b30adcb8668d (diff) | |
download | kdepimpi-904cbf4f2a418d3cadc74a6168a4565ae6ebc3c5.zip kdepimpi-904cbf4f2a418d3cadc74a6168a4565ae6ebc3c5.tar.gz kdepimpi-904cbf4f2a418d3cadc74a6168a4565ae6ebc3c5.tar.bz2 |
*** empty log message ***
-rw-r--r-- | pwmanager/pwmanager/pwmanagerE.pro | 2 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmdoc.cpp | 568 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmdoc.h | 70 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmdocui.cpp | 2 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmexception.h | 1 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmview.cpp | 64 | ||||
-rw-r--r-- | pwmanager/pwmanager/pwmview.h | 22 | ||||
-rw-r--r-- | pwmanager/pwmanager/serializer.cpp | 109 | ||||
-rw-r--r-- | pwmanager/pwmanager/serializer.h | 17 |
9 files changed, 746 insertions, 109 deletions
diff --git a/pwmanager/pwmanager/pwmanagerE.pro b/pwmanager/pwmanager/pwmanagerE.pro index 2558aca..95f5bf3 100644 --- a/pwmanager/pwmanager/pwmanagerE.pro +++ b/pwmanager/pwmanager/pwmanagerE.pro | |||
@@ -1,34 +1,34 @@ | |||
1 | TEMPLATE= app | 1 | TEMPLATE= app |
2 | CONFIG += qt warn_on | 2 | CONFIG += qt warn_on |
3 | 3 | ||
4 | 4 | ||
5 | TARGET = pwmpi | 5 | TARGET = pwmpi |
6 | OBJECTS_DIR = obj/$(PLATFORM) | 6 | OBJECTS_DIR = obj/$(PLATFORM) |
7 | MOC_DIR = moc/$(PLATFORM) | 7 | MOC_DIR = moc/$(PLATFORM) |
8 | DESTDIR=$(QPEDIR)/bin | 8 | DESTDIR=$(QPEDIR)/bin |
9 | 9 | ||
10 | INCLUDEPATH += . ../../qtcompat ../../qtcompat/xml ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils $(QPEDIR)/include | 10 | INCLUDEPATH += . ../../ ../../qtcompat ../../qtcompat/xml ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils $(QPEDIR)/include |
11 | DEFINES += PWM_EMBEDDED | 11 | DEFINES += PWM_EMBEDDED |
12 | #enable this setting if you want debugoutput for pwmanager | 12 | #enable this setting if you want debugoutput for pwmanager |
13 | #DEFINES += CONFIG_DEBUG | 13 | #DEFINES += CONFIG_DEBUG |
14 | 14 | ||
15 | LIBS += -lmicrokde | 15 | LIBS += -lmicrokde |
16 | LIBS += -lmicroqtcompat | 16 | LIBS += -lmicroqtcompat |
17 | LIBS += -lmicrokdepim | 17 | LIBS += -lmicrokdepim |
18 | LIBS += -L$(QPEDIR)/lib | 18 | LIBS += -L$(QPEDIR)/lib |
19 | LIBS += -lqpe | 19 | LIBS += -lqpe |
20 | LIBS += -lbz2 | 20 | LIBS += -lbz2 |
21 | LIBS += $(QTOPIALIB) | 21 | LIBS += $(QTOPIALIB) |
22 | 22 | ||
23 | #INTERFACES = \ | 23 | #INTERFACES = \ |
24 | #addentrywnd.ui \ | 24 | #addentrywnd.ui \ |
25 | #configwnd.ui \ | 25 | #configwnd.ui \ |
26 | #findwnd.ui \ | 26 | #findwnd.ui \ |
27 | #getmasterpwwnd.ui \ | 27 | #getmasterpwwnd.ui \ |
28 | #pwgenwnd.ui \ | 28 | #pwgenwnd.ui \ |
29 | #setmasterpwwnd.ui \ | 29 | #setmasterpwwnd.ui \ |
30 | #subtbledit.ui | 30 | #subtbledit.ui |
31 | 31 | ||
32 | #INTERFACES = \ | 32 | #INTERFACES = \ |
33 | #subtbledit.ui \ | 33 | #subtbledit.ui \ |
34 | 34 | ||
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp index 82fc746..4e8a603 100644 --- a/pwmanager/pwmanager/pwmdoc.cpp +++ b/pwmanager/pwmanager/pwmdoc.cpp | |||
@@ -14,48 +14,52 @@ | |||
14 | * This file is originaly based on version 2.0 of pwmanager | 14 | * This file is originaly based on version 2.0 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$ |
18 | **************************************************************************/ | 18 | **************************************************************************/ |
19 | 19 | ||
20 | #include "pwmdoc.h" | 20 | #include "pwmdoc.h" |
21 | #include "pwmview.h" | 21 | #include "pwmview.h" |
22 | #include "blowfish.h" | 22 | #include "blowfish.h" |
23 | #include "sha1.h" | 23 | #include "sha1.h" |
24 | #include "globalstuff.h" | 24 | #include "globalstuff.h" |
25 | #include "gpasmanfile.h" | 25 | #include "gpasmanfile.h" |
26 | #include "serializer.h" | 26 | #include "serializer.h" |
27 | #include "compressgzip.h" | 27 | #include "compressgzip.h" |
28 | #include "compressbzip2.h" | 28 | #include "compressbzip2.h" |
29 | #include "randomizer.h" | 29 | #include "randomizer.h" |
30 | #include "pwminit.h" | 30 | #include "pwminit.h" |
31 | #ifndef PWM_EMBEDDED | 31 | #ifndef PWM_EMBEDDED |
32 | //US #include "libgryptif.h" | 32 | //US #include "libgryptif.h" |
33 | #else | 33 | #else |
34 | #include "pwmprefs.h" | 34 | #include "pwmprefs.h" |
35 | #include "kglobal.h" | 35 | #include "kglobal.h" |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | #include <kmessagebox.h> | ||
39 | #include <libkcal/syncdefines.h> | ||
40 | |||
41 | |||
38 | #ifdef CONFIG_KWALLETIF | 42 | #ifdef CONFIG_KWALLETIF |
39 | # include "kwalletemu.h" | 43 | # include "kwalletemu.h" |
40 | #endif // CONFIG_KWALLETIF | 44 | #endif // CONFIG_KWALLETIF |
41 | 45 | ||
42 | #include <qdatetime.h> | 46 | #include <qdatetime.h> |
43 | #include <qsize.h> | 47 | #include <qsize.h> |
44 | #include <qfileinfo.h> | 48 | #include <qfileinfo.h> |
45 | #include <qfile.h> | 49 | #include <qfile.h> |
46 | 50 | ||
47 | #include <stdio.h> | 51 | #include <stdio.h> |
48 | #include <stdlib.h> | 52 | #include <stdlib.h> |
49 | #include <errno.h> | 53 | #include <errno.h> |
50 | #include <string.h> | 54 | #include <string.h> |
51 | //US#include <iostream> | 55 | //US#include <iostream> |
52 | #include <algorithm> | 56 | #include <algorithm> |
53 | #include <sys/types.h> | 57 | #include <sys/types.h> |
54 | #include <sys/stat.h> | 58 | #include <sys/stat.h> |
55 | #include <unistd.h> | 59 | #include <unistd.h> |
56 | #include <stdint.h> | 60 | #include <stdint.h> |
57 | 61 | ||
58 | //TODO: reset to its normal value. | 62 | //TODO: reset to its normal value. |
59 | #define META_CHECK_TIMER_INTERVAL10/*300*/ /* sek */ | 63 | #define META_CHECK_TIMER_INTERVAL10/*300*/ /* sek */ |
60 | 64 | ||
61 | using namespace std; | 65 | using namespace std; |
@@ -986,271 +990,271 @@ PwMerror PwMDoc::addEntry(const QString &category, PwMDataItem *d, | |||
986 | return e_maxAllowedEntr; | 990 | return e_maxAllowedEntr; |
987 | 991 | ||
988 | vector<unsigned int> foundPositions; | 992 | vector<unsigned int> foundPositions; |
989 | /* historically this was: | 993 | /* historically this was: |
990 | *const int searchIn = SEARCH_IN_DESC | SEARCH_IN_NAME | | 994 | *const int searchIn = SEARCH_IN_DESC | SEARCH_IN_NAME | |
991 | * SEARCH_IN_URL | SEARCH_IN_LAUNCHER; | 995 | * SEARCH_IN_URL | SEARCH_IN_LAUNCHER; |
992 | * But for now we only search in desc. | 996 | * But for now we only search in desc. |
993 | * That's a tweak to be KWallet compatible. But it should not add | 997 | * That's a tweak to be KWallet compatible. But it should not add |
994 | * usability-drop onto PwManager, does it? | 998 | * usability-drop onto PwManager, does it? |
995 | * (And yes, "int" was a bug. Correct is "unsigned int") | 999 | * (And yes, "int" was a bug. Correct is "unsigned int") |
996 | */ | 1000 | */ |
997 | const unsigned int searchIn = SEARCH_IN_DESC; | 1001 | const unsigned int searchIn = SEARCH_IN_DESC; |
998 | findEntry(cat, *d, searchIn, &foundPositions, true); | 1002 | findEntry(cat, *d, searchIn, &foundPositions, true); |
999 | if (foundPositions.size()) { | 1003 | if (foundPositions.size()) { |
1000 | // DOH! We found this entry. | 1004 | // DOH! We found this entry. |
1001 | return e_entryExists; | 1005 | return e_entryExists; |
1002 | } | 1006 | } |
1003 | 1007 | ||
1004 | d->listViewPos = -1; | 1008 | d->listViewPos = -1; |
1005 | d->lockStat = conf()->confGlobNewEntrLockStat(); | 1009 | d->lockStat = conf()->confGlobNewEntrLockStat(); |
1006 | if (updateMeta) { | 1010 | if (updateMeta) { |
1007 | d->meta.create = QDateTime::currentDateTime(); | 1011 | d->meta.create = QDateTime::currentDateTime(); |
1008 | d->meta.update = d->meta.create; | 1012 | d->meta.update = d->meta.create; |
1009 | } | 1013 | } |
1010 | dta[cat].d.push_back(*d); | 1014 | dti.dta[cat].d.push_back(*d); |
1011 | 1015 | ||
1012 | delAllEmptyCat(true); | 1016 | delAllEmptyCat(true); |
1013 | 1017 | ||
1014 | if (!dontFlagDirty) | 1018 | if (!dontFlagDirty) |
1015 | flagDirty(); | 1019 | flagDirty(); |
1016 | return e_success; | 1020 | return e_success; |
1017 | } | 1021 | } |
1018 | 1022 | ||
1019 | PwMerror PwMDoc::addCategory(const QString &category, unsigned int *categoryIndex, | 1023 | PwMerror PwMDoc::addCategory(const QString &category, unsigned int *categoryIndex, |
1020 | bool checkIfExist) | 1024 | bool checkIfExist) |
1021 | { | 1025 | { |
1022 | if (isDeepLocked()) { | 1026 | if (isDeepLocked()) { |
1023 | PwMerror ret; | 1027 | PwMerror ret; |
1024 | ret = deepLock(false); | 1028 | ret = deepLock(false); |
1025 | if (ret != e_success) | 1029 | if (ret != e_success) |
1026 | return e_lock; | 1030 | return e_lock; |
1027 | } | 1031 | } |
1028 | if (checkIfExist) { | 1032 | if (checkIfExist) { |
1029 | if (findCategory(category, categoryIndex)) | 1033 | if (findCategory(category, categoryIndex)) |
1030 | return e_categoryExists; | 1034 | return e_categoryExists; |
1031 | } | 1035 | } |
1032 | PwMCategoryItem item; | 1036 | PwMCategoryItem item; |
1033 | item.name = category.latin1(); | 1037 | item.name = category.latin1(); |
1034 | dta.push_back(item); | 1038 | dti.dta.push_back(item); |
1035 | if (categoryIndex) | 1039 | if (categoryIndex) |
1036 | *categoryIndex = dta.size() - 1; | 1040 | *categoryIndex = dti.dta.size() - 1; |
1037 | return e_success; | 1041 | return e_success; |
1038 | } | 1042 | } |
1039 | 1043 | ||
1040 | bool PwMDoc::delEntry(const QString &category, unsigned int index, bool dontFlagDirty) | 1044 | bool PwMDoc::delEntry(const QString &category, unsigned int index, bool dontFlagDirty) |
1041 | { | 1045 | { |
1042 | unsigned int cat = 0; | 1046 | unsigned int cat = 0; |
1043 | 1047 | ||
1044 | if (!findCategory(category, &cat)) { | 1048 | if (!findCategory(category, &cat)) { |
1045 | BUG(); | 1049 | BUG(); |
1046 | return false; | 1050 | return false; |
1047 | } | 1051 | } |
1048 | 1052 | ||
1049 | return delEntry(cat, index, dontFlagDirty); | 1053 | return delEntry(cat, index, dontFlagDirty); |
1050 | } | 1054 | } |
1051 | 1055 | ||
1052 | bool PwMDoc::delEntry(unsigned int category, unsigned int index, bool dontFlagDirty) | 1056 | bool PwMDoc::delEntry(unsigned int category, unsigned int index, bool dontFlagDirty) |
1053 | { | 1057 | { |
1054 | if (isDeepLocked()) | 1058 | if (isDeepLocked()) |
1055 | return false; | 1059 | return false; |
1056 | if (index > dta[category].d.size() - 1) | 1060 | if (index > dti.dta[category].d.size() - 1) |
1057 | return false; | 1061 | return false; |
1058 | getDataChangedLock(); | 1062 | getDataChangedLock(); |
1059 | if (!lockAt(category, index, false)) { | 1063 | if (!lockAt(category, index, false)) { |
1060 | putDataChangedLock(); | 1064 | putDataChangedLock(); |
1061 | return false; | 1065 | return false; |
1062 | } | 1066 | } |
1063 | putDataChangedLock(); | 1067 | putDataChangedLock(); |
1064 | int lvPos = dta[category].d[index].listViewPos; | 1068 | int lvPos = dti.dta[category].d[index].listViewPos; |
1065 | 1069 | ||
1066 | // delete entry | 1070 | // delete entry |
1067 | dta[category].d.erase(dta[category].d.begin() + index); | 1071 | dti.dta[category].d.erase(dti.dta[category].d.begin() + index); |
1068 | 1072 | ||
1069 | unsigned int i, entries = numEntries(category); | 1073 | unsigned int i, entries = numEntries(category); |
1070 | if (!entries) { | 1074 | if (!entries) { |
1071 | // no more entries in this category, so | 1075 | // no more entries in this category, so |
1072 | // we can delete it, too. | 1076 | // we can delete it, too. |
1073 | BUG_ON(!delCategory(category)); | 1077 | BUG_ON(!delCategory(category)); |
1074 | // delCategory() flags it dirty, so we need not to do so. | 1078 | // delCategory() flags it dirty, so we need not to do so. |
1075 | return true; | 1079 | return true; |
1076 | } | 1080 | } |
1077 | for (i = 0; i < entries; ++i) { | 1081 | for (i = 0; i < entries; ++i) { |
1078 | // decrement all listViewPositions that are greater than the deleted. | 1082 | // decrement all listViewPositions that are greater than the deleted. |
1079 | if (dta[category].d[i].listViewPos > lvPos) | 1083 | if (dti.dta[category].d[i].listViewPos > lvPos) |
1080 | --dta[category].d[i].listViewPos; | 1084 | --dti.dta[category].d[i].listViewPos; |
1081 | } | 1085 | } |
1082 | 1086 | ||
1083 | if (!dontFlagDirty) | 1087 | if (!dontFlagDirty) |
1084 | flagDirty(); | 1088 | flagDirty(); |
1085 | return true; | 1089 | return true; |
1086 | } | 1090 | } |
1087 | 1091 | ||
1088 | bool PwMDoc::editEntry(const QString &oldCategory, const QString &newCategory, | 1092 | bool PwMDoc::editEntry(const QString &oldCategory, const QString &newCategory, |
1089 | unsigned int index, PwMDataItem *d, bool updateMeta) | 1093 | unsigned int index, PwMDataItem *d, bool updateMeta) |
1090 | { | 1094 | { |
1091 | PWM_ASSERT(d); | 1095 | PWM_ASSERT(d); |
1092 | unsigned int oldCat = 0; | 1096 | unsigned int oldCat = 0; |
1093 | 1097 | ||
1094 | if (!findCategory(oldCategory, &oldCat)) { | 1098 | if (!findCategory(oldCategory, &oldCat)) { |
1095 | BUG(); | 1099 | BUG(); |
1096 | return false; | 1100 | return false; |
1097 | } | 1101 | } |
1098 | 1102 | ||
1099 | return editEntry(oldCat, newCategory, index, d, updateMeta); | 1103 | return editEntry(oldCat, newCategory, index, d, updateMeta); |
1100 | } | 1104 | } |
1101 | 1105 | ||
1102 | bool PwMDoc::editEntry(unsigned int oldCategory, const QString &newCategory, | 1106 | bool PwMDoc::editEntry(unsigned int oldCategory, const QString &newCategory, |
1103 | unsigned int index, PwMDataItem *d, bool updateMeta) | 1107 | unsigned int index, PwMDataItem *d, bool updateMeta) |
1104 | { | 1108 | { |
1105 | if (isDeepLocked()) | 1109 | if (isDeepLocked()) |
1106 | return false; | 1110 | return false; |
1107 | if (updateMeta) { | 1111 | if (updateMeta) { |
1108 | d->meta.update = QDateTime::currentDateTime(); | 1112 | d->meta.update = QDateTime::currentDateTime(); |
1109 | if (d->meta.create.isNull()) { | 1113 | if (d->meta.create.isNull()) { |
1110 | d->meta.create = d->meta.update; | 1114 | d->meta.create = d->meta.update; |
1111 | } | 1115 | } |
1112 | } | 1116 | } |
1113 | if (dta[oldCategory].name != newCategory.latin1()) { | 1117 | if (dti.dta[oldCategory].name != newCategory.latin1()) { |
1114 | // the user changed the category. | 1118 | // the user changed the category. |
1115 | PwMerror ret; | 1119 | PwMerror ret; |
1116 | d->rev = 0; | 1120 | d->rev = 0; |
1117 | ret = addEntry(newCategory, d, true, false); | 1121 | ret = addEntry(newCategory, d, true, false); |
1118 | if (ret != e_success) | 1122 | if (ret != e_success) |
1119 | return false; | 1123 | return false; |
1120 | if (!delEntry(oldCategory, index, true)) | 1124 | if (!delEntry(oldCategory, index, true)) |
1121 | return false; | 1125 | return false; |
1122 | } else { | 1126 | } else { |
1123 | d->rev = dta[oldCategory].d[index].rev + 1; // increment revision counter. | 1127 | d->rev = dti.dta[oldCategory].d[index].rev + 1; // increment revision counter. |
1124 | dta[oldCategory].d[index] = *d; | 1128 | dti.dta[oldCategory].d[index] = *d; |
1125 | } | 1129 | } |
1126 | flagDirty(); | 1130 | flagDirty(); |
1127 | return true; | 1131 | return true; |
1128 | } | 1132 | } |
1129 | 1133 | ||
1130 | unsigned int PwMDoc::numEntries(const QString &category) | 1134 | unsigned int PwMDoc::numEntries(const QString &category) |
1131 | { | 1135 | { |
1132 | unsigned int cat = 0; | 1136 | unsigned int cat = 0; |
1133 | 1137 | ||
1134 | if (!findCategory(category, &cat)) { | 1138 | if (!findCategory(category, &cat)) { |
1135 | BUG(); | 1139 | BUG(); |
1136 | return 0; | 1140 | return 0; |
1137 | } | 1141 | } |
1138 | 1142 | ||
1139 | return numEntries(cat); | 1143 | return numEntries(cat); |
1140 | } | 1144 | } |
1141 | 1145 | ||
1142 | bool PwMDoc::serializeDta(string *d) | 1146 | bool PwMDoc::serializeDta(string *d) |
1143 | { | 1147 | { |
1144 | PWM_ASSERT(d); | 1148 | PWM_ASSERT(d); |
1145 | Serializer ser; | 1149 | Serializer ser; |
1146 | if (!ser.serialize(dta)) | 1150 | if (!ser.serialize(dti)) |
1147 | return false; | 1151 | return false; |
1148 | d->assign(ser.getXml()); | 1152 | d->assign(ser.getXml()); |
1149 | if (!d->size()) | 1153 | if (!d->size()) |
1150 | return false; | 1154 | return false; |
1151 | return true; | 1155 | return true; |
1152 | } | 1156 | } |
1153 | 1157 | ||
1154 | bool PwMDoc::deSerializeDta(const string *d, bool entriesLocked) | 1158 | bool PwMDoc::deSerializeDta(const string *d, bool entriesLocked) |
1155 | { | 1159 | { |
1156 | PWM_ASSERT(d); | 1160 | PWM_ASSERT(d); |
1157 | #ifndef PWM_EMBEDDED | 1161 | #ifndef PWM_EMBEDDED |
1158 | try { | 1162 | try { |
1159 | 1163 | ||
1160 | Serializer ser(d->c_str()); | 1164 | Serializer ser(d->c_str()); |
1161 | ser.setDefaultLockStat(entriesLocked); | 1165 | ser.setDefaultLockStat(entriesLocked); |
1162 | if (!ser.deSerialize(&dta)) | 1166 | if (!ser.deSerialize(&dti)) |
1163 | return false; | 1167 | return false; |
1164 | } catch (PwMException) { | 1168 | } catch (PwMException) { |
1165 | return false; | 1169 | return false; |
1166 | } | 1170 | } |
1167 | #else | 1171 | #else |
1168 | Serializer ser(d->c_str()); | 1172 | Serializer ser(d->c_str()); |
1169 | ser.setDefaultLockStat(entriesLocked); | 1173 | ser.setDefaultLockStat(entriesLocked); |
1170 | if (!ser.deSerialize(&dta)) | 1174 | if (!ser.deSerialize(&dti)) |
1171 | return false; | 1175 | return false; |
1172 | #endif | 1176 | #endif |
1173 | 1177 | ||
1174 | emitDataChanged(this); | 1178 | emitDataChanged(this); |
1175 | return true; | 1179 | return true; |
1176 | } | 1180 | } |
1177 | 1181 | ||
1178 | bool PwMDoc::getEntry(const QString &category, unsigned int index, | 1182 | bool PwMDoc::getEntry(const QString &category, unsigned int index, |
1179 | PwMDataItem * d, bool unlockIfLocked) | 1183 | PwMDataItem * d, bool unlockIfLocked) |
1180 | { | 1184 | { |
1181 | PWM_ASSERT(d); | 1185 | PWM_ASSERT(d); |
1182 | unsigned int cat = 0; | 1186 | unsigned int cat = 0; |
1183 | 1187 | ||
1184 | if (!findCategory(category, &cat)) { | 1188 | if (!findCategory(category, &cat)) { |
1185 | BUG(); | 1189 | BUG(); |
1186 | return false; | 1190 | return false; |
1187 | } | 1191 | } |
1188 | 1192 | ||
1189 | return getEntry(cat, index, d, unlockIfLocked); | 1193 | return getEntry(cat, index, d, unlockIfLocked); |
1190 | } | 1194 | } |
1191 | 1195 | ||
1192 | bool PwMDoc::getEntry(unsigned int category, unsigned int index, | 1196 | bool PwMDoc::getEntry(unsigned int category, unsigned int index, |
1193 | PwMDataItem *d, bool unlockIfLocked) | 1197 | PwMDataItem *d, bool unlockIfLocked) |
1194 | { | 1198 | { |
1195 | if (index > dta[category].d.size() - 1) | 1199 | if (index > dti.dta[category].d.size() - 1) |
1196 | return false; | 1200 | return false; |
1197 | 1201 | ||
1198 | bool locked = isLocked(category, index); | 1202 | bool locked = isLocked(category, index); |
1199 | if (locked) { | 1203 | if (locked) { |
1200 | /* this entry is locked. We don't return a password, | 1204 | /* this entry is locked. We don't return a password, |
1201 | * until it's unlocked by the user by inserting | 1205 | * until it's unlocked by the user by inserting |
1202 | * chipcard or entering the mpw | 1206 | * chipcard or entering the mpw |
1203 | */ | 1207 | */ |
1204 | if (unlockIfLocked) { | 1208 | if (unlockIfLocked) { |
1205 | if (!lockAt(category, index, false)) { | 1209 | if (!lockAt(category, index, false)) { |
1206 | return false; | 1210 | return false; |
1207 | } | 1211 | } |
1208 | locked = false; | 1212 | locked = false; |
1209 | } | 1213 | } |
1210 | } | 1214 | } |
1211 | 1215 | ||
1212 | *d = dta[category].d[index]; | 1216 | *d = dti.dta[category].d[index]; |
1213 | if (locked) | 1217 | if (locked) |
1214 | d->pw = LOCKED_STRING.latin1(); | 1218 | d->pw = LOCKED_STRING.latin1(); |
1215 | 1219 | ||
1216 | return true; | 1220 | return true; |
1217 | } | 1221 | } |
1218 | 1222 | ||
1219 | PwMerror PwMDoc::getCommentByLvp(const QString &category, int listViewPos, | 1223 | PwMerror PwMDoc::getCommentByLvp(const QString &category, int listViewPos, |
1220 | string *foundComment) | 1224 | string *foundComment) |
1221 | { | 1225 | { |
1222 | PWM_ASSERT(foundComment); | 1226 | PWM_ASSERT(foundComment); |
1223 | unsigned int cat = 0; | 1227 | unsigned int cat = 0; |
1224 | 1228 | ||
1225 | if (!findCategory(category, &cat)) | 1229 | if (!findCategory(category, &cat)) |
1226 | return e_invalidArg; | 1230 | return e_invalidArg; |
1227 | 1231 | ||
1228 | unsigned int i, entries = numEntries(cat); | 1232 | unsigned int i, entries = numEntries(cat); |
1229 | for (i = 0; i < entries; ++i) { | 1233 | for (i = 0; i < entries; ++i) { |
1230 | if (dta[cat].d[i].listViewPos == listViewPos) { | 1234 | if (dti.dta[cat].d[i].listViewPos == listViewPos) { |
1231 | *foundComment = dta[cat].d[i].comment; | 1235 | *foundComment = dti.dta[cat].d[i].comment; |
1232 | if (dta[cat].d[i].binary) | 1236 | if (dti.dta[cat].d[i].binary) |
1233 | return e_binEntry; | 1237 | return e_binEntry; |
1234 | return e_normalEntry; | 1238 | return e_normalEntry; |
1235 | } | 1239 | } |
1236 | } | 1240 | } |
1237 | BUG(); | 1241 | BUG(); |
1238 | return e_generic; | 1242 | return e_generic; |
1239 | } | 1243 | } |
1240 | 1244 | ||
1241 | bool PwMDoc::compressDta(string *d, char algo) | 1245 | bool PwMDoc::compressDta(string *d, char algo) |
1242 | { | 1246 | { |
1243 | PWM_ASSERT(d); | 1247 | PWM_ASSERT(d); |
1244 | switch (algo) { | 1248 | switch (algo) { |
1245 | case PWM_COMPRESS_GZIP: { | 1249 | case PWM_COMPRESS_GZIP: { |
1246 | CompressGzip comp; | 1250 | CompressGzip comp; |
1247 | return comp.compress(d); | 1251 | return comp.compress(d); |
1248 | } case PWM_COMPRESS_BZIP2: { | 1252 | } case PWM_COMPRESS_BZIP2: { |
1249 | CompressBzip2 comp; | 1253 | CompressBzip2 comp; |
1250 | return comp.compress(d); | 1254 | return comp.compress(d); |
1251 | } case PWM_COMPRESS_NONE: { | 1255 | } case PWM_COMPRESS_NONE: { |
1252 | return true; | 1256 | return true; |
1253 | } default: { | 1257 | } default: { |
1254 | BUG(); | 1258 | BUG(); |
1255 | } | 1259 | } |
1256 | } | 1260 | } |
@@ -1469,74 +1473,74 @@ PwMerror PwMDoc::checkDataHash(char dataHashType, const string *dataHash, | |||
1469 | dataHashType); | 1473 | dataHashType); |
1470 | if (err != e_success) | 1474 | if (err != e_success) |
1471 | return e_hashNotImpl; | 1475 | return e_hashNotImpl; |
1472 | string calcHash(reinterpret_cast<const char *>(buf), | 1476 | string calcHash(reinterpret_cast<const char *>(buf), |
1473 | static_cast<string::size_type>(hashLen)); | 1477 | static_cast<string::size_type>(hashLen)); |
1474 | delete [] buf; | 1478 | delete [] buf; |
1475 | if (calcHash != *dataHash) | 1479 | if (calcHash != *dataHash) |
1476 | return e_fileCorrupt; | 1480 | return e_fileCorrupt; |
1477 | break; | 1481 | break; |
1478 | } | 1482 | } |
1479 | #endif | 1483 | #endif |
1480 | default: | 1484 | default: |
1481 | return e_hashNotImpl; | 1485 | return e_hashNotImpl; |
1482 | } | 1486 | } |
1483 | return e_success; | 1487 | return e_success; |
1484 | } | 1488 | } |
1485 | 1489 | ||
1486 | bool PwMDoc::lockAt(unsigned int category, unsigned int index, | 1490 | bool PwMDoc::lockAt(unsigned int category, unsigned int index, |
1487 | bool lock) | 1491 | bool lock) |
1488 | { | 1492 | { |
1489 | if (index >= numEntries(category)) { | 1493 | if (index >= numEntries(category)) { |
1490 | BUG(); | 1494 | BUG(); |
1491 | return false; | 1495 | return false; |
1492 | } | 1496 | } |
1493 | if (lock == dta[category].d[index].lockStat) | 1497 | if (lock == dti.dta[category].d[index].lockStat) |
1494 | return true; | 1498 | return true; |
1495 | 1499 | ||
1496 | if (!lock && currentPw != "") { | 1500 | if (!lock && currentPw != "") { |
1497 | // "unlocking" and "password is already set" | 1501 | // "unlocking" and "password is already set" |
1498 | if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) { | 1502 | if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) { |
1499 | // unlocking without pw not allowed | 1503 | // unlocking without pw not allowed |
1500 | QString pw; | 1504 | QString pw; |
1501 | pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); | 1505 | pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); |
1502 | if (pw != "") { | 1506 | if (pw != "") { |
1503 | if (pw != currentPw) { | 1507 | if (pw != currentPw) { |
1504 | wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); | 1508 | wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); |
1505 | return false; | 1509 | return false; |
1506 | } else { | 1510 | } else { |
1507 | timer()->start(DocTimer::id_mpwTimer); | 1511 | timer()->start(DocTimer::id_mpwTimer); |
1508 | } | 1512 | } |
1509 | } else { | 1513 | } else { |
1510 | return false; | 1514 | return false; |
1511 | } | 1515 | } |
1512 | } else { | 1516 | } else { |
1513 | timer()->start(DocTimer::id_mpwTimer); | 1517 | timer()->start(DocTimer::id_mpwTimer); |
1514 | } | 1518 | } |
1515 | } | 1519 | } |
1516 | 1520 | ||
1517 | dta[category].d[index].lockStat = lock; | 1521 | dti.dta[category].d[index].lockStat = lock; |
1518 | dta[category].d[index].rev++; // increment revision counter. | 1522 | dti.dta[category].d[index].rev++; // increment revision counter. |
1519 | 1523 | ||
1520 | emitDataChanged(this); | 1524 | emitDataChanged(this); |
1521 | if (!lock) | 1525 | if (!lock) |
1522 | timer()->start(DocTimer::id_autoLockTimer); | 1526 | timer()->start(DocTimer::id_autoLockTimer); |
1523 | 1527 | ||
1524 | return true; | 1528 | return true; |
1525 | 1529 | ||
1526 | } | 1530 | } |
1527 | 1531 | ||
1528 | bool PwMDoc::lockAt(const QString &category,unsigned int index, | 1532 | bool PwMDoc::lockAt(const QString &category,unsigned int index, |
1529 | bool lock) | 1533 | bool lock) |
1530 | { | 1534 | { |
1531 | unsigned int cat = 0; | 1535 | unsigned int cat = 0; |
1532 | 1536 | ||
1533 | if (!findCategory(category, &cat)) { | 1537 | if (!findCategory(category, &cat)) { |
1534 | BUG(); | 1538 | BUG(); |
1535 | return false; | 1539 | return false; |
1536 | } | 1540 | } |
1537 | 1541 | ||
1538 | return lockAt(cat, index, lock); | 1542 | return lockAt(cat, index, lock); |
1539 | } | 1543 | } |
1540 | 1544 | ||
1541 | bool PwMDoc::lockAll(bool lock) | 1545 | bool PwMDoc::lockAll(bool lock) |
1542 | { | 1546 | { |
@@ -1550,50 +1554,50 @@ bool PwMDoc::lockAll(bool lock) | |||
1550 | if (isDocEmpty()) { | 1554 | if (isDocEmpty()) { |
1551 | return true; | 1555 | return true; |
1552 | } | 1556 | } |
1553 | if (!lock && currentPw != "") { | 1557 | if (!lock && currentPw != "") { |
1554 | // unlocking and password is already set | 1558 | // unlocking and password is already set |
1555 | if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) { | 1559 | if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) { |
1556 | // unlocking without pw not allowed | 1560 | // unlocking without pw not allowed |
1557 | QString pw; | 1561 | QString pw; |
1558 | pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); | 1562 | pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); |
1559 | if (pw != "") { | 1563 | if (pw != "") { |
1560 | if (pw != currentPw) { | 1564 | if (pw != currentPw) { |
1561 | wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); | 1565 | wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); |
1562 | return false; | 1566 | return false; |
1563 | } else { | 1567 | } else { |
1564 | timer()->start(DocTimer::id_mpwTimer); | 1568 | timer()->start(DocTimer::id_mpwTimer); |
1565 | } | 1569 | } |
1566 | } else { | 1570 | } else { |
1567 | return false; | 1571 | return false; |
1568 | } | 1572 | } |
1569 | } else { | 1573 | } else { |
1570 | timer()->start(DocTimer::id_mpwTimer); | 1574 | timer()->start(DocTimer::id_mpwTimer); |
1571 | } | 1575 | } |
1572 | } | 1576 | } |
1573 | 1577 | ||
1574 | vector<PwMCategoryItem>::iterator catBegin = dta.begin(), | 1578 | vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), |
1575 | catEnd = dta.end(), | 1579 | catEnd = dti.dta.end(), |
1576 | catI = catBegin; | 1580 | catI = catBegin; |
1577 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; | 1581 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; |
1578 | while (catI != catEnd) { | 1582 | while (catI != catEnd) { |
1579 | entrBegin = catI->d.begin(); | 1583 | entrBegin = catI->d.begin(); |
1580 | entrEnd = catI->d.end(); | 1584 | entrEnd = catI->d.end(); |
1581 | entrI = entrBegin; | 1585 | entrI = entrBegin; |
1582 | while (entrI != entrEnd) { | 1586 | while (entrI != entrEnd) { |
1583 | entrI->lockStat = lock; | 1587 | entrI->lockStat = lock; |
1584 | entrI->rev++; // increment revision counter. | 1588 | entrI->rev++; // increment revision counter. |
1585 | ++entrI; | 1589 | ++entrI; |
1586 | } | 1590 | } |
1587 | ++catI; | 1591 | ++catI; |
1588 | } | 1592 | } |
1589 | 1593 | ||
1590 | emitDataChanged(this); | 1594 | emitDataChanged(this); |
1591 | if (lock) | 1595 | if (lock) |
1592 | timer()->stop(DocTimer::id_autoLockTimer); | 1596 | timer()->stop(DocTimer::id_autoLockTimer); |
1593 | else | 1597 | else |
1594 | timer()->start(DocTimer::id_autoLockTimer); | 1598 | timer()->start(DocTimer::id_autoLockTimer); |
1595 | 1599 | ||
1596 | return true; | 1600 | return true; |
1597 | } | 1601 | } |
1598 | 1602 | ||
1599 | bool PwMDoc::isLocked(const QString &category, unsigned int index) | 1603 | bool PwMDoc::isLocked(const QString &category, unsigned int index) |
@@ -1624,50 +1628,50 @@ bool PwMDoc::unlockAll_tempoary(bool revert) | |||
1624 | if (ret == e_success) { | 1628 | if (ret == e_success) { |
1625 | /* deep-lock succeed. We are save. | 1629 | /* deep-lock succeed. We are save. |
1626 | * (but if it failed, just go on | 1630 | * (but if it failed, just go on |
1627 | * lock them normally) | 1631 | * lock them normally) |
1628 | */ | 1632 | */ |
1629 | delete_and_null(oldLockStates); | 1633 | delete_and_null(oldLockStates); |
1630 | timer()->start(DocTimer::id_autoLockTimer); | 1634 | timer()->start(DocTimer::id_autoLockTimer); |
1631 | printDebug("tempoary unlocking of dta " | 1635 | printDebug("tempoary unlocking of dta " |
1632 | "reverted by deep-locking."); | 1636 | "reverted by deep-locking."); |
1633 | return true; | 1637 | return true; |
1634 | } | 1638 | } |
1635 | printDebug("deep-lock failed while reverting! " | 1639 | printDebug("deep-lock failed while reverting! " |
1636 | "Falling back to normal-lock."); | 1640 | "Falling back to normal-lock."); |
1637 | } | 1641 | } |
1638 | if (unlikely(!wasDeepLocked && | 1642 | if (unlikely(!wasDeepLocked && |
1639 | numCategories() != oldLockStates->size())) { | 1643 | numCategories() != oldLockStates->size())) { |
1640 | /* DOH! We have modified "dta" while | 1644 | /* DOH! We have modified "dta" while |
1641 | * it was unlocked tempoary. DON'T DO THIS! | 1645 | * it was unlocked tempoary. DON'T DO THIS! |
1642 | */ | 1646 | */ |
1643 | BUG(); | 1647 | BUG(); |
1644 | delete_and_null(oldLockStates); | 1648 | delete_and_null(oldLockStates); |
1645 | timer()->start(DocTimer::id_autoLockTimer); | 1649 | timer()->start(DocTimer::id_autoLockTimer); |
1646 | return false; | 1650 | return false; |
1647 | } | 1651 | } |
1648 | vector<PwMCategoryItem>::iterator catBegin = dta.begin(), | 1652 | vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), |
1649 | catEnd = dta.end(), | 1653 | catEnd = dti.dta.end(), |
1650 | catI = catBegin; | 1654 | catI = catBegin; |
1651 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; | 1655 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; |
1652 | vector< vector<bool> >::iterator oldCatStatI = oldLockStates->begin(); | 1656 | vector< vector<bool> >::iterator oldCatStatI = oldLockStates->begin(); |
1653 | vector<bool>::iterator oldEntrStatBegin, | 1657 | vector<bool>::iterator oldEntrStatBegin, |
1654 | oldEntrStatEnd, | 1658 | oldEntrStatEnd, |
1655 | oldEntrStatI; | 1659 | oldEntrStatI; |
1656 | while (catI != catEnd) { | 1660 | while (catI != catEnd) { |
1657 | entrBegin = catI->d.begin(); | 1661 | entrBegin = catI->d.begin(); |
1658 | entrEnd = catI->d.end(); | 1662 | entrEnd = catI->d.end(); |
1659 | entrI = entrBegin; | 1663 | entrI = entrBegin; |
1660 | if (likely(!wasDeepLocked)) { | 1664 | if (likely(!wasDeepLocked)) { |
1661 | oldEntrStatBegin = oldCatStatI->begin(); | 1665 | oldEntrStatBegin = oldCatStatI->begin(); |
1662 | oldEntrStatEnd = oldCatStatI->end(); | 1666 | oldEntrStatEnd = oldCatStatI->end(); |
1663 | oldEntrStatI = oldEntrStatBegin; | 1667 | oldEntrStatI = oldEntrStatBegin; |
1664 | if (unlikely(catI->d.size() != oldCatStatI->size())) { | 1668 | if (unlikely(catI->d.size() != oldCatStatI->size())) { |
1665 | /* DOH! We have modified "dta" while | 1669 | /* DOH! We have modified "dta" while |
1666 | * it was unlocked tempoary. DON'T DO THIS! | 1670 | * it was unlocked tempoary. DON'T DO THIS! |
1667 | */ | 1671 | */ |
1668 | BUG(); | 1672 | BUG(); |
1669 | delete_and_null(oldLockStates); | 1673 | delete_and_null(oldLockStates); |
1670 | timer()->start(DocTimer::id_autoLockTimer); | 1674 | timer()->start(DocTimer::id_autoLockTimer); |
1671 | return false; | 1675 | return false; |
1672 | } | 1676 | } |
1673 | } | 1677 | } |
@@ -1708,96 +1712,96 @@ bool PwMDoc::unlockAll_tempoary(bool revert) | |||
1708 | */ | 1712 | */ |
1709 | BUG(); | 1713 | BUG(); |
1710 | return false; | 1714 | return false; |
1711 | } | 1715 | } |
1712 | wasDeepLocked = false; | 1716 | wasDeepLocked = false; |
1713 | bool mustUnlock = false; | 1717 | bool mustUnlock = false; |
1714 | if (isDeepLocked()) { | 1718 | if (isDeepLocked()) { |
1715 | PwMerror ret; | 1719 | PwMerror ret; |
1716 | while (1) { | 1720 | while (1) { |
1717 | ret = deepLock(false); | 1721 | ret = deepLock(false); |
1718 | if (ret == e_success) { | 1722 | if (ret == e_success) { |
1719 | break; | 1723 | break; |
1720 | } else if (ret == e_wrongPw) { | 1724 | } else if (ret == e_wrongPw) { |
1721 | wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); | 1725 | wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); |
1722 | } else { | 1726 | } else { |
1723 | printDebug("deep-unlocking failed while " | 1727 | printDebug("deep-unlocking failed while " |
1724 | "tempoary unlocking!"); | 1728 | "tempoary unlocking!"); |
1725 | return false; | 1729 | return false; |
1726 | } | 1730 | } |
1727 | } | 1731 | } |
1728 | wasDeepLocked = true; | 1732 | wasDeepLocked = true; |
1729 | mustUnlock = true; | 1733 | mustUnlock = true; |
1730 | } else { | 1734 | } else { |
1731 | // first check if it's needed to unlock some entries | 1735 | // first check if it's needed to unlock some entries |
1732 | vector<PwMCategoryItem>::iterator catBegin = dta.begin(), | 1736 | vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), |
1733 | catEnd = dta.end(), | 1737 | catEnd = dti.dta.end(), |
1734 | catI = catBegin; | 1738 | catI = catBegin; |
1735 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; | 1739 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; |
1736 | while (catI != catEnd) { | 1740 | while (catI != catEnd) { |
1737 | entrBegin = catI->d.begin(); | 1741 | entrBegin = catI->d.begin(); |
1738 | entrEnd = catI->d.end(); | 1742 | entrEnd = catI->d.end(); |
1739 | entrI = entrBegin; | 1743 | entrI = entrBegin; |
1740 | while (entrI != entrEnd) { | 1744 | while (entrI != entrEnd) { |
1741 | if (entrI->lockStat == true) { | 1745 | if (entrI->lockStat == true) { |
1742 | mustUnlock = true; | 1746 | mustUnlock = true; |
1743 | break; | 1747 | break; |
1744 | } | 1748 | } |
1745 | ++entrI; | 1749 | ++entrI; |
1746 | } | 1750 | } |
1747 | if (mustUnlock) | 1751 | if (mustUnlock) |
1748 | break; | 1752 | break; |
1749 | ++catI; | 1753 | ++catI; |
1750 | } | 1754 | } |
1751 | } | 1755 | } |
1752 | if (!mustUnlock) { | 1756 | if (!mustUnlock) { |
1753 | // nothing to do. | 1757 | // nothing to do. |
1754 | timer()->stop(DocTimer::id_autoLockTimer); | 1758 | timer()->stop(DocTimer::id_autoLockTimer); |
1755 | printDebug("unlockAll_tempoary(): nothing to do."); | 1759 | printDebug("unlockAll_tempoary(): nothing to do."); |
1756 | return true; | 1760 | return true; |
1757 | } else if (!wasDeepLocked) { | 1761 | } else if (!wasDeepLocked) { |
1758 | if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW) && | 1762 | if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW) && |
1759 | currentPw != "") { | 1763 | currentPw != "") { |
1760 | /* we can't unlock without mpw, so | 1764 | /* we can't unlock without mpw, so |
1761 | * we need to ask for it. | 1765 | * we need to ask for it. |
1762 | */ | 1766 | */ |
1763 | QString pw; | 1767 | QString pw; |
1764 | while (1) { | 1768 | while (1) { |
1765 | pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); | 1769 | pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); |
1766 | if (pw == "") { | 1770 | if (pw == "") { |
1767 | return false; | 1771 | return false; |
1768 | } else if (pw == currentPw) { | 1772 | } else if (pw == currentPw) { |
1769 | break; | 1773 | break; |
1770 | } | 1774 | } |
1771 | wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); | 1775 | wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); |
1772 | } | 1776 | } |
1773 | } | 1777 | } |
1774 | } | 1778 | } |
1775 | timer()->stop(DocTimer::id_autoLockTimer); | 1779 | timer()->stop(DocTimer::id_autoLockTimer); |
1776 | oldLockStates = new vector< vector<bool> >; | 1780 | oldLockStates = new vector< vector<bool> >; |
1777 | vector<bool> tmp_vec; | 1781 | vector<bool> tmp_vec; |
1778 | vector<PwMCategoryItem>::iterator catBegin = dta.begin(), | 1782 | vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), |
1779 | catEnd = dta.end(), | 1783 | catEnd = dti.dta.end(), |
1780 | catI = catBegin; | 1784 | catI = catBegin; |
1781 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; | 1785 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; |
1782 | while (catI != catEnd) { | 1786 | while (catI != catEnd) { |
1783 | entrBegin = catI->d.begin(); | 1787 | entrBegin = catI->d.begin(); |
1784 | entrEnd = catI->d.end(); | 1788 | entrEnd = catI->d.end(); |
1785 | entrI = entrBegin; | 1789 | entrI = entrBegin; |
1786 | while (entrI != entrEnd) { | 1790 | while (entrI != entrEnd) { |
1787 | if (!wasDeepLocked) { | 1791 | if (!wasDeepLocked) { |
1788 | tmp_vec.push_back(entrI->lockStat); | 1792 | tmp_vec.push_back(entrI->lockStat); |
1789 | } | 1793 | } |
1790 | entrI->lockStat = false; | 1794 | entrI->lockStat = false; |
1791 | ++entrI; | 1795 | ++entrI; |
1792 | } | 1796 | } |
1793 | if (!wasDeepLocked) { | 1797 | if (!wasDeepLocked) { |
1794 | oldLockStates->push_back(tmp_vec); | 1798 | oldLockStates->push_back(tmp_vec); |
1795 | tmp_vec.clear(); | 1799 | tmp_vec.clear(); |
1796 | } | 1800 | } |
1797 | ++catI; | 1801 | ++catI; |
1798 | } | 1802 | } |
1799 | printDebug("tempoary unlocked dta."); | 1803 | printDebug("tempoary unlocked dta."); |
1800 | } | 1804 | } |
1801 | 1805 | ||
1802 | return true; | 1806 | return true; |
1803 | } | 1807 | } |
@@ -1839,448 +1843,448 @@ PwMerror PwMDoc::deepLock(bool lock, bool saveToFile) | |||
1839 | ret = openDoc(&filename, (conf()->confGlobUnlockOnOpen()) | 1843 | ret = openDoc(&filename, (conf()->confGlobUnlockOnOpen()) |
1840 | ? 0 : 1); | 1844 | ? 0 : 1); |
1841 | if (ret == e_wrongPw) { | 1845 | if (ret == e_wrongPw) { |
1842 | return e_wrongPw; | 1846 | return e_wrongPw; |
1843 | } else if (ret != e_success) { | 1847 | } else if (ret != e_success) { |
1844 | printDebug(string("PwMDoc::deepLock(false): ERR! openDoc() == ") | 1848 | printDebug(string("PwMDoc::deepLock(false): ERR! openDoc() == ") |
1845 | + tostr(static_cast<int>(ret))); | 1849 | + tostr(static_cast<int>(ret))); |
1846 | return e_lock; | 1850 | return e_lock; |
1847 | } | 1851 | } |
1848 | unsetDocStatFlag(DOC_STAT_DEEPLOCKED); | 1852 | unsetDocStatFlag(DOC_STAT_DEEPLOCKED); |
1849 | timer()->start(DocTimer::id_autoLockTimer); | 1853 | timer()->start(DocTimer::id_autoLockTimer); |
1850 | } | 1854 | } |
1851 | 1855 | ||
1852 | emitDataChanged(this); | 1856 | emitDataChanged(this); |
1853 | return e_success; | 1857 | return e_success; |
1854 | } | 1858 | } |
1855 | 1859 | ||
1856 | void PwMDoc::_deepUnlock() | 1860 | void PwMDoc::_deepUnlock() |
1857 | { | 1861 | { |
1858 | deepLock(false); | 1862 | deepLock(false); |
1859 | } | 1863 | } |
1860 | 1864 | ||
1861 | void PwMDoc::clearDoc() | 1865 | void PwMDoc::clearDoc() |
1862 | { | 1866 | { |
1863 | dta.clear(); | 1867 | dti.clear(); |
1864 | PwMCategoryItem d; | 1868 | PwMCategoryItem d; |
1865 | d.name = DEFAULT_CATEGORY.latin1(); | 1869 | d.name = DEFAULT_CATEGORY.latin1(); |
1866 | dta.push_back(d); | 1870 | dti.dta.push_back(d); |
1867 | currentPw = ""; | 1871 | currentPw = ""; |
1868 | unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); | 1872 | unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); |
1869 | } | 1873 | } |
1870 | 1874 | ||
1871 | void PwMDoc::changeCurrentPw() | 1875 | void PwMDoc::changeCurrentPw() |
1872 | { | 1876 | { |
1873 | if (currentPw == "") | 1877 | if (currentPw == "") |
1874 | return; // doc hasn't been saved. No mpw available. | 1878 | return; // doc hasn't been saved. No mpw available. |
1875 | bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD); | 1879 | bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD); |
1876 | QString pw = requestMpwChange(¤tPw, &useChipcard); | 1880 | QString pw = requestMpwChange(¤tPw, &useChipcard); |
1877 | if (pw == "") | 1881 | if (pw == "") |
1878 | return; | 1882 | return; |
1879 | if (useChipcard) | 1883 | if (useChipcard) |
1880 | setDocStatFlag(DOC_STAT_USE_CHIPCARD); | 1884 | setDocStatFlag(DOC_STAT_USE_CHIPCARD); |
1881 | else | 1885 | else |
1882 | unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); | 1886 | unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); |
1883 | setCurrentPw(pw); | 1887 | setCurrentPw(pw); |
1884 | } | 1888 | } |
1885 | 1889 | ||
1886 | void PwMDoc::setListViewPos(const QString &category, unsigned int index, | 1890 | void PwMDoc::setListViewPos(const QString &category, unsigned int index, |
1887 | int pos) | 1891 | int pos) |
1888 | { | 1892 | { |
1889 | unsigned int cat = 0; | 1893 | unsigned int cat = 0; |
1890 | 1894 | ||
1891 | if (!findCategory(category, &cat)) { | 1895 | if (!findCategory(category, &cat)) { |
1892 | BUG(); | 1896 | BUG(); |
1893 | return; | 1897 | return; |
1894 | } | 1898 | } |
1895 | setListViewPos(cat, index, pos); | 1899 | setListViewPos(cat, index, pos); |
1896 | } | 1900 | } |
1897 | 1901 | ||
1898 | void PwMDoc::setListViewPos(unsigned int category, unsigned int index, | 1902 | void PwMDoc::setListViewPos(unsigned int category, unsigned int index, |
1899 | int pos) | 1903 | int pos) |
1900 | { | 1904 | { |
1901 | dta[category].d[index].listViewPos = pos; | 1905 | dti.dta[category].d[index].listViewPos = pos; |
1902 | 1906 | ||
1903 | /* FIXME workaround: don't flag dirty, because this function sometimes | 1907 | /* FIXME workaround: don't flag dirty, because this function sometimes |
1904 | * get's called when it shouldn't. It's because PwMView assumes | 1908 | * get's called when it shouldn't. It's because PwMView assumes |
1905 | * the user resorted the UI on behalf of signal layoutChanged(). | 1909 | * the user resorted the UI on behalf of signal layoutChanged(). |
1906 | * This is somewhat broken and incorrect, but I've no other | 1910 | * This is somewhat broken and incorrect, but I've no other |
1907 | * solution for now. | 1911 | * solution for now. |
1908 | */ | 1912 | */ |
1909 | //setDocStatFlag(DOC_STAT_DISK_DIRTY); | 1913 | //setDocStatFlag(DOC_STAT_DISK_DIRTY); |
1910 | } | 1914 | } |
1911 | 1915 | ||
1912 | int PwMDoc::getListViewPos(const QString &category, unsigned int index) | 1916 | int PwMDoc::getListViewPos(const QString &category, unsigned int index) |
1913 | { | 1917 | { |
1914 | unsigned int cat = 0; | 1918 | unsigned int cat = 0; |
1915 | 1919 | ||
1916 | if (!findCategory(category, &cat)) { | 1920 | if (!findCategory(category, &cat)) { |
1917 | BUG(); | 1921 | BUG(); |
1918 | return -1; | 1922 | return -1; |
1919 | } | 1923 | } |
1920 | 1924 | ||
1921 | return dta[cat].d[index].listViewPos; | 1925 | return dti.dta[cat].d[index].listViewPos; |
1922 | } | 1926 | } |
1923 | 1927 | ||
1924 | void PwMDoc::findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn, | 1928 | void PwMDoc::findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn, |
1925 | vector<unsigned int> *foundPositions, bool breakAfterFound, | 1929 | vector<unsigned int> *foundPositions, bool breakAfterFound, |
1926 | bool caseSensitive, bool exactWordMatch, bool sortByLvp) | 1930 | bool caseSensitive, bool exactWordMatch, bool sortByLvp) |
1927 | { | 1931 | { |
1928 | PWM_ASSERT(foundPositions); | 1932 | PWM_ASSERT(foundPositions); |
1929 | PWM_ASSERT(searchIn); | 1933 | PWM_ASSERT(searchIn); |
1930 | foundPositions->clear(); | 1934 | foundPositions->clear(); |
1931 | 1935 | ||
1932 | unsigned int i, entries = numEntries(category); | 1936 | unsigned int i, entries = numEntries(category); |
1933 | for (i = 0; i < entries; ++i) { | 1937 | for (i = 0; i < entries; ++i) { |
1934 | if (searchIn & SEARCH_IN_DESC) { | 1938 | if (searchIn & SEARCH_IN_DESC) { |
1935 | if (!compareString(find.desc, dta[category].d[i].desc, | 1939 | if (!compareString(find.desc, dti.dta[category].d[i].desc, |
1936 | caseSensitive, exactWordMatch)) { | 1940 | caseSensitive, exactWordMatch)) { |
1937 | continue; | 1941 | continue; |
1938 | } | 1942 | } |
1939 | } | 1943 | } |
1940 | if (searchIn & SEARCH_IN_NAME) { | 1944 | if (searchIn & SEARCH_IN_NAME) { |
1941 | if (!compareString(find.name, dta[category].d[i].name, | 1945 | if (!compareString(find.name, dti.dta[category].d[i].name, |
1942 | caseSensitive, exactWordMatch)) { | 1946 | caseSensitive, exactWordMatch)) { |
1943 | continue; | 1947 | continue; |
1944 | } | 1948 | } |
1945 | } | 1949 | } |
1946 | if (searchIn & SEARCH_IN_PW) { | 1950 | if (searchIn & SEARCH_IN_PW) { |
1947 | bool wasLocked = isLocked(category, i); | 1951 | bool wasLocked = isLocked(category, i); |
1948 | getDataChangedLock(); | 1952 | getDataChangedLock(); |
1949 | lockAt(category, i, false); | 1953 | lockAt(category, i, false); |
1950 | if (!compareString(find.pw, dta[category].d[i].pw, | 1954 | if (!compareString(find.pw, dti.dta[category].d[i].pw, |
1951 | caseSensitive, exactWordMatch)) { | 1955 | caseSensitive, exactWordMatch)) { |
1952 | lockAt(category, i, wasLocked); | 1956 | lockAt(category, i, wasLocked); |
1953 | putDataChangedLock(); | 1957 | putDataChangedLock(); |
1954 | continue; | 1958 | continue; |
1955 | } | 1959 | } |
1956 | lockAt(category, i, wasLocked); | 1960 | lockAt(category, i, wasLocked); |
1957 | putDataChangedLock(); | 1961 | putDataChangedLock(); |
1958 | } | 1962 | } |
1959 | if (searchIn & SEARCH_IN_COMMENT) { | 1963 | if (searchIn & SEARCH_IN_COMMENT) { |
1960 | if (!compareString(find.comment, dta[category].d[i].comment, | 1964 | if (!compareString(find.comment, dti.dta[category].d[i].comment, |
1961 | caseSensitive, exactWordMatch)) { | 1965 | caseSensitive, exactWordMatch)) { |
1962 | continue; | 1966 | continue; |
1963 | } | 1967 | } |
1964 | } | 1968 | } |
1965 | if (searchIn & SEARCH_IN_URL) { | 1969 | if (searchIn & SEARCH_IN_URL) { |
1966 | if (!compareString(find.url, dta[category].d[i].url, | 1970 | if (!compareString(find.url, dti.dta[category].d[i].url, |
1967 | caseSensitive, exactWordMatch)) { | 1971 | caseSensitive, exactWordMatch)) { |
1968 | continue; | 1972 | continue; |
1969 | } | 1973 | } |
1970 | } | 1974 | } |
1971 | if (searchIn & SEARCH_IN_LAUNCHER) { | 1975 | if (searchIn & SEARCH_IN_LAUNCHER) { |
1972 | if (!compareString(find.launcher, dta[category].d[i].launcher, | 1976 | if (!compareString(find.launcher, dti.dta[category].d[i].launcher, |
1973 | caseSensitive, exactWordMatch)) { | 1977 | caseSensitive, exactWordMatch)) { |
1974 | continue; | 1978 | continue; |
1975 | } | 1979 | } |
1976 | } | 1980 | } |
1977 | 1981 | ||
1978 | // all selected "searchIn" matched. | 1982 | // all selected "searchIn" matched. |
1979 | foundPositions->push_back(i); | 1983 | foundPositions->push_back(i); |
1980 | if (breakAfterFound) | 1984 | if (breakAfterFound) |
1981 | break; | 1985 | break; |
1982 | } | 1986 | } |
1983 | 1987 | ||
1984 | if (sortByLvp && foundPositions->size() > 1) { | 1988 | if (sortByLvp && foundPositions->size() > 1) { |
1985 | vector< pair<unsigned int /* foundPosition (real doc pos) */, | 1989 | vector< pair<unsigned int /* foundPosition (real doc pos) */, |
1986 | unsigned int /* lvp-pos */> > tmp_vec; | 1990 | unsigned int /* lvp-pos */> > tmp_vec; |
1987 | 1991 | ||
1988 | unsigned int i, items = foundPositions->size(); | 1992 | unsigned int i, items = foundPositions->size(); |
1989 | pair<unsigned int, unsigned int> tmp_pair; | 1993 | pair<unsigned int, unsigned int> tmp_pair; |
1990 | for (i = 0; i < items; ++i) { | 1994 | for (i = 0; i < items; ++i) { |
1991 | tmp_pair.first = (*foundPositions)[i]; | 1995 | tmp_pair.first = (*foundPositions)[i]; |
1992 | tmp_pair.second = dta[category].d[(*foundPositions)[i]].listViewPos; | 1996 | tmp_pair.second = dti.dta[category].d[(*foundPositions)[i]].listViewPos; |
1993 | tmp_vec.push_back(tmp_pair); | 1997 | tmp_vec.push_back(tmp_pair); |
1994 | } | 1998 | } |
1995 | sort(tmp_vec.begin(), tmp_vec.end(), dta_lvp_greater()); | 1999 | sort(tmp_vec.begin(), tmp_vec.end(), dta_lvp_greater()); |
1996 | foundPositions->clear(); | 2000 | foundPositions->clear(); |
1997 | for (i = 0; i < items; ++i) { | 2001 | for (i = 0; i < items; ++i) { |
1998 | foundPositions->push_back(tmp_vec[i].first); | 2002 | foundPositions->push_back(tmp_vec[i].first); |
1999 | } | 2003 | } |
2000 | } | 2004 | } |
2001 | } | 2005 | } |
2002 | 2006 | ||
2003 | void PwMDoc::findEntry(const QString &category, PwMDataItem find, unsigned int searchIn, | 2007 | void PwMDoc::findEntry(const QString &category, PwMDataItem find, unsigned int searchIn, |
2004 | vector<unsigned int> *foundPositions, bool breakAfterFound, | 2008 | vector<unsigned int> *foundPositions, bool breakAfterFound, |
2005 | bool caseSensitive, bool exactWordMatch, bool sortByLvp) | 2009 | bool caseSensitive, bool exactWordMatch, bool sortByLvp) |
2006 | { | 2010 | { |
2007 | PWM_ASSERT(foundPositions); | 2011 | PWM_ASSERT(foundPositions); |
2008 | unsigned int cat = 0; | 2012 | unsigned int cat = 0; |
2009 | 2013 | ||
2010 | if (!findCategory(category, &cat)) { | 2014 | if (!findCategory(category, &cat)) { |
2011 | foundPositions->clear(); | 2015 | foundPositions->clear(); |
2012 | return; | 2016 | return; |
2013 | } | 2017 | } |
2014 | 2018 | ||
2015 | findEntry(cat, find, searchIn, foundPositions, breakAfterFound, | 2019 | findEntry(cat, find, searchIn, foundPositions, breakAfterFound, |
2016 | caseSensitive, exactWordMatch, sortByLvp); | 2020 | caseSensitive, exactWordMatch, sortByLvp); |
2017 | } | 2021 | } |
2018 | 2022 | ||
2019 | bool PwMDoc::compareString(const string &s1, const string &s2, bool caseSensitive, | 2023 | bool PwMDoc::compareString(const string &s1, const string &s2, bool caseSensitive, |
2020 | bool exactWordMatch) | 2024 | bool exactWordMatch) |
2021 | { | 2025 | { |
2022 | QString _s1(s1.c_str()); | 2026 | QString _s1(s1.c_str()); |
2023 | QString _s2(s2.c_str()); | 2027 | QString _s2(s2.c_str()); |
2024 | if (!caseSensitive) { | 2028 | if (!caseSensitive) { |
2025 | _s1 = _s1.lower(); | 2029 | _s1 = _s1.lower(); |
2026 | _s2 = _s2.lower(); | 2030 | _s2 = _s2.lower(); |
2027 | } | 2031 | } |
2028 | if (exactWordMatch ? (_s1 == _s2) : (_s2.find(_s1) != -1)) | 2032 | if (exactWordMatch ? (_s1 == _s2) : (_s2.find(_s1) != -1)) |
2029 | return true; | 2033 | return true; |
2030 | return false; | 2034 | return false; |
2031 | } | 2035 | } |
2032 | 2036 | ||
2033 | bool PwMDoc::findCategory(const QString &name, unsigned int *index) | 2037 | bool PwMDoc::findCategory(const QString &name, unsigned int *index) |
2034 | { | 2038 | { |
2035 | vector<PwMCategoryItem>::iterator i = dta.begin(), | 2039 | vector<PwMCategoryItem>::iterator i = dti.dta.begin(), |
2036 | end = dta.end(); | 2040 | end = dti.dta.end(); |
2037 | while (i != end) { | 2041 | while (i != end) { |
2038 | if ((*i).name == name.latin1()) { | 2042 | if ((*i).name == name.latin1()) { |
2039 | if (index) { | 2043 | if (index) { |
2040 | *index = i - dta.begin(); | 2044 | *index = i - dti.dta.begin(); |
2041 | } | 2045 | } |
2042 | return true; | 2046 | return true; |
2043 | } | 2047 | } |
2044 | ++i; | 2048 | ++i; |
2045 | } | 2049 | } |
2046 | return false; | 2050 | return false; |
2047 | } | 2051 | } |
2048 | 2052 | ||
2049 | bool PwMDoc::renameCategory(const QString &category, const QString &newName) | 2053 | bool PwMDoc::renameCategory(const QString &category, const QString &newName) |
2050 | { | 2054 | { |
2051 | unsigned int cat = 0; | 2055 | unsigned int cat = 0; |
2052 | 2056 | ||
2053 | if (!findCategory(category, &cat)) | 2057 | if (!findCategory(category, &cat)) |
2054 | return false; | 2058 | return false; |
2055 | 2059 | ||
2056 | return renameCategory(cat, newName); | 2060 | return renameCategory(cat, newName); |
2057 | } | 2061 | } |
2058 | 2062 | ||
2059 | bool PwMDoc::renameCategory(unsigned int category, const QString &newName, | 2063 | bool PwMDoc::renameCategory(unsigned int category, const QString &newName, |
2060 | bool dontFlagDirty) | 2064 | bool dontFlagDirty) |
2061 | { | 2065 | { |
2062 | if (category > numCategories() - 1) | 2066 | if (category > numCategories() - 1) |
2063 | return false; | 2067 | return false; |
2064 | 2068 | ||
2065 | dta[category].name = newName.latin1(); | 2069 | dti.dta[category].name = newName.latin1(); |
2066 | if (!dontFlagDirty) | 2070 | if (!dontFlagDirty) |
2067 | flagDirty(); | 2071 | flagDirty(); |
2068 | 2072 | ||
2069 | return true; | 2073 | return true; |
2070 | } | 2074 | } |
2071 | 2075 | ||
2072 | bool PwMDoc::delCategory(const QString &category) | 2076 | bool PwMDoc::delCategory(const QString &category) |
2073 | { | 2077 | { |
2074 | unsigned int cat = 0; | 2078 | unsigned int cat = 0; |
2075 | 2079 | ||
2076 | if (!findCategory(category, &cat)) | 2080 | if (!findCategory(category, &cat)) |
2077 | return false; | 2081 | return false; |
2078 | 2082 | ||
2079 | return delCategory(cat); | 2083 | return delCategory(cat); |
2080 | } | 2084 | } |
2081 | 2085 | ||
2082 | bool PwMDoc::delCategory(unsigned int category, bool dontFlagDirty) | 2086 | bool PwMDoc::delCategory(unsigned int category, bool dontFlagDirty) |
2083 | { | 2087 | { |
2084 | if (category > numCategories() - 1) | 2088 | if (category > numCategories() - 1) |
2085 | return false; | 2089 | return false; |
2086 | 2090 | ||
2087 | // We don't delete it, if it is the last existing | 2091 | // We don't delete it, if it is the last existing |
2088 | // category! Instead we rename it to "Default". | 2092 | // category! Instead we rename it to "Default". |
2089 | if (numCategories() > 1) { | 2093 | if (numCategories() > 1) { |
2090 | dta.erase(dta.begin() + category); | 2094 | dti.dta.erase(dti.dta.begin() + category); |
2091 | } else { | 2095 | } else { |
2092 | renameCategory(category, DEFAULT_CATEGORY, dontFlagDirty); | 2096 | renameCategory(category, DEFAULT_CATEGORY, dontFlagDirty); |
2093 | return true; | 2097 | return true; |
2094 | } | 2098 | } |
2095 | if (!dontFlagDirty) | 2099 | if (!dontFlagDirty) |
2096 | flagDirty(); | 2100 | flagDirty(); |
2097 | 2101 | ||
2098 | return true; | 2102 | return true; |
2099 | } | 2103 | } |
2100 | 2104 | ||
2101 | void PwMDoc::delAllEmptyCat(bool dontFlagDirty) | 2105 | void PwMDoc::delAllEmptyCat(bool dontFlagDirty) |
2102 | { | 2106 | { |
2103 | vector<PwMCategoryItem>::iterator begin = dta.begin(), | 2107 | vector<PwMCategoryItem>::iterator begin = dti.dta.begin(), |
2104 | end = dta.end(), | 2108 | end = dti.dta.end(), |
2105 | i = begin; | 2109 | i = begin; |
2106 | while (i != end) { | 2110 | while (i != end) { |
2107 | if (i->d.empty()) { | 2111 | if (i->d.empty()) { |
2108 | delCategory(begin - i, dontFlagDirty); | 2112 | delCategory(begin - i, dontFlagDirty); |
2109 | } | 2113 | } |
2110 | ++i; | 2114 | ++i; |
2111 | } | 2115 | } |
2112 | } | 2116 | } |
2113 | 2117 | ||
2114 | void PwMDoc::getCategoryList(vector<string> *list) | 2118 | void PwMDoc::getCategoryList(vector<string> *list) |
2115 | { | 2119 | { |
2116 | PWM_ASSERT(list); | 2120 | PWM_ASSERT(list); |
2117 | list->clear(); | 2121 | list->clear(); |
2118 | vector<PwMCategoryItem>::iterator i = dta.begin(), | 2122 | vector<PwMCategoryItem>::iterator i = dti.dta.begin(), |
2119 | end = dta.end(); | 2123 | end = dti.dta.end(); |
2120 | while (i != end) { | 2124 | while (i != end) { |
2121 | list->push_back(i->name); | 2125 | list->push_back(i->name); |
2122 | ++i; | 2126 | ++i; |
2123 | } | 2127 | } |
2124 | } | 2128 | } |
2125 | 2129 | ||
2126 | void PwMDoc::getCategoryList(QStringList *list) | 2130 | void PwMDoc::getCategoryList(QStringList *list) |
2127 | { | 2131 | { |
2128 | PWM_ASSERT(list); | 2132 | PWM_ASSERT(list); |
2129 | list->clear(); | 2133 | list->clear(); |
2130 | vector<PwMCategoryItem>::iterator i = dta.begin(), | 2134 | vector<PwMCategoryItem>::iterator i = dti.dta.begin(), |
2131 | end = dta.end(); | 2135 | end = dti.dta.end(); |
2132 | while (i != end) { | 2136 | while (i != end) { |
2133 | #ifndef PWM_EMBEDDED | 2137 | #ifndef PWM_EMBEDDED |
2134 | list->push_back(i->name.c_str()); | 2138 | list->push_back(i->name.c_str()); |
2135 | #else | 2139 | #else |
2136 | list->append(i->name.c_str()); | 2140 | list->append(i->name.c_str()); |
2137 | #endif | 2141 | #endif |
2138 | ++i; | 2142 | ++i; |
2139 | } | 2143 | } |
2140 | } | 2144 | } |
2141 | 2145 | ||
2142 | void PwMDoc::getEntryList(const QString &category, QStringList *list) | 2146 | void PwMDoc::getEntryList(const QString &category, QStringList *list) |
2143 | { | 2147 | { |
2144 | PWM_ASSERT(list); | 2148 | PWM_ASSERT(list); |
2145 | unsigned int cat = 0; | 2149 | unsigned int cat = 0; |
2146 | if (!findCategory(category, &cat)) { | 2150 | if (!findCategory(category, &cat)) { |
2147 | list->clear(); | 2151 | list->clear(); |
2148 | return; | 2152 | return; |
2149 | } | 2153 | } |
2150 | getEntryList(cat, list); | 2154 | getEntryList(cat, list); |
2151 | } | 2155 | } |
2152 | 2156 | ||
2153 | void PwMDoc::getEntryList(const QString &category, vector<string> *list) | 2157 | void PwMDoc::getEntryList(const QString &category, vector<string> *list) |
2154 | { | 2158 | { |
2155 | PWM_ASSERT(list); | 2159 | PWM_ASSERT(list); |
2156 | unsigned int cat = 0; | 2160 | unsigned int cat = 0; |
2157 | if (!findCategory(category, &cat)) { | 2161 | if (!findCategory(category, &cat)) { |
2158 | list->clear(); | 2162 | list->clear(); |
2159 | return; | 2163 | return; |
2160 | } | 2164 | } |
2161 | getEntryList(cat, list); | 2165 | getEntryList(cat, list); |
2162 | } | 2166 | } |
2163 | 2167 | ||
2164 | void PwMDoc::getEntryList(unsigned int category, vector<string> *list) | 2168 | void PwMDoc::getEntryList(unsigned int category, vector<string> *list) |
2165 | { | 2169 | { |
2166 | PWM_ASSERT(list); | 2170 | PWM_ASSERT(list); |
2167 | list->clear(); | 2171 | list->clear(); |
2168 | vector<PwMDataItem>::iterator begin = dta[category].d.begin(), | 2172 | vector<PwMDataItem>::iterator begin = dti.dta[category].d.begin(), |
2169 | end = dta[category].d.end(), | 2173 | end = dti.dta[category].d.end(), |
2170 | i = begin; | 2174 | i = begin; |
2171 | while (i != end) { | 2175 | while (i != end) { |
2172 | list->push_back(i->desc); | 2176 | list->push_back(i->desc); |
2173 | ++i; | 2177 | ++i; |
2174 | } | 2178 | } |
2175 | } | 2179 | } |
2176 | 2180 | ||
2177 | void PwMDoc::getEntryList(unsigned int category, QStringList *list) | 2181 | void PwMDoc::getEntryList(unsigned int category, QStringList *list) |
2178 | { | 2182 | { |
2179 | PWM_ASSERT(list); | 2183 | PWM_ASSERT(list); |
2180 | list->clear(); | 2184 | list->clear(); |
2181 | vector<PwMDataItem>::iterator begin = dta[category].d.begin(), | 2185 | vector<PwMDataItem>::iterator begin = dti.dta[category].d.begin(), |
2182 | end = dta[category].d.end(), | 2186 | end = dti.dta[category].d.end(), |
2183 | i = begin; | 2187 | i = begin; |
2184 | while (i != end) { | 2188 | while (i != end) { |
2185 | #ifndef PWM_EMBEDDED | 2189 | #ifndef PWM_EMBEDDED |
2186 | list->push_back(i->desc.c_str()); | 2190 | list->push_back(i->desc.c_str()); |
2187 | #else | 2191 | #else |
2188 | list->append(i->desc.c_str()); | 2192 | list->append(i->desc.c_str()); |
2189 | #endif | 2193 | #endif |
2190 | ++i; | 2194 | ++i; |
2191 | } | 2195 | } |
2192 | } | 2196 | } |
2193 | 2197 | ||
2194 | bool PwMDoc::execLauncher(const QString &category, unsigned int entryIndex) | 2198 | bool PwMDoc::execLauncher(const QString &category, unsigned int entryIndex) |
2195 | { | 2199 | { |
2196 | unsigned int cat = 0; | 2200 | unsigned int cat = 0; |
2197 | 2201 | ||
2198 | if (!findCategory(category, &cat)) | 2202 | if (!findCategory(category, &cat)) |
2199 | return false; | 2203 | return false; |
2200 | 2204 | ||
2201 | return execLauncher(cat, entryIndex); | 2205 | return execLauncher(cat, entryIndex); |
2202 | } | 2206 | } |
2203 | 2207 | ||
2204 | bool PwMDoc::execLauncher(unsigned int category, unsigned int entryIndex) | 2208 | bool PwMDoc::execLauncher(unsigned int category, unsigned int entryIndex) |
2205 | { | 2209 | { |
2206 | if (geteuid() == 0) { | 2210 | if (geteuid() == 0) { |
2207 | rootAlertMsgBox(); | 2211 | rootAlertMsgBox(); |
2208 | return false; | 2212 | return false; |
2209 | } | 2213 | } |
2210 | QString command(dta[category].d[entryIndex].launcher.c_str()); | 2214 | QString command(dti.dta[category].d[entryIndex].launcher.c_str()); |
2211 | bool wasLocked = isLocked(category, entryIndex); | 2215 | bool wasLocked = isLocked(category, entryIndex); |
2212 | 2216 | ||
2213 | if (command.find("$p") != -1) { | 2217 | if (command.find("$p") != -1) { |
2214 | /* the user requested the password to be included | 2218 | /* the user requested the password to be included |
2215 | * into the command. We have to ask for the password, | 2219 | * into the command. We have to ask for the password, |
2216 | * if it's locked. We do that by unlocking the entry | 2220 | * if it's locked. We do that by unlocking the entry |
2217 | */ | 2221 | */ |
2218 | if (!lockAt(category, entryIndex, false)) | 2222 | if (!lockAt(category, entryIndex, false)) |
2219 | return false; | 2223 | return false; |
2220 | } | 2224 | } |
2221 | #ifndef PWM_EMBEDDED | 2225 | #ifndef PWM_EMBEDDED |
2222 | command.replace("$d", dta[category].d[entryIndex].desc.c_str()); | 2226 | command.replace("$d", dti.dta[category].d[entryIndex].desc.c_str()); |
2223 | command.replace("$n", dta[category].d[entryIndex].name.c_str()); | 2227 | command.replace("$n", dti.dta[category].d[entryIndex].name.c_str()); |
2224 | command.replace("$p", dta[category].d[entryIndex].pw.c_str()); | 2228 | command.replace("$p", dti.dta[category].d[entryIndex].pw.c_str()); |
2225 | command.replace("$u", dta[category].d[entryIndex].url.c_str()); | 2229 | command.replace("$u", dti.dta[category].d[entryIndex].url.c_str()); |
2226 | command.replace("$c", dta[category].d[entryIndex].comment.c_str()); | 2230 | command.replace("$c", dti.dta[category].d[entryIndex].comment.c_str()); |
2227 | #else | 2231 | #else |
2228 | command.replace(QRegExp("$d"), dta[category].d[entryIndex].desc.c_str()); | 2232 | command.replace(QRegExp("$d"), dti.dta[category].d[entryIndex].desc.c_str()); |
2229 | command.replace(QRegExp("$n"), dta[category].d[entryIndex].name.c_str()); | 2233 | command.replace(QRegExp("$n"), dti.dta[category].d[entryIndex].name.c_str()); |
2230 | command.replace(QRegExp("$p"), dta[category].d[entryIndex].pw.c_str()); | 2234 | command.replace(QRegExp("$p"), dti.dta[category].d[entryIndex].pw.c_str()); |
2231 | command.replace(QRegExp("$u"), dta[category].d[entryIndex].url.c_str()); | 2235 | command.replace(QRegExp("$u"), dti.dta[category].d[entryIndex].url.c_str()); |
2232 | command.replace(QRegExp("$c"), dta[category].d[entryIndex].comment.c_str()); | 2236 | command.replace(QRegExp("$c"), dti.dta[category].d[entryIndex].comment.c_str()); |
2233 | #endif | 2237 | #endif |
2234 | command.append(" &"); | 2238 | command.append(" &"); |
2235 | 2239 | ||
2236 | QString customXterm(conf()->confGlobXtermCommand()); | 2240 | QString customXterm(conf()->confGlobXtermCommand()); |
2237 | if (!customXterm.isEmpty()) | 2241 | if (!customXterm.isEmpty()) |
2238 | command = customXterm + " " + command; | 2242 | command = customXterm + " " + command; |
2239 | 2243 | ||
2240 | system(command.latin1()); | 2244 | system(command.latin1()); |
2241 | 2245 | ||
2242 | lockAt(category, entryIndex, wasLocked); | 2246 | lockAt(category, entryIndex, wasLocked); |
2243 | return true; | 2247 | return true; |
2244 | } | 2248 | } |
2245 | 2249 | ||
2246 | bool PwMDoc::goToURL(const QString &category, unsigned int entryIndex) | 2250 | bool PwMDoc::goToURL(const QString &category, unsigned int entryIndex) |
2247 | { | 2251 | { |
2248 | unsigned int cat = 0; | 2252 | unsigned int cat = 0; |
2249 | 2253 | ||
2250 | if (!findCategory(category, &cat)) | 2254 | if (!findCategory(category, &cat)) |
2251 | return false; | 2255 | return false; |
2252 | 2256 | ||
2253 | return goToURL(cat, entryIndex); | 2257 | return goToURL(cat, entryIndex); |
2254 | } | 2258 | } |
2255 | 2259 | ||
2256 | bool PwMDoc::goToURL(unsigned int category, unsigned int entryIndex) | 2260 | bool PwMDoc::goToURL(unsigned int category, unsigned int entryIndex) |
2257 | { | 2261 | { |
2258 | if (geteuid() == 0) { | 2262 | if (geteuid() == 0) { |
2259 | rootAlertMsgBox(); | 2263 | rootAlertMsgBox(); |
2260 | return false; | 2264 | return false; |
2261 | } | 2265 | } |
2262 | QString url(dta[category].d[entryIndex].url.c_str()); | 2266 | QString url(dti.dta[category].d[entryIndex].url.c_str()); |
2263 | if (url.isEmpty()) | 2267 | if (url.isEmpty()) |
2264 | return false; | 2268 | return false; |
2265 | 2269 | ||
2266 | QString customBrowser(conf()->confGlobBrowserCommand()); | 2270 | QString customBrowser(conf()->confGlobBrowserCommand()); |
2267 | if (!customBrowser.isEmpty()) { | 2271 | if (!customBrowser.isEmpty()) { |
2268 | browserProc.clearArguments(); | 2272 | browserProc.clearArguments(); |
2269 | browserProc << customBrowser << url; | 2273 | browserProc << customBrowser << url; |
2270 | if (browserProc.start(KProcess::DontCare)) | 2274 | if (browserProc.start(KProcess::DontCare)) |
2271 | return true; | 2275 | return true; |
2272 | } | 2276 | } |
2273 | 2277 | ||
2274 | browserProc.clearArguments(); | 2278 | browserProc.clearArguments(); |
2275 | browserProc << "konqueror" << url; | 2279 | browserProc << "konqueror" << url; |
2276 | if (browserProc.start(KProcess::DontCare)) | 2280 | if (browserProc.start(KProcess::DontCare)) |
2277 | return true; | 2281 | return true; |
2278 | 2282 | ||
2279 | browserProc.clearArguments(); | 2283 | browserProc.clearArguments(); |
2280 | browserProc << "mozilla" << url; | 2284 | browserProc << "mozilla" << url; |
2281 | if (browserProc.start(KProcess::DontCare)) | 2285 | if (browserProc.start(KProcess::DontCare)) |
2282 | return true; | 2286 | return true; |
2283 | 2287 | ||
2284 | browserProc.clearArguments(); | 2288 | browserProc.clearArguments(); |
2285 | browserProc << "opera" << url; | 2289 | browserProc << "opera" << url; |
2286 | if (browserProc.start(KProcess::DontCare)) | 2290 | if (browserProc.start(KProcess::DontCare)) |
@@ -2329,119 +2333,119 @@ PwMerror PwMDoc::exportToText(const QString *file) | |||
2329 | header += tostr(currDate.year()); | 2333 | header += tostr(currDate.year()); |
2330 | header += "\n==============================\n\n"; | 2334 | header += "\n==============================\n\n"; |
2331 | 2335 | ||
2332 | 2336 | ||
2333 | #ifndef PWM_EMBEDDED | 2337 | #ifndef PWM_EMBEDDED |
2334 | if (f.writeBlock(header.c_str(), header.length()) != (Q_LONG)header.length()) { | 2338 | if (f.writeBlock(header.c_str(), header.length()) != (Q_LONG)header.length()) { |
2335 | unlockAll_tempoary(true); | 2339 | unlockAll_tempoary(true); |
2336 | f.close(); | 2340 | f.close(); |
2337 | return e_writeFile; | 2341 | return e_writeFile; |
2338 | } | 2342 | } |
2339 | #else | 2343 | #else |
2340 | if (f.writeBlock(header.c_str(), header.length()) != (long)header.length()) { | 2344 | if (f.writeBlock(header.c_str(), header.length()) != (long)header.length()) { |
2341 | unlockAll_tempoary(true); | 2345 | unlockAll_tempoary(true); |
2342 | f.close(); | 2346 | f.close(); |
2343 | return e_writeFile; | 2347 | return e_writeFile; |
2344 | } | 2348 | } |
2345 | #endif | 2349 | #endif |
2346 | unsigned int i, numCat = numCategories(); | 2350 | unsigned int i, numCat = numCategories(); |
2347 | unsigned int j, numEnt; | 2351 | unsigned int j, numEnt; |
2348 | string exp; | 2352 | string exp; |
2349 | for (i = 0; i < numCat; ++i) { | 2353 | for (i = 0; i < numCat; ++i) { |
2350 | numEnt = numEntries(i); | 2354 | numEnt = numEntries(i); |
2351 | 2355 | ||
2352 | exp = "\n== Category: "; | 2356 | exp = "\n== Category: "; |
2353 | exp += dta[i].name; | 2357 | exp += dti.dta[i].name; |
2354 | exp += " ==\n"; | 2358 | exp += " ==\n"; |
2355 | #ifndef PWM_EMBEDDED | 2359 | #ifndef PWM_EMBEDDED |
2356 | if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) { | 2360 | if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) { |
2357 | unlockAll_tempoary(true); | 2361 | unlockAll_tempoary(true); |
2358 | f.close(); | 2362 | f.close(); |
2359 | return e_writeFile; | 2363 | return e_writeFile; |
2360 | } | 2364 | } |
2361 | #else | 2365 | #else |
2362 | if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) { | 2366 | if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) { |
2363 | unlockAll_tempoary(true); | 2367 | unlockAll_tempoary(true); |
2364 | f.close(); | 2368 | f.close(); |
2365 | return e_writeFile; | 2369 | return e_writeFile; |
2366 | } | 2370 | } |
2367 | #endif | 2371 | #endif |
2368 | for (j = 0; j < numEnt; ++j) { | 2372 | for (j = 0; j < numEnt; ++j) { |
2369 | exp = "\n-- "; | 2373 | exp = "\n-- "; |
2370 | exp += dta[i].d[j].desc; | 2374 | exp += dti.dta[i].d[j].desc; |
2371 | exp += " --\n"; | 2375 | exp += " --\n"; |
2372 | 2376 | ||
2373 | exp += i18n("Username: ").latin1(); | 2377 | exp += i18n("Username: ").latin1(); |
2374 | exp += dta[i].d[j].name; | 2378 | exp += dti.dta[i].d[j].name; |
2375 | exp += "\n"; | 2379 | exp += "\n"; |
2376 | 2380 | ||
2377 | exp += i18n("Password: ").latin1(); | 2381 | exp += i18n("Password: ").latin1(); |
2378 | exp += dta[i].d[j].pw; | 2382 | exp += dti.dta[i].d[j].pw; |
2379 | exp += "\n"; | 2383 | exp += "\n"; |
2380 | 2384 | ||
2381 | exp += i18n("Comment: ").latin1(); | 2385 | exp += i18n("Comment: ").latin1(); |
2382 | exp += dta[i].d[j].comment; | 2386 | exp += dti.dta[i].d[j].comment; |
2383 | exp += "\n"; | 2387 | exp += "\n"; |
2384 | 2388 | ||
2385 | exp += i18n("URL: ").latin1(); | 2389 | exp += i18n("URL: ").latin1(); |
2386 | exp += dta[i].d[j].url; | 2390 | exp += dti.dta[i].d[j].url; |
2387 | exp += "\n"; | 2391 | exp += "\n"; |
2388 | 2392 | ||
2389 | exp += i18n("Launcher: ").latin1(); | 2393 | exp += i18n("Launcher: ").latin1(); |
2390 | exp += dta[i].d[j].launcher; | 2394 | exp += dti.dta[i].d[j].launcher; |
2391 | exp += "\n"; | 2395 | exp += "\n"; |
2392 | 2396 | ||
2393 | #ifndef PWM_EMBEDDED | 2397 | #ifndef PWM_EMBEDDED |
2394 | if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) { | 2398 | if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) { |
2395 | unlockAll_tempoary(true); | 2399 | unlockAll_tempoary(true); |
2396 | f.close(); | 2400 | f.close(); |
2397 | return e_writeFile; | 2401 | return e_writeFile; |
2398 | } | 2402 | } |
2399 | #else | 2403 | #else |
2400 | if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) { | 2404 | if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) { |
2401 | unlockAll_tempoary(true); | 2405 | unlockAll_tempoary(true); |
2402 | f.close(); | 2406 | f.close(); |
2403 | return e_writeFile; | 2407 | return e_writeFile; |
2404 | } | 2408 | } |
2405 | #endif | 2409 | #endif |
2406 | } | 2410 | } |
2407 | } | 2411 | } |
2408 | unlockAll_tempoary(true); | 2412 | unlockAll_tempoary(true); |
2409 | f.close(); | 2413 | f.close(); |
2410 | 2414 | ||
2411 | return e_success; | 2415 | return e_success; |
2412 | } | 2416 | } |
2413 | 2417 | ||
2414 | PwMerror PwMDoc::importFromText(const QString *file, int format) | 2418 | PwMerror PwMDoc::importFromText(const QString *file, int format) |
2415 | { | 2419 | { |
2416 | PWM_ASSERT(file); | 2420 | PWM_ASSERT(file); |
2417 | if (format == 0) | 2421 | if (format == 0) |
2418 | return importText_PwM(file); | 2422 | return importText_PwM(file); |
2419 | else if (format == -1) { | 2423 | else if (format == -1) { |
2420 | // probe for all formats | 2424 | // probe for all formats |
2421 | if (importText_PwM(file) == e_success) | 2425 | if (importText_PwM(file) == e_success) |
2422 | return e_success; | 2426 | return e_success; |
2423 | dta.clear(); | 2427 | dti.clear(); |
2424 | emitDataChanged(this); | 2428 | emitDataChanged(this); |
2425 | // add next format here... | 2429 | // add next format here... |
2426 | return e_fileFormat; | 2430 | return e_fileFormat; |
2427 | } | 2431 | } |
2428 | return e_invalidArg; | 2432 | return e_invalidArg; |
2429 | } | 2433 | } |
2430 | 2434 | ||
2431 | PwMerror PwMDoc::importText_PwM(const QString *file) | 2435 | PwMerror PwMDoc::importText_PwM(const QString *file) |
2432 | { | 2436 | { |
2433 | PWM_ASSERT(file); | 2437 | PWM_ASSERT(file); |
2434 | FILE *f; | 2438 | FILE *f; |
2435 | int tmp; | 2439 | int tmp; |
2436 | ssize_t ret; | 2440 | ssize_t ret; |
2437 | string curCat; | 2441 | string curCat; |
2438 | unsigned int entriesRead = 0; | 2442 | unsigned int entriesRead = 0; |
2439 | PwMDataItem currItem; | 2443 | PwMDataItem currItem; |
2440 | f = fopen(file->latin1(), "r"); | 2444 | f = fopen(file->latin1(), "r"); |
2441 | if (!f) | 2445 | if (!f) |
2442 | return e_openFile; | 2446 | return e_openFile; |
2443 | size_t ch_tmp_size = 1024; | 2447 | size_t ch_tmp_size = 1024; |
2444 | char *ch_tmp = (char*)malloc(ch_tmp_size); | 2448 | char *ch_tmp = (char*)malloc(ch_tmp_size); |
2445 | if (!ch_tmp) { | 2449 | if (!ch_tmp) { |
2446 | fclose(f); | 2450 | fclose(f); |
2447 | return e_outOfMem; | 2451 | return e_outOfMem; |
@@ -2593,60 +2597,60 @@ PwMerror PwMDoc::exportToGpasman(const QString *file) | |||
2593 | if (gpmPassword == "") { | 2597 | if (gpmPassword == "") { |
2594 | unlockAll_tempoary(true); | 2598 | unlockAll_tempoary(true); |
2595 | return e_noPw; | 2599 | return e_noPw; |
2596 | } | 2600 | } |
2597 | if (gpmPassword.length() < 4) { | 2601 | if (gpmPassword.length() < 4) { |
2598 | gpmPwLenErrMsgBox(); | 2602 | gpmPwLenErrMsgBox(); |
2599 | } else { | 2603 | } else { |
2600 | break; | 2604 | break; |
2601 | } | 2605 | } |
2602 | } | 2606 | } |
2603 | 2607 | ||
2604 | ret = gp.save_init(file->latin1(), gpmPassword.latin1()); | 2608 | ret = gp.save_init(file->latin1(), gpmPassword.latin1()); |
2605 | if (ret != 1) { | 2609 | if (ret != 1) { |
2606 | unlockAll_tempoary(true); | 2610 | unlockAll_tempoary(true); |
2607 | return e_accessFile; | 2611 | return e_accessFile; |
2608 | } | 2612 | } |
2609 | 2613 | ||
2610 | char *entry[4]; | 2614 | char *entry[4]; |
2611 | unsigned int numCat = numCategories(), i; | 2615 | unsigned int numCat = numCategories(), i; |
2612 | unsigned int numEntr, j; | 2616 | unsigned int numEntr, j; |
2613 | int descLen, nameLen, pwLen, commentLen; | 2617 | int descLen, nameLen, pwLen, commentLen; |
2614 | for (i = 0; i < numCat; ++i) { | 2618 | for (i = 0; i < numCat; ++i) { |
2615 | numEntr = numEntries(i); | 2619 | numEntr = numEntries(i); |
2616 | for (j = 0; j < numEntr; ++j) { | 2620 | for (j = 0; j < numEntr; ++j) { |
2617 | descLen = dta[i].d[j].desc.length(); | 2621 | descLen = dti.dta[i].d[j].desc.length(); |
2618 | nameLen = dta[i].d[j].name.length(); | 2622 | nameLen = dti.dta[i].d[j].name.length(); |
2619 | pwLen = dta[i].d[j].pw.length(); | 2623 | pwLen = dti.dta[i].d[j].pw.length(); |
2620 | commentLen = dta[i].d[j].comment.length(); | 2624 | commentLen = dti.dta[i].d[j].comment.length(); |
2621 | entry[0] = new char[descLen + 1]; | 2625 | entry[0] = new char[descLen + 1]; |
2622 | entry[1] = new char[nameLen + 1]; | 2626 | entry[1] = new char[nameLen + 1]; |
2623 | entry[2] = new char[pwLen + 1]; | 2627 | entry[2] = new char[pwLen + 1]; |
2624 | entry[3] = new char[commentLen + 1]; | 2628 | entry[3] = new char[commentLen + 1]; |
2625 | strcpy(entry[0], descLen == 0 ? " " : dta[i].d[j].desc.c_str()); | 2629 | strcpy(entry[0], descLen == 0 ? " " : dti.dta[i].d[j].desc.c_str()); |
2626 | strcpy(entry[1], nameLen == 0 ? " " : dta[i].d[j].name.c_str()); | 2630 | strcpy(entry[1], nameLen == 0 ? " " : dti.dta[i].d[j].name.c_str()); |
2627 | strcpy(entry[2], pwLen == 0 ? " " : dta[i].d[j].pw.c_str()); | 2631 | strcpy(entry[2], pwLen == 0 ? " " : dti.dta[i].d[j].pw.c_str()); |
2628 | strcpy(entry[3], commentLen == 0 ? " " : dta[i].d[j].comment.c_str()); | 2632 | strcpy(entry[3], commentLen == 0 ? " " : dti.dta[i].d[j].comment.c_str()); |
2629 | entry[0][descLen == 0 ? descLen + 1 : descLen] = '\0'; | 2633 | entry[0][descLen == 0 ? descLen + 1 : descLen] = '\0'; |
2630 | entry[1][nameLen == 0 ? nameLen + 1 : nameLen] = '\0'; | 2634 | entry[1][nameLen == 0 ? nameLen + 1 : nameLen] = '\0'; |
2631 | entry[2][pwLen == 0 ? pwLen + 1 : pwLen] = '\0'; | 2635 | entry[2][pwLen == 0 ? pwLen + 1 : pwLen] = '\0'; |
2632 | entry[3][commentLen == 0 ? commentLen + 1 : commentLen] = '\0'; | 2636 | entry[3][commentLen == 0 ? commentLen + 1 : commentLen] = '\0'; |
2633 | 2637 | ||
2634 | ret = gp.save_entry(entry); | 2638 | ret = gp.save_entry(entry); |
2635 | if (ret == -1){ | 2639 | if (ret == -1){ |
2636 | delete [] entry[0]; | 2640 | delete [] entry[0]; |
2637 | delete [] entry[1]; | 2641 | delete [] entry[1]; |
2638 | delete [] entry[2]; | 2642 | delete [] entry[2]; |
2639 | delete [] entry[3]; | 2643 | delete [] entry[3]; |
2640 | gp.save_finalize(); | 2644 | gp.save_finalize(); |
2641 | unlockAll_tempoary(true); | 2645 | unlockAll_tempoary(true); |
2642 | return e_writeFile; | 2646 | return e_writeFile; |
2643 | } | 2647 | } |
2644 | 2648 | ||
2645 | delete [] entry[0]; | 2649 | delete [] entry[0]; |
2646 | delete [] entry[1]; | 2650 | delete [] entry[1]; |
2647 | delete [] entry[2]; | 2651 | delete [] entry[2]; |
2648 | delete [] entry[3]; | 2652 | delete [] entry[3]; |
2649 | } | 2653 | } |
2650 | } | 2654 | } |
2651 | unlockAll_tempoary(true); | 2655 | unlockAll_tempoary(true); |
2652 | if (gp.save_finalize() == -1) | 2656 | if (gp.save_finalize() == -1) |
@@ -2684,50 +2688,50 @@ PwMerror PwMDoc::importFromGpasman(const QString *file) | |||
2684 | for (i = 0; i < 4; ++i) | 2688 | for (i = 0; i < 4; ++i) |
2685 | free(entry[i]); | 2689 | free(entry[i]); |
2686 | if (ret2 == e_maxAllowedEntr) { | 2690 | if (ret2 == e_maxAllowedEntr) { |
2687 | gp.load_finalize(); | 2691 | gp.load_finalize(); |
2688 | return e_maxAllowedEntr; | 2692 | return e_maxAllowedEntr; |
2689 | } | 2693 | } |
2690 | } while (1); | 2694 | } while (1); |
2691 | gp.load_finalize(); | 2695 | gp.load_finalize(); |
2692 | if (isDocEmpty()) | 2696 | if (isDocEmpty()) |
2693 | return e_wrongPw; // we assume this. | 2697 | return e_wrongPw; // we assume this. |
2694 | 2698 | ||
2695 | flagDirty(); | 2699 | flagDirty(); |
2696 | return e_success; | 2700 | return e_success; |
2697 | } | 2701 | } |
2698 | 2702 | ||
2699 | void PwMDoc::ensureLvp() | 2703 | void PwMDoc::ensureLvp() |
2700 | { | 2704 | { |
2701 | if (isDocEmpty()) | 2705 | if (isDocEmpty()) |
2702 | return; | 2706 | return; |
2703 | 2707 | ||
2704 | vector< vector<PwMDataItem>::iterator > undefined; | 2708 | vector< vector<PwMDataItem>::iterator > undefined; |
2705 | vector< vector<PwMDataItem>::iterator >::iterator undefBegin, | 2709 | vector< vector<PwMDataItem>::iterator >::iterator undefBegin, |
2706 | undefEnd, | 2710 | undefEnd, |
2707 | undefI; | 2711 | undefI; |
2708 | vector<PwMCategoryItem>::iterator catBegin = dta.begin(), | 2712 | vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), |
2709 | catEnd = dta.end(), | 2713 | catEnd = dti.dta.end(), |
2710 | catI = catBegin; | 2714 | catI = catBegin; |
2711 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; | 2715 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; |
2712 | int lvpTop, tmpLvp; | 2716 | int lvpTop, tmpLvp; |
2713 | 2717 | ||
2714 | while (catI != catEnd) { | 2718 | while (catI != catEnd) { |
2715 | lvpTop = -1; | 2719 | lvpTop = -1; |
2716 | undefined.clear(); | 2720 | undefined.clear(); |
2717 | 2721 | ||
2718 | entrBegin = catI->d.begin(); | 2722 | entrBegin = catI->d.begin(); |
2719 | entrEnd = catI->d.end(); | 2723 | entrEnd = catI->d.end(); |
2720 | entrI = entrBegin; | 2724 | entrI = entrBegin; |
2721 | 2725 | ||
2722 | while (entrI != entrEnd) { | 2726 | while (entrI != entrEnd) { |
2723 | tmpLvp = entrI->listViewPos; | 2727 | tmpLvp = entrI->listViewPos; |
2724 | if (tmpLvp == -1) | 2728 | if (tmpLvp == -1) |
2725 | undefined.push_back(entrI); | 2729 | undefined.push_back(entrI); |
2726 | else if (tmpLvp > lvpTop) | 2730 | else if (tmpLvp > lvpTop) |
2727 | lvpTop = tmpLvp; | 2731 | lvpTop = tmpLvp; |
2728 | ++entrI; | 2732 | ++entrI; |
2729 | } | 2733 | } |
2730 | undefBegin = undefined.begin(); | 2734 | undefBegin = undefined.begin(); |
2731 | undefEnd = undefined.end(); | 2735 | undefEnd = undefined.end(); |
2732 | undefI = undefBegin; | 2736 | undefI = undefBegin; |
2733 | while (undefI != undefEnd) { | 2737 | while (undefI != undefEnd) { |
@@ -2764,73 +2768,347 @@ bool PwMDoc::tryDelete() | |||
2764 | int ret; | 2768 | int ret; |
2765 | if (isDirty()) { | 2769 | if (isDirty()) { |
2766 | ret = dirtyAskSave(getTitle()); | 2770 | ret = dirtyAskSave(getTitle()); |
2767 | if (ret == 0) { // save to disk | 2771 | if (ret == 0) { // save to disk |
2768 | if (!saveDocUi(this)) | 2772 | if (!saveDocUi(this)) |
2769 | goto out_ignore; | 2773 | goto out_ignore; |
2770 | } else if (ret == 1) { // don't save and delete | 2774 | } else if (ret == 1) { // don't save and delete |
2771 | goto out_accept; | 2775 | goto out_accept; |
2772 | } else { // cancel operation | 2776 | } else { // cancel operation |
2773 | goto out_ignore; | 2777 | goto out_ignore; |
2774 | } | 2778 | } |
2775 | } | 2779 | } |
2776 | out_accept: | 2780 | out_accept: |
2777 | deleted = true; | 2781 | deleted = true; |
2778 | delete this; | 2782 | delete this; |
2779 | return true; | 2783 | return true; |
2780 | out_ignore: | 2784 | out_ignore: |
2781 | return false; | 2785 | return false; |
2782 | } | 2786 | } |
2783 | 2787 | ||
2784 | 2788 | ||
2785 | 2789 | ||
2786 | #ifdef PWM_EMBEDDED | 2790 | #ifdef PWM_EMBEDDED |
2787 | //US ENH: this is the magic function that syncronizes the this doc with the remote doc | 2791 | //US ENH: this is the magic function that syncronizes the this doc with the remote doc |
2792 | //US it could have been defined as static, but I did not want to. | ||
2788 | PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* syncRemote, int mode ) | 2793 | PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* syncRemote, int mode ) |
2789 | { | 2794 | { |
2790 | bool syncOK = true; | ||
2791 | int addedPasswordsLocal = 0; | 2795 | int addedPasswordsLocal = 0; |
2792 | int addedPasswordsRemote = 0; | 2796 | int addedPasswordsRemote = 0; |
2793 | int deletedPasswordsRemote = 0; | 2797 | int deletedPasswordsRemote = 0; |
2794 | int deletedPasswordsLocal = 0; | 2798 | int deletedPasswordsLocal = 0; |
2795 | int changedLocal = 0; | 2799 | int changedLocal = 0; |
2796 | int changedRemote = 0; | 2800 | int changedRemote = 0; |
2797 | 2801 | ||
2802 | PwMSyncItem* syncItemLocal; | ||
2803 | PwMSyncItem* syncItemRemote; | ||
2804 | |||
2798 | QString mCurrentSyncName = manager->getCurrentSyncName(); | 2805 | QString mCurrentSyncName = manager->getCurrentSyncName(); |
2799 | QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); | 2806 | QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); |
2800 | 2807 | ||
2808 | bool fullDateRange = false; | ||
2809 | int take; | ||
2810 | // local->resetTempSyncStat(); | ||
2811 | QDateTime mLastSync = QDateTime::currentDateTime(); | ||
2812 | QDateTime modifiedSync = mLastSync; | ||
2813 | |||
2814 | unsigned int index; | ||
2815 | //Step 1. Find syncinfo in Local file and create if not existent. | ||
2816 | bool found = syncLocal->findSyncData(mCurrentSyncDevice, &index); | ||
2817 | if (found == false) | ||
2818 | { | ||
2819 | PwMSyncItem newSyncItemLocal; | ||
2820 | newSyncItemLocal.syncName = mCurrentSyncDevice; | ||
2821 | newSyncItemLocal.lastSyncDate = mLastSync; | ||
2822 | syncLocal->addSyncDataEntry(&newSyncItemLocal, true); | ||
2823 | found = syncLocal->findSyncData(mCurrentSyncDevice, &index); | ||
2824 | if (found == false) { | ||
2825 | qDebug("PwMDoc::syncronize : newly created local sync data could not be found"); | ||
2826 | return e_syncError; | ||
2827 | } | ||
2828 | } | ||
2829 | |||
2830 | syncItemLocal = syncLocal->getSyncDataEntry(index); | ||
2831 | qDebug("Last Sync %s ", syncItemLocal->lastSyncDate.toString().latin1()); | ||
2832 | |||
2833 | //Step 2. Find syncinfo in remote file and create if not existent. | ||
2834 | found = syncRemote->findSyncData(mCurrentSyncName, &index); | ||
2835 | if (found == false) | ||
2836 | { | ||
2837 | qDebug("FULLDATE 1"); | ||
2838 | fullDateRange = true; | ||
2839 | PwMSyncItem newSyncItemRemote; | ||
2840 | newSyncItemRemote.syncName = mCurrentSyncName; | ||
2841 | newSyncItemRemote.lastSyncDate = mLastSync; | ||
2842 | syncRemote->addSyncDataEntry(&newSyncItemRemote, true); | ||
2843 | found = syncRemote->findSyncData(mCurrentSyncName, &index); | ||
2844 | if (found == false) { | ||
2845 | qDebug("PwMDoc::syncronize : newly created remote sync data could not be found"); | ||
2846 | return e_syncError; | ||
2847 | } | ||
2848 | } | ||
2849 | |||
2850 | syncItemRemote = syncRemote->getSyncDataEntry(index); | ||
2851 | //and remove the found entry here. We will reenter it later again. | ||
2852 | syncRemote->delSyncDataEntry(index, true); | ||
2801 | 2853 | ||
2802 | 2854 | ||
2855 | if ( syncItemLocal->lastSyncDate == mLastSync ) { | ||
2856 | qDebug("FULLDATE 2"); | ||
2857 | fullDateRange = true; | ||
2858 | } | ||
2859 | |||
2860 | if ( ! fullDateRange ) { | ||
2861 | if ( syncItemLocal->lastSyncDate != syncItemRemote->lastSyncDate ) { | ||
2862 | |||
2863 | // qDebug("set fulldate to true %s %s" ,addresseeLSync->dtStart().toString().latin1(), addresseeRSync->dtStart().toString().latin1() ); | ||
2864 | //qDebug("%d %d %d %d ", addresseeLSync->dtStart().time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec()); | ||
2865 | fullDateRange = true; | ||
2866 | qDebug("FULLDATE 3 %s %s", syncItemLocal->lastSyncDate.toString().latin1() , syncItemRemote->lastSyncDate.toString().latin1() ); | ||
2867 | } | ||
2868 | } | ||
2869 | // fullDateRange = true; // debug only! | ||
2870 | if ( fullDateRange ) | ||
2871 | mLastSync = QDateTime::currentDateTime().addDays( -100*365); | ||
2872 | else | ||
2873 | mLastSync = syncItemLocal->lastSyncDate; | ||
2874 | |||
2875 | |||
2876 | qDebug("*************************** "); | ||
2877 | // qDebug("mLastAddressbookSync %s ",mLastAddressbookSync.toString().latin1() ); | ||
2878 | QStringList er = syncRemote->getIDEntryList(); | ||
2879 | PwMDataItem* inRemote ;//= er.first(); | ||
2880 | PwMDataItem* inLocal; | ||
2881 | unsigned int catLocal, indexLocal; | ||
2882 | unsigned int catRemote, indexRemote; | ||
2883 | |||
2884 | QString uid; | ||
2885 | manager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count()); | ||
2886 | |||
2887 | int modulo = (er.count()/10)+1; | ||
2888 | unsigned int incCounter = 0; | ||
2889 | while ( incCounter < er.count()) { | ||
2890 | if (manager->isProgressBarCanceled()) | ||
2891 | return e_syncError; | ||
2892 | if ( incCounter % modulo == 0 ) | ||
2893 | manager->showProgressBar(incCounter); | ||
2894 | |||
2895 | uid = er[ incCounter ]; | ||
2896 | qApp->processEvents(); | ||
2897 | |||
2898 | inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); | ||
2899 | inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote ); | ||
2900 | if ( inLocal != 0 ) { // maybe conflict - same uid in both files | ||
2901 | if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) { | ||
2902 | //qDebug("take %d %s ", take, inL.summary().latin1()); | ||
2903 | if ( take == 3 ) | ||
2904 | return e_syncError; | ||
2905 | if ( take == 1 ) {// take local | ||
2906 | //US syncRemote->removeAddressee( inRemote ); | ||
2907 | (*inRemote) = (*inLocal); | ||
2908 | //US syncRemote->insertAddressee( inRemote , false); | ||
2909 | ++changedRemote; | ||
2910 | } else { // take == 2 take remote | ||
2911 | //US syncLocal->removeAddressee( inLocal ); | ||
2912 | (*inLocal) = (*inRemote); | ||
2913 | //US syncLocal->insertAddressee( inLocal , false ); | ||
2914 | ++changedLocal; | ||
2915 | } | ||
2916 | } | ||
2917 | } else { // no conflict | ||
2918 | if ( inRemote->meta.update > mLastSync || mode == 5 ) { | ||
2919 | inRemote->meta.update = modifiedSync; | ||
2920 | //US syncRemote->insertAddressee( inRemote, false ); | ||
2921 | //US syncLocal->insertAddressee( inRemote, false ); | ||
2922 | syncLocal->addEntry("newcategory", inRemote, true, false); | ||
2923 | |||
2924 | ++addedPasswordsLocal; | ||
2925 | } else { | ||
2926 | // pending checkExternSyncAddressee(addresseeRSyncSharp, inR); | ||
2927 | syncRemote->delEntry(catRemote, indexRemote, true); | ||
2928 | //USsyncRemote->removeAddressee( inRemote ); | ||
2929 | ++deletedPasswordsRemote; | ||
2930 | } | ||
2931 | } | ||
2932 | |||
2933 | ++incCounter; | ||
2934 | } | ||
2803 | 2935 | ||
2804 | 2936 | ||
2937 | er.clear(); | ||
2938 | QStringList el = syncLocal->getIDEntryList(); | ||
2939 | modulo = (el.count()/10)+1; | ||
2940 | |||
2941 | manager->showProgressBar(0, i18n("Add / remove addressees"), el.count()); | ||
2942 | incCounter = 0; | ||
2943 | while ( incCounter < el.count()) { | ||
2944 | qApp->processEvents(); | ||
2945 | if (manager->isProgressBarCanceled()) | ||
2946 | return e_syncError; | ||
2947 | if ( incCounter % modulo == 0 ) | ||
2948 | manager->showProgressBar(incCounter); | ||
2949 | uid = el[ incCounter ]; | ||
2950 | |||
2951 | inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); | ||
2952 | inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote ); | ||
2953 | if ( inRemote == 0 ) { | ||
2954 | if ( inLocal->meta.update < mLastSync && mode != 4 ) { | ||
2955 | // pending checkExternSyncAddressee(addresseeLSyncSharp, inL); | ||
2956 | syncLocal->delEntry(catLocal, indexLocal, true); | ||
2957 | //USsyncLocal->removeAddressee( inLocal ); | ||
2958 | ++deletedPasswordsLocal; | ||
2959 | } else { | ||
2960 | if ( ! PWMPrefs::instance()->mWriteBackExistingOnly ) { | ||
2961 | ++addedPasswordsRemote; | ||
2962 | inLocal->meta.update = modifiedSync; | ||
2963 | //USsyncLocal->insertAddressee( inLocal, false ); | ||
2964 | (*inRemote) = (*inLocal); | ||
2965 | //USsyncRemote->insertAddressee( inRemote, false ); | ||
2966 | syncRemote->addEntry("newcategory", inRemote, true, false); | ||
2967 | |||
2968 | } | ||
2969 | } | ||
2970 | |||
2971 | } | ||
2972 | ++incCounter; | ||
2973 | } | ||
2974 | el.clear(); | ||
2975 | manager->hideProgressBar(); | ||
2976 | |||
2977 | // Now write the info back into the sync data space of the files | ||
2805 | 2978 | ||
2979 | mLastSync = QDateTime::currentDateTime().addSecs( 1 ); | ||
2980 | // get rid of micro seconds | ||
2981 | QTime t = mLastSync.time(); | ||
2982 | mLastSync.setTime( QTime (t.hour (), t.minute (), t.second () ) ); | ||
2806 | 2983 | ||
2984 | |||
2985 | syncItemLocal->lastSyncDate = mLastSync; | ||
2986 | syncItemRemote->lastSyncDate = mLastSync; | ||
2807 | 2987 | ||
2988 | // addresseeRSync.setRole( i18n("!Remote from: ")+mCurrentSyncName ) ; | ||
2989 | // addresseeLSync.setRole(i18n("!Local from: ") + mCurrentSyncName ); | ||
2808 | 2990 | ||
2991 | syncRemote->addSyncDataEntry( syncItemRemote, false ); | ||
2992 | syncLocal->addSyncDataEntry( syncItemLocal, false ); | ||
2993 | QString mes; | ||
2994 | mes .sprintf( i18n("Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n"),addedPasswordsLocal, addedPasswordsRemote, changedLocal, changedRemote, deletedPasswordsLocal, deletedPasswordsRemote ); | ||
2995 | if ( PWMPrefs::instance()->mShowSyncSummary ) { | ||
2996 | KMessageBox::information(0, mes, i18n("PWM/Pi Synchronization") ); | ||
2997 | } | ||
2998 | qDebug( mes ); | ||
2809 | return e_success; | 2999 | return e_success; |
2810 | } | 3000 | } |
2811 | 3001 | ||
2812 | 3002 | ||
3003 | int PwMDoc::takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime lastSync, int mode , bool full ) | ||
3004 | { | ||
3005 | // 0 equal | ||
3006 | // 1 take local | ||
3007 | // 2 take remote | ||
3008 | // 3 cancel | ||
3009 | QDateTime localMod = local->meta.update; | ||
3010 | QDateTime remoteMod = remote->meta.update; | ||
3011 | |||
3012 | //US QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); | ||
3013 | |||
3014 | if ( localMod == remoteMod ) | ||
3015 | return 0; | ||
3016 | |||
3017 | qDebug(" %d %d conflict on %s %s ", mode, full, local->desc.c_str(), remote->desc.c_str() ); | ||
3018 | |||
3019 | //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , localMod, remote->lastModified().toString().latin1(), remoteMod); | ||
3020 | //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() ); | ||
3021 | //full = true; //debug only | ||
3022 | if ( full ) { | ||
3023 | bool equ = true;//US ( (*local) == (*remote) ); | ||
3024 | if ( equ ) { | ||
3025 | //qDebug("equal "); | ||
3026 | if ( mode < SYNC_PREF_FORCE_LOCAL ) | ||
3027 | return 0; | ||
3028 | |||
3029 | }//else //debug only | ||
3030 | //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); | ||
3031 | } | ||
3032 | |||
3033 | int result; | ||
3034 | bool localIsNew; | ||
3035 | //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , local->lastModified().toString().latin1() , remote->lastModified().toString().latin1() ); | ||
3036 | |||
3037 | if ( full && mode < SYNC_PREF_NEWEST ) | ||
3038 | mode = SYNC_PREF_ASK; | ||
3039 | |||
3040 | switch( mode ) { | ||
3041 | case SYNC_PREF_LOCAL: | ||
3042 | if ( lastSync > remoteMod ) | ||
3043 | return 1; | ||
3044 | if ( lastSync > localMod ) | ||
3045 | return 2; | ||
3046 | return 1; | ||
3047 | break; | ||
3048 | case SYNC_PREF_REMOTE: | ||
3049 | if ( lastSync > remoteMod ) | ||
3050 | return 1; | ||
3051 | if ( lastSync > localMod ) | ||
3052 | return 2; | ||
3053 | return 2; | ||
3054 | break; | ||
3055 | case SYNC_PREF_NEWEST: | ||
3056 | if ( localMod > remoteMod ) | ||
3057 | return 1; | ||
3058 | else | ||
3059 | return 2; | ||
3060 | break; | ||
3061 | case SYNC_PREF_ASK: | ||
3062 | //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); | ||
3063 | if ( lastSync > remoteMod ) | ||
3064 | return 1; | ||
3065 | if ( lastSync > localMod ) | ||
3066 | return 2; | ||
3067 | localIsNew = localMod >= remoteMod; | ||
3068 | //qDebug("conflict! ************************************** "); | ||
3069 | { | ||
3070 | PwMDataItemChooser acd ( *local,*remote, localIsNew , 0/*this*/ ); | ||
3071 | result = acd.executeD(localIsNew); | ||
3072 | return result; | ||
3073 | } | ||
3074 | break; | ||
3075 | case SYNC_PREF_FORCE_LOCAL: | ||
3076 | return 1; | ||
3077 | break; | ||
3078 | case SYNC_PREF_FORCE_REMOTE: | ||
3079 | return 2; | ||
3080 | break; | ||
3081 | |||
3082 | default: | ||
3083 | // SYNC_PREF_TAKE_BOTH not implemented | ||
3084 | break; | ||
3085 | } | ||
3086 | return 0; | ||
3087 | } | ||
3088 | |||
3089 | |||
3090 | |||
2813 | 3091 | ||
2814 | //this are the overwritten callbackmethods from the syncinterface | 3092 | //this are the overwritten callbackmethods from the syncinterface |
2815 | bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode) | 3093 | bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode) |
2816 | { | 3094 | { |
2817 | QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); | 3095 | QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); |
2818 | 3096 | ||
2819 | // construct on the stack = automatic cleanup. | 3097 | // construct on the stack = automatic cleanup. |
2820 | PwMDoc syncTarget(this, "synctarget"); | 3098 | PwMDoc syncTarget(this, "synctarget"); |
2821 | 3099 | ||
2822 | PwMerror err = syncTarget.openDoc(&filename, 2 /*== deeplocked*/); | 3100 | PwMerror err = syncTarget.openDoc(&filename, 2 /*== deeplocked*/); |
2823 | 3101 | ||
2824 | if (err != e_success) | 3102 | if (err != e_success) |
2825 | return false; | 3103 | return false; |
2826 | 3104 | ||
2827 | qDebug("PWM file loaded %s,sync mode %d",filename.latin1(), mode ); | 3105 | qDebug("PWM file loaded %s,sync mode %d",filename.latin1(), mode ); |
2828 | 3106 | ||
2829 | 3107 | ||
2830 | err = syncronize(manager, this, &syncTarget, mode ); | 3108 | err = syncronize(manager, this, &syncTarget, mode ); |
2831 | 3109 | ||
2832 | if (err == e_success) { | 3110 | if (err == e_success) { |
2833 | if ( PWMPrefs::instance()->mWriteBackFile ){ | 3111 | if ( PWMPrefs::instance()->mWriteBackFile ){ |
2834 | qDebug("Saving remote PWManager file"); | 3112 | qDebug("Saving remote PWManager file"); |
2835 | err = syncTarget.saveDoc(conf()->confGlobCompression()); | 3113 | err = syncTarget.saveDoc(conf()->confGlobCompression()); |
2836 | if (err != e_success) | 3114 | if (err != e_success) |
@@ -2840,39 +3118,151 @@ bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode) | |||
2840 | 3118 | ||
2841 | flagDirty(); | 3119 | flagDirty(); |
2842 | return true; | 3120 | return true; |
2843 | } | 3121 | } |
2844 | else { | 3122 | else { |
2845 | return false; | 3123 | return false; |
2846 | } | 3124 | } |
2847 | } | 3125 | } |
2848 | 3126 | ||
2849 | //called by the syncmanager to indicate that the work has to marked as dirty. | 3127 | //called by the syncmanager to indicate that the work has to marked as dirty. |
2850 | void PwMDoc::sync_setModified() | 3128 | void PwMDoc::sync_setModified() |
2851 | { | 3129 | { |
2852 | flagDirty(); | 3130 | flagDirty(); |
2853 | } | 3131 | } |
2854 | 3132 | ||
2855 | //called by the syncmanager to ask if the dirty flag is set. | 3133 | //called by the syncmanager to ask if the dirty flag is set. |
2856 | bool PwMDoc::sync_isModified() | 3134 | bool PwMDoc::sync_isModified() |
2857 | { | 3135 | { |
2858 | return isDirty(); | 3136 | return isDirty(); |
2859 | } | 3137 | } |
2860 | 3138 | ||
2861 | //called by the syncmanager to indicate that the work has to be saved. | 3139 | //called by the syncmanager to indicate that the work has to be saved. |
2862 | void PwMDoc::sync_save() | 3140 | void PwMDoc::sync_save() |
2863 | { | 3141 | { |
2864 | PwMerror ret = saveDoc(conf()->confGlobCompression()); | 3142 | saveDoc(conf()->confGlobCompression()); |
2865 | } | 3143 | } |
2866 | |||
2867 | #endif | 3144 | #endif |
2868 | 3145 | ||
2869 | 3146 | ||
3147 | bool PwMDoc::findSyncData(const QString &syncname, unsigned int *index) | ||
3148 | { | ||
3149 | vector<PwMSyncItem>::iterator i = dti.syncDta.begin(), | ||
3150 | end = dti.syncDta.end(); | ||
3151 | |||
3152 | while (i != end) { | ||
3153 | if ((*i).syncName == syncname.latin1()) { | ||
3154 | if (index) { | ||
3155 | *index = i - dti.syncDta.begin(); | ||
3156 | } | ||
3157 | return true; | ||
3158 | } | ||
3159 | ++i; | ||
3160 | } | ||
3161 | return false; | ||
3162 | }; | ||
3163 | |||
3164 | /** add new syncdataentry */ | ||
3165 | PwMerror PwMDoc::addSyncDataEntry(PwMSyncItem *d, bool dontFlagDirty) | ||
3166 | { | ||
3167 | PWM_ASSERT(d); | ||
3168 | |||
3169 | if (isDeepLocked()) { | ||
3170 | PwMerror ret; | ||
3171 | ret = deepLock(false); | ||
3172 | if (ret != e_success) | ||
3173 | return e_lock; | ||
3174 | } | ||
3175 | unsigned int index; | ||
3176 | |||
3177 | const QString tmp = d->syncName.c_str(); | ||
3178 | bool exists = findSyncData(d->syncName.c_str(), &index); | ||
3179 | |||
3180 | if (exists == true) { | ||
3181 | // DOH! We found this entry. | ||
3182 | return e_entryExists; | ||
3183 | } | ||
3184 | |||
3185 | dti.syncDta.push_back(*d); | ||
3186 | |||
3187 | if (!dontFlagDirty) | ||
3188 | flagDirty(); | ||
3189 | return e_success; | ||
3190 | } | ||
3191 | |||
3192 | |||
2870 | 3193 | ||
3194 | /** delete syncdata entry */ | ||
3195 | bool PwMDoc::delSyncDataEntry(unsigned int index, bool dontFlagDirty) | ||
3196 | { | ||
3197 | if (isDeepLocked()) | ||
3198 | return false; | ||
3199 | if (index > dti.syncDta.size() - 1) | ||
3200 | return false; | ||
3201 | |||
3202 | // delete entry | ||
3203 | dti.syncDta.erase(dti.syncDta.begin() + index); | ||
3204 | |||
3205 | if (!dontFlagDirty) | ||
3206 | flagDirty(); | ||
3207 | return true; | ||
3208 | } | ||
3209 | |||
3210 | |||
3211 | PwMDataItem* PwMDoc::findEntryByID(const QString &uid, unsigned int *category, unsigned int *index) | ||
3212 | { | ||
3213 | vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(), | ||
3214 | catend = dti.dta.end(); | ||
3215 | |||
3216 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; | ||
3217 | |||
3218 | while (catcounter != catend) { | ||
3219 | entrBegin = catcounter->d.begin(); | ||
3220 | entrEnd = catcounter->d.end(); | ||
3221 | entrI = entrBegin; | ||
3222 | while (entrI != entrEnd) { | ||
3223 | if ((*entrI).meta.uniqueid == uid.latin1()) { | ||
3224 | if (category) | ||
3225 | *category = catcounter - dti.dta.begin(); | ||
3226 | if (index) | ||
3227 | *index = entrI - entrBegin; | ||
3228 | |||
3229 | return &(*entrI); | ||
3230 | } | ||
3231 | ++entrI; | ||
3232 | } | ||
3233 | ++catcounter; | ||
3234 | } | ||
3235 | |||
3236 | return 0; | ||
3237 | } | ||
3238 | |||
3239 | QStringList PwMDoc::getIDEntryList() | ||
3240 | { | ||
3241 | QStringList results; | ||
3242 | |||
3243 | vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(), | ||
3244 | catend = dti.dta.end(); | ||
3245 | |||
3246 | vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; | ||
3247 | |||
3248 | while (catcounter != catend) { | ||
3249 | entrBegin = catcounter->d.begin(); | ||
3250 | entrEnd = catcounter->d.end(); | ||
3251 | entrI = entrBegin; | ||
3252 | while (entrI != entrEnd) { | ||
3253 | results.append( (*entrI).meta.uniqueid ); | ||
3254 | ++entrI; | ||
3255 | } | ||
3256 | ++catcounter; | ||
3257 | } | ||
3258 | |||
3259 | return results; | ||
3260 | } | ||
2871 | 3261 | ||
2872 | 3262 | ||
2873 | 3263 | ||
2874 | 3264 | ||
2875 | 3265 | ||
2876 | #ifndef PWM_EMBEDDED | 3266 | #ifndef PWM_EMBEDDED |
2877 | #include "pwmdoc.moc" | 3267 | #include "pwmdoc.moc" |
2878 | #endif | 3268 | #endif |
diff --git a/pwmanager/pwmanager/pwmdoc.h b/pwmanager/pwmanager/pwmdoc.h index ea4d687..91277f6 100644 --- a/pwmanager/pwmanager/pwmdoc.h +++ b/pwmanager/pwmanager/pwmdoc.h | |||
@@ -185,64 +185,90 @@ struct PwMDataItem | |||
185 | /** data revision counter. This counter can be used | 185 | /** data revision counter. This counter can be used |
186 | * to easily, efficiently determine if this data item | 186 | * to easily, efficiently determine if this data item |
187 | * has changed since some time. | 187 | * has changed since some time. |
188 | * This counter is incremented on every update. | 188 | * This counter is incremented on every update. |
189 | */ | 189 | */ |
190 | unsigned int rev; | 190 | unsigned int rev; |
191 | 191 | ||
192 | void clear(bool clearMeta = true) | 192 | void clear(bool clearMeta = true) |
193 | { | 193 | { |
194 | /* NOTE: Don't use .clear() here to be | 194 | /* NOTE: Don't use .clear() here to be |
195 | * backward compatible with gcc-2 (Debian Woody) | 195 | * backward compatible with gcc-2 (Debian Woody) |
196 | */ | 196 | */ |
197 | desc = ""; | 197 | desc = ""; |
198 | name = ""; | 198 | name = ""; |
199 | pw = ""; | 199 | pw = ""; |
200 | comment = ""; | 200 | comment = ""; |
201 | url = ""; | 201 | url = ""; |
202 | launcher = ""; | 202 | launcher = ""; |
203 | lockStat = true; | 203 | lockStat = true; |
204 | listViewPos = -1; | 204 | listViewPos = -1; |
205 | binary = false; | 205 | binary = false; |
206 | if (clearMeta) | 206 | if (clearMeta) |
207 | meta.clear(); | 207 | meta.clear(); |
208 | } | 208 | } |
209 | |||
209 | }; | 210 | }; |
210 | 211 | ||
211 | struct PwMCategoryItem | 212 | struct PwMCategoryItem |
212 | { | 213 | { |
213 | /** all PwMDataItems (all passwords) within this category */ | 214 | /** all PwMDataItems (all passwords) within this category */ |
214 | vector<PwMDataItem>d; | 215 | vector<PwMDataItem>d; |
215 | /** category name/description */ | 216 | /** category name/description */ |
216 | string name; | 217 | string name; |
217 | 218 | ||
218 | void clear() | 219 | void clear() |
219 | { | 220 | { |
220 | d.clear(); | 221 | d.clear(); |
221 | name = ""; | 222 | name = ""; |
222 | } | 223 | } |
223 | }; | 224 | }; |
224 | 225 | ||
226 | struct PwMSyncItem | ||
227 | { | ||
228 | string syncName; | ||
229 | QDateTime lastSyncDate; | ||
230 | |||
231 | void clear() | ||
232 | { | ||
233 | lastSyncDate = QDateTime(); | ||
234 | syncName = ""; | ||
235 | } | ||
236 | }; | ||
237 | |||
238 | struct PwMItem | ||
239 | { | ||
240 | vector<PwMCategoryItem> dta; | ||
241 | vector<PwMSyncItem> syncDta; | ||
242 | |||
243 | void clear() | ||
244 | { | ||
245 | dta.clear(); | ||
246 | syncDta.clear(); | ||
247 | } | ||
248 | }; | ||
249 | |||
250 | |||
225 | /** "Function Object" for sort()ing PwMDataItem::listViewPos */ | 251 | /** "Function Object" for sort()ing PwMDataItem::listViewPos */ |
226 | class dta_lvp_greater | 252 | class dta_lvp_greater |
227 | { | 253 | { |
228 | public: | 254 | public: |
229 | bool operator() (const pair<unsigned int, unsigned int> &d1, | 255 | bool operator() (const pair<unsigned int, unsigned int> &d1, |
230 | const pair<unsigned int, unsigned int> &d2) | 256 | const pair<unsigned int, unsigned int> &d2) |
231 | { | 257 | { |
232 | return d1.second > d2.second; | 258 | return d1.second > d2.second; |
233 | } | 259 | } |
234 | }; | 260 | }; |
235 | 261 | ||
236 | /** list of PwMDoc documents and it's IDs */ | 262 | /** list of PwMDoc documents and it's IDs */ |
237 | class PwMDocList | 263 | class PwMDocList |
238 | { | 264 | { |
239 | public: | 265 | public: |
240 | struct listItem | 266 | struct listItem |
241 | { | 267 | { |
242 | /** document filename (known as ID, here) */ | 268 | /** document filename (known as ID, here) */ |
243 | string docId; | 269 | string docId; |
244 | /** pointer to the document class */ | 270 | /** pointer to the document class */ |
245 | PwMDoc *doc; | 271 | PwMDoc *doc; |
246 | }; | 272 | }; |
247 | 273 | ||
248 | PwMDocList() {} | 274 | PwMDocList() {} |
@@ -419,81 +445,82 @@ public: | |||
419 | unsigned int index, PwMDataItem *d, bool updateMeta = true); | 445 | unsigned int index, PwMDataItem *d, bool updateMeta = true); |
420 | /** finds the category with the "name" and return it's index */ | 446 | /** finds the category with the "name" and return it's index */ |
421 | bool findCategory(const QString &name, unsigned int *index); | 447 | bool findCategory(const QString &name, unsigned int *index); |
422 | /** search for an entry "find" and check while searching only for | 448 | /** search for an entry "find" and check while searching only for |
423 | * the data-fields specified by "searchIn". To set the "searchIn" | 449 | * the data-fields specified by "searchIn". To set the "searchIn" |
424 | * value, we may use one or more of the SEARCH_IN_* defines at | 450 | * value, we may use one or more of the SEARCH_IN_* defines at |
425 | * the top of this header-file. It returns the positions of all | 451 | * the top of this header-file. It returns the positions of all |
426 | * matched entries in "foundPositions". If "breakAfterFound" is true, | 452 | * matched entries in "foundPositions". If "breakAfterFound" is true, |
427 | * the function terminates after the first occurence of the entry | 453 | * the function terminates after the first occurence of the entry |
428 | * and doesn't go on searching. So foundPositions->size() is never | 454 | * and doesn't go on searching. So foundPositions->size() is never |
429 | * > 1 if breakAfterFound is true. | 455 | * > 1 if breakAfterFound is true. |
430 | */ | 456 | */ |
431 | void findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn, | 457 | void findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn, |
432 | vector<unsigned int> *foundPositions, bool breakAfterFound = false, | 458 | vector<unsigned int> *foundPositions, bool breakAfterFound = false, |
433 | bool caseSensitive = true, bool exactWordMatch = true, | 459 | bool caseSensitive = true, bool exactWordMatch = true, |
434 | bool sortByLvp = false); | 460 | bool sortByLvp = false); |
435 | /** see the above funtion. This function allows to set the category by name. */ | 461 | /** see the above funtion. This function allows to set the category by name. */ |
436 | void findEntry(const QString &category, PwMDataItem find, unsigned int searchIn, | 462 | void findEntry(const QString &category, PwMDataItem find, unsigned int searchIn, |
437 | vector<unsigned int> *foundPositions, bool breakAfterFound = false, | 463 | vector<unsigned int> *foundPositions, bool breakAfterFound = false, |
438 | bool caseSensitive = true, bool exactWordMatch = true, | 464 | bool caseSensitive = true, bool exactWordMatch = true, |
439 | bool sortByLvp = false); | 465 | bool sortByLvp = false); |
440 | /** returns number of entries */ | 466 | /** returns number of entries */ |
441 | unsigned int numEntries(const QString &category); | 467 | unsigned int numEntries(const QString &category); |
442 | unsigned int numEntries(unsigned int category) | 468 | unsigned int numEntries(unsigned int category) |
443 | { return dta[category].d.size(); } | 469 | { return dti.dta[category].d.size(); } |
444 | /** returns number of categories */ | 470 | /** returns number of categories */ |
445 | unsigned int numCategories() | 471 | unsigned int numCategories() |
446 | { return dta.size(); } | 472 | { return dti.dta.size(); } |
447 | /** returns the name of the category at "index" */ | 473 | /** returns the name of the category at "index" */ |
448 | const string* getCategory(unsigned int index) | 474 | const string* getCategory(unsigned int index) |
449 | { return (&(dta[index].name)); } | 475 | { return (&(dti.dta[index].name)); } |
476 | |||
450 | /** returns the data of item at "index". | 477 | /** returns the data of item at "index". |
451 | * It unlocks the entry if it's locked and unlockIfLocked is true. | 478 | * It unlocks the entry if it's locked and unlockIfLocked is true. |
452 | * If the entry is locked, but unlockIfLocked is false, it'll not return | 479 | * If the entry is locked, but unlockIfLocked is false, it'll not return |
453 | * the pw. | 480 | * the pw. |
454 | */ | 481 | */ |
455 | bool getEntry(const QString &category, unsigned int index, | 482 | bool getEntry(const QString &category, unsigned int index, |
456 | PwMDataItem *d, bool unlockIfLocked = false); | 483 | PwMDataItem *d, bool unlockIfLocked = false); |
457 | bool getEntry(unsigned int category, unsigned int index, | 484 | bool getEntry(unsigned int category, unsigned int index, |
458 | PwMDataItem *d, bool unlockIfLocked = false); | 485 | PwMDataItem *d, bool unlockIfLocked = false); |
459 | /** returns the comment-string by looking at the category | 486 | /** returns the comment-string by looking at the category |
460 | * and the listViewPos | 487 | * and the listViewPos |
461 | */ | 488 | */ |
462 | PwMerror getCommentByLvp(const QString &category, int listViewPos, | 489 | PwMerror getCommentByLvp(const QString &category, int listViewPos, |
463 | string *foundComment); | 490 | string *foundComment); |
464 | /** checks if a password is already available. (currentPw) */ | 491 | /** checks if a password is already available. (currentPw) */ |
465 | bool isPwAvailable() | 492 | bool isPwAvailable() |
466 | { return (currentPw != ""); } | 493 | { return (currentPw != ""); } |
467 | /** un/lock entry at "index". If needed, ask for password. */ | 494 | /** un/lock entry at "index". If needed, ask for password. */ |
468 | bool lockAt(const QString &category, unsigned int index, | 495 | bool lockAt(const QString &category, unsigned int index, |
469 | bool lock = true); | 496 | bool lock = true); |
470 | bool lockAt(unsigned int category, unsigned int index, | 497 | bool lockAt(unsigned int category, unsigned int index, |
471 | bool lock = true); | 498 | bool lock = true); |
472 | /** returns the lock-status at "index" */ | 499 | /** returns the lock-status at "index" */ |
473 | bool isLocked(const QString &category, unsigned int index); | 500 | bool isLocked(const QString &category, unsigned int index); |
474 | bool isLocked(unsigned int category, unsigned int index) | 501 | bool isLocked(unsigned int category, unsigned int index) |
475 | { return dta[category].d[index].lockStat; } | 502 | { return dti.dta[category].d[index].lockStat; } |
476 | /** returns the deeplock status */ | 503 | /** returns the deeplock status */ |
477 | bool isDeepLocked() | 504 | bool isDeepLocked() |
478 | { return getDocStatFlag(DOC_STAT_DEEPLOCKED); } | 505 | { return getDocStatFlag(DOC_STAT_DEEPLOCKED); } |
479 | /** (un)lock all entries */ | 506 | /** (un)lock all entries */ |
480 | bool lockAll(bool lock); | 507 | bool lockAll(bool lock); |
481 | /** unlocks all entries tempoarly. | 508 | /** unlocks all entries tempoarly. |
482 | * 1st NOTE: Be very careful with this function! :) | 509 | * 1st NOTE: Be very careful with this function! :) |
483 | * 2nd NOTE: After you have called unlockAll_Tempoary(); , | 510 | * 2nd NOTE: After you have called unlockAll_Tempoary(); , |
484 | * please DON'T forget to call unlockAll_Tempoary(true); | 511 | * please DON'T forget to call unlockAll_Tempoary(true); |
485 | * _before_ the user (or someone else) is able to change | 512 | * _before_ the user (or someone else) is able to change |
486 | * the document! | 513 | * the document! |
487 | * 3rd NOTE: Please DON'T change "dta" while the data is tempoary | 514 | * 3rd NOTE: Please DON'T change "dta" while the data is tempoary |
488 | * unlocked! This will cause corruption. | 515 | * unlocked! This will cause corruption. |
489 | */ | 516 | */ |
490 | bool unlockAll_tempoary(bool revert = false); | 517 | bool unlockAll_tempoary(bool revert = false); |
491 | /** deep-(un)locks the document. | 518 | /** deep-(un)locks the document. |
492 | * deep-locking writes all data to the file, deletes all data | 519 | * deep-locking writes all data to the file, deletes all data |
493 | * in memory, but doesn't close the document. | 520 | * in memory, but doesn't close the document. |
494 | * deep-locking is only available, if the user previously saved | 521 | * deep-locking is only available, if the user previously saved |
495 | * the doc to a file (with a password). | 522 | * the doc to a file (with a password). |
496 | * If "saveToFile" is false, it does NOT write the data to the file! | 523 | * If "saveToFile" is false, it does NOT write the data to the file! |
497 | */ | 524 | */ |
498 | PwMerror deepLock(bool lock = true, bool saveToFile = true); | 525 | PwMerror deepLock(bool lock = true, bool saveToFile = true); |
499 | /** is unlockable without pw? */ | 526 | /** is unlockable without pw? */ |
@@ -553,89 +580,91 @@ public: | |||
553 | /** returns the list-view-pointer */ | 580 | /** returns the list-view-pointer */ |
554 | PwMView * getListViewPointer() | 581 | PwMView * getListViewPointer() |
555 | { return listView; } | 582 | { return listView; } |
556 | /** try to delete the doc. The user may be asked to save | 583 | /** try to delete the doc. The user may be asked to save |
557 | * the data. The user may cancel the whole operation. | 584 | * the data. The user may cancel the whole operation. |
558 | * false is returned, then. | 585 | * false is returned, then. |
559 | */ | 586 | */ |
560 | bool tryDelete(); | 587 | bool tryDelete(); |
561 | /** is the doc deleted? (with tryDelete() ) */ | 588 | /** is the doc deleted? (with tryDelete() ) */ |
562 | bool isDeleted() | 589 | bool isDeleted() |
563 | { return deleted; } | 590 | { return deleted; } |
564 | /** returns the document timer object */ | 591 | /** returns the document timer object */ |
565 | DocTimer * timer() | 592 | DocTimer * timer() |
566 | { return _timer; } | 593 | { return _timer; } |
567 | /** get a lock on the dataChanged signal. | 594 | /** get a lock on the dataChanged signal. |
568 | * If someone is holding a lock, the signal is not emitted. | 595 | * If someone is holding a lock, the signal is not emitted. |
569 | */ | 596 | */ |
570 | void getDataChangedLock() | 597 | void getDataChangedLock() |
571 | { ++dataChangedLock; } | 598 | { ++dataChangedLock; } |
572 | /** put the dataChanged lock */ | 599 | /** put the dataChanged lock */ |
573 | void putDataChangedLock() | 600 | void putDataChangedLock() |
574 | { --dataChangedLock; } | 601 | { --dataChangedLock; } |
575 | /** returns the revision count of the item at cat/index */ | 602 | /** returns the revision count of the item at cat/index */ |
576 | unsigned int getEntryRevCnt(unsigned int category, unsigned int index) | 603 | unsigned int getEntryRevCnt(unsigned int category, unsigned int index) |
577 | { return dta[category].d[index].rev; } | 604 | { return dti.dta[category].d[index].rev; } |
578 | /** returns a const pointer to the entries meta */ | 605 | /** returns a const pointer to the entries meta */ |
579 | const PwMMetaData * getEntryMeta(unsigned int category, unsigned int index) | 606 | const PwMMetaData * getEntryMeta(unsigned int category, unsigned int index) |
580 | { return &(dta[category].d[index].meta); } | 607 | { return &(dti.dta[category].d[index].meta); } |
581 | /** is the entry at "category" "index" a binary entry? */ | 608 | /** is the entry at "category" "index" a binary entry? */ |
582 | bool isBinEntry(unsigned int category, unsigned int index) | 609 | bool isBinEntry(unsigned int category, unsigned int index) |
583 | { return dta[category].d[index].binary; } | 610 | { return dti.dta[category].d[index].binary; } |
584 | 611 | ||
585 | public slots: | 612 | public slots: |
586 | /** wrapper for PwMTray */ | 613 | /** wrapper for PwMTray */ |
587 | void _deepUnlock(); | 614 | void _deepUnlock(); |
588 | 615 | ||
589 | signals: | 616 | signals: |
590 | /** the data of the document has changed and must be updated | 617 | /** the data of the document has changed and must be updated |
591 | * in all views. | 618 | * in all views. |
592 | * NOTE: use emitDataChanged(PwMDoc *document) to emit this signal! | 619 | * NOTE: use emitDataChanged(PwMDoc *document) to emit this signal! |
593 | */ | 620 | */ |
594 | void dataChanged(PwMDoc *document); | 621 | void dataChanged(PwMDoc *document); |
595 | /** the document class is going to close. This signal may be | 622 | /** the document class is going to close. This signal may be |
596 | * used to nofify all views, that the user closed the document, | 623 | * used to nofify all views, that the user closed the document, |
597 | * so the views can go down, too. | 624 | * so the views can go down, too. |
598 | */ | 625 | */ |
599 | void docClosed(PwMDoc *document); | 626 | void docClosed(PwMDoc *document); |
600 | /** somebody just opened the document */ | 627 | /** somebody just opened the document */ |
601 | void docOpened(PwMDoc *document); | 628 | void docOpened(PwMDoc *document); |
602 | /** this document object just got created */ | 629 | /** this document object just got created */ |
603 | void docCreated(PwMDoc *document); | 630 | void docCreated(PwMDoc *document); |
604 | 631 | ||
605 | public: | 632 | public: |
606 | /** emit the dataChanged signal after checking for a lock */ | 633 | /** emit the dataChanged signal after checking for a lock */ |
607 | void emitDataChanged(PwMDoc *document) | 634 | void emitDataChanged(PwMDoc *document) |
608 | { | 635 | { |
609 | if (!dataChangedLock) | 636 | if (!dataChangedLock) |
610 | emit dataChanged(document); | 637 | emit dataChanged(document); |
611 | } | 638 | } |
612 | 639 | ||
613 | protected: | 640 | protected: |
614 | /** current file for this doc */ | 641 | /** current file for this doc */ |
615 | QString filename; | 642 | QString filename; |
643 | //US ENH: we need a place where we keep the syncentries. So I invented | ||
644 | // struct PwMItem, that has a vector of PwMCategoryItem and vector of PwMSyncItem | ||
616 | /** holds all data */ | 645 | /** holds all data */ |
617 | vector<PwMCategoryItem> dta; | 646 | PwMItem dti; |
618 | /** maximum number of entries */ | 647 | /** maximum number of entries */ |
619 | unsigned int maxEntries; | 648 | unsigned int maxEntries; |
620 | /** currently used password to encrypt data */ | 649 | /** currently used password to encrypt data */ |
621 | QString currentPw; | 650 | QString currentPw; |
622 | /** current global document status flags */ | 651 | /** current global document status flags */ |
623 | unsigned int curDocStat; | 652 | unsigned int curDocStat; |
624 | /** browser process for goToURL() */ | 653 | /** browser process for goToURL() */ |
625 | KProcess browserProc; | 654 | KProcess browserProc; |
626 | /** pointer to the list-view, using this document. | 655 | /** pointer to the list-view, using this document. |
627 | * As there can only be one list-view per doc, we | 656 | * As there can only be one list-view per doc, we |
628 | * don't need a list here. | 657 | * don't need a list here. |
629 | */ | 658 | */ |
630 | PwMView *listView; | 659 | PwMView *listView; |
631 | /** unnamedNum is used to store the "unnamed counter" | 660 | /** unnamedNum is used to store the "unnamed counter" |
632 | * for this document, while it's unnamed. If it's 0, | 661 | * for this document, while it's unnamed. If it's 0, |
633 | * we have to get a new unique one. | 662 | * we have to get a new unique one. |
634 | */ | 663 | */ |
635 | unsigned int unnamedNum; | 664 | unsigned int unnamedNum; |
636 | /** is this doc going to be deleted (executing in destructor context) */ | 665 | /** is this doc going to be deleted (executing in destructor context) */ |
637 | bool deleted; | 666 | bool deleted; |
638 | /** document timer */ | 667 | /** document timer */ |
639 | DocTimer *_timer; | 668 | DocTimer *_timer; |
640 | /** lock counter for the "dataChanged" signal */ | 669 | /** lock counter for the "dataChanged" signal */ |
641 | unsigned int dataChangedLock; | 670 | unsigned int dataChangedLock; |
@@ -686,39 +715,64 @@ protected: | |||
686 | { curDocStat |= statFlag; } | 715 | { curDocStat |= statFlag; } |
687 | /** unset a document status flag */ | 716 | /** unset a document status flag */ |
688 | void unsetDocStatFlag(unsigned int statFlag) | 717 | void unsetDocStatFlag(unsigned int statFlag) |
689 | { curDocStat &= ~statFlag; } | 718 | { curDocStat &= ~statFlag; } |
690 | /** get a document status flag */ | 719 | /** get a document status flag */ |
691 | bool getDocStatFlag(unsigned int statFlag) const | 720 | bool getDocStatFlag(unsigned int statFlag) const |
692 | { return (curDocStat & statFlag); } | 721 | { return (curDocStat & statFlag); } |
693 | /** set the "currentPassword" */ | 722 | /** set the "currentPassword" */ |
694 | void setCurrentPw(const QString &pw) | 723 | void setCurrentPw(const QString &pw) |
695 | { | 724 | { |
696 | currentPw = pw; | 725 | currentPw = pw; |
697 | setDocStatFlag(DOC_STAT_DISK_DIRTY); | 726 | setDocStatFlag(DOC_STAT_DISK_DIRTY); |
698 | } | 727 | } |
699 | /** make a backup-copy of the given file */ | 728 | /** make a backup-copy of the given file */ |
700 | bool backupFile(const QString &filePath); | 729 | bool backupFile(const QString &filePath); |
701 | /** copy a file from src to dst */ | 730 | /** copy a file from src to dst */ |
702 | bool copyFile(const QString &src, const QString &dst); | 731 | bool copyFile(const QString &src, const QString &dst); |
703 | 732 | ||
704 | 733 | ||
705 | public: | 734 | public: |
706 | #ifdef PWM_EMBEDDED | 735 | #ifdef PWM_EMBEDDED |
707 | //US ENH: this is the magic function that syncronizes the local doc with the remote doc. | 736 | //US ENH: this is the magic function that syncronizes the local doc with the remote doc. |
708 | PwMerror syncronize(KSyncManager* manager, PwMDoc* syncLocal, PwMDoc* syncRemote, int mode ); | 737 | PwMerror syncronize(KSyncManager* manager, PwMDoc* syncLocal, PwMDoc* syncRemote, int mode ); |
709 | 738 | ||
739 | //takePwMDataItem returns the following values | ||
740 | // 0 equal | ||
741 | // 1 take local | ||
742 | // 2 take remote | ||
743 | // 3 cancel | ||
744 | int takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime lastSync, int mode , bool full ); | ||
710 | 745 | ||
711 | //the following methods are the overwritten callbackmethods from the syncinterface | 746 | //the following methods are the overwritten callbackmethods from the syncinterface |
712 | virtual bool sync(KSyncManager* manager, QString filename, int mode); | 747 | virtual bool sync(KSyncManager* manager, QString filename, int mode); |
713 | 748 | ||
714 | //called by the syncmanager to indicate that the work has to be marked as dirty. | 749 | //called by the syncmanager to indicate that the work has to be marked as dirty. |
715 | virtual void sync_setModified(); | 750 | virtual void sync_setModified(); |
716 | //called by the syncmanager to ask if the dirty flag is set. | 751 | //called by the syncmanager to ask if the dirty flag is set. |
717 | virtual bool sync_isModified(); | 752 | virtual bool sync_isModified(); |
718 | //called by the syncmanager to indicate that the work has to be saved. | 753 | //called by the syncmanager to indicate that the work has to be saved. |
719 | virtual void sync_save(); | 754 | virtual void sync_save(); |
755 | |||
720 | #endif | 756 | #endif |
757 | private: | ||
758 | //US ENH: helpermethods to access the sync data for a certain syncname. | ||
759 | // It returns the syncdatas index | ||
760 | bool findSyncData(const QString &syncname, unsigned int *index); | ||
761 | |||
762 | /** add new syncdataentry */ | ||
763 | PwMerror addSyncDataEntry(PwMSyncItem *d, bool dontFlagDirty = false); | ||
764 | |||
765 | /** returns a pointer to the syncdata */ | ||
766 | PwMSyncItem* getSyncDataEntry(unsigned int index) | ||
767 | { return &(dti.syncDta[index]); } | ||
768 | |||
769 | /** delete entry */ | ||
770 | bool delSyncDataEntry(unsigned int index, bool dontFlagDirty = false); | ||
771 | |||
772 | PwMDataItem* findEntryByID(const QString &uid, unsigned int *category, unsigned int *index); | ||
773 | |||
774 | QStringList getIDEntryList(); | ||
721 | 775 | ||
722 | }; | 776 | }; |
723 | 777 | ||
724 | #endif | 778 | #endif |
diff --git a/pwmanager/pwmanager/pwmdocui.cpp b/pwmanager/pwmanager/pwmdocui.cpp index 5e675fc..41afa6a 100644 --- a/pwmanager/pwmanager/pwmdocui.cpp +++ b/pwmanager/pwmanager/pwmdocui.cpp | |||
@@ -255,49 +255,49 @@ bool PwMDocUi::saveDocUi(PwMDoc *doc) | |||
255 | i18n("nothing to do")); | 255 | i18n("nothing to do")); |
256 | doc->timer()->putLock(DocTimer::id_autoLockTimer); | 256 | doc->timer()->putLock(DocTimer::id_autoLockTimer); |
257 | return true; | 257 | return true; |
258 | } | 258 | } |
259 | PwMerror ret = doc->saveDoc(conf()->confGlobCompression()); | 259 | PwMerror ret = doc->saveDoc(conf()->confGlobCompression()); |
260 | if (ret == e_filename) { | 260 | if (ret == e_filename) { |
261 | doc->timer()->putLock(DocTimer::id_autoLockTimer); | 261 | doc->timer()->putLock(DocTimer::id_autoLockTimer); |
262 | return saveAsDocUi(doc); | 262 | return saveAsDocUi(doc); |
263 | } else if (ret == e_weakPw) { | 263 | } else if (ret == e_weakPw) { |
264 | KMessageBox::error(currentView, | 264 | KMessageBox::error(currentView, |
265 | i18n("Error: This is a weak password.\n" | 265 | i18n("Error: This is a weak password.\n" |
266 | "Please select another password."), | 266 | "Please select another password."), |
267 | i18n("weak password")); | 267 | i18n("weak password")); |
268 | doc->timer()->putLock(DocTimer::id_autoLockTimer); | 268 | doc->timer()->putLock(DocTimer::id_autoLockTimer); |
269 | return false; | 269 | return false; |
270 | } else if (ret == e_fileBackup) { | 270 | } else if (ret == e_fileBackup) { |
271 | KMessageBox::error(currentView, | 271 | KMessageBox::error(currentView, |
272 | i18n("Error: Couldn't make backup-file!"), | 272 | i18n("Error: Couldn't make backup-file!"), |
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_success) { | 276 | } else if (ret != e_success) { |
277 | KMessageBox::error(currentView, | 277 | KMessageBox::error(currentView, |
278 | i18n("Error: Couldn't write to file.\n" | 278 | i18n("Error: Couldn't write to file.\n" |
279 | "Please check if you have permission to " | 279 | "Please check if you have permission to\n" |
280 | "write to the file in that directory."), | 280 | "write to the file in that directory."), |
281 | i18n("error while writing")); | 281 | i18n("error while writing")); |
282 | doc->timer()->putLock(DocTimer::id_autoLockTimer); | 282 | doc->timer()->putLock(DocTimer::id_autoLockTimer); |
283 | return false; | 283 | return false; |
284 | } | 284 | } |
285 | doc->timer()->putLock(DocTimer::id_autoLockTimer); | 285 | doc->timer()->putLock(DocTimer::id_autoLockTimer); |
286 | return true; | 286 | return true; |
287 | } | 287 | } |
288 | 288 | ||
289 | bool PwMDocUi::saveAsDocUi(PwMDoc *doc) | 289 | bool PwMDocUi::saveAsDocUi(PwMDoc *doc) |
290 | { | 290 | { |
291 | PWM_ASSERT(doc); | 291 | PWM_ASSERT(doc); |
292 | doc->timer()->getLock(DocTimer::id_autoLockTimer); | 292 | doc->timer()->getLock(DocTimer::id_autoLockTimer); |
293 | if (doc->isDocEmpty()) { | 293 | if (doc->isDocEmpty()) { |
294 | KMessageBox::information(currentView, | 294 | KMessageBox::information(currentView, |
295 | i18n | 295 | i18n |
296 | ("Sorry, there's nothing to save.\n" | 296 | ("Sorry, there's nothing to save.\n" |
297 | "Please first add some passwords."), | 297 | "Please first add some passwords."), |
298 | i18n("nothing to do")); | 298 | i18n("nothing to do")); |
299 | doc->timer()->putLock(DocTimer::id_autoLockTimer); | 299 | doc->timer()->putLock(DocTimer::id_autoLockTimer); |
300 | return true; | 300 | return true; |
301 | } | 301 | } |
302 | #ifndef PWM_EMBEDDED | 302 | #ifndef PWM_EMBEDDED |
303 | QString fn(KFileDialog::getSaveFileName(QString::null, | 303 | QString fn(KFileDialog::getSaveFileName(QString::null, |
diff --git a/pwmanager/pwmanager/pwmexception.h b/pwmanager/pwmanager/pwmexception.h index c8a8c0f..301ebd7 100644 --- a/pwmanager/pwmanager/pwmexception.h +++ b/pwmanager/pwmanager/pwmexception.h | |||
@@ -138,48 +138,49 @@ enum PwMerror { | |||
138 | e_weakPw, | 138 | e_weakPw, |
139 | e_noPw, | 139 | e_noPw, |
140 | 140 | ||
141 | // action not implemented errors | 141 | // action not implemented errors |
142 | e_hashNotImpl, | 142 | e_hashNotImpl, |
143 | e_cryptNotImpl, | 143 | e_cryptNotImpl, |
144 | 144 | ||
145 | // argument/parameter errors | 145 | // argument/parameter errors |
146 | e_incompleteArg, | 146 | e_incompleteArg, |
147 | e_invalidArg, | 147 | e_invalidArg, |
148 | 148 | ||
149 | // misc | 149 | // misc |
150 | e_writeHeader, | 150 | e_writeHeader, |
151 | e_serializeDta, | 151 | e_serializeDta, |
152 | e_enc, | 152 | e_enc, |
153 | e_entryExists, | 153 | e_entryExists, |
154 | e_categoryExists, | 154 | e_categoryExists, |
155 | e_maxAllowedEntr,// no more entries can be added. | 155 | e_maxAllowedEntr,// no more entries can be added. |
156 | e_outOfMem, | 156 | e_outOfMem, |
157 | e_lock, // error while (un)locking | 157 | e_lock, // error while (un)locking |
158 | e_docNotSaved, // doc wasn't saved to a file, yet. | 158 | e_docNotSaved, // doc wasn't saved to a file, yet. |
159 | e_docIsEmpty, | 159 | e_docIsEmpty, |
160 | e_binEntry, | 160 | e_binEntry, |
161 | e_normalEntry, | 161 | e_normalEntry, |
162 | e_syncError, | ||
162 | 163 | ||
163 | e_generic | 164 | e_generic |
164 | }; | 165 | }; |
165 | 166 | ||
166 | /** can be used for general exception faults */ | 167 | /** can be used for general exception faults */ |
167 | class PwMException | 168 | class PwMException |
168 | { | 169 | { |
169 | public: | 170 | public: |
170 | enum exceptionId | 171 | enum exceptionId |
171 | { | 172 | { |
172 | EX_GENERIC = 0, | 173 | EX_GENERIC = 0, |
173 | EX_OPEN, | 174 | EX_OPEN, |
174 | EX_CLOSE, | 175 | EX_CLOSE, |
175 | EX_READ, | 176 | EX_READ, |
176 | EX_WRITE, | 177 | EX_WRITE, |
177 | EX_LOAD_MODULE, | 178 | EX_LOAD_MODULE, |
178 | EX_PARSE | 179 | EX_PARSE |
179 | }; | 180 | }; |
180 | 181 | ||
181 | public: | 182 | public: |
182 | PwMException(exceptionId id = EX_GENERIC, | 183 | PwMException(exceptionId id = EX_GENERIC, |
183 | const char *message = "") | 184 | const char *message = "") |
184 | { | 185 | { |
185 | exId = id; | 186 | exId = id; |
diff --git a/pwmanager/pwmanager/pwmview.cpp b/pwmanager/pwmanager/pwmview.cpp index d192119..e23ce25 100644 --- a/pwmanager/pwmanager/pwmview.cpp +++ b/pwmanager/pwmanager/pwmview.cpp | |||
@@ -14,48 +14,49 @@ | |||
14 | * This file is originaly based on version 1.0.1 of pwmanager | 14 | * This file is originaly based on version 1.0.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$ |
18 | **************************************************************************/ | 18 | **************************************************************************/ |
19 | 19 | ||
20 | #include "pwmview.h" | 20 | #include "pwmview.h" |
21 | #include "pwmexception.h" | 21 | #include "pwmexception.h" |
22 | #include "globalstuff.h" | 22 | #include "globalstuff.h" |
23 | #include "pwm.h" | 23 | #include "pwm.h" |
24 | #include "rencatwnd.h" | 24 | #include "rencatwnd.h" |
25 | #ifndef PWM_EMBEDDED | 25 | #ifndef PWM_EMBEDDED |
26 | #include "configuration.h" | 26 | #include "configuration.h" |
27 | #else | 27 | #else |
28 | #include "pwmprefs.h" | 28 | #include "pwmprefs.h" |
29 | #endif | 29 | #endif |
30 | #include "commentbox.h" | 30 | #include "commentbox.h" |
31 | 31 | ||
32 | #include <kmessagebox.h> | 32 | #include <kmessagebox.h> |
33 | #include <klocale.h> | 33 | #include <klocale.h> |
34 | 34 | ||
35 | #include <qlineedit.h> | 35 | #include <qlineedit.h> |
36 | #include <qpoint.h> | 36 | #include <qpoint.h> |
37 | #include <qapplication.h> | 37 | #include <qapplication.h> |
38 | #include <qlayout.h> | ||
38 | 39 | ||
39 | //US ENH: wouldn't it be a good idea if we could use this consts everywhere else. | 40 | //US ENH: wouldn't it be a good idea if we could use this consts everywhere else. |
40 | //US ENH: for examle in listviewpwm.cpp | 41 | //US ENH: for examle in listviewpwm.cpp |
41 | //US ENH: Because of that I transfer them into the headerfile. | 42 | //US ENH: Because of that I transfer them into the headerfile. |
42 | /* | 43 | /* |
43 | #define COLUMN_DESC 0 | 44 | #define COLUMN_DESC 0 |
44 | #define COLUMN_NAME 1 | 45 | #define COLUMN_NAME 1 |
45 | #define COLUMN_PW 2 | 46 | #define COLUMN_PW 2 |
46 | #define COLUMN_URL 3 | 47 | #define COLUMN_URL 3 |
47 | #define COLUMN_LAUNCHER 4 | 48 | #define COLUMN_LAUNCHER 4 |
48 | */ | 49 | */ |
49 | 50 | ||
50 | PwMView::PwMView(PwM *_mainClass, | 51 | PwMView::PwMView(PwM *_mainClass, |
51 | QWidget *parent, PwMDoc *_doc, | 52 | QWidget *parent, PwMDoc *_doc, |
52 | const char *name) | 53 | const char *name) |
53 | : PwMViewStyle(parent, name) | 54 | : PwMViewStyle(parent, name) |
54 | { | 55 | { |
55 | PWM_ASSERT(_mainClass); | 56 | PWM_ASSERT(_mainClass); |
56 | PWM_ASSERT(parent); | 57 | PWM_ASSERT(parent); |
57 | PWM_ASSERT(_doc); | 58 | PWM_ASSERT(_doc); |
58 | setView(this); | 59 | setView(this); |
59 | doc = _doc; | 60 | doc = _doc; |
60 | doc->setListViewPointer(this); | 61 | doc->setListViewPointer(this); |
61 | mainClass = _mainClass; | 62 | mainClass = _mainClass; |
@@ -434,27 +435,90 @@ void PwMView::copyUrlToClip() | |||
434 | void PwMView::copyLauncherToClip() | 435 | void PwMView::copyLauncherToClip() |
435 | { | 436 | { |
436 | if (doc->isDeepLocked()) | 437 | if (doc->isDeepLocked()) |
437 | return; | 438 | return; |
438 | unsigned int curIndex = 0; | 439 | unsigned int curIndex = 0; |
439 | if (!getCurEntryIndex(&curIndex)) | 440 | if (!getCurEntryIndex(&curIndex)) |
440 | return; | 441 | return; |
441 | PwMDataItem d; | 442 | PwMDataItem d; |
442 | document()->getEntry(getCurrentCategory(), curIndex, &d); | 443 | document()->getEntry(getCurrentCategory(), curIndex, &d); |
443 | PwM::copyToClipboard(d.launcher.c_str()); | 444 | PwM::copyToClipboard(d.launcher.c_str()); |
444 | } | 445 | } |
445 | 446 | ||
446 | void PwMView::copyCommentToClip() | 447 | void PwMView::copyCommentToClip() |
447 | { | 448 | { |
448 | if (doc->isDeepLocked()) | 449 | if (doc->isDeepLocked()) |
449 | return; | 450 | return; |
450 | unsigned int curIndex = 0; | 451 | unsigned int curIndex = 0; |
451 | if (!getCurEntryIndex(&curIndex)) | 452 | if (!getCurEntryIndex(&curIndex)) |
452 | return; | 453 | return; |
453 | PwMDataItem d; | 454 | PwMDataItem d; |
454 | document()->getEntry(getCurrentCategory(), curIndex, &d); | 455 | document()->getEntry(getCurrentCategory(), curIndex, &d); |
455 | PwM::copyToClipboard(d.comment.c_str()); | 456 | PwM::copyToClipboard(d.comment.c_str()); |
456 | } | 457 | } |
457 | 458 | ||
459 | |||
460 | |||
461 | |||
462 | PwMDataItemChooser::PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool takeloc, QWidget *parent, const char *name ) : KDialogBase(parent,name, | ||
463 | true ,i18n("Conflict! Please choose Entry!"),Ok|User1|Close,Close, false) | ||
464 | { | ||
465 | findButton( Close )->setText( i18n("Cancel Sync")); | ||
466 | findButton( Ok )->setText( i18n("Remote")); | ||
467 | findButton( User1 )->setText( i18n("Local")); | ||
468 | QWidget* topframe = new QWidget( this ); | ||
469 | setMainWidget( topframe ); | ||
470 | QBoxLayout* bl; | ||
471 | if ( QApplication::desktop()->width() < 640 ) { | ||
472 | bl = new QVBoxLayout( topframe ); | ||
473 | } else { | ||
474 | bl = new QHBoxLayout( topframe ); | ||
475 | } | ||
476 | QVBox* subframe = new QVBox( topframe ); | ||
477 | bl->addWidget(subframe ); | ||
478 | QLabel* lab = new QLabel( i18n("Local Entry"), subframe ); | ||
479 | if ( takeloc ) | ||
480 | lab->setBackgroundColor(Qt::green.light() ); | ||
481 | // AddresseeView * av = new AddresseeView( subframe ); | ||
482 | // av->setAddressee( loc ); | ||
483 | subframe = new QVBox( topframe ); | ||
484 | bl->addWidget(subframe ); | ||
485 | lab = new QLabel( i18n("Remote Entry"), subframe ); | ||
486 | if ( !takeloc ) | ||
487 | lab->setBackgroundColor(Qt::green.light() ); | ||
488 | // av = new AddresseeView( subframe ); | ||
489 | // av->setAddressee( rem ); | ||
490 | QObject::connect(findButton( Ok ),SIGNAL(clicked()),this, SLOT(slot_remote())); | ||
491 | QObject::connect(this,SIGNAL(user1Clicked()),this, SLOT(slot_local())); | ||
492 | #ifndef DESKTOP_VERSION | ||
493 | showMaximized(); | ||
494 | #else | ||
495 | resize ( 640, 400 ); | ||
496 | #endif | ||
497 | } | ||
498 | |||
499 | int PwMDataItemChooser::executeD( bool local ) | ||
500 | { | ||
501 | mSyncResult = 3; | ||
502 | if ( local ) | ||
503 | findButton( User1 )->setFocus(); | ||
504 | else | ||
505 | findButton( Ok )->setFocus(); | ||
506 | exec(); | ||
507 | return mSyncResult; | ||
508 | } | ||
509 | void PwMDataItemChooser::slot_remote() | ||
510 | { | ||
511 | mSyncResult = 2; | ||
512 | accept(); | ||
513 | } | ||
514 | void PwMDataItemChooser::slot_local() | ||
515 | { | ||
516 | mSyncResult = 1; | ||
517 | accept(); | ||
518 | } | ||
519 | |||
520 | |||
521 | |||
458 | #ifndef PWM_EMBEDDED | 522 | #ifndef PWM_EMBEDDED |
459 | #include "pwmview.moc" | 523 | #include "pwmview.moc" |
460 | #endif | 524 | #endif |
diff --git a/pwmanager/pwmanager/pwmview.h b/pwmanager/pwmanager/pwmview.h index 5a326d3..75cce51 100644 --- a/pwmanager/pwmanager/pwmview.h +++ b/pwmanager/pwmanager/pwmview.h | |||
@@ -15,48 +15,49 @@ | |||
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$ |
18 | **************************************************************************/ | 18 | **************************************************************************/ |
19 | 19 | ||
20 | #ifndef PWMVIEW_H | 20 | #ifndef PWMVIEW_H |
21 | #define PWMVIEW_H | 21 | #define PWMVIEW_H |
22 | 22 | ||
23 | //US ENH: wouldn't it be a good idea if we could use this consts everywhere else. | 23 | //US ENH: wouldn't it be a good idea if we could use this consts everywhere else. |
24 | //US ENH: for examle in listviewpwm.cpp | 24 | //US ENH: for examle in listviewpwm.cpp |
25 | //US ENH: Because of that I transfer them into the headerfile. | 25 | //US ENH: Because of that I transfer them into the headerfile. |
26 | #define COLUMN_DESC 0 | 26 | #define COLUMN_DESC 0 |
27 | #define COLUMN_NAME 1 | 27 | #define COLUMN_NAME 1 |
28 | #define COLUMN_PW 2 | 28 | #define COLUMN_PW 2 |
29 | #define COLUMN_URL 3 | 29 | #define COLUMN_URL 3 |
30 | #define COLUMN_LAUNCHER 4 | 30 | #define COLUMN_LAUNCHER 4 |
31 | 31 | ||
32 | 32 | ||
33 | #include "listviewpwm.h" | 33 | #include "listviewpwm.h" |
34 | #include "pwmdoc.h" | 34 | #include "pwmdoc.h" |
35 | #include "pwmviewstyle.h" | 35 | #include "pwmviewstyle.h" |
36 | 36 | ||
37 | #include <kconfig.h> | 37 | #include <kconfig.h> |
38 | #include <klocale.h> | 38 | #include <klocale.h> |
39 | #include <kdialogbase.h> | ||
39 | 40 | ||
40 | #include <qevent.h> | 41 | #include <qevent.h> |
41 | #include <qfont.h> | 42 | #include <qfont.h> |
42 | #include <qobject.h> | 43 | #include <qobject.h> |
43 | 44 | ||
44 | #include <vector> | 45 | #include <vector> |
45 | #include <string> | 46 | #include <string> |
46 | 47 | ||
47 | using std::string; | 48 | using std::string; |
48 | using std::vector; | 49 | using std::vector; |
49 | 50 | ||
50 | class PwM; | 51 | class PwM; |
51 | class ConfFile; | 52 | class ConfFile; |
52 | class PwMStatusBar; | 53 | class PwMStatusBar; |
53 | 54 | ||
54 | 55 | ||
55 | /** View class for PwM */ | 56 | /** View class for PwM */ |
56 | class PwMView : public PwMViewStyle | 57 | class PwMView : public PwMViewStyle |
57 | { | 58 | { |
58 | Q_OBJECT | 59 | Q_OBJECT |
59 | friend class PwMViewStyle; | 60 | friend class PwMViewStyle; |
60 | public: | 61 | public: |
61 | /** construtor */ | 62 | /** construtor */ |
62 | PwMView(PwM *_mainClass, QWidget* parent, PwMDoc *_doc, | 63 | PwMView(PwM *_mainClass, QWidget* parent, PwMDoc *_doc, |
@@ -126,25 +127,46 @@ protected slots: | |||
126 | /** copy pw to clipboard */ | 127 | /** copy pw to clipboard */ |
127 | void copyPwToClip(); | 128 | void copyPwToClip(); |
128 | /** copy name to clipboard */ | 129 | /** copy name to clipboard */ |
129 | void copyNameToClip(); | 130 | void copyNameToClip(); |
130 | /** copy desc to clipboard */ | 131 | /** copy desc to clipboard */ |
131 | void copyDescToClip(); | 132 | void copyDescToClip(); |
132 | /** copy url to clipboard */ | 133 | /** copy url to clipboard */ |
133 | void copyUrlToClip(); | 134 | void copyUrlToClip(); |
134 | /** copy launcher to clipboard */ | 135 | /** copy launcher to clipboard */ |
135 | void copyLauncherToClip(); | 136 | void copyLauncherToClip(); |
136 | /** copy comment to clipboard */ | 137 | /** copy comment to clipboard */ |
137 | void copyCommentToClip(); | 138 | void copyCommentToClip(); |
138 | /** reorganize the "listViewPos" positions in the document | 139 | /** reorganize the "listViewPos" positions in the document |
139 | * (for the current category only!) | 140 | * (for the current category only!) |
140 | */ | 141 | */ |
141 | void reorgLp(); | 142 | void reorgLp(); |
142 | 143 | ||
143 | private: | 144 | private: |
144 | /** document */ | 145 | /** document */ |
145 | PwMDoc *doc; | 146 | PwMDoc *doc; |
146 | /** pointer to the main class "PwM" */ | 147 | /** pointer to the main class "PwM" */ |
147 | PwM *mainClass; | 148 | PwM *mainClass; |
148 | }; | 149 | }; |
149 | 150 | ||
151 | |||
152 | //US ENH we need this chooser when syncing results in a conflict | ||
153 | class PwMDataItemChooser : public KDialogBase | ||
154 | { | ||
155 | Q_OBJECT | ||
156 | |||
157 | public: | ||
158 | PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool takeloc, QWidget *parent = 0, const char *name = 0 ); | ||
159 | |||
160 | int executeD( bool local ); | ||
161 | |||
162 | private: | ||
163 | int mSyncResult; | ||
164 | |||
165 | private slots: | ||
166 | void slot_remote(); | ||
167 | void slot_local(); | ||
168 | |||
169 | }; | ||
170 | |||
171 | |||
150 | #endif | 172 | #endif |
diff --git a/pwmanager/pwmanager/serializer.cpp b/pwmanager/pwmanager/serializer.cpp index a54ba8a..f615082 100644 --- a/pwmanager/pwmanager/serializer.cpp +++ b/pwmanager/pwmanager/serializer.cpp | |||
@@ -20,48 +20,52 @@ | |||
20 | 20 | ||
21 | #include "serializer.h" | 21 | #include "serializer.h" |
22 | #include "pwmexception.h" | 22 | #include "pwmexception.h" |
23 | 23 | ||
24 | #ifdef PWM_EMBEDDED | 24 | #ifdef PWM_EMBEDDED |
25 | #include <kglobal.h> | 25 | #include <kglobal.h> |
26 | #include <klocale.h> | 26 | #include <klocale.h> |
27 | #endif | 27 | #endif |
28 | 28 | ||
29 | /* enable/disable serializer debugging (0/1) */ | 29 | /* enable/disable serializer debugging (0/1) */ |
30 | #define SERIALIZER_DEBUG1 | 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 |
33 | /* write a CDATA section (0/1) */ | 33 | /* write a CDATA section (0/1) */ |
34 | #define WRITE_CDATA_SEC 0 | 34 | #define WRITE_CDATA_SEC 0 |
35 | 35 | ||
36 | 36 | ||
37 | #define META_CREATE_DATE"c" | 37 | #define META_CREATE_DATE"c" |
38 | #define META_VALID_DATE "v" | 38 | #define META_VALID_DATE "v" |
39 | #define META_EXPIRE_DATE"e" | 39 | #define META_EXPIRE_DATE"e" |
40 | #define META_UPDATE_DATE"u" | 40 | #define META_UPDATE_DATE"u" |
41 | #define META_UPDATE_INT "i" | 41 | #define META_UPDATE_INT "i" |
42 | //US ENH : uniqueid | 42 | //US ENH : uniqueid |
43 | #define META_UNIQUEID "n" | 43 | #define META_UNIQUEID "n" |
44 | #define SYNC_ROOT "s" | ||
45 | #define SYNC_TARGET_PREFIX "t" | ||
46 | #define SYNC_TARGET_NAME "n" | ||
47 | |||
44 | 48 | ||
45 | /* This is compatibility stuff. | 49 | /* This is compatibility stuff. |
46 | * The names of the entries have changed and here are the | 50 | * The names of the entries have changed and here are the |
47 | * new and old ones | 51 | * new and old ones |
48 | */ | 52 | */ |
49 | #define ROOT_MAGIC_OLD "PwM-xml-dat" | 53 | #define ROOT_MAGIC_OLD "PwM-xml-dat" |
50 | #define VER_STR_OLD "ver" | 54 | #define VER_STR_OLD "ver" |
51 | #define COMPAT_VER_OLD "0x02" | 55 | #define COMPAT_VER_OLD "0x02" |
52 | #define CAT_ROOT_OLD "categories" | 56 | #define CAT_ROOT_OLD "categories" |
53 | #define CAT_PREFIX_OLD "cat_" | 57 | #define CAT_PREFIX_OLD "cat_" |
54 | #define CAT_NAME_OLD "name" | 58 | #define CAT_NAME_OLD "name" |
55 | #define ENTRY_PREFIX_OLD"entry_" | 59 | #define ENTRY_PREFIX_OLD"entry_" |
56 | #define ENTRY_DESC_OLD "desc" | 60 | #define ENTRY_DESC_OLD "desc" |
57 | #define ENTRY_NAME_OLD "name" | 61 | #define ENTRY_NAME_OLD "name" |
58 | #define ENTRY_PW_OLD "pw" | 62 | #define ENTRY_PW_OLD "pw" |
59 | #define ENTRY_COMMENT_OLD"comment" | 63 | #define ENTRY_COMMENT_OLD"comment" |
60 | #define ENTRY_URL_OLD "url" | 64 | #define ENTRY_URL_OLD "url" |
61 | #define ENTRY_LAUNCHER_OLD"launcher" | 65 | #define ENTRY_LAUNCHER_OLD"launcher" |
62 | #define ENTRY_LVP_OLD "listViewPos" | 66 | #define ENTRY_LVP_OLD "listViewPos" |
63 | #define ENTRY_BIN_OLD "b" | 67 | #define ENTRY_BIN_OLD "b" |
64 | #define ENTRY_META_OLD "m" | 68 | #define ENTRY_META_OLD "m" |
65 | 69 | ||
66 | #define ROOT_MAGIC_NEW "P" | 70 | #define ROOT_MAGIC_NEW "P" |
67 | #define VER_STR_NEW "v" | 71 | #define VER_STR_NEW "v" |
@@ -185,83 +189,95 @@ QCString Serializer::getXml() | |||
185 | cout << tmp << endl; | 189 | cout << tmp << endl; |
186 | printDebug("<END Serializer::getXml() dump>"); | 190 | printDebug("<END Serializer::getXml() dump>"); |
187 | #endif // DEBUG | 191 | #endif // DEBUG |
188 | 192 | ||
189 | QCString ret(domDoc->toCString(0)); | 193 | QCString ret(domDoc->toCString(0)); |
190 | ret.replace('\n', ""); | 194 | ret.replace('\n', ""); |
191 | return ret; | 195 | return ret; |
192 | #else | 196 | #else |
193 | 197 | ||
194 | #if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0 | 198 | #if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0 |
195 | QCString tmp(" " + domDoc->toCString()); | 199 | QCString tmp(" " + domDoc->toCString()); |
196 | printDebug("<BEGIN Serializer::getXml() dump>\n"); | 200 | printDebug("<BEGIN Serializer::getXml() dump>\n"); |
197 | qDebug(tmp); | 201 | qDebug(tmp); |
198 | cout << tmp << endl; | 202 | cout << tmp << endl; |
199 | printDebug("<END Serializer::getXml() dump>"); | 203 | printDebug("<END Serializer::getXml() dump>"); |
200 | #endif // DEBUG | 204 | #endif // DEBUG |
201 | 205 | ||
202 | QCString ret(domDoc->toCString()); | 206 | QCString ret(domDoc->toCString()); |
203 | ret.replace(QRegExp("\n"), ""); | 207 | ret.replace(QRegExp("\n"), ""); |
204 | return ret; | 208 | return ret; |
205 | 209 | ||
206 | #endif | 210 | #endif |
207 | } | 211 | } |
208 | 212 | ||
209 | bool Serializer::serialize(const vector<PwMCategoryItem> &dta) | 213 | bool Serializer::serialize(PwMItem &dta) |
210 | { | 214 | { |
211 | PWM_ASSERT(domDoc); | 215 | PWM_ASSERT(domDoc); |
212 | QDomElement root(genNewRoot()); | 216 | QDomElement root(genNewRoot()); |
213 | QDomElement catNode(domDoc->createElement(CAT_ROOT_WR)); | 217 | QDomElement catNode(domDoc->createElement(CAT_ROOT_WR)); |
214 | root.appendChild(catNode); | 218 | QDomElement syncNode(domDoc->createElement(SYNC_ROOT)); |
215 | if (!addCategories(&catNode, dta)) | 219 | if (!addSyncData(&syncNode, dta.syncDta)) |
216 | return false; | 220 | return false; |
221 | root.appendChild(syncNode); | ||
222 | if (!addCategories(&catNode, dta.dta)) | ||
223 | return false; | ||
224 | root.appendChild(catNode); | ||
217 | return true; | 225 | return true; |
218 | } | 226 | } |
219 | 227 | ||
220 | bool Serializer::deSerialize(vector<PwMCategoryItem> *dta) | 228 | bool Serializer::deSerialize(PwMItem *dta) |
221 | { | 229 | { |
222 | PWM_ASSERT(domDoc); | 230 | PWM_ASSERT(domDoc); |
223 | PWM_ASSERT(dta); | 231 | PWM_ASSERT(dta); |
224 | QDomElement root(domDoc->documentElement()); | 232 | QDomElement root(domDoc->documentElement()); |
225 | QDomNode n; | 233 | QDomNode n; |
226 | 234 | ||
227 | dta->clear(); | 235 | dta->clear(); |
228 | for (n = root.firstChild(); !n.isNull(); n = n.nextSibling()) { | 236 | for (n = root.firstChild(); !n.isNull(); n = n.nextSibling()) { |
229 | // find <categories> ... </categories> | 237 | // find <categories> ... </categories> |
230 | // <c> ... </c> | 238 | // <c> ... </c> |
231 | if (n.nodeName() == CAT_ROOT_NEW || | 239 | if (n.nodeName() == CAT_ROOT_NEW || |
232 | n.nodeName() == CAT_ROOT_OLD) { | 240 | n.nodeName() == CAT_ROOT_OLD) { |
233 | if (!readCategories(n, dta)) { | 241 | if (!readCategories(n, &(dta->dta))) { |
234 | return false; | 242 | return false; |
235 | } | 243 | } |
244 | continue; | ||
245 | } | ||
246 | else if (n.nodeName() == SYNC_ROOT) { | ||
247 | if (!readSyncData(n, &(dta->syncDta))) { | ||
248 | return false; | ||
249 | } | ||
250 | continue; | ||
251 | } | ||
236 | 252 | ||
237 | /* NOTE: We can stop processing here, as we | 253 | /* NOTE: We can stop processing here, as we |
238 | * don't have more nodes in root, yet. | 254 | * don't have more nodes in root, yet. |
239 | */ | 255 | */ |
240 | return true; | 256 | return false; |
241 | } | 257 | |
242 | } | 258 | } |
243 | return false; | 259 | return true; |
244 | } | 260 | } |
245 | 261 | ||
246 | bool Serializer::readCategories(const QDomNode &n, | 262 | bool Serializer::readCategories(const QDomNode &n, |
247 | vector<PwMCategoryItem> *dta) | 263 | vector<PwMCategoryItem> *dta) |
248 | { | 264 | { |
249 | QDomNodeList nl(n.childNodes()); | 265 | QDomNodeList nl(n.childNodes()); |
250 | QDomNode cur; | 266 | QDomNode cur; |
251 | QString name; | 267 | QString name; |
252 | unsigned int numCat = nl.count(), i; | 268 | unsigned int numCat = nl.count(), i; |
253 | PwMCategoryItem curCat; | 269 | PwMCategoryItem curCat; |
254 | vector<PwMDataItem> curEntr; | 270 | vector<PwMDataItem> curEntr; |
255 | 271 | ||
256 | if (!numCat) { | 272 | if (!numCat) { |
257 | printDebug("Serializer::readCategories(): empty"); | 273 | printDebug("Serializer::readCategories(): empty"); |
258 | return false; | 274 | return false; |
259 | } | 275 | } |
260 | for (i = 0; i < numCat; ++i) { | 276 | for (i = 0; i < numCat; ++i) { |
261 | cur = nl.item(i); | 277 | cur = nl.item(i); |
262 | if (cur.nodeName().left(1) == CAT_PREFIX_NEW || | 278 | if (cur.nodeName().left(1) == CAT_PREFIX_NEW || |
263 | cur.nodeName().left(4) == CAT_PREFIX_OLD) { | 279 | cur.nodeName().left(4) == CAT_PREFIX_OLD) { |
264 | name = cur.toElement().attribute(CAT_NAME_NEW); | 280 | name = cur.toElement().attribute(CAT_NAME_NEW); |
265 | if (name == QString::null) | 281 | if (name == QString::null) |
266 | name = cur.toElement().attribute(CAT_NAME_OLD); | 282 | name = cur.toElement().attribute(CAT_NAME_OLD); |
267 | PWM_ASSERT(name != QString::null); | 283 | PWM_ASSERT(name != QString::null); |
@@ -640,24 +656,101 @@ bool Serializer::writeMeta(QDomElement *e, | |||
640 | 656 | ||
641 | QString Serializer::escapeEntryData(QString dta) | 657 | QString Serializer::escapeEntryData(QString dta) |
642 | { | 658 | { |
643 | #ifndef PWM_EMBEDDED | 659 | #ifndef PWM_EMBEDDED |
644 | dta.replace('\n', "$>--endl--<$"); | 660 | dta.replace('\n', "$>--endl--<$"); |
645 | dta.replace("]]>", "||>"); | 661 | dta.replace("]]>", "||>"); |
646 | #else | 662 | #else |
647 | dta.replace(QRegExp("\n"), "$>--endl--<$"); | 663 | dta.replace(QRegExp("\n"), "$>--endl--<$"); |
648 | dta.replace(QRegExp("]]>"), "||>"); | 664 | dta.replace(QRegExp("]]>"), "||>"); |
649 | #endif | 665 | #endif |
650 | return dta; | 666 | return dta; |
651 | } | 667 | } |
652 | 668 | ||
653 | QString Serializer::unescapeEntryData(QString dta) | 669 | QString Serializer::unescapeEntryData(QString dta) |
654 | { | 670 | { |
655 | #ifndef PWM_EMBEDDED | 671 | #ifndef PWM_EMBEDDED |
656 | dta.replace("$>--endl--<$", "\n"); | 672 | dta.replace("$>--endl--<$", "\n"); |
657 | dta.replace("||>", "]]>"); | 673 | dta.replace("||>", "]]>"); |
658 | #else | 674 | #else |
659 | dta.replace(QRegExp("$>--endl--<$"), "\n"); | 675 | dta.replace(QRegExp("$>--endl--<$"), "\n"); |
660 | dta.replace(QRegExp("||>"), "]]>"); | 676 | dta.replace(QRegExp("||>"), "]]>"); |
661 | #endif | 677 | #endif |
662 | return dta; | 678 | return dta; |
663 | } | 679 | } |
680 | |||
681 | |||
682 | //US ENH: the following methods are getting used to write/read sync entries | ||
683 | /** read the syncentries in the node "n" */ | ||
684 | bool Serializer::readSyncData(const QDomNode &n, vector<PwMSyncItem> *dta) | ||
685 | { | ||
686 | QDomNodeList nl(n.childNodes()); | ||
687 | QDomNode cur; | ||
688 | |||
689 | QString devicename, val; | ||
690 | unsigned int numSync = nl.count(), i; | ||
691 | PwMSyncItem curSync; | ||
692 | bool ok = true; | ||
693 | |||
694 | if (!numSync) { | ||
695 | //no sync entries is a possible result | ||
696 | printDebug("Serializer::readSyncData(): empty"); | ||
697 | return true; | ||
698 | } | ||
699 | for (i = 0; i < numSync; ++i) { | ||
700 | cur = nl.item(i); | ||
701 | if (cur.nodeName().left(1) == SYNC_TARGET_PREFIX) { | ||
702 | devicename = cur.toElement().attribute(SYNC_TARGET_NAME); | ||
703 | val = cur.toElement().text(); | ||
704 | |||
705 | if ((val == "") || (devicename == QString::null)) { | ||
706 | printDebug("Serializer::readSyncData(): empty synctarget name or syncdate"); | ||
707 | continue; | ||
708 | } | ||
709 | |||
710 | curSync.syncName = devicename; | ||
711 | #ifndef PWM_EMBEDDED | ||
712 | curSync.lastSyncDate = QDateTime::fromString(val, Qt::ISODate); | ||
713 | #else | ||
714 | curSync.lastSyncDate = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); | ||
715 | if (ok == false) | ||
716 | qDebug("Serializer::readSyncData(): could not parse syncdate:%s",val.latin1()); | ||
717 | |||
718 | #endif | ||
719 | dta->push_back(curSync); | ||
720 | } | ||
721 | } | ||
722 | return true; | ||
723 | |||
724 | } | ||
725 | |||
726 | |||
727 | |||
728 | bool Serializer::addSyncData(QDomElement *e, | ||
729 | const vector<PwMSyncItem> &dta) | ||
730 | { | ||
731 | unsigned int numSync = dta.size(), i; | ||
732 | QString curId, curDeviceName; | ||
733 | QDomElement curSync, curSyncDate; | ||
734 | QDomText text; | ||
735 | |||
736 | for (i = 0; i < numSync; ++i) { | ||
737 | curId = SYNC_TARGET_PREFIX; | ||
738 | curId += tostr(i).c_str(); | ||
739 | curDeviceName = dta[i].syncName.c_str(); | ||
740 | curSync = domDoc->createElement(curId); | ||
741 | curSync.setAttribute(SYNC_TARGET_NAME, curDeviceName); | ||
742 | |||
743 | #ifndef PWM_EMBEDDED | ||
744 | text = domDoc->createTextNode(dta[i].lastSyncDate.toString(Qt::ISODate)); | ||
745 | #else | ||
746 | text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta[i].lastSyncDate, KLocale::ISODate)); | ||
747 | #endif | ||
748 | curSyncDate.appendChild(text); | ||
749 | curSync.appendChild(curSyncDate); | ||
750 | |||
751 | e->appendChild(curSync); | ||
752 | |||
753 | } | ||
754 | return true; | ||
755 | } | ||
756 | |||
diff --git a/pwmanager/pwmanager/serializer.h b/pwmanager/pwmanager/serializer.h index 245fcee..ee61b94 100644 --- a/pwmanager/pwmanager/serializer.h +++ b/pwmanager/pwmanager/serializer.h | |||
@@ -30,73 +30,86 @@ | |||
30 | 30 | ||
31 | using std::vector; | 31 | using std::vector; |
32 | 32 | ||
33 | /** This serializes its input data into | 33 | /** This serializes its input data into |
34 | * the PwManager-XML-datastream, that becomes | 34 | * the PwManager-XML-datastream, that becomes |
35 | * encrypted and maybe compressed | 35 | * encrypted and maybe compressed |
36 | */ | 36 | */ |
37 | class Serializer | 37 | class Serializer |
38 | { | 38 | { |
39 | public: | 39 | public: |
40 | /** construct an empty serializer document */ | 40 | /** construct an empty serializer document */ |
41 | Serializer(); | 41 | Serializer(); |
42 | /** construct a serializer document and parse "buffer" */ | 42 | /** construct a serializer document and parse "buffer" */ |
43 | Serializer(const QCString &buffer); | 43 | Serializer(const QCString &buffer); |
44 | /** destructor */ | 44 | /** destructor */ |
45 | virtual ~Serializer(); | 45 | virtual ~Serializer(); |
46 | 46 | ||
47 | /** clears all data */ | 47 | /** clears all data */ |
48 | void clear(); | 48 | void clear(); |
49 | /** parse the given data buffer */ | 49 | /** parse the given data buffer */ |
50 | bool parseXml(const QCString &buffer); | 50 | bool parseXml(const QCString &buffer); |
51 | /** returns the current XML data */ | 51 | /** returns the current XML data */ |
52 | QCString getXml(); | 52 | QCString getXml(); |
53 | /** serialize "dta" and store it as XML data */ | 53 | /** serialize "dta" and store it as XML data */ |
54 | bool serialize(const vector<PwMCategoryItem> &dta); | 54 | //US ENH: we need to serialize and deserialize not only categories, but also synctargets |
55 | bool serialize(PwMItem &dta); | ||
55 | /** deserialize the (parsed) XML data and store it in "dta" */ | 56 | /** deserialize the (parsed) XML data and store it in "dta" */ |
56 | bool deSerialize(vector<PwMCategoryItem> *dta); | 57 | bool deSerialize(PwMItem *dta); |
57 | /** sets the initial default lockStat we should assign */ | 58 | /** sets the initial default lockStat we should assign */ |
58 | void setDefaultLockStat(bool stat) | 59 | void setDefaultLockStat(bool stat) |
59 | { defaultLockStat = stat; } | 60 | { defaultLockStat = stat; } |
60 | 61 | ||
61 | protected: | 62 | protected: |
62 | /** main data holder */ | 63 | /** main data holder */ |
63 | QDomDocument *domDoc; | 64 | QDomDocument *domDoc; |
64 | /** default lockStat to assign */ | 65 | /** default lockStat to assign */ |
65 | bool defaultLockStat; | 66 | bool defaultLockStat; |
66 | 67 | ||
67 | protected: | 68 | protected: |
68 | /** check if this is valid PwManager XML data */ | 69 | /** check if this is valid PwManager XML data */ |
69 | bool checkValid(); | 70 | bool checkValid(); |
70 | /** read the categories in the node "n" */ | 71 | /** read the categories in the node "n" */ |
71 | bool readCategories(const QDomNode &n, | 72 | bool readCategories(const QDomNode &n, |
72 | vector<PwMCategoryItem> *dta); | 73 | vector<PwMCategoryItem> *dta); |
73 | /** read the entries in the node "n" */ | 74 | /** read the entries in the node "n" */ |
74 | bool readEntries(const QDomNode &n, | 75 | bool readEntries(const QDomNode &n, |
75 | vector<PwMDataItem> *dta); | 76 | vector<PwMDataItem> *dta); |
76 | /** extract the data out of the given item at "n" */ | 77 | /** extract the data out of the given item at "n" */ |
77 | bool extractEntry(const QDomNode &n, | 78 | bool extractEntry(const QDomNode &n, |
78 | PwMDataItem *dta); | 79 | PwMDataItem *dta); |
79 | /** extract the meta-data */ | 80 | /** extract the meta-data */ |
80 | bool extractMeta(const QDomNode &n, | 81 | bool extractMeta(const QDomNode &n, |
81 | PwMMetaData *dta); | 82 | PwMMetaData *dta); |
82 | /** generates a new root node and sets all initial parameters */ | 83 | /** generates a new root node and sets all initial parameters */ |
83 | QDomElement genNewRoot(); | 84 | QDomElement genNewRoot(); |
84 | /** add new categories to the XML data stream in e */ | 85 | /** add new categories to the XML data stream in e */ |
85 | bool addCategories(QDomElement *e, | 86 | bool addCategories(QDomElement *e, |
86 | const vector<PwMCategoryItem> &dta); | 87 | const vector<PwMCategoryItem> &dta); |
87 | /** add the given new entries to the XML data stream in e */ | 88 | /** add the given new entries to the XML data stream in e */ |
88 | bool addEntries(QDomElement *e, | 89 | bool addEntries(QDomElement *e, |
89 | const vector<PwMDataItem> &dta); | 90 | const vector<PwMDataItem> &dta); |
90 | /** do serialize and write the given entry to the XML stream */ | 91 | /** do serialize and write the given entry to the XML stream */ |
91 | bool writeEntry(QDomElement *e, | 92 | bool writeEntry(QDomElement *e, |
92 | const PwMDataItem &_dta); | 93 | const PwMDataItem &_dta); |
93 | /** write the entry meta data to the xml stream */ | 94 | /** write the entry meta data to the xml stream */ |
94 | bool writeMeta(QDomElement *e, | 95 | bool writeMeta(QDomElement *e, |
95 | const PwMMetaData &dta); | 96 | const PwMMetaData &dta); |
96 | /** escape illegal characters out of the given entry data string */ | 97 | /** escape illegal characters out of the given entry data string */ |
97 | QString escapeEntryData(QString dta); | 98 | QString escapeEntryData(QString dta); |
98 | /** un-escape illegal characters out of the given entry data string */ | 99 | /** un-escape illegal characters out of the given entry data string */ |
99 | QString unescapeEntryData(QString dta); | 100 | QString unescapeEntryData(QString dta); |
101 | |||
102 | |||
103 | |||
104 | //US ENH: the following methods are getting used to write/read sync entries | ||
105 | /** read the syncentries in the node "n" */ | ||
106 | bool readSyncData(const QDomNode &n, | ||
107 | vector<PwMSyncItem> *dta); | ||
108 | |||
109 | /** add new syncentries to the XML data stream in e */ | ||
110 | bool addSyncData(QDomElement *e, | ||
111 | const vector<PwMSyncItem> &dta); | ||
112 | |||
100 | }; | 113 | }; |
101 | 114 | ||
102 | #endif // __SERIALIZER_H | 115 | #endif // __SERIALIZER_H |