summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--Makefile589
-rw-r--r--kdepim-desktop.pro2
-rw-r--r--pwmanager/pwmanager/main.cpp1
-rw-r--r--pwmanager/pwmanager/pwm.cpp12
-rw-r--r--pwmanager/pwmanager/pwm.h8
-rw-r--r--pwmanager/pwmanager/pwmanager.pro33
-rw-r--r--pwmanager/pwmanager/pwmdoc.cpp8
-rw-r--r--pwmanager/pwmanager/pwminit.cpp16
-rw-r--r--pwmanager/pwmanager/serializer.cpp6
9 files changed, 281 insertions, 394 deletions
diff --git a/Makefile b/Makefile
index 8c6110c..be106e6 100644
--- a/Makefile
+++ b/Makefile
@@ -1,362 +1,229 @@
1export KDEPIMDIR = $(shell pwd) 1#############################################################################
2 2# Makefile for building: kdepim-desktop
3export KDEPIM_VERSION=$(shell sed -e 's/.*\"\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/' < version) 3# Generated by qmake (1.07a) (Qt 3.3.1) on: Wed Oct 20 01:01:01 2004
4 4# Project: kdepim-desktop.pro
5ifeq ($(PLATFORM) , zaurus) 5# Template: subdirs
6 BUILD_NO_LDAP_PLUGIN=1 6# Command: $(QMAKE) -o Makefile kdepim-desktop.pro
7endif 7#############################################################################
8 8
9ifneq ($(PLATFORM) , zaurus) 9 MAKEFILE =Makefile
10 BUILD_NO_SHARP_PLUGIN=1 10 QMAKE =qmake
11endif 11DEL_FILE = rm -f
12 12CHK_DIR_EXISTS= test -d
13SUBDIRS_MICROKDE = \ 13MKDIR = mkdir -p
14 libical/src/libical \ 14 SUBTARGETS = \
15 libical/src/libicalss \ 15 sub-pwmanager-libcrypt-cipher \
16 qtcompat \ 16 sub-pwmanager-libcrypt-error \
17 microkde \ 17 sub-pwmanager-libcrypt-mpi \
18 libkcal \ 18 sub-pwmanager-libcrypt-zlib \
19 libkdepim \ 19 sub-gammu-emb-common \
20 kabc \ 20 sub-gammu-emb-gammu \
21 kabc/formats/binary \ 21 sub-libical \
22 kabc/plugins/file \ 22 sub-libkcal \
23 kabc/plugins/dir \ 23 sub-microkde \
24 korganizer \ 24 sub-libkdepim \
25 kalarmd \ 25 sub-kabc \
26 kaddressbook 26 sub-pwmanager-pwmanager \
27 27 sub-korganizer \
28SUBDIRS_QTOPIA_PLUGIN = \ 28 sub-kaddressbook \
29 kabc/plugins/qtopia 29 sub-kabc-plugins-file \
30 30 sub-kabc-plugins-dir
31SUBDIRS_OPIE_PLUGIN = \ 31
32 kabc/plugins/opie 32first: all
33 33
34SUBDIRS_SHARP_PLUGIN = \ 34all: Makefile $(SUBTARGETS)
35 kabc/plugins/sharpdtm 35
36 36pwmanager/libcrypt/cipher/$(MAKEFILE):
37SUBDIRS_LDAP_PLUGIN = \ 37 @$(CHK_DIR_EXISTS) "pwmanager/libcrypt/cipher" || $(MKDIR) "pwmanager/libcrypt/cipher"
38 kabc/plugins/ldap 38 cd pwmanager/libcrypt/cipher && $(QMAKE) cipher.pro -o $(MAKEFILE)
39 39sub-pwmanager-libcrypt-cipher: pwmanager/libcrypt/cipher/$(MAKEFILE) FORCE
40SUBDIRS_MICROMAIL = \ 40 cd pwmanager/libcrypt/cipher && $(MAKE) -f $(MAKEFILE)
41 kmicromail/libetpan \ 41
42 kmicromail/libmailwrapper \ 42pwmanager/libcrypt/error/$(MAKEFILE):
43 kmicromail 43 @$(CHK_DIR_EXISTS) "pwmanager/libcrypt/error" || $(MKDIR) "pwmanager/libcrypt/error"
44 44 cd pwmanager/libcrypt/error && $(QMAKE) error.pro -o $(MAKEFILE)
45SUBDIRS_GAMMU = \ 45sub-pwmanager-libcrypt-error: pwmanager/libcrypt/error/$(MAKEFILE) FORCE
46 gammu/emb/common \ 46 cd pwmanager/libcrypt/error && $(MAKE) -f $(MAKEFILE)
47 gammu/emb/gammu 47
48 48pwmanager/libcrypt/mpi/$(MAKEFILE):
49SUBDIRS_PWMANAGER = \ 49 @$(CHK_DIR_EXISTS) "pwmanager/libcrypt/mpi" || $(MKDIR) "pwmanager/libcrypt/mpi"
50 pwmanager/libcrypt/mpi \ 50 cd pwmanager/libcrypt/mpi && $(QMAKE) mpi.pro -o $(MAKEFILE)
51 pwmanager/libcrypt/error \ 51sub-pwmanager-libcrypt-mpi: pwmanager/libcrypt/mpi/$(MAKEFILE) FORCE
52 pwmanager/libcrypt/cipher \ 52 cd pwmanager/libcrypt/mpi && $(MAKE) -f $(MAKEFILE)
53 pwmanager/libcrypt/zlib \ 53
54 pwmanager/pwmanager 54pwmanager/libcrypt/zlib/$(MAKEFILE):
55 55 @$(CHK_DIR_EXISTS) "pwmanager/libcrypt/zlib" || $(MKDIR) "pwmanager/libcrypt/zlib"
56SUBDIRS = \ 56 cd pwmanager/libcrypt/zlib && $(QMAKE) zlib.pro -o $(MAKEFILE)
57 $(SUBDIRS_MICROKDE) \ 57sub-pwmanager-libcrypt-zlib: pwmanager/libcrypt/zlib/$(MAKEFILE) FORCE
58 $(SUBDIRS_QTOPIA_PLUGIN) \ 58 cd pwmanager/libcrypt/zlib && $(MAKE) -f $(MAKEFILE)
59 $(SUBDIRS_OPIE_PLUGIN) \ 59
60 $(SUBDIRS_SHARP_PLUGIN) \ 60gammu/emb/common/$(MAKEFILE):
61 $(SUBDIRS_LDAP_PLUGIN) \ 61 @$(CHK_DIR_EXISTS) "gammu/emb/common" || $(MKDIR) "gammu/emb/common"
62 $(SUBDIRS_MICROMAIL) \ 62 cd gammu/emb/common && $(QMAKE) common.pro -o $(MAKEFILE)
63 $(SUBDIRS_GAMMU) \ 63sub-gammu-emb-common: gammu/emb/common/$(MAKEFILE) FORCE
64 $(SUBDIRS_PWMANAGER) 64 cd gammu/emb/common && $(MAKE) -f $(MAKEFILE)
65 65
66 66gammu/emb/gammu/$(MAKEFILE):
67all: build_microkde \ 67 @$(CHK_DIR_EXISTS) "gammu/emb/gammu" || $(MKDIR) "gammu/emb/gammu"
68 build_qtopia_plugin \ 68 cd gammu/emb/gammu && $(QMAKE) gammu.pro -o $(MAKEFILE)
69 build_opie_plugin \ 69sub-gammu-emb-gammu: gammu/emb/gammu/$(MAKEFILE) FORCE
70 build_sharp_plugin \ 70 cd gammu/emb/gammu && $(MAKE) -f $(MAKEFILE)
71 build_ldap_plugin \ 71
72 build_micromail \ 72libical/$(MAKEFILE):
73 build_gammu \ 73 @$(CHK_DIR_EXISTS) "libical" || $(MKDIR) "libical"
74 build_pwmanager 74 cd libical && $(QMAKE) libical.pro -o $(MAKEFILE)
75 75sub-libical: libical/$(MAKEFILE) FORCE
76 76 cd libical && $(MAKE) -f $(MAKEFILE)
77build_microkde: variable_test tmake 77
78 for i in $(SUBDIRS_MICROKDE); do pushd $$i; \ 78libkcal/$(MAKEFILE):
79 make -f Makefile$(PLATFORM) || exit 1; popd; \ 79 @$(CHK_DIR_EXISTS) "libkcal" || $(MKDIR) "libkcal"
80 done 80 cd libkcal && $(QMAKE) libkcal.pro -o $(MAKEFILE)
81 81sub-libkcal: libkcal/$(MAKEFILE) FORCE
82build_qtopia_plugin: build_microkde 82 cd libkcal && $(MAKE) -f $(MAKEFILE)
83 ifdef BUILD_NO_QTOPIA_PLUGIN 83
84 @echo == qtopia plugin not build. 84microkde/$(MAKEFILE):
85 else 85 @$(CHK_DIR_EXISTS) "microkde" || $(MKDIR) "microkde"
86 for i in $(SUBDIRS_QTOPIA_PLUGIN); do pushd $$i; \ 86 cd microkde && $(QMAKE) microkde.pro -o $(MAKEFILE)
87 make -f Makefile$(PLATFORM) || exit 1; popd; \ 87sub-microkde: microkde/$(MAKEFILE) FORCE
88 done 88 cd microkde && $(MAKE) -f $(MAKEFILE)
89 endif 89
90 90libkdepim/$(MAKEFILE):
91build_opie_plugin: build_microkde 91 @$(CHK_DIR_EXISTS) "libkdepim" || $(MKDIR) "libkdepim"
92 ifdef BUILD_NO_OPIE_PLUGIN 92 cd libkdepim && $(QMAKE) libkdepim.pro -o $(MAKEFILE)
93 @echo == opie plugin not build. 93sub-libkdepim: libkdepim/$(MAKEFILE) FORCE
94 else 94 cd libkdepim && $(MAKE) -f $(MAKEFILE)
95 for i in $(SUBDIRS_OPIE_PLUGIN); do pushd $$i; \ 95
96 make -f Makefile$(PLATFORM) || exit 1; popd; \ 96kabc/$(MAKEFILE):
97 done 97 @$(CHK_DIR_EXISTS) "kabc" || $(MKDIR) "kabc"
98 endif 98 cd kabc && $(QMAKE) kabc.pro -o $(MAKEFILE)
99 99sub-kabc: kabc/$(MAKEFILE) FORCE
100build_sharp_plugin: build_microkde 100 cd kabc && $(MAKE) -f $(MAKEFILE)
101 ifdef BUILD_NO_SHARP_PLUGIN 101
102 @echo == ldap plugin not build. 102pwmanager/pwmanager/$(MAKEFILE):
103 else 103 @$(CHK_DIR_EXISTS) "pwmanager/pwmanager" || $(MKDIR) "pwmanager/pwmanager"
104 for i in $(SUBDIRS_SHARP_PLUGIN); do pushd $$i; \ 104 cd pwmanager/pwmanager && $(QMAKE) pwmanager.pro -o $(MAKEFILE)
105 make -f Makefile$(PLATFORM) || exit 1; popd; \ 105sub-pwmanager-pwmanager: pwmanager/pwmanager/$(MAKEFILE) FORCE
106 done 106 cd pwmanager/pwmanager && $(MAKE) -f $(MAKEFILE)
107 endif 107
108 108korganizer/$(MAKEFILE):
109build_ldap_plugin: build_microkde 109 @$(CHK_DIR_EXISTS) "korganizer" || $(MKDIR) "korganizer"
110 ifdef BUILD_NO_LDAP_PLUGIN 110 cd korganizer && $(QMAKE) korganizer.pro -o $(MAKEFILE)
111 @echo == ldap plugin not build. 111sub-korganizer: korganizer/$(MAKEFILE) FORCE
112 else 112 cd korganizer && $(MAKE) -f $(MAKEFILE)
113 for i in $(SUBDIRS_LDAP_PLUGIN); do pushd $$i; \ 113
114 make -f Makefile$(PLATFORM) || exit 1; popd; \ 114kaddressbook/$(MAKEFILE):
115 done 115 @$(CHK_DIR_EXISTS) "kaddressbook" || $(MKDIR) "kaddressbook"
116 endif 116 cd kaddressbook && $(QMAKE) kaddressbook.pro -o $(MAKEFILE)
117 117sub-kaddressbook: kaddressbook/$(MAKEFILE) FORCE
118 118 cd kaddressbook && $(MAKE) -f $(MAKEFILE)
119build_micromail: build_microkde 119
120 ifdef BUILD_NO_MICROMAIL 120kabc/plugins/file/$(MAKEFILE):
121 @echo == kmicromail not build. 121 @$(CHK_DIR_EXISTS) "kabc/plugins/file" || $(MKDIR) "kabc/plugins/file"
122 else 122 cd kabc/plugins/file && $(QMAKE) file.pro -o $(MAKEFILE)
123 for i in $(SUBDIRS_MICROMAIL); do pushd $$i; \ 123sub-kabc-plugins-file: kabc/plugins/file/$(MAKEFILE) FORCE
124 make -f Makefile$(PLATFORM) || exit 1; popd; \ 124 cd kabc/plugins/file && $(MAKE) -f $(MAKEFILE)
125 done 125
126 endif 126kabc/plugins/dir/$(MAKEFILE):
127 127 @$(CHK_DIR_EXISTS) "kabc/plugins/dir" || $(MKDIR) "kabc/plugins/dir"
128build_gammu: variable_test tmake 128 cd kabc/plugins/dir && $(QMAKE) dir.pro -o $(MAKEFILE)
129 ifdef BUILD_NO_GAMMU 129sub-kabc-plugins-dir: kabc/plugins/dir/$(MAKEFILE) FORCE
130 @echo == gammu not build. 130 cd kabc/plugins/dir && $(MAKE) -f $(MAKEFILE)
131 else 131
132 for i in $(SUBDIRS_GAMMU); do pushd $$i; \ 132Makefile: kdepim-desktop.pro /usr/lib/qt3/mkspecs/default/qmake.conf
133 make -f Makefile$(PLATFORM) || exit 1; popd; \ 133 $(QMAKE) -o Makefile kdepim-desktop.pro
134 done 134qmake: qmake_all
135 endif 135 @$(QMAKE) -o Makefile kdepim-desktop.pro
136 136
137build_pwmanager: build_microkde 137all: $(SUBTARGETS)
138 ifdef BUILD_NO_PWMANAGER 138qmake_all: pwmanager/libcrypt/cipher/$(MAKEFILE) pwmanager/libcrypt/error/$(MAKEFILE) pwmanager/libcrypt/mpi/$(MAKEFILE) pwmanager/libcrypt/zlib/$(MAKEFILE) gammu/emb/common/$(MAKEFILE) gammu/emb/gammu/$(MAKEFILE) libical/$(MAKEFILE) libkcal/$(MAKEFILE) microkde/$(MAKEFILE) libkdepim/$(MAKEFILE) kabc/$(MAKEFILE) pwmanager/pwmanager/$(MAKEFILE) korganizer/$(MAKEFILE) kaddressbook/$(MAKEFILE) kabc/plugins/file/$(MAKEFILE) kabc/plugins/dir/$(MAKEFILE)
139 @echo == pwmanager not build. 139 ( [ -d pwmanager/libcrypt/cipher ] && cd pwmanager/libcrypt/cipher ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
140 else 140 ( [ -d pwmanager/libcrypt/error ] && cd pwmanager/libcrypt/error ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
141 for i in $(SUBDIRS_PWMANAGER); do pushd $$i; \ 141 ( [ -d pwmanager/libcrypt/mpi ] && cd pwmanager/libcrypt/mpi ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
142 make -f Makefile$(PLATFORM) || exit 1; popd; \ 142 ( [ -d pwmanager/libcrypt/zlib ] && cd pwmanager/libcrypt/zlib ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
143 done 143 ( [ -d gammu/emb/common ] && cd gammu/emb/common ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
144 endif 144 ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
145 145 ( [ -d libical ] && cd libical ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
146 146 ( [ -d libkcal ] && cd libkcal ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
147variable_info: 147 ( [ -d microkde ] && cd microkde ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
148 @echo -------------------------------------- 148 ( [ -d libkdepim ] && cd libkdepim ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
149 @echo KDEPIM buildsystem, variableinfo... 149 ( [ -d kabc ] && cd kabc ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
150 @echo KDEPIMDIR=$(KDEPIMDIR) 150 ( [ -d pwmanager/pwmanager ] && cd pwmanager/pwmanager ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
151 @echo QTDIR=$(QTDIR) 151 ( [ -d korganizer ] && cd korganizer ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
152 @echo QPEDIR=$(QPEDIR) 152 ( [ -d kaddressbook ] && cd kaddressbook ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
153 @echo OPIEDIR=$(OPIEDIR) 153 ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
154 @echo PLATFORM=$(PLATFORM) 154 ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; grep "^qmake_all:" $(MAKEFILE) && $(MAKE) -f $(MAKEFILE) qmake_all; ) || true
155 @echo RELEASE_DEBUG=$(RELEASE_DEBUG) 155clean uicables mocables uiclean mocclean lexclean yaccclean : qmake_all FORCE
156 @echo BUILD_NO_MICROMAIL=$(BUILD_NO_MICROMAIL) 156 ( [ -d pwmanager/libcrypt/cipher ] && cd pwmanager/libcrypt/cipher ; $(MAKE) -f $(MAKEFILE) $@; ) || true
157 @echo BUILD_NO_LDAP_PLUGIN=$(BUILD_NO_LDAP_PLUGIN) 157 ( [ -d pwmanager/libcrypt/error ] && cd pwmanager/libcrypt/error ; $(MAKE) -f $(MAKEFILE) $@; ) || true
158 @echo BUILD_NO_OPIE_PLUGIN=$(BUILD_NO_OPIE_PLUGIN) 158 ( [ -d pwmanager/libcrypt/mpi ] && cd pwmanager/libcrypt/mpi ; $(MAKE) -f $(MAKEFILE) $@; ) || true
159 @echo BUILD_NO_QTOPIA_PLUGIN=$(BUILD_NO_QTOPIA_PLUGIN) 159 ( [ -d pwmanager/libcrypt/zlib ] && cd pwmanager/libcrypt/zlib ; $(MAKE) -f $(MAKEFILE) $@; ) || true
160 @echo BUILD_NO_SHARP_PLUGIN=$(BUILD_NO_SHARP_PLUGIN) 160 ( [ -d gammu/emb/common ] && cd gammu/emb/common ; $(MAKE) -f $(MAKEFILE) $@; ) || true
161 ifndef BUILD_NO_SHARP_PLUGIN 161 ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; $(MAKE) -f $(MAKEFILE) $@; ) || true
162 @echo SHARPDTMSDK=$(SHARPDTMSDK) 162 ( [ -d libical ] && cd libical ; $(MAKE) -f $(MAKEFILE) $@; ) || true
163 endif 163 ( [ -d libkcal ] && cd libkcal ; $(MAKE) -f $(MAKEFILE) $@; ) || true
164 @echo BUILD_NO_GAMMU=$(BUILD_NO_GAMMU) 164 ( [ -d microkde ] && cd microkde ; $(MAKE) -f $(MAKEFILE) $@; ) || true
165 @echo BUILD_NO_PWMANAGER=$(BUILD_NO_PWMANAGER) 165 ( [ -d libkdepim ] && cd libkdepim ; $(MAKE) -f $(MAKEFILE) $@; ) || true
166 @echo -------------------------------------- 166 ( [ -d kabc ] && cd kabc ; $(MAKE) -f $(MAKEFILE) $@; ) || true
167 167 ( [ -d pwmanager/pwmanager ] && cd pwmanager/pwmanager ; $(MAKE) -f $(MAKEFILE) $@; ) || true
168variable_test: variable_info 168 ( [ -d korganizer ] && cd korganizer ; $(MAKE) -f $(MAKEFILE) $@; ) || true
169 @echo KDEPIM buildsystem, variablecheck... 169 ( [ -d kaddressbook ] && cd kaddressbook ; $(MAKE) -f $(MAKEFILE) $@; ) || true
170 ifndef KDEPIMDIR 170 ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; $(MAKE) -f $(MAKEFILE) $@; ) || true
171 @echo KDEPIMDIR is not defined. 171 ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; $(MAKE) -f $(MAKEFILE) $@; ) || true
172 $(error KDEPIMDIR is not defined) 172uninstall_subdirs: qmake_all FORCE
173 endif 173 ( [ -d pwmanager/libcrypt/cipher ] && cd pwmanager/libcrypt/cipher ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
174 ifndef PLATFORM 174 ( [ -d pwmanager/libcrypt/error ] && cd pwmanager/libcrypt/error ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
175 @echo PLATFORM is not defined. 175 ( [ -d pwmanager/libcrypt/mpi ] && cd pwmanager/libcrypt/mpi ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
176 $(error PLATFORM is not defined) 176 ( [ -d pwmanager/libcrypt/zlib ] && cd pwmanager/libcrypt/zlib ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
177 endif 177 ( [ -d gammu/emb/common ] && cd gammu/emb/common ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
178 ifdef BUILD_NO_LDAP_PLUGIN 178 ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
179 @echo LDAP PLUGIN will not be build, because BUILD_NO_LDAP_PLUGIN is set to $(BUILD_NO_LDAP_PLUGIN) 179 ( [ -d libical ] && cd libical ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
180 endif 180 ( [ -d libkcal ] && cd libkcal ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
181 ifdef BUILD_NO_OPIE_PLUGIN 181 ( [ -d microkde ] && cd microkde ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
182 @echo OPIE PLUGIN will not be build, because BUILD_NO_OPIE_PLUGIN is set to $(BUILD_NO_OPIE_PLUGIN) 182 ( [ -d libkdepim ] && cd libkdepim ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
183 endif 183 ( [ -d kabc ] && cd kabc ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
184 ifdef BUILD_NO_QTOPIA_PLUGIN 184 ( [ -d pwmanager/pwmanager ] && cd pwmanager/pwmanager ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
185 @echo QTOPIA PLUGIN will not be build, because BUILD_NO__QTOPIA_PLUGIN is set to $(BUILD_NO__QTOPIA_PLUGIN) 185 ( [ -d korganizer ] && cd korganizer ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
186 endif 186 ( [ -d kaddressbook ] && cd kaddressbook ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
187 ifdef BUILD_NO_MICROMAIL 187 ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
188 @echo MICROMAIL will not be build, because BUILD_NO_MICROMAIL is set to $(BUILD_NO_MICROMAIL) 188 ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; $(MAKE) -f $(MAKEFILE) uninstall; ) || true
189 endif 189install_subdirs: qmake_all FORCE
190 ifdef BUILD_NO_SHARP_PLUGIN 190 ( [ -d pwmanager/libcrypt/cipher ] && cd pwmanager/libcrypt/cipher ; $(MAKE) -f $(MAKEFILE) install; ) || true
191 @echo SHARP PLUGIN will not be build, because BUILD_NO_SHARP_PLUGIN is set to $(BUILD_NO_SHARP_PLUGIN) 191 ( [ -d pwmanager/libcrypt/error ] && cd pwmanager/libcrypt/error ; $(MAKE) -f $(MAKEFILE) install; ) || true
192 else 192 ( [ -d pwmanager/libcrypt/mpi ] && cd pwmanager/libcrypt/mpi ; $(MAKE) -f $(MAKEFILE) install; ) || true
193 ifndef SHARPDTMSDK 193 ( [ -d pwmanager/libcrypt/zlib ] && cd pwmanager/libcrypt/zlib ; $(MAKE) -f $(MAKEFILE) install; ) || true
194 @echo SHARP PLUGIN can not be build, because SHARPDTMSDK is set to $(SHARPDTMSDK) 194 ( [ -d gammu/emb/common ] && cd gammu/emb/common ; $(MAKE) -f $(MAKEFILE) install; ) || true
195 $(error SHARPDTMSDK is not defined) 195 ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; $(MAKE) -f $(MAKEFILE) install; ) || true
196 endif 196 ( [ -d libical ] && cd libical ; $(MAKE) -f $(MAKEFILE) install; ) || true
197 endif 197 ( [ -d libkcal ] && cd libkcal ; $(MAKE) -f $(MAKEFILE) install; ) || true
198 ifdef BUILD_NO_GAMMU 198 ( [ -d microkde ] && cd microkde ; $(MAKE) -f $(MAKEFILE) install; ) || true
199 @echo GAMMU will not be build, because BUILD_NO_GAMMU is set to $(BUILD_NO_GAMMU) 199 ( [ -d libkdepim ] && cd libkdepim ; $(MAKE) -f $(MAKEFILE) install; ) || true
200 endif 200 ( [ -d kabc ] && cd kabc ; $(MAKE) -f $(MAKEFILE) install; ) || true
201 ifdef BUILD_NO_PWMANAGER 201 ( [ -d pwmanager/pwmanager ] && cd pwmanager/pwmanager ; $(MAKE) -f $(MAKEFILE) install; ) || true
202 @echo PWMANAGER will not be build, because BUILD_NO_PWMANAGER is set to $(BUILD_NO_PWMANAGER) 202 ( [ -d korganizer ] && cd korganizer ; $(MAKE) -f $(MAKEFILE) install; ) || true
203 endif 203 ( [ -d kaddressbook ] && cd kaddressbook ; $(MAKE) -f $(MAKEFILE) install; ) || true
204 @echo -------------------------------------- 204 ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; $(MAKE) -f $(MAKEFILE) install; ) || true
205 205 ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; $(MAKE) -f $(MAKEFILE) install; ) || true
206 206distclean: qmake_all FORCE
207objects: 207 ( [ -d pwmanager/libcrypt/cipher ] && cd pwmanager/libcrypt/cipher ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
208 for i in $(SUBDIRS); do mkdir -p $$i/obj/$(PLATFORM); done 208 ( [ -d pwmanager/libcrypt/error ] && cd pwmanager/libcrypt/error ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
209 for i in $(SUBDIRS); do mkdir -p $$i/moc/$(PLATFORM); done 209 ( [ -d pwmanager/libcrypt/mpi ] && cd pwmanager/libcrypt/mpi ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
210 mkdir -p libical/lib/$(PLATFORM) 210 ( [ -d pwmanager/libcrypt/zlib ] && cd pwmanager/libcrypt/zlib ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
211 mkdir -p pwmanager/libcrypt/$(PLATFORM) 211 ( [ -d gammu/emb/common ] && cd gammu/emb/common ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
212 212 ( [ -d gammu/emb/gammu ] && cd gammu/emb/gammu ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
213clean: 213 ( [ -d libical ] && cd libical ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
214 rm -rf libical/lib/$(PLATFORM)/*; 214 ( [ -d libkcal ] && cd libkcal ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
215 rm -rf pwmanager/libcrypt/$(PLATFORM)/*; 215 ( [ -d microkde ] && cd microkde ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
216 for i in $(SUBDIRS); do pushd $$i; make clean; rm -f *~;\ 216 ( [ -d libkdepim ] && cd libkdepim ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
217 rm -f obj/$(PLATFORM)/*; rm -f moc/$(PLATFORM)/*; rm Makefile$(PLATFORM); popd; \ 217 ( [ -d kabc ] && cd kabc ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
218 done 218 ( [ -d pwmanager/pwmanager ] && cd pwmanager/pwmanager ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
219 219 ( [ -d korganizer ] && cd korganizer ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
220install: 220 ( [ -d kaddressbook ] && cd kaddressbook ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
221 221 ( [ -d kabc/plugins/file ] && cd kabc/plugins/file ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
222 cd bin/kdepim; make install 222 ( [ -d kabc/plugins/dir ] && cd kabc/plugins/dir ; $(MAKE) -f $(MAKEFILE) $@; $(DEL_FILE) $(MAKEFILE); ) || true
223 cp -r Pim $(QPEDIR)/apps 223
224 cp db2file/db2file $(QPEDIR)/bin/db2file 224install: install_subdirs
225 cp korganizer/korganizer.desktop $(QPEDIR)/apps/Pim/korganizer.desktop 225
226 cp kaddressbook/kaddressbook.desktop $(QPEDIR)/apps/Pim/kaddressbook.desktop 226uninstall: uninstall_subdirs
227 cp kmicromail/kmicromail.desktop $(QPEDIR)/apps/Pim/kopiemail.desktop 227
228 cp pwmanager/pwmanager/pwmanager.desktop $(QPEDIR)/apps/Pim/pwmanager.desktop 228FORCE:
229
230dist:
231 @echo Dont forget to do "make install" before "make dist"
232 rm -f *arm.ipk
233 rm -f *~
234 cd ..; tar czf kdepim.src.tar.gz --exclude=obj --exclude=moc --exclude=CVS --exclude=Makefilezaurus --exclude=Makefileqtopia kdepim
235 mkipks kmicrokdelibs.control
236 mkipks korganizer.control
237 mkipks kaddressbook.control
238 ifndef BUILD_NO_MICROMAIL
239 mkipks kopiemail.control
240 endif
241 mkipks korganizer-alarm.control
242 ifndef BUILD_NO_GAMMU
243 mkipks phoneaccess.control
244 endif
245 ifndef BUILD_NO_PWMANAGER
246 mkipks pwmanager.control
247 endif
248 mkipks pim_TAB_icon.control
249
250tmake: objects \
251 qtcompat/Makefile$(PLATFORM) \
252 microkde/Makefile$(PLATFORM) \
253 libkcal/Makefile$(PLATFORM) \
254 libkdepim/Makefile$(PLATFORM) \
255 korganizer/Makefile$(PLATFORM) \
256 kalarmd/Makefile$(PLATFORM) \
257 libical/src/libical/Makefile$(PLATFORM) \
258 libical/src/libicalss/Makefile$(PLATFORM) \
259 kabc/Makefile$(PLATFORM) \
260 kabc/formats/binary/Makefile$(PLATFORM) \
261 kabc/plugins/file/Makefile$(PLATFORM) \
262 kabc/plugins/dir/Makefile$(PLATFORM) \
263 kabc/plugins/ldap/Makefile$(PLATFORM) \
264 kabc/plugins/opie/Makefile$(PLATFORM) \
265 kabc/plugins/qtopia/Makefile$(PLATFORM) \
266 kabc/plugins/sharpdtm/Makefile$(PLATFORM) \
267 kaddressbook/Makefile$(PLATFORM) \
268 kmicromail/Makefile$(PLATFORM) \
269 kmicromail/libetpan/Makefile$(PLATFORM) \
270 kmicromail/libmailwrapper/Makefile$(PLATFORM) \
271 gammu/emb/common/Makefile$(PLATFORM) \
272 gammu/emb/gammu/Makefile$(PLATFORM) \
273 pwmanager/pwmanager/Makefile$(PLATFORM) \
274 pwmanager/libcrypt/mpi/Makefile$(PLATFORM) \
275 pwmanager/libcrypt/error/Makefile$(PLATFORM) \
276 pwmanager/libcrypt/cipher/Makefile$(PLATFORM) \
277 pwmanager/libcrypt/zlib/Makefile$(PLATFORM)
278
279qtcompat/Makefile$(PLATFORM): qtcompat/qtcompat.pro
280 cd qtcompat; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" qtcompat.pro -o Makefile$(PLATFORM)
281
282microkde/Makefile$(PLATFORM): microkde/microkdeE.pro
283 cd microkde; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" microkdeE.pro -o Makefile$(PLATFORM)
284
285libkcal/Makefile$(PLATFORM): libkcal/libkcalE.pro
286 cd libkcal; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" libkcalE.pro -o Makefile$(PLATFORM)
287
288
289libkdepim/Makefile$(PLATFORM): libkdepim/libkdepimE.pro
290 cd libkdepim; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" libkdepimE.pro -o Makefile$(PLATFORM)
291
292kalarmd/Makefile$(PLATFORM): kalarmd/kalarmdE.pro
293 cd kalarmd; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" kalarmdE.pro -o Makefile$(PLATFORM)
294
295korganizer/Makefile$(PLATFORM): korganizer/korganizerE.pro
296 cd korganizer; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" korganizerE.pro -o Makefile$(PLATFORM)
297
298libical/src/libical/Makefile$(PLATFORM): libical/src/libical/libicalE.pro
299 cd libical/src/libical; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" libicalE.pro -o Makefile$(PLATFORM)
300
301libical/src/libicalss/Makefile$(PLATFORM): libical/src/libicalss/libicalssE.pro
302 cd libical/src/libicalss; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" libicalssE.pro -o Makefile$(PLATFORM)
303
304kabc/Makefile$(PLATFORM): kabc/kabcE.pro
305 cd kabc; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" kabcE.pro -o Makefile$(PLATFORM)
306
307kabc/formats/binary/Makefile$(PLATFORM): kabc/formats/binary/kabcformat_binaryE.pro
308 cd kabc/formats/binary; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" kabcformat_binaryE.pro -o Makefile$(PLATFORM)
309
310kabc/plugins/file/Makefile$(PLATFORM): kabc/plugins/file/fileE.pro
311 cd kabc/plugins/file; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" fileE.pro -o Makefile$(PLATFORM)
312
313kabc/plugins/dir/Makefile$(PLATFORM): kabc/plugins/dir/dirE.pro
314 cd kabc/plugins/dir; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" dirE.pro -o Makefile$(PLATFORM)
315
316kabc/plugins/ldap/Makefile$(PLATFORM): kabc/plugins/ldap/ldapE.pro
317 cd kabc/plugins/ldap; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" ldapE.pro -o Makefile$(PLATFORM)
318
319kabc/plugins/opie/Makefile$(PLATFORM): kabc/plugins/opie/opieE.pro
320 cd kabc/plugins/opie; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" opieE.pro -o Makefile$(PLATFORM)
321
322kabc/plugins/qtopia/Makefile$(PLATFORM): kabc/plugins/qtopia/qtopiaE.pro
323 cd kabc/plugins/qtopia; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" qtopiaE.pro -o Makefile$(PLATFORM)
324
325kabc/plugins/sharpdtm/Makefile$(PLATFORM): kabc/plugins/sharpdtm/sharpdtmE.pro
326 cd kabc/plugins/sharpdtm; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" sharpdtmE.pro -o Makefile$(PLATFORM)
327
328kaddressbook/Makefile$(PLATFORM): kaddressbook/kaddressbookE.pro
329 cd kaddressbook; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" kaddressbookE.pro -o Makefile$(PLATFORM)
330
331kmicromail/Makefile$(PLATFORM): kmicromail/kmicromailE.pro
332 cd kmicromail; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" kmicromailE.pro -o Makefile$(PLATFORM)
333
334kmicromail/libetpan/Makefile$(PLATFORM): kmicromail/libetpan/libetpanE.pro
335 cd kmicromail/libetpan; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" libetpanE.pro -o Makefile$(PLATFORM)
336
337kmicromail/libmailwrapper/Makefile$(PLATFORM): kmicromail/libmailwrapper/libmailwrapperE.pro
338 cd kmicromail/libmailwrapper; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" libmailwrapperE.pro -o Makefile$(PLATFORM)
339
340gammu/emb/common/Makefile$(PLATFORM): gammu/emb/common/commonE.pro
341 cd gammu/emb/common; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" commonE.pro -o Makefile$(PLATFORM)
342
343gammu/emb/gammu/Makefile$(PLATFORM): gammu/emb/gammu/gammuE.pro
344 cd gammu/emb/gammu; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" gammuE.pro -o Makefile$(PLATFORM)
345
346pwmanager/pwmanager/Makefile$(PLATFORM): pwmanager/pwmanager/pwmanagerE.pro
347 cd pwmanager/pwmanager; tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" pwmanagerE.pro -o Makefile$(PLATFORM)
348
349
350pwmanager/libcrypt/mpi/Makefile$(PLATFORM): pwmanager/libcrypt/mpi/mpi.pro
351 cd pwmanager/libcrypt/mpi;tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" mpi.pro -o Makefile$(PLATFORM)
352
353pwmanager/libcrypt/error/Makefile$(PLATFORM): pwmanager/libcrypt/error/error.pro
354 cd pwmanager/libcrypt/error;tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" error.pro -o Makefile$(PLATFORM)
355
356pwmanager/libcrypt/cipher/Makefile$(PLATFORM): pwmanager/libcrypt/cipher/cipher.pro
357 cd pwmanager/libcrypt/cipher;tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" cipher.pro -o Makefile$(PLATFORM)
358
359pwmanager/libcrypt/zlib/Makefile$(PLATFORM): pwmanager/libcrypt/zlib/zlib.pro
360 cd pwmanager/libcrypt/zlib;tmake "CONFIG+=$(RELEASE_DEBUG)" "VERSION=$(KDEPIM_VERSION)" zlib.pro -o Makefile$(PLATFORM)
361
362 229
diff --git a/kdepim-desktop.pro b/kdepim-desktop.pro
index 7a3a96e..cb4eee3 100644
--- a/kdepim-desktop.pro
+++ b/kdepim-desktop.pro
@@ -1,6 +1,6 @@
1 1
2 2
3TEMPLATE = subdirs 3TEMPLATE = subdirs
4SUBDIRS = gammu/emb/common gammu/emb/gammu libical libkcal microkde libkdepim kabc korganizer kaddressbook kabc/plugins/file kabc/plugins/dir 4SUBDIRS = pwmanager/libcrypt/cipher pwmanager/libcrypt/error pwmanager/libcrypt/mpi pwmanager/libcrypt/zlib gammu/emb/common gammu/emb/gammu libical libkcal microkde libkdepim kabc pwmanager/pwmanager korganizer kaddressbook kabc/plugins/file kabc/plugins/dir
5#kalarmd 5#kalarmd
6 6
diff --git a/pwmanager/pwmanager/main.cpp b/pwmanager/pwmanager/main.cpp
index 3f2d055..9d1d863 100644
--- a/pwmanager/pwmanager/main.cpp
+++ b/pwmanager/pwmanager/main.cpp
@@ -1,213 +1,214 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 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#ifndef PWM_EMBEDDED 20#ifndef PWM_EMBEDDED
21#include <kcmdlineargs.h> 21#include <kcmdlineargs.h>
22#include <kaboutdata.h> 22#include <kaboutdata.h>
23#else 23#else
24#include <qdir.h> 24#include <qdir.h>
25#include <kpimglobalprefs.h> 25#include <kpimglobalprefs.h>
26#endif 26#endif
27 27
28#include <klocale.h> 28#include <klocale.h>
29#include <kstandarddirs.h> 29#include <kstandarddirs.h>
30 30
31#include "pwmexception.h" 31#include "pwmexception.h"
32#include "pwminit.h" 32#include "pwminit.h"
33 33
34 #define LICENSE_FILE(::locate("data", "pwmanager/pwmanager_license_text")) 34 #define LICENSE_FILE(::locate("data", "pwmanager/pwmanager_license_text"))
35 35
36int PwMApplication::newInstance() 36int PwMApplication::newInstance()
37{ 37{
38 static bool initial = true; 38 static bool initial = true;
39 if (initial) { 39 if (initial) {
40 initial = false; 40 initial = false;
41 init = new PwMInit(this); 41 init = new PwMInit(this);
42 init->initializeApp(); 42 init->initializeApp();
43 } else { 43 } else {
44 BUG_ON(!init); 44 BUG_ON(!init);
45 printInfo("passing parameters to old instance."); 45 printInfo("passing parameters to old instance.");
46 init->handleCmdLineArgs(false); 46 init->handleCmdLineArgs(false);
47 } 47 }
48 return EXIT_SUCCESS; 48 return EXIT_SUCCESS;
49} 49}
50 50
51 51
52static const char *description = I18N_NOOP("PwManager\n" 52static const char *description = I18N_NOOP("PwManager\n"
53 "The convenient way of managing passwords"); 53 "The convenient way of managing passwords");
54 54
55#ifndef PWM_EMBEDDED 55#ifndef PWM_EMBEDDED
56static KCmdLineOptions options[] = 56static KCmdLineOptions options[] =
57{ 57{
58 { "minimized", I18N_NOOP("Windows minimized"), 0 }, 58 { "minimized", I18N_NOOP("Windows minimized"), 0 },
59 { "mintray", I18N_NOOP("Windows minimized to tray"),0 }, 59 { "mintray", I18N_NOOP("Windows minimized to tray"),0 },
60 { "open-deeplocked", I18N_NOOP("Open all \"files\" deeplocked"),0 }, 60 { "open-deeplocked", I18N_NOOP("Open all \"files\" deeplocked"),0 },
61 { "skip-self-test", I18N_NOOP("Don't run a self-test on startup"),0 }, 61 { "skip-self-test", I18N_NOOP("Don't run a self-test on startup"),0 },
62 { "+[files...]", I18N_NOOP("Files to open on startup"), 0 }, 62 { "+[files...]", I18N_NOOP("Files to open on startup"), 0 },
63 { 0, 0, 0 } 63 { 0, 0, 0 }
64}; 64};
65#endif 65#endif
66 66
67#ifdef PWM_DEBUG 67#ifdef PWM_DEBUG
68static void printDebugConfigureInfo() 68static void printDebugConfigureInfo()
69{ 69{
70 cout << "================================" << endl; 70 cout << "================================" << endl;
71 cout << PROG_NAME " version " PACKAGE_VER << endl; 71 cout << PROG_NAME " version " PACKAGE_VER << endl;
72#ifdef CONFIG_KEYCARD 72#ifdef CONFIG_KEYCARD
73 cout << "CONFIG_KEYCARD: enabled" << endl; 73 cout << "CONFIG_KEYCARD: enabled" << endl;
74#else 74#else
75 cout << "CONFIG_KEYCARD: disabled" << endl; 75 cout << "CONFIG_KEYCARD: disabled" << endl;
76#endif 76#endif
77#ifdef CONFIG_KWALLETIF 77#ifdef CONFIG_KWALLETIF
78 cout << "CONFIG_KWALLETIF: enabled" << endl; 78 cout << "CONFIG_KWALLETIF: enabled" << endl;
79#else 79#else
80 cout << "CONFIG_KWALLETIF: disabled" << endl; 80 cout << "CONFIG_KWALLETIF: disabled" << endl;
81#endif 81#endif
82#ifdef BIG_ENDIAN_HOST 82#ifdef BIG_ENDIAN_HOST
83 cout << "Endianess: big-endian" << endl; 83 cout << "Endianess: big-endian" << endl;
84#else 84#else
85 cout << "Endianess: little-endian" << endl; 85 cout << "Endianess: little-endian" << endl;
86#endif 86#endif
87 cout << "sizeof(long): " << sizeof(long) << endl; 87 cout << "sizeof(long): " << sizeof(long) << endl;
88 cout << "================================" << endl; 88 cout << "================================" << endl;
89} 89}
90#else // PWM_DEBUG 90#else // PWM_DEBUG
91static inline void printDebugConfigureInfo() { /* nothing */ } 91static inline void printDebugConfigureInfo() { /* nothing */ }
92#endif // PWM_DEBUG 92#endif // PWM_DEBUG
93 93
94#ifndef PWM_EMBEDDED 94#ifndef PWM_EMBEDDED
95static void addAuthors(KAboutData *aboutData) 95static void addAuthors(KAboutData *aboutData)
96{ 96{
97 aboutData->addAuthor("Michael Buesch", 97 aboutData->addAuthor("Michael Buesch",
98 I18N_NOOP( 98 I18N_NOOP(
99 "main programming and current maintainer"), 99 "main programming and current maintainer"),
100 "mbuesch@freenet.de"); 100 "mbuesch@freenet.de");
101 aboutData->addAuthor("Matt Scifo", 101 aboutData->addAuthor("Matt Scifo",
102 I18N_NOOP( 102 I18N_NOOP(
103 "original implementaion of \n" 103 "original implementaion of \n"
104 "\"categories\" and the password-tree \n" 104 "\"categories\" and the password-tree \n"
105 "in the system-tray. Original implementations of \n" 105 "in the system-tray. Original implementations of \n"
106 "numerous view-improvements."), 106 "numerous view-improvements."),
107 "mscifo@o1.com"); 107 "mscifo@o1.com");
108 aboutData->addCredit("Elias Probst", 108 aboutData->addCredit("Elias Probst",
109 I18N_NOOP( 109 I18N_NOOP(
110 "Gentoo ebuild maintainer."), 110 "Gentoo ebuild maintainer."),
111 "elias.probst@gmx.de"); 111 "elias.probst@gmx.de");
112 aboutData->addCredit("George Staikos", 112 aboutData->addCredit("George Staikos",
113 I18N_NOOP("KWallet"), 113 I18N_NOOP("KWallet"),
114 "staikos@kde.org"); 114 "staikos@kde.org");
115 aboutData->addCredit("Matthew Palmer", 115 aboutData->addCredit("Matthew Palmer",
116 I18N_NOOP("rc2 code"), 116 I18N_NOOP("rc2 code"),
117 "mjp16@uow.edu.au"); 117 "mjp16@uow.edu.au");
118 aboutData->addCredit("Olivier Sessink", 118 aboutData->addCredit("Olivier Sessink",
119 I18N_NOOP("gpasman"), 119 I18N_NOOP("gpasman"),
120 "gpasman@nl.linux.org"); 120 "gpasman@nl.linux.org");
121 aboutData->addCredit("The libgcrypt developers", 121 aboutData->addCredit("The libgcrypt developers",
122 I18N_NOOP("Blowfish and SHA1 algorithms"), 122 I18N_NOOP("Blowfish and SHA1 algorithms"),
123 0, "ftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/"); 123 0, "ftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/");
124 aboutData->addCredit("Troy Engel", 124 aboutData->addCredit("Troy Engel",
125 I18N_NOOP("kpasman"), 125 I18N_NOOP("kpasman"),
126 "tengel@sonic.net"); 126 "tengel@sonic.net");
127 aboutData->addCredit("Wickey", 127 aboutData->addCredit("Wickey",
128 I18N_NOOP("graphics-design in older versions."), 128 I18N_NOOP("graphics-design in older versions."),
129 "wickey@gmx.at"); 129 "wickey@gmx.at");
130 aboutData->addCredit("Ian MacGregor", 130 aboutData->addCredit("Ian MacGregor",
131 I18N_NOOP( 131 I18N_NOOP(
132 "original documentation author.")); 132 "original documentation author."));
133} 133}
134#endif 134#endif
135 135
136int main(int argc, char *argv[]) 136int main(int argc, char *argv[])
137{ 137{
138 printDebugConfigureInfo(); 138 printDebugConfigureInfo();
139#ifndef PWM_EMBEDDED 139#ifndef PWM_EMBEDDED
140 KAboutData aboutData(PACKAGE_NAME, PROG_NAME, 140 KAboutData aboutData(PACKAGE_NAME, PROG_NAME,
141 PACKAGE_VER, description, KAboutData::License_File, 141 PACKAGE_VER, description, KAboutData::License_File,
142 "(c) 2003, 2004 Michael Buesch and the PwManager Team", 0, 142 "(c) 2003, 2004 Michael Buesch and the PwManager Team", 0,
143 "http://passwordmanager.sourceforge.net/", 143 "http://passwordmanager.sourceforge.net/",
144 "mbuesch@freenet.de"); 144 "mbuesch@freenet.de");
145 addAuthors(&aboutData); 145 addAuthors(&aboutData);
146 146
147 KCmdLineArgs::init(argc, argv, &aboutData); 147 KCmdLineArgs::init(argc, argv, &aboutData);
148 KCmdLineArgs::addCmdLineOptions(options); 148 KCmdLineArgs::addCmdLineOptions(options);
149 149
150 KUniqueApplication::addCmdLineOptions(); 150 KUniqueApplication::addCmdLineOptions();
151 if (!KUniqueApplication::start()) { 151 if (!KUniqueApplication::start()) {
152 printInfo("already running."); 152 printInfo("already running.");
153 return EXIT_SUCCESS; 153 return EXIT_SUCCESS;
154 } 154 }
155 PwMApplication a; 155 PwMApplication a;
156 aboutData.setLicenseTextFile(LICENSE_FILE); 156 aboutData.setLicenseTextFile(LICENSE_FILE);
157 return a.exec(); 157 return a.exec();
158#else 158#else
159 159
160 bool exitHelp = false; 160 bool exitHelp = false;
161 if ( argc > 1 ) { 161 if ( argc > 1 ) {
162 QString command = argv[1]; 162 QString command = argv[1];
163 if ( command == "-help" ){ 163 if ( command == "-help" ){
164 printf("PWM/PI command line commands:\n"); 164 printf("PWM/PI command line commands:\n");
165 printf(" no command: Start PWM/PI in usual way\n"); 165 printf(" no command: Start PWM/PI in usual way\n");
166 printf(" -help: This output\n"); 166 printf(" -help: This output\n");
167 printf(" PWM/PI is exiting now. Bye!\n"); 167 printf(" PWM/PI is exiting now. Bye!\n");
168 exitHelp = true; 168 exitHelp = true;
169 } 169 }
170 } 170 }
171 if ( ! exitHelp ) { 171 if ( ! exitHelp ) {
172 172
173 PwMApplication a(argc, argv); 173 PwMApplication a(argc, argv);
174 174
175 KGlobal::setAppName( "pwmanager" ); 175 KGlobal::setAppName( "pwmanager" );
176#ifndef DESKTOP_VERSION 176#ifndef DESKTOP_VERSION
177 //qDebug("width %d ",QApplication::desktop()->width() ); 177 //qDebug("width %d ",QApplication::desktop()->width() );
178 if ( QApplication::desktop()->width() > 320 ) 178 if ( QApplication::desktop()->width() > 320 )
179 KGlobal::iconLoader()->setIconPath(QString(getenv("QPEDIR"))+"/pics/kdepim/pwmanager/icons22/"); 179 KGlobal::iconLoader()->setIconPath(QString(getenv("QPEDIR"))+"/pics/kdepim/pwmanager/icons22/");
180 else 180 else
181 KGlobal::iconLoader()->setIconPath(QString(getenv("QPEDIR"))+"/pics/kdepim/pwmanager/icons16/"); 181 KGlobal::iconLoader()->setIconPath(QString(getenv("QPEDIR"))+"/pics/kdepim/pwmanager/icons16/");
182#else 182#else
183 QString fileName ; 183 QString fileName ;
184 fileName = qApp->applicationDirPath () + "/kdepim/pwmanager/icons22/"; 184 fileName = qApp->applicationDirPath () + "/kdepim/pwmanager/icons22/";
185 KGlobal::iconLoader()->setIconPath(QDir::convertSeparators(fileName)); 185 KGlobal::iconLoader()->setIconPath(QDir::convertSeparators(fileName));
186 QApplication::addLibraryPath ( qApp->applicationDirPath () ); 186 QApplication::addLibraryPath ( qApp->applicationDirPath () );
187 187
188#endif 188#endif
189 KStandardDirs::setAppDir( QDir::convertSeparators(locateLocal("data", "pwmanager"))); 189 KStandardDirs::setAppDir( QDir::convertSeparators(locateLocal("data", "pwmanager")));
190 KPimGlobalPrefs::instance()->setGlobalConfig(); 190 KPimGlobalPrefs::instance()->setGlobalConfig();
191 191
192 a.newInstance(); 192 a.newInstance();
193 193
194 //US KAddressBookMain m ; 194 //US KAddressBookMain m ;
195 195
196 //US QObject::connect(&a, SIGNAL (appMessage ( const QCString &, const QByteArray & )), ExternalAppHandler::instance(), SLOT (appMessage ( const QCString &, const QByteArray & ))); 196 //US QObject::connect(&a, SIGNAL (appMessage ( const QCString &, const QByteArray & )), ExternalAppHandler::instance(), SLOT (appMessage ( const QCString &, const QByteArray & )));
197 /*US 197 /*US
198#ifndef DESKTOP_VERSION 198#ifndef DESKTOP_VERSION
199 a.showMainWidget( &m ); 199 a.showMainWidget( &m );
200#else 200#else
201 a.setMainWidget( &m ); 201 a.setMainWidget( &m );
202 m.resize (640, 480 ); 202 m.resize (640, 480 );
203 m.show(); 203 m.show();
204#endif 204#endif
205 */ 205 */
206 qDebug("exec ");
206 a.exec(); 207 a.exec();
207 208
208 } 209 }
209 qDebug("PWMPI: Bye! "); 210 qDebug("PWMPI: Bye! ");
210 211
211#endif 212#endif
212 213
213} 214}
diff --git a/pwmanager/pwmanager/pwm.cpp b/pwmanager/pwmanager/pwm.cpp
index 26a44b1..c511661 100644
--- a/pwmanager/pwmanager/pwm.cpp
+++ b/pwmanager/pwmanager/pwm.cpp
@@ -1,1373 +1,1373 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 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 <klocale.h> 20#include <klocale.h>
21#include <klistview.h> 21#include <klistview.h>
22#include <ktoolbar.h> 22#include <ktoolbar.h>
23#include <kfiledialog.h> 23#include <kfiledialog.h>
24#include <kiconloader.h> 24#include <kiconloader.h>
25#include <kmessagebox.h> 25#include <kmessagebox.h>
26 26
27#ifndef PWM_EMBEDDED 27#ifndef PWM_EMBEDDED
28#include <kmenubar.h> 28#include <kmenubar.h>
29#include <kstatusbar.h> 29#include <kstatusbar.h>
30#include <dcopclient.h> 30#include <dcopclient.h>
31#include "configwndimpl.h" 31#include "configwndimpl.h"
32#include "configuration.h" 32#include "configuration.h"
33#else 33#else
34#include <qmenubar.h> 34#include <qmenubar.h>
35#include <qmessagebox.h> 35#include <qmessagebox.h>
36#include <pwmprefs.h> 36#include <pwmprefs.h>
37#include <kpimglobalprefs.h> 37#include <kpimglobalprefs.h>
38#include <kcmconfigs/kcmpwmconfig.h> 38#include <kcmconfigs/kcmpwmconfig.h>
39#include <kcmconfigs/kcmkdepimconfig.h> 39#include <kcmconfigs/kcmkdepimconfig.h>
40#include <kcmultidialog.h> 40#include <kcmultidialog.h>
41#endif 41#endif
42 42
43#include <qpixmap.h> 43#include <qpixmap.h>
44#include <qcheckbox.h> 44#include <qcheckbox.h>
45#include <qspinbox.h> 45#include <qspinbox.h>
46#include <qlineedit.h> 46#include <qlineedit.h>
47#include <qfileinfo.h> 47#include <qfileinfo.h>
48#include <qclipboard.h> 48#include <qclipboard.h>
49 49
50 50
51#include <stdio.h> 51#include <stdio.h>
52 52
53#include "pwm.h" 53#include "pwm.h"
54#include "pwminit.h" 54#include "pwminit.h"
55#include "pwmprint.h" 55#include "pwmprint.h"
56#include "addentrywndimpl.h" 56#include "addentrywndimpl.h"
57#include "globalstuff.h" 57#include "globalstuff.h"
58#include "findwndimpl.h" 58#include "findwndimpl.h"
59 59
60#ifdef CONFIG_KWALLETIF 60#ifdef CONFIG_KWALLETIF
61# include "kwalletif.h" 61# include "kwalletif.h"
62# include "kwalletemu.h" 62# include "kwalletemu.h"
63#endif 63#endif
64#ifdef CONFIG_KEYCARD 64#ifdef CONFIG_KEYCARD
65# include "pwmkeycard.h" 65# include "pwmkeycard.h"
66#endif 66#endif
67 67
68 68
69 #define DEFAULT_SIZE (QSize(700, 400)) 69 #define DEFAULT_SIZE (QSize(700, 400))
70 70
71// Button IDs for "file" popup menu 71// Button IDs for "file" popup menu
72enum { 72enum {
73 BUTTON_POPUP_FILE_NEW = 0, 73 BUTTON_POPUP_FILE_NEW = 0,
74 BUTTON_POPUP_FILE_OPEN, 74 BUTTON_POPUP_FILE_OPEN,
75 BUTTON_POPUP_FILE_CLOSE, 75 BUTTON_POPUP_FILE_CLOSE,
76 BUTTON_POPUP_FILE_SAVE, 76 BUTTON_POPUP_FILE_SAVE,
77 BUTTON_POPUP_FILE_SAVEAS, 77 BUTTON_POPUP_FILE_SAVEAS,
78 BUTTON_POPUP_FILE_EXPORT, 78 BUTTON_POPUP_FILE_EXPORT,
79 BUTTON_POPUP_FILE_IMPORT, 79 BUTTON_POPUP_FILE_IMPORT,
80 BUTTON_POPUP_FILE_PRINT, 80 BUTTON_POPUP_FILE_PRINT,
81 BUTTON_POPUP_FILE_QUIT 81 BUTTON_POPUP_FILE_QUIT
82}; 82};
83// Button IDs for "manage" popup menu 83// Button IDs for "manage" popup menu
84enum { 84enum {
85 BUTTON_POPUP_MANAGE_ADD = 0, 85 BUTTON_POPUP_MANAGE_ADD = 0,
86 BUTTON_POPUP_MANAGE_EDIT, 86 BUTTON_POPUP_MANAGE_EDIT,
87 BUTTON_POPUP_MANAGE_DEL, 87 BUTTON_POPUP_MANAGE_DEL,
88 BUTTON_POPUP_MANAGE_CHANGEMP 88 BUTTON_POPUP_MANAGE_CHANGEMP
89}; 89};
90// Button IDs for chipcard popup menu 90// Button IDs for chipcard popup menu
91enum { 91enum {
92#ifdef CONFIG_KEYCARD 92#ifdef CONFIG_KEYCARD
93 BUTTON_POPUP_CHIPCARD_GENNEW = 0, 93 BUTTON_POPUP_CHIPCARD_GENNEW = 0,
94 BUTTON_POPUP_CHIPCARD_DEL, 94 BUTTON_POPUP_CHIPCARD_DEL,
95 BUTTON_POPUP_CHIPCARD_READID, 95 BUTTON_POPUP_CHIPCARD_READID,
96 BUTTON_POPUP_CHIPCARD_SAVEBACKUP, 96 BUTTON_POPUP_CHIPCARD_SAVEBACKUP,
97 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP 97 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP
98#else // CONFIG_KEYCARD 98#else // CONFIG_KEYCARD
99 BUTTON_POPUP_CHIPCARD_NO = 0 99 BUTTON_POPUP_CHIPCARD_NO = 0
100#endif // CONFIG_KEYCARD 100#endif // CONFIG_KEYCARD
101}; 101};
102// Button IDs for "view" popup menu 102// Button IDs for "view" popup menu
103enum { 103enum {
104 BUTTON_POPUP_VIEW_FIND = 0, 104 BUTTON_POPUP_VIEW_FIND = 0,
105 BUTTON_POPUP_VIEW_LOCK, 105 BUTTON_POPUP_VIEW_LOCK,
106 BUTTON_POPUP_VIEW_DEEPLOCK, 106 BUTTON_POPUP_VIEW_DEEPLOCK,
107 BUTTON_POPUP_VIEW_UNLOCK 107 BUTTON_POPUP_VIEW_UNLOCK
108}; 108};
109// Button IDs for "options" popup menu 109// Button IDs for "options" popup menu
110enum { 110enum {
111 BUTTON_POPUP_OPTIONS_CONFIG = 0 111 BUTTON_POPUP_OPTIONS_CONFIG = 0
112}; 112};
113// Button IDs for "export" popup menu (in "file" popup menu) 113// Button IDs for "export" popup menu (in "file" popup menu)
114enum { 114enum {
115 BUTTON_POPUP_EXPORT_TEXT = 0, 115 BUTTON_POPUP_EXPORT_TEXT = 0,
116 BUTTON_POPUP_EXPORT_GPASMAN 116 BUTTON_POPUP_EXPORT_GPASMAN
117#ifdef CONFIG_KWALLETIF 117#ifdef CONFIG_KWALLETIF
118 ,BUTTON_POPUP_EXPORT_KWALLET 118 ,BUTTON_POPUP_EXPORT_KWALLET
119#endif 119#endif
120}; 120};
121// Button IDs for "import" popup menu (in "file" popup menu) 121// Button IDs for "import" popup menu (in "file" popup menu)
122enum { 122enum {
123 BUTTON_POPUP_IMPORT_TEXT = 0, 123 BUTTON_POPUP_IMPORT_TEXT = 0,
124 BUTTON_POPUP_IMPORT_GPASMAN 124 BUTTON_POPUP_IMPORT_GPASMAN
125#ifdef CONFIG_KWALLETIF 125#ifdef CONFIG_KWALLETIF
126 ,BUTTON_POPUP_IMPORT_KWALLET 126 ,BUTTON_POPUP_IMPORT_KWALLET
127#endif 127#endif
128}; 128};
129 129
130#ifdef PWM_EMBEDDED 130#ifdef PWM_EMBEDDED
131// Button IDs for "help" popup menu 131// Button IDs for "help" popup menu
132enum { 132enum {
133 BUTTON_POPUP_HELP_LICENSE = 0, 133 BUTTON_POPUP_HELP_LICENSE = 0,
134 BUTTON_POPUP_HELP_FAQ, 134 BUTTON_POPUP_HELP_FAQ,
135 BUTTON_POPUP_HELP_ABOUT, 135 BUTTON_POPUP_HELP_ABOUT,
136 BUTTON_POPUP_HELP_SYNC, 136 BUTTON_POPUP_HELP_SYNC,
137 BUTTON_POPUP_HELP_WHATSNEW 137 BUTTON_POPUP_HELP_WHATSNEW
138}; 138};
139#endif 139#endif
140 140
141// Button IDs for toolbar 141// Button IDs for toolbar
142enum { 142enum {
143 BUTTON_TOOL_NEW = 0, 143 BUTTON_TOOL_NEW = 0,
144 BUTTON_TOOL_OPEN, 144 BUTTON_TOOL_OPEN,
145 BUTTON_TOOL_SAVE, 145 BUTTON_TOOL_SAVE,
146 BUTTON_TOOL_SAVEAS, 146 BUTTON_TOOL_SAVEAS,
147 BUTTON_TOOL_PRINT, 147 BUTTON_TOOL_PRINT,
148 BUTTON_TOOL_ADD, 148 BUTTON_TOOL_ADD,
149 BUTTON_TOOL_EDIT, 149 BUTTON_TOOL_EDIT,
150 BUTTON_TOOL_DEL, 150 BUTTON_TOOL_DEL,
151 BUTTON_TOOL_FIND, 151 BUTTON_TOOL_FIND,
152 BUTTON_TOOL_LOCK, 152 BUTTON_TOOL_LOCK,
153 BUTTON_TOOL_DEEPLOCK, 153 BUTTON_TOOL_DEEPLOCK,
154 BUTTON_TOOL_UNLOCK 154 BUTTON_TOOL_UNLOCK
155}; 155};
156 156
157 157
158PwM::PwM(PwMInit *_init, PwMDoc *doc, 158PwM::PwM(PwMInit *_init, PwMDoc *doc,
159 bool virginity, 159 bool virginity,
160 QWidget *parent, const char *name) 160 QWidget *parent, const char *name)
161 : KMainWindow(parent, "HALLO") 161 : KMainWindow(parent, "HALLO")
162 , forceQuit (false) 162 , forceQuit (false)
163 , forceMinimizeToTray (false) 163 , forceMinimizeToTray (false)
164{ 164{
165 init = _init; 165 init = _init;
166 connect(doc, SIGNAL(docClosed(PwMDoc *)), 166 connect(doc, SIGNAL(docClosed(PwMDoc *)),
167 this, SLOT(docClosed(PwMDoc *))); 167 this, SLOT(docClosed(PwMDoc *)));
168 initMenubar(); 168 initMenubar();
169 initToolbar(); 169 initToolbar();
170 initMetrics(); 170 initMetrics();
171 setVirgin(virginity); 171 setVirgin(virginity);
172 setFocusPolicy(QWidget::WheelFocus); 172 setFocusPolicy(QWidget::WheelFocus);
173#ifndef PWM_EMBEDDED 173#ifndef PWM_EMBEDDED
174 statusBar()->show(); 174 statusBar()->show();
175#endif 175#endif
176 view = makeNewListView(doc); 176 view = makeNewListView(doc);
177 setCentralWidget(view); 177 setCentralWidget(view);
178 updateCaption(); 178 updateCaption();
179 showStatMsg(i18n("Ready.")); 179 showStatMsg(i18n("Ready."));
180} 180}
181 181
182PwM::~PwM() 182PwM::~PwM()
183{ 183{
184 disconnect(curDoc(), SIGNAL(docClosed(PwMDoc *)), 184 disconnect(curDoc(), SIGNAL(docClosed(PwMDoc *)),
185 this, SLOT(docClosed(PwMDoc *))); 185 this, SLOT(docClosed(PwMDoc *)));
186 conf()->confWndMainWndSize(size()); 186 conf()->confWndMainWndSize(size());
187 emit closed(this); 187 emit closed(this);
188 delete view; 188 delete view;
189} 189}
190 190
191void PwM::initMenubar() 191void PwM::initMenubar()
192{ 192{
193 KIconLoader* picons; 193 KIconLoader* picons;
194#ifndef PWM_EMBEDDED 194#ifndef PWM_EMBEDDED
195 KIconLoader icons; 195 KIconLoader icons;
196 picons = &icons; 196 picons = &icons;
197#else 197#else
198 picons = KGlobal::iconLoader(); 198 picons = KGlobal::iconLoader();
199 199
200 200
201 syncPopup = new KPopupMenu(this); 201 syncPopup = new KPopupMenu(this);
202 202
203 syncManager = new KSyncManager((QWidget*)this, (KSyncInterface*)this, KSyncManager::PWMPI, PWMPrefs::instance(), syncPopup); 203 syncManager = new KSyncManager((QWidget*)this, (KSyncInterface*)this, KSyncManager::PWMPI, PWMPrefs::instance(), syncPopup);
204 syncManager->setBlockSave(false); 204 syncManager->setBlockSave(false);
205 205
206 connect ( syncPopup, SIGNAL( activated ( int ) ), syncManager, SLOT (slotSyncMenu( int ) ) ); 206 connect ( syncPopup, SIGNAL( activated ( int ) ), syncManager, SLOT (slotSyncMenu( int ) ) );
207 syncManager->fillSyncMenu(); 207 syncManager->fillSyncMenu();
208 208
209#endif 209#endif
210 filePopup = new KPopupMenu(this); 210 filePopup = new KPopupMenu(this);
211 importPopup = new KPopupMenu(filePopup); 211 importPopup = new KPopupMenu(filePopup);
212 exportPopup = new KPopupMenu(filePopup); 212 exportPopup = new KPopupMenu(filePopup);
213 managePopup = new KPopupMenu(this); 213 managePopup = new KPopupMenu(this);
214#ifdef CONFIG_KEYCARD 214#ifdef CONFIG_KEYCARD
215 chipcardPopup = new KPopupMenu(this); 215 chipcardPopup = new KPopupMenu(this);
216#endif // CONFIG_KEYCARD 216#endif // CONFIG_KEYCARD
217 viewPopup = new KPopupMenu(this); 217 viewPopup = new KPopupMenu(this);
218 optionsPopup = new KPopupMenu(this); 218 optionsPopup = new KPopupMenu(this);
219 219
220// "file" popup menu 220// "file" popup menu
221 filePopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)), 221 filePopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)),
222 i18n("&New"), this, 222 i18n("&New"), this,
223 SLOT(new_slot()), 0, BUTTON_POPUP_FILE_NEW); 223 SLOT(new_slot()), 0, BUTTON_POPUP_FILE_NEW);
224 filePopup->insertItem(QIconSet(picons->loadIcon("fileopen", KIcon::Small)), 224 filePopup->insertItem(QIconSet(picons->loadIcon("fileopen", KIcon::Small)),
225 i18n("&Open"), this, 225 i18n("&Open"), this,
226 SLOT(open_slot()), 0, BUTTON_POPUP_FILE_OPEN); 226 SLOT(open_slot()), 0, BUTTON_POPUP_FILE_OPEN);
227 filePopup->insertItem(QIconSet(picons->loadIcon("fileclose", KIcon::Small)), 227 filePopup->insertItem(QIconSet(picons->loadIcon("fileclose", KIcon::Small)),
228 i18n("&Close"), this, 228 i18n("&Close"), this,
229 SLOT(close_slot()), 0, BUTTON_POPUP_FILE_CLOSE); 229 SLOT(close_slot()), 0, BUTTON_POPUP_FILE_CLOSE);
230 filePopup->insertSeparator(); 230 filePopup->insertSeparator();
231 filePopup->insertItem(QIconSet(picons->loadIcon("filesave", KIcon::Small)), 231 filePopup->insertItem(QIconSet(picons->loadIcon("filesave", KIcon::Small)),
232 i18n("&Save"), this, 232 i18n("&Save"), this,
233 SLOT(save_slot()), 0, BUTTON_POPUP_FILE_SAVE); 233 SLOT(save_slot()), 0, BUTTON_POPUP_FILE_SAVE);
234 filePopup->insertItem(QIconSet(picons->loadIcon("filesaveas", KIcon::Small)), 234 filePopup->insertItem(QIconSet(picons->loadIcon("filesaveas", KIcon::Small)),
235 i18n("Save &as..."), 235 i18n("Save &as..."),
236 this, SLOT(saveAs_slot()), 0, 236 this, SLOT(saveAs_slot()), 0,
237 BUTTON_POPUP_FILE_SAVEAS); 237 BUTTON_POPUP_FILE_SAVEAS);
238 filePopup->insertSeparator(); 238 filePopup->insertSeparator();
239 // "file/export" popup menu 239 // "file/export" popup menu
240 exportPopup->insertItem(i18n("&Text-file..."), this, 240 exportPopup->insertItem(i18n("&Text-file..."), this,
241 SLOT(exportToText()), 0, BUTTON_POPUP_EXPORT_TEXT); 241 SLOT(exportToText()), 0, BUTTON_POPUP_EXPORT_TEXT);
242 exportPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this, 242 exportPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this,
243 SLOT(exportToGpasman()), 0, BUTTON_POPUP_EXPORT_GPASMAN); 243 SLOT(exportToGpasman()), 0, BUTTON_POPUP_EXPORT_GPASMAN);
244#ifdef CONFIG_KWALLETIF 244#ifdef CONFIG_KWALLETIF
245 exportPopup->insertItem(i18n("&KWallet..."), this, 245 exportPopup->insertItem(i18n("&KWallet..."), this,
246 SLOT(exportToKWallet()), 0, BUTTON_POPUP_EXPORT_KWALLET); 246 SLOT(exportToKWallet()), 0, BUTTON_POPUP_EXPORT_KWALLET);
247#endif 247#endif
248 filePopup->insertItem(QIconSet(picons->loadIcon("fileexport", KIcon::Small)), 248 filePopup->insertItem(QIconSet(picons->loadIcon("fileexport", KIcon::Small)),
249 i18n("E&xport"), exportPopup, 249 i18n("E&xport"), exportPopup,
250 BUTTON_POPUP_FILE_EXPORT); 250 BUTTON_POPUP_FILE_EXPORT);
251 // "file/import" popup menu 251 // "file/import" popup menu
252 importPopup->insertItem(i18n("&Text-file..."), this, 252 importPopup->insertItem(i18n("&Text-file..."), this,
253 SLOT(importFromText()), 0, BUTTON_POPUP_IMPORT_TEXT); 253 SLOT(importFromText()), 0, BUTTON_POPUP_IMPORT_TEXT);
254 importPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this, 254 importPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this,
255 SLOT(importFromGpasman()), 0, BUTTON_POPUP_IMPORT_GPASMAN); 255 SLOT(importFromGpasman()), 0, BUTTON_POPUP_IMPORT_GPASMAN);
256#ifdef CONFIG_KWALLETIF 256#ifdef CONFIG_KWALLETIF
257 importPopup->insertItem(i18n("&KWallet..."), this, 257 importPopup->insertItem(i18n("&KWallet..."), this,
258 SLOT(importKWallet()), 0, BUTTON_POPUP_IMPORT_KWALLET); 258 SLOT(importKWallet()), 0, BUTTON_POPUP_IMPORT_KWALLET);
259#endif 259#endif
260 filePopup->insertItem(QIconSet(picons->loadIcon("fileimport", KIcon::Small)), 260 filePopup->insertItem(QIconSet(picons->loadIcon("fileimport", KIcon::Small)),
261 i18n("I&mport"), importPopup, 261 i18n("I&mport"), importPopup,
262 BUTTON_POPUP_FILE_IMPORT); 262 BUTTON_POPUP_FILE_IMPORT);
263 filePopup->insertSeparator(); 263 filePopup->insertSeparator();
264 filePopup->insertItem(QIconSet(picons->loadIcon("fileprint", KIcon::Small)), 264 filePopup->insertItem(QIconSet(picons->loadIcon("fileprint", KIcon::Small)),
265 i18n("&Print..."), this, 265 i18n("&Print..."), this,
266 SLOT(print_slot()), 0, BUTTON_POPUP_FILE_PRINT); 266 SLOT(print_slot()), 0, BUTTON_POPUP_FILE_PRINT);
267 filePopup->insertSeparator(); 267 filePopup->insertSeparator();
268 filePopup->insertItem(QIconSet(picons->loadIcon("exit", KIcon::Small)), 268 filePopup->insertItem(QIconSet(picons->loadIcon("exit", KIcon::Small)),
269 i18n("&Quit"), this, 269 i18n("&Quit"), this,
270 SLOT(quitButton_slot()), 0, BUTTON_POPUP_FILE_QUIT); 270 SLOT(quitButton_slot()), 0, BUTTON_POPUP_FILE_QUIT);
271 menuBar()->insertItem(i18n("&File"), filePopup); 271 menuBar()->insertItem(i18n("&File"), filePopup);
272// "manage" popup menu 272// "manage" popup menu
273 managePopup->insertItem(QIconSet(picons->loadIcon("pencil", KIcon::Small)), 273 managePopup->insertItem(QIconSet(picons->loadIcon("pencil", KIcon::Small)),
274 i18n("&Add password"), this, 274 i18n("&Add password"), this,
275 SLOT(addPwd_slot()), 0, 275 SLOT(addPwd_slot()), 0,
276 BUTTON_POPUP_MANAGE_ADD); 276 BUTTON_POPUP_MANAGE_ADD);
277 managePopup->insertItem(QIconSet(picons->loadIcon("edit", KIcon::Small)), 277 managePopup->insertItem(QIconSet(picons->loadIcon("edit", KIcon::Small)),
278 i18n("&Edit"), this, SLOT(editPwd_slot()), 0, 278 i18n("&Edit"), this, SLOT(editPwd_slot()), 0,
279 BUTTON_POPUP_MANAGE_EDIT); 279 BUTTON_POPUP_MANAGE_EDIT);
280 managePopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)), 280 managePopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)),
281 i18n("&Delete"), this, SLOT(deletePwd_slot()), 281 i18n("&Delete"), this, SLOT(deletePwd_slot()),
282 0, BUTTON_POPUP_MANAGE_DEL); 282 0, BUTTON_POPUP_MANAGE_DEL);
283 managePopup->insertSeparator(); 283 managePopup->insertSeparator();
284 managePopup->insertItem(QIconSet(picons->loadIcon("rotate", KIcon::Small)), 284 managePopup->insertItem(QIconSet(picons->loadIcon("rotate", KIcon::Small)),
285 i18n("Change &Master Password"), this, 285 i18n("Change &Master Password"), this,
286 SLOT(changeMasterPwd_slot()), 0, 286 SLOT(changeMasterPwd_slot()), 0,
287 BUTTON_POPUP_MANAGE_CHANGEMP); 287 BUTTON_POPUP_MANAGE_CHANGEMP);
288 menuBar()->insertItem(i18n("&Manage"), managePopup); 288 menuBar()->insertItem(i18n("&Manage"), managePopup);
289// "chipcard" popup menu 289// "chipcard" popup menu
290#ifdef CONFIG_KEYCARD 290#ifdef CONFIG_KEYCARD
291 chipcardPopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)), 291 chipcardPopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)),
292 i18n("&Generate new key-card"), this, 292 i18n("&Generate new key-card"), this,
293 SLOT(genNewCard_slot()), 0, 293 SLOT(genNewCard_slot()), 0,
294 BUTTON_POPUP_CHIPCARD_GENNEW); 294 BUTTON_POPUP_CHIPCARD_GENNEW);
295 chipcardPopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)), 295 chipcardPopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)),
296 i18n("&Erase key-card"), this, 296 i18n("&Erase key-card"), this,
297 SLOT(eraseCard_slot()), 0, 297 SLOT(eraseCard_slot()), 0,
298 BUTTON_POPUP_CHIPCARD_DEL); 298 BUTTON_POPUP_CHIPCARD_DEL);
299 chipcardPopup->insertItem(QIconSet(picons->loadIcon("", KIcon::Small)), 299 chipcardPopup->insertItem(QIconSet(picons->loadIcon("", KIcon::Small)),
300 i18n("Read card-&ID"), this, 300 i18n("Read card-&ID"), this,
301 SLOT(readCardId_slot()), 0, 301 SLOT(readCardId_slot()), 0,
302 BUTTON_POPUP_CHIPCARD_READID); 302 BUTTON_POPUP_CHIPCARD_READID);
303 chipcardPopup->insertSeparator(); 303 chipcardPopup->insertSeparator();
304 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2rightarrow", KIcon::Small)), 304 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2rightarrow", KIcon::Small)),
305 i18n("&Make card backup-image"), this, 305 i18n("&Make card backup-image"), this,
306 SLOT(makeCardBackup_slot()), 0, 306 SLOT(makeCardBackup_slot()), 0,
307 BUTTON_POPUP_CHIPCARD_SAVEBACKUP); 307 BUTTON_POPUP_CHIPCARD_SAVEBACKUP);
308 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2leftarrow", KIcon::Small)), 308 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2leftarrow", KIcon::Small)),
309 i18n("&Replay card backup-image"), this, 309 i18n("&Replay card backup-image"), this,
310 SLOT(replayCardBackup_slot()), 0, 310 SLOT(replayCardBackup_slot()), 0,
311 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP); 311 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP);
312 menuBar()->insertItem(i18n("&Chipcard manager"), chipcardPopup); 312 menuBar()->insertItem(i18n("&Chipcard manager"), chipcardPopup);
313#endif // CONFIG_KEYCARD 313#endif // CONFIG_KEYCARD
314// "view" popup menu 314// "view" popup menu
315 viewPopup->insertItem(QIconSet(picons->loadIcon("find", KIcon::Small)), 315 viewPopup->insertItem(QIconSet(picons->loadIcon("find", KIcon::Small)),
316 i18n("&Find"), this, 316 i18n("&Find"), this,
317 SLOT(find_slot()), 0, BUTTON_POPUP_VIEW_FIND); 317 SLOT(find_slot()), 0, BUTTON_POPUP_VIEW_FIND);
318 viewPopup->insertSeparator(); 318 viewPopup->insertSeparator();
319 viewPopup->insertItem(QIconSet(picons->loadIcon("halfencrypted", KIcon::Small)), 319 viewPopup->insertItem(QIconSet(picons->loadIcon("halfencrypted", KIcon::Small)),
320 i18n("&Lock all entries"), this, 320 i18n("&Lock all entries"), this,
321 SLOT(lockWnd_slot()), 0, 321 SLOT(lockWnd_slot()), 0,
322 BUTTON_POPUP_VIEW_LOCK); 322 BUTTON_POPUP_VIEW_LOCK);
323 viewPopup->insertItem(QIconSet(picons->loadIcon("encrypted", KIcon::Small)), 323 viewPopup->insertItem(QIconSet(picons->loadIcon("encrypted", KIcon::Small)),
324 i18n("&Deep-lock all entries"), this, 324 i18n("&Deep-lock all entries"), this,
325 SLOT(deepLockWnd_slot()), 0, 325 SLOT(deepLockWnd_slot()), 0,
326 BUTTON_POPUP_VIEW_DEEPLOCK); 326 BUTTON_POPUP_VIEW_DEEPLOCK);
327 viewPopup->insertItem(QIconSet(picons->loadIcon("decrypted", KIcon::Small)), 327 viewPopup->insertItem(QIconSet(picons->loadIcon("decrypted", KIcon::Small)),
328 i18n("&Unlock all entries"), this, 328 i18n("&Unlock all entries"), this,
329 SLOT(unlockWnd_slot()), 0, 329 SLOT(unlockWnd_slot()), 0,
330 BUTTON_POPUP_VIEW_UNLOCK); 330 BUTTON_POPUP_VIEW_UNLOCK);
331 menuBar()->insertItem(i18n("&View"), viewPopup); 331 menuBar()->insertItem(i18n("&View"), viewPopup);
332// "options" popup menu 332// "options" popup menu
333 optionsPopup->insertItem(QIconSet(picons->loadIcon("configure", KIcon::Small)), 333 optionsPopup->insertItem(QIconSet(picons->loadIcon("configure", KIcon::Small)),
334 i18n("&Configure..."), this, 334 i18n("&Configure..."), this,
335 SLOT(config_slot()), 335 SLOT(config_slot()),
336 BUTTON_POPUP_OPTIONS_CONFIG); 336 BUTTON_POPUP_OPTIONS_CONFIG);
337 menuBar()->insertItem(i18n("&Options"), optionsPopup); 337 menuBar()->insertItem(i18n("&Options"), optionsPopup);
338// "help" popup menu 338// "help" popup menu
339#ifndef PWM_EMBEDDED 339#ifndef PWM_EMBEDDED
340 helpPopup = helpMenu(QString::null, false); 340 helpPopup = helpMenu(QString::null, false);
341#else 341#else
342 menuBar()->insertItem(i18n("&Sync"), syncPopup); 342 menuBar()->insertItem(i18n("&Sync"), syncPopup);
343 343
344 344
345 345
346 346
347 347
348 helpPopup = new KPopupMenu(this); 348 helpPopup = new KPopupMenu(this);
349 349
350 350
351 helpPopup->insertItem(i18n("&License"), this, 351 helpPopup->insertItem(i18n("&License"), this,
352 SLOT(showLicense_slot()), 0, 352 SLOT(showLicense_slot()), 0,
353 BUTTON_POPUP_HELP_LICENSE); 353 BUTTON_POPUP_HELP_LICENSE);
354 354
355 helpPopup->insertItem(i18n("&Faq"), this, 355 helpPopup->insertItem(i18n("&Faq"), this,
356 SLOT(faq_slot()), 0, 356 SLOT(faq_slot()), 0,
357 BUTTON_POPUP_HELP_FAQ); 357 BUTTON_POPUP_HELP_FAQ);
358 358
359 helpPopup->insertItem(i18n("&About PwManager"), this, 359 helpPopup->insertItem(i18n("&About PwManager"), this,
360 SLOT(createAboutData_slot()), 0, 360 SLOT(createAboutData_slot()), 0,
361 BUTTON_POPUP_HELP_ABOUT); 361 BUTTON_POPUP_HELP_ABOUT);
362 362
363 helpPopup->insertItem(i18n("&Sync HowTo"), this, 363 helpPopup->insertItem(i18n("&Sync HowTo"), this,
364 SLOT(syncHowTo_slot()), 0, 364 SLOT(syncHowTo_slot()), 0,
365 BUTTON_POPUP_HELP_SYNC); 365 BUTTON_POPUP_HELP_SYNC);
366 366
367 helpPopup->insertItem(i18n("&What's New"), this, 367 helpPopup->insertItem(i18n("&What's New"), this,
368 SLOT(whatsnew_slot()), 0, 368 SLOT(whatsnew_slot()), 0,
369 BUTTON_POPUP_HELP_WHATSNEW); 369 BUTTON_POPUP_HELP_WHATSNEW);
370 370
371#endif 371#endif
372 menuBar()->insertItem(i18n("&Help"), helpPopup); 372 menuBar()->insertItem(i18n("&Help"), helpPopup);
373 373
374} 374}
375 375
376void PwM::initToolbar() 376void PwM::initToolbar()
377{ 377{
378 KIconLoader* picons; 378 KIconLoader* picons;
379#ifndef PWM_EMBEDDED 379#ifndef PWM_EMBEDDED
380 KIconLoader icons; 380 KIconLoader icons;
381 picons = &icons; 381 picons = &icons;
382#else 382#else
383 picons = KGlobal::iconLoader(); 383 picons = KGlobal::iconLoader();
384#endif 384#endif
385 385
386#ifdef PWM_EMBEDDED 386#ifdef PWM_EMBEDDED
387 if ( QApplication::desktop()->width() > 320 ) 387 if ( QApplication::desktop()->width() > 320 )
388#endif 388#endif
389 { 389 {
390 toolBar()->insertButton(picons->loadIcon("filenew", KIcon::Toolbar), 390 toolBar()->insertButton(picons->loadIcon("filenew", KIcon::Toolbar),
391 BUTTON_TOOL_NEW, SIGNAL(clicked(int)), this, 391 BUTTON_TOOL_NEW, SIGNAL(clicked(int)), this,
392 SLOT(new_slot()), true, i18n("New")); 392 SLOT(new_slot()), true, i18n("New"));
393 toolBar()->insertButton(picons->loadIcon("fileopen", KIcon::Toolbar), 393 toolBar()->insertButton(picons->loadIcon("fileopen", KIcon::Toolbar),
394 BUTTON_TOOL_OPEN, SIGNAL(clicked(int)), this, 394 BUTTON_TOOL_OPEN, SIGNAL(clicked(int)), this,
395 SLOT(open_slot()), true, i18n("Open")); 395 SLOT(open_slot()), true, i18n("Open"));
396 toolBar()->insertSeparator(); 396 toolBar()->insertSeparator();
397 } 397 }
398 toolBar()->insertButton(picons->loadIcon("filesave", KIcon::Toolbar), 398 toolBar()->insertButton(picons->loadIcon("filesave", KIcon::Toolbar),
399 BUTTON_TOOL_SAVE, SIGNAL(clicked(int)), this, 399 BUTTON_TOOL_SAVE, SIGNAL(clicked(int)), this,
400 SLOT(save_slot()), true, i18n("Save")); 400 SLOT(save_slot()), true, i18n("Save"));
401 toolBar()->insertButton(picons->loadIcon("filesaveas", KIcon::Toolbar), 401 toolBar()->insertButton(picons->loadIcon("filesaveas", KIcon::Toolbar),
402 BUTTON_TOOL_SAVEAS, SIGNAL(clicked(int)), this, 402 BUTTON_TOOL_SAVEAS, SIGNAL(clicked(int)), this,
403 SLOT(saveAs_slot()), true, i18n("Save as")); 403 SLOT(saveAs_slot()), true, i18n("Save as"));
404 toolBar()->insertButton(picons->loadIcon("fileprint", KIcon::Toolbar), 404 toolBar()->insertButton(picons->loadIcon("fileprint", KIcon::Toolbar),
405 BUTTON_TOOL_PRINT, SIGNAL(clicked(int)), this, 405 BUTTON_TOOL_PRINT, SIGNAL(clicked(int)), this,
406 SLOT(print_slot()), true, i18n("Print...")); 406 SLOT(print_slot()), true, i18n("Print..."));
407 toolBar()->insertSeparator(); 407 toolBar()->insertSeparator();
408 toolBar()->insertButton(picons->loadIcon("pencil", KIcon::Toolbar), 408 toolBar()->insertButton(picons->loadIcon("pencil", KIcon::Toolbar),
409 BUTTON_TOOL_ADD, SIGNAL(clicked(int)), this, 409 BUTTON_TOOL_ADD, SIGNAL(clicked(int)), this,
410 SLOT(addPwd_slot()), true, 410 SLOT(addPwd_slot()), true,
411 i18n("Add password")); 411 i18n("Add password"));
412 toolBar()->insertButton(picons->loadIcon("edit", KIcon::Toolbar), 412 toolBar()->insertButton(picons->loadIcon("edit", KIcon::Toolbar),
413 BUTTON_TOOL_EDIT, SIGNAL(clicked(int)), this, 413 BUTTON_TOOL_EDIT, SIGNAL(clicked(int)), this,
414 SLOT(editPwd_slot()), true, 414 SLOT(editPwd_slot()), true,
415 i18n("Edit password")); 415 i18n("Edit password"));
416 toolBar()->insertButton(picons->loadIcon("editdelete", KIcon::Toolbar), 416 toolBar()->insertButton(picons->loadIcon("editdelete", KIcon::Toolbar),
417 BUTTON_TOOL_DEL, SIGNAL(clicked(int)), this, 417 BUTTON_TOOL_DEL, SIGNAL(clicked(int)), this,
418 SLOT(deletePwd_slot()), true, 418 SLOT(deletePwd_slot()), true,
419 i18n("Delete password")); 419 i18n("Delete password"));
420 toolBar()->insertSeparator(); 420 toolBar()->insertSeparator();
421 toolBar()->insertButton(picons->loadIcon("find", KIcon::Toolbar), 421 toolBar()->insertButton(picons->loadIcon("find", KIcon::Toolbar),
422 BUTTON_TOOL_FIND, SIGNAL(clicked(int)), this, 422 BUTTON_TOOL_FIND, SIGNAL(clicked(int)), this,
423 SLOT(find_slot()), true, i18n("Find entry")); 423 SLOT(find_slot()), true, i18n("Find entry"));
424 toolBar()->insertSeparator(); 424 toolBar()->insertSeparator();
425 toolBar()->insertButton(picons->loadIcon("halfencrypted", KIcon::Toolbar), 425 toolBar()->insertButton(picons->loadIcon("halfencrypted", KIcon::Toolbar),
426 BUTTON_TOOL_LOCK, SIGNAL(clicked(int)), this, 426 BUTTON_TOOL_LOCK, SIGNAL(clicked(int)), this,
427 SLOT(lockWnd_slot()), true, 427 SLOT(lockWnd_slot()), true,
428 i18n("Lock all entries")); 428 i18n("Lock all entries"));
429 toolBar()->insertButton(picons->loadIcon("encrypted", KIcon::Toolbar), 429 toolBar()->insertButton(picons->loadIcon("encrypted", KIcon::Toolbar),
430 BUTTON_TOOL_DEEPLOCK, SIGNAL(clicked(int)), this, 430 BUTTON_TOOL_DEEPLOCK, SIGNAL(clicked(int)), this,
431 SLOT(deepLockWnd_slot()), true, 431 SLOT(deepLockWnd_slot()), true,
432 i18n("Deep-Lock all entries")); 432 i18n("Deep-Lock all entries"));
433 toolBar()->insertButton(picons->loadIcon("decrypted", KIcon::Toolbar), 433 toolBar()->insertButton(picons->loadIcon("decrypted", KIcon::Toolbar),
434 BUTTON_TOOL_UNLOCK, SIGNAL(clicked(int)), this, 434 BUTTON_TOOL_UNLOCK, SIGNAL(clicked(int)), this,
435 SLOT(unlockWnd_slot()), true, 435 SLOT(unlockWnd_slot()), true,
436 i18n("Unlock all entries")); 436 i18n("Unlock all entries"));
437} 437}
438 438
439void PwM::initMetrics() 439void PwM::initMetrics()
440{ 440{
441 QSize s = conf()->confWndMainWndSize(); 441 QSize s = conf()->confWndMainWndSize();
442 if (s.isValid()) 442 if (s.isValid())
443 resize(s); 443 resize(s);
444 else 444 else
445 resize(DEFAULT_SIZE); 445 resize(DEFAULT_SIZE);
446} 446}
447 447
448void PwM::updateCaption() 448void PwM::updateCaption()
449{ 449{
450 setPlainCaption(curDoc()->getTitle() + " - " PROG_NAME " " PACKAGE_VER); 450 setPlainCaption(curDoc()->getTitle() + " - " PROG_NAME " " PACKAGE_VER);
451} 451}
452 452
453void PwM::hideEvent(QHideEvent *) 453void PwM::hideEvent(QHideEvent *)
454{ 454{
455 if (isMinimized()) { 455 if (isMinimized()) {
456 if (init->tray()) { 456 if (init->tray()) {
457 forceMinimizeToTray = true; 457 forceMinimizeToTray = true;
458 close(); 458 close();
459 } 459 }
460 int mmlock = conf()->confGlobMinimizeLock(); 460 int mmlock = conf()->confGlobMinimizeLock();
461 switch (mmlock) { 461 switch (mmlock) {
462 case 0: // don't lock anything 462 case 0: // don't lock anything
463 break; 463 break;
464 case 1: {// normal lock 464 case 1: {// normal lock
465 curDoc()->lockAll(true); 465 curDoc()->lockAll(true);
466 break; 466 break;
467 } case 2: {// deep-lock 467 } case 2: {// deep-lock
468 curDoc()->deepLock(); 468 curDoc()->deepLock();
469 break; 469 break;
470 } default: 470 } default:
471 WARN(); 471 WARN();
472 } 472 }
473 } 473 }
474} 474}
475 475
476void PwM::setVirgin(bool v) 476void PwM::setVirgin(bool v)
477{ 477{
478 if (virgin == v) 478 if (virgin == v)
479 return; 479 return;
480 virgin = v; 480 virgin = v;
481 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVE, !v); 481 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVE, !v);
482 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVEAS, !v); 482 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVEAS, !v);
483 filePopup->setItemEnabled(BUTTON_POPUP_FILE_EXPORT, !v); 483 filePopup->setItemEnabled(BUTTON_POPUP_FILE_EXPORT, !v);
484 filePopup->setItemEnabled(BUTTON_POPUP_FILE_PRINT, !v); 484 filePopup->setItemEnabled(BUTTON_POPUP_FILE_PRINT, !v);
485 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_EDIT, !v); 485 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_EDIT, !v);
486 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_DEL, !v); 486 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_DEL, !v);
487 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, !v); 487 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, !v);
488 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_LOCK, !v); 488 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_LOCK, !v);
489 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_DEEPLOCK, !v); 489 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_DEEPLOCK, !v);
490 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_UNLOCK, !v); 490 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_UNLOCK, !v);
491 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_FIND, !v); 491 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_FIND, !v);
492 toolBar()->setItemEnabled(BUTTON_TOOL_SAVE, !v); 492 toolBar()->setItemEnabled(BUTTON_TOOL_SAVE, !v);
493 toolBar()->setItemEnabled(BUTTON_TOOL_SAVEAS, !v); 493 toolBar()->setItemEnabled(BUTTON_TOOL_SAVEAS, !v);
494 toolBar()->setItemEnabled(BUTTON_TOOL_PRINT, !v); 494 toolBar()->setItemEnabled(BUTTON_TOOL_PRINT, !v);
495 toolBar()->setItemEnabled(BUTTON_TOOL_EDIT, !v); 495 toolBar()->setItemEnabled(BUTTON_TOOL_EDIT, !v);
496 toolBar()->setItemEnabled(BUTTON_TOOL_DEL, !v); 496 toolBar()->setItemEnabled(BUTTON_TOOL_DEL, !v);
497 toolBar()->setItemEnabled(BUTTON_TOOL_LOCK, !v); 497 toolBar()->setItemEnabled(BUTTON_TOOL_LOCK, !v);
498 toolBar()->setItemEnabled(BUTTON_TOOL_DEEPLOCK, !v); 498 toolBar()->setItemEnabled(BUTTON_TOOL_DEEPLOCK, !v);
499 toolBar()->setItemEnabled(BUTTON_TOOL_UNLOCK, !v); 499 toolBar()->setItemEnabled(BUTTON_TOOL_UNLOCK, !v);
500 toolBar()->setItemEnabled(BUTTON_TOOL_FIND, !v); 500 toolBar()->setItemEnabled(BUTTON_TOOL_FIND, !v);
501} 501}
502 502
503void PwM::new_slot() 503void PwM::new_slot()
504{ 504{
505 init->createMainWnd(); 505 init->createMainWnd();
506} 506}
507 507
508//US ENH 508//US ENH
509void PwM::open_slot() 509void PwM::open_slot()
510{ 510{
511 open_slot(""); 511 open_slot("");
512} 512}
513 513
514void PwM::open_slot(QString fn) 514void PwM::open_slot(QString fn)
515{ 515{
516 openDoc(fn); 516 openDoc(fn);
517} 517}
518 518
519PwMDoc * PwM::openDoc(QString filename, bool openDeepLocked) 519PwMDoc * PwM::openDoc(QString filename, bool openDeepLocked)
520{ 520{
521 if (!isVirgin()) { 521 if (!isVirgin()) {
522 // open the document in a new window. 522 // open the document in a new window.
523 PwM *newInstance = init->createMainWnd(); 523 PwM *newInstance = init->createMainWnd();
524 PwMDoc *newDoc = newInstance->openDoc(filename, openDeepLocked); 524 PwMDoc *newDoc = newInstance->openDoc(filename, openDeepLocked);
525 if (!newDoc) { 525 if (!newDoc) {
526 newInstance->setForceQuit(true); 526 newInstance->setForceQuit(true);
527 delete_and_null(newInstance); 527 delete_and_null(newInstance);
528 } 528 }
529 return newDoc; 529 return newDoc;
530 } 530 }
531 531
532 if (!curDoc()->openDocUi(curDoc(), filename, openDeepLocked)) 532 if (!curDoc()->openDocUi(curDoc(), filename, openDeepLocked))
533 return 0; 533 return 0;
534 showStatMsg(i18n("Successfully opened file.")); 534 showStatMsg(i18n("Successfully opened file."));
535 updateCaption(); 535 updateCaption();
536 setVirgin(false); 536 setVirgin(false);
537 return curDoc(); 537 return curDoc();
538} 538}
539 539
540PwMView * PwM::makeNewListView(PwMDoc *doc) 540PwMView * PwM::makeNewListView(PwMDoc *doc)
541{ 541{
542 PwMView *ret = new PwMView(this, this, doc); 542 PwMView *ret = new PwMView(this, this, doc);
543 ret->setFont(conf()->confGlobEntryFont()); 543 ret->setFont(conf()->confGlobEntryFont());
544 ret->show(); 544 ret->show();
545 return ret; 545 return ret;
546} 546}
547 547
548void PwM::close_slot() 548void PwM::close_slot()
549{ 549{
550 close(); 550 close();
551} 551}
552 552
553void PwM::quitButton_slot() 553void PwM::quitButton_slot()
554{ 554{
555 init->shutdownApp(0); 555 init->shutdownApp(0);
556} 556}
557 557
558void PwM::save_slot() 558void PwM::save_slot()
559{ 559{
560 save(); 560 save();
561} 561}
562 562
563bool PwM::save() 563bool PwM::save()
564{ 564{
565 if (!curDoc()->saveDocUi(curDoc())) 565 if (!curDoc()->saveDocUi(curDoc()))
566 return false; 566 return false;
567 showStatMsg(i18n("Successfully saved data.")); 567 showStatMsg(i18n("Successfully saved data."));
568 updateCaption(); 568 updateCaption();
569 return true; 569 return true;
570} 570}
571 571
572void PwM::saveAs_slot() 572void PwM::saveAs_slot()
573{ 573{
574 saveAs(); 574 saveAs();
575} 575}
576 576
577bool PwM::saveAs() 577bool PwM::saveAs()
578{ 578{
579 if (!curDoc()->saveAsDocUi(curDoc())) 579 if (!curDoc()->saveAsDocUi(curDoc()))
580 return false; 580 return false;
581 showStatMsg(i18n("Successfully saved data.")); 581 showStatMsg(i18n("Successfully saved data."));
582 updateCaption(); 582 updateCaption();
583 return true; 583 return true;
584} 584}
585 585
586//US ENH : changed code to run with older MOC 586//US ENH : changed code to run with older MOC
587void PwM::addPwd_slot() 587void PwM::addPwd_slot()
588{ 588{
589 addPwd_slot(0, 0); 589 addPwd_slot1(0, 0);
590} 590}
591 591
592void PwM::addPwd_slot(QString *pw, PwMDoc *_doc) 592void PwM::addPwd_slot1(QString *pw, PwMDoc *_doc)
593{ 593{
594 PwMDoc *doc; 594 PwMDoc *doc;
595 if (_doc) { 595 if (_doc) {
596 doc = _doc; 596 doc = _doc;
597 } else { 597 } else {
598 doc = curDoc(); 598 doc = curDoc();
599 } 599 }
600 PWM_ASSERT(doc); 600 PWM_ASSERT(doc);
601 doc->timer()->getLock(DocTimer::id_autoLockTimer); 601 doc->timer()->getLock(DocTimer::id_autoLockTimer);
602#ifndef PWM_EMBEDDED 602#ifndef PWM_EMBEDDED
603 AddEntryWndImpl w; 603 AddEntryWndImpl w;
604#else 604#else
605 AddEntryWndImpl w(this, "addentrywndimpl"); 605 AddEntryWndImpl w(this, "addentrywndimpl");
606#endif 606#endif
607 607
608 vector<string> catList; 608 vector<string> catList;
609 doc->getCategoryList(&catList); 609 doc->getCategoryList(&catList);
610 unsigned i, size = catList.size(); 610 unsigned i, size = catList.size();
611 for (i = 0; i < size; ++i) { 611 for (i = 0; i < size; ++i) {
612 w.addCategory(catList[i].c_str()); 612 w.addCategory(catList[i].c_str());
613 } 613 }
614 w.setCurrCategory(view->getCurrentCategory()); 614 w.setCurrCategory(view->getCurrentCategory());
615 if (pw) 615 if (pw)
616 w.pwLineEdit->setText(*pw); 616 w.pwLineEdit->setText(*pw);
617 617
618 tryAgain: 618 tryAgain:
619 if (w.exec() == 1) 619 if (w.exec() == 1)
620 { 620 {
621 PwMDataItem d; 621 PwMDataItem d;
622 622
623 //US BUG: to initialize all values of curEntr with meaningfulldata, 623 //US BUG: to initialize all values of curEntr with meaningfulldata,
624 // we call clear on it. Reason: Metadata will be uninitialized otherwise. 624 // we call clear on it. Reason: Metadata will be uninitialized otherwise.
625 // another option would be to create a constructor for PwMDataItem 625 // another option would be to create a constructor for PwMDataItem
626 d.clear(true); 626 d.clear(true);
627 627
628 d.desc = w.getDescription().latin1(); 628 d.desc = w.getDescription().latin1();
629 d.name = w.getUsername().latin1(); 629 d.name = w.getUsername().latin1();
630 d.pw = w.getPassword().latin1(); 630 d.pw = w.getPassword().latin1();
631 d.comment = w.getComment().latin1(); 631 d.comment = w.getComment().latin1();
632 d.url = w.getUrl().latin1(); 632 d.url = w.getUrl().latin1();
633 d.launcher = w.getLauncher().latin1(); 633 d.launcher = w.getLauncher().latin1();
634 PwMerror ret = doc->addEntry(w.getCategory(), &d); 634 PwMerror ret = doc->addEntry(w.getCategory(), &d);
635 if (ret == e_entryExists) { 635 if (ret == e_entryExists) {
636 KMessageBox::error(this, 636 KMessageBox::error(this,
637 i18n 637 i18n
638 ("An entry with this \"Description\",\n" 638 ("An entry with this \"Description\",\n"
639 "does already exist.\n" 639 "does already exist.\n"
640 "Please select another description."), 640 "Please select another description."),
641 i18n("entry already exists.")); 641 i18n("entry already exists."));
642 goto tryAgain; 642 goto tryAgain;
643 } else if (ret == e_maxAllowedEntr) { 643 } else if (ret == e_maxAllowedEntr) {
644 KMessageBox::error(this, i18n("The maximum possible number of\nentries" 644 KMessageBox::error(this, i18n("The maximum possible number of\nentries"
645 "has been reached.\nYou can't add more entries."), 645 "has been reached.\nYou can't add more entries."),
646 i18n("maximum number of entries")); 646 i18n("maximum number of entries"));
647 doc->timer()->putLock(DocTimer::id_autoLockTimer); 647 doc->timer()->putLock(DocTimer::id_autoLockTimer);
648 return; 648 return;
649 } 649 }
650 } 650 }
651 setVirgin(false); 651 setVirgin(false);
652 doc->timer()->putLock(DocTimer::id_autoLockTimer); 652 doc->timer()->putLock(DocTimer::id_autoLockTimer);
653} 653}
654 654
655//US ENH : changed code to run with older MOC 655//US ENH : changed code to run with older MOC
656void PwM::editPwd_slot() 656void PwM::editPwd_slot()
657{ 657{
658 editPwd_slot(0,0,0); 658 editPwd_slot3(0,0,0);
659} 659}
660 660
661void PwM::editPwd_slot(const QString *category) 661void PwM::editPwd_slot1(const QString *category)
662{ 662{
663 editPwd_slot(category, 0, 0); 663 editPwd_slot3(category, 0, 0);
664} 664}
665 665
666void PwM::editPwd_slot(const QString *category, const int *index, 666void PwM::editPwd_slot3(const QString *category, const int *index,
667 PwMDoc *_doc) 667 PwMDoc *_doc)
668{ 668{
669 PwMDoc *doc; 669 PwMDoc *doc;
670 if (_doc) { 670 if (_doc) {
671 doc = _doc; 671 doc = _doc;
672 } else { 672 } else {
673 doc = curDoc(); 673 doc = curDoc();
674 } 674 }
675 PWM_ASSERT(doc); 675 PWM_ASSERT(doc);
676 if (doc->isDocEmpty()) 676 if (doc->isDocEmpty())
677 return; 677 return;
678 if (doc->isDeepLocked()) 678 if (doc->isDeepLocked())
679 return; 679 return;
680 doc->timer()->getLock(DocTimer::id_autoLockTimer); 680 doc->timer()->getLock(DocTimer::id_autoLockTimer);
681 unsigned int curEntryIndex; 681 unsigned int curEntryIndex;
682 if (index) { 682 if (index) {
683 curEntryIndex = *index; 683 curEntryIndex = *index;
684 } else { 684 } else {
685 if (!(view->getCurEntryIndex(&curEntryIndex))) { 685 if (!(view->getCurEntryIndex(&curEntryIndex))) {
686 printDebug("couldn't get index. Maybe we have a binary entry here."); 686 printDebug("couldn't get index. Maybe we have a binary entry here.");
687 doc->timer()->putLock(DocTimer::id_autoLockTimer); 687 doc->timer()->putLock(DocTimer::id_autoLockTimer);
688 return; 688 return;
689 } 689 }
690 } 690 }
691 QString curCategory; 691 QString curCategory;
692 if (category) { 692 if (category) {
693 curCategory = *category; 693 curCategory = *category;
694 } else { 694 } else {
695 curCategory = view->getCurrentCategory(); 695 curCategory = view->getCurrentCategory();
696 } 696 }
697 PwMDataItem currItem; 697 PwMDataItem currItem;
698 if (!doc->getEntry(curCategory, curEntryIndex, &currItem, true)) { 698 if (!doc->getEntry(curCategory, curEntryIndex, &currItem, true)) {
699 doc->timer()->putLock(DocTimer::id_autoLockTimer); 699 doc->timer()->putLock(DocTimer::id_autoLockTimer);
700 return; 700 return;
701 } 701 }
702 BUG_ON(currItem.binary); 702 BUG_ON(currItem.binary);
703 703
704 AddEntryWndImpl w; 704 AddEntryWndImpl w;
705 vector<string> catList; 705 vector<string> catList;
706 doc->getCategoryList(&catList); 706 doc->getCategoryList(&catList);
707 unsigned i, size = catList.size(); 707 unsigned i, size = catList.size();
708 for (i = 0; i < size; ++i) { 708 for (i = 0; i < size; ++i) {
709 w.addCategory(catList[i].c_str()); 709 w.addCategory(catList[i].c_str());
710 } 710 }
711 w.setCurrCategory(curCategory); 711 w.setCurrCategory(curCategory);
712 w.setDescription(currItem.desc.c_str()); 712 w.setDescription(currItem.desc.c_str());
713 w.setUsername(currItem.name.c_str()); 713 w.setUsername(currItem.name.c_str());
714 w.setPassword(currItem.pw.c_str()); 714 w.setPassword(currItem.pw.c_str());
715 w.setUrl(currItem.url.c_str()); 715 w.setUrl(currItem.url.c_str());
716 w.setLauncher(currItem.launcher.c_str()); 716 w.setLauncher(currItem.launcher.c_str());
717 w.setComment(currItem.comment.c_str()); 717 w.setComment(currItem.comment.c_str());
718 if (w.exec() == 1) { 718 if (w.exec() == 1) {
719 currItem.desc = w.getDescription().latin1(); 719 currItem.desc = w.getDescription().latin1();
720 currItem.name = w.getUsername().latin1(); 720 currItem.name = w.getUsername().latin1();
721 currItem.pw = w.getPassword().latin1(); 721 currItem.pw = w.getPassword().latin1();
722 currItem.comment = w.getComment().latin1(); 722 currItem.comment = w.getComment().latin1();
723 currItem.url = w.getUrl().latin1(); 723 currItem.url = w.getUrl().latin1();
724 currItem.launcher = w.getLauncher().latin1(); 724 currItem.launcher = w.getLauncher().latin1();
725 if (!doc->editEntry(curCategory, w.getCategory(), 725 if (!doc->editEntry(curCategory, w.getCategory(),
726 curEntryIndex, &currItem)) { 726 curEntryIndex, &currItem)) {
727 KMessageBox::error(this, 727 KMessageBox::error(this,
728 i18n("Couldn't edit the entry.\n" 728 i18n("Couldn't edit the entry.\n"
729 "Maybe you changed the category and " 729 "Maybe you changed the category and "
730 "this entry is already present in the new " 730 "this entry is already present in the new "
731 "category?"), 731 "category?"),
732 i18n("couldn't edit entry.")); 732 i18n("couldn't edit entry."));
733 doc->timer()->putLock(DocTimer::id_autoLockTimer); 733 doc->timer()->putLock(DocTimer::id_autoLockTimer);
734 return; 734 return;
735 } 735 }
736 } 736 }
737 doc->timer()->putLock(DocTimer::id_autoLockTimer); 737 doc->timer()->putLock(DocTimer::id_autoLockTimer);
738} 738}
739 739
740void PwM::deletePwd_slot() 740void PwM::deletePwd_slot()
741{ 741{
742 PWM_ASSERT(curDoc()); 742 PWM_ASSERT(curDoc());
743 if (curDoc()->isDocEmpty()) 743 if (curDoc()->isDocEmpty())
744 return; 744 return;
745 if (curDoc()->isDeepLocked()) 745 if (curDoc()->isDeepLocked())
746 return; 746 return;
747 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 747 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
748 unsigned int curEntryIndex = 0; 748 unsigned int curEntryIndex = 0;
749 if (!(view->getCurEntryIndex(&curEntryIndex))) { 749 if (!(view->getCurEntryIndex(&curEntryIndex))) {
750 printDebug("couldn't get index"); 750 printDebug("couldn't get index");
751 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 751 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
752 return; 752 return;
753 } 753 }
754 754
755 PwMDataItem currItem; 755 PwMDataItem currItem;
756 QString curCategory = view->getCurrentCategory(); 756 QString curCategory = view->getCurrentCategory();
757 if (!curDoc()->getEntry(curCategory, curEntryIndex, &currItem)) { 757 if (!curDoc()->getEntry(curCategory, curEntryIndex, &currItem)) {
758 printDebug("couldn't get entry"); 758 printDebug("couldn't get entry");
759 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 759 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
760 return; 760 return;
761 } 761 }
762 if (KMessageBox:: 762 if (KMessageBox::
763 questionYesNo(this, 763 questionYesNo(this,
764 i18n 764 i18n
765 ("Do you really want to delete\nthe selected entry") + 765 ("Do you really want to delete\nthe selected entry") +
766 " \n\"" + QString(currItem.desc.c_str()) 766 " \n\"" + QString(currItem.desc.c_str())
767 + "\" ?", i18n("delete?")) 767 + "\" ?", i18n("delete?"))
768 == KMessageBox::Yes) { 768 == KMessageBox::Yes) {
769 769
770 curDoc()->delEntry(curCategory, curEntryIndex); 770 curDoc()->delEntry(curCategory, curEntryIndex);
771 } 771 }
772 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 772 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
773} 773}
774 774
775void PwM::changeMasterPwd_slot() 775void PwM::changeMasterPwd_slot()
776{ 776{
777 PWM_ASSERT(curDoc()); 777 PWM_ASSERT(curDoc());
778 curDoc()->changeCurrentPw(); 778 curDoc()->changeCurrentPw();
779} 779}
780 780
781void PwM::lockWnd_slot() 781void PwM::lockWnd_slot()
782{ 782{
783 PWM_ASSERT(curDoc()); 783 PWM_ASSERT(curDoc());
784 curDoc()->lockAll(true); 784 curDoc()->lockAll(true);
785} 785}
786 786
787void PwM::deepLockWnd_slot() 787void PwM::deepLockWnd_slot()
788{ 788{
789 PWM_ASSERT(curDoc()); 789 PWM_ASSERT(curDoc());
790 curDoc()->deepLock(); 790 curDoc()->deepLock();
791} 791}
792 792
793void PwM::unlockWnd_slot() 793void PwM::unlockWnd_slot()
794{ 794{
795 PWM_ASSERT(curDoc()); 795 PWM_ASSERT(curDoc());
796 curDoc()->lockAll(false); 796 curDoc()->lockAll(false);
797} 797}
798 798
799void PwM::config_slot() 799void PwM::config_slot()
800{ 800{
801 int oldStyle = conf()->confWndMainViewStyle(); 801 int oldStyle = conf()->confWndMainViewStyle();
802#ifdef PWM_EMBEDDED 802#ifdef PWM_EMBEDDED
803 KCMultiDialog* ConfigureDialog = new KCMultiDialog( "PIM", this ,"pwmconfigdialog", true ); 803 KCMultiDialog* ConfigureDialog = new KCMultiDialog( "PIM", this ,"pwmconfigdialog", true );
804 804
805 KCMPwmConfig* pwmcfg = new KCMPwmConfig( ConfigureDialog->getNewVBoxPage(i18n( "PwManager")) , "KCMPwmConfig" ); 805 KCMPwmConfig* pwmcfg = new KCMPwmConfig( ConfigureDialog->getNewVBoxPage(i18n( "PwManager")) , "KCMPwmConfig" );
806 ConfigureDialog->addModule(pwmcfg ); 806 ConfigureDialog->addModule(pwmcfg );
807 807
808 KCMKdePimConfig* kdelibcfg = new KCMKdePimConfig( ConfigureDialog->getNewVBoxPage(i18n( "Global")) , "KCMKdeLibConfig" ); 808 KCMKdePimConfig* kdelibcfg = new KCMKdePimConfig( ConfigureDialog->getNewVBoxPage(i18n( "Global")) , "KCMKdeLibConfig" );
809 ConfigureDialog->addModule(kdelibcfg ); 809 ConfigureDialog->addModule(kdelibcfg );
810 810
811#ifndef DESKTOP_VERSION 811#ifndef DESKTOP_VERSION
812 ConfigureDialog->showMaximized(); 812 ConfigureDialog->showMaximized();
813#endif 813#endif
814 if ( ConfigureDialog->exec() ) 814 if ( ConfigureDialog->exec() )
815 KMessageBox::information( this, i18n("Some changes are only\neffective after a restart!\n") ); 815 KMessageBox::information( this, i18n("Some changes are only\neffective after a restart!\n") );
816 delete ConfigureDialog; 816 delete ConfigureDialog;
817 817
818#else //PWM_EMBEDDED 818#else //PWM_EMBEDDED
819 // display the configuration window (modal mode) 819 // display the configuration window (modal mode)
820 if (!conf()->showConfWnd(this)) 820 if (!conf()->showConfWnd(this))
821 return; 821 return;
822#endif 822#endif
823 823
824 int newStyle = conf()->confWndMainViewStyle(); 824 int newStyle = conf()->confWndMainViewStyle();
825 // reinitialize tray 825 // reinitialize tray
826 init->initTray(); 826 init->initTray();
827 // reinitialize KWallet emulation 827 // reinitialize KWallet emulation
828 init->initKWalletEmu(); 828 init->initKWalletEmu();
829 829
830 PwMDocList *_dl = PwMDoc::getOpenDocList(); 830 PwMDocList *_dl = PwMDoc::getOpenDocList();
831 const vector<PwMDocList::listItem> *dl = _dl->getList(); 831 const vector<PwMDocList::listItem> *dl = _dl->getList();
832 vector<PwMDocList::listItem>::const_iterator i = dl->begin(), 832 vector<PwMDocList::listItem>::const_iterator i = dl->begin(),
833 end = dl->end(); 833 end = dl->end();
834 PwMDoc *doc; 834 PwMDoc *doc;
835 while (i != end) { 835 while (i != end) {
836 doc = (*i).doc; 836 doc = (*i).doc;
837 // unlock-without-mpw timeout 837 // unlock-without-mpw timeout
838 doc->timer()->start(DocTimer::id_mpwTimer); 838 doc->timer()->start(DocTimer::id_mpwTimer);
839 // auto-lock timeout 839 // auto-lock timeout
840 doc->timer()->start(DocTimer::id_autoLockTimer); 840 doc->timer()->start(DocTimer::id_autoLockTimer);
841 ++i; 841 ++i;
842 } 842 }
843 843
844 const QValueList<PwM *> *ml = init->mainWndList(); 844 const QValueList<PwM *> *ml = init->mainWndList();
845#ifndef PWM_EMBEDDED 845#ifndef PWM_EMBEDDED
846 QValueList<PwM *>::const_iterator i2 = ml->begin(), 846 QValueList<PwM *>::const_iterator i2 = ml->begin(),
847 end2 = ml->end(); 847 end2 = ml->end();
848#else 848#else
849 QValueList<PwM *>::ConstIterator i2 = ml->begin(), 849 QValueList<PwM *>::ConstIterator i2 = ml->begin(),
850 end2 = ml->end(); 850 end2 = ml->end();
851#endif 851#endif
852 PwM *pwm; 852 PwM *pwm;
853 while (i2 != end2) { 853 while (i2 != end2) {
854 pwm = *i2; 854 pwm = *i2;
855 // reinitialize the window style. 855 // reinitialize the window style.
856 if (oldStyle != newStyle) 856 if (oldStyle != newStyle)
857 pwm->curView()->initStyle(newStyle); 857 pwm->curView()->initStyle(newStyle);
858 // set the new font 858 // set the new font
859 pwm->curView()->setFont(conf()->confGlobEntryFont()); 859 pwm->curView()->setFont(conf()->confGlobEntryFont());
860 ++i2; 860 ++i2;
861 } 861 }
862} 862}
863 863
864void PwM::activateMpButton(bool activate) 864void PwM::activateMpButton(bool activate)
865{ 865{
866 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, activate); 866 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, activate);
867} 867}
868 868
869void PwM::closeEvent(QCloseEvent *e) 869void PwM::closeEvent(QCloseEvent *e)
870{ 870{
871 e->accept(); 871 e->accept();
872} 872}
873 873
874void PwM::docClosed(PwMDoc *doc) 874void PwM::docClosed(PwMDoc *doc)
875{ 875{
876 PARAM_UNUSED(doc); 876 PARAM_UNUSED(doc);
877 PWM_ASSERT(doc == curDoc()); 877 PWM_ASSERT(doc == curDoc());
878 close(); 878 close();
879} 879}
880 880
881void PwM::find_slot() 881void PwM::find_slot()
882{ 882{
883 PWM_ASSERT(curDoc()); 883 PWM_ASSERT(curDoc());
884 if (curDoc()->isDocEmpty()) 884 if (curDoc()->isDocEmpty())
885 return; 885 return;
886 if (curDoc()->isDeepLocked()) 886 if (curDoc()->isDeepLocked())
887 return; 887 return;
888 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 888 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
889 FindWndImpl findWnd(view); 889 FindWndImpl findWnd(view);
890 findWnd.exec(); 890 findWnd.exec();
891 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 891 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
892} 892}
893 893
894void PwM::exportToText() 894void PwM::exportToText()
895{ 895{
896 PWM_ASSERT(curDoc()); 896 PWM_ASSERT(curDoc());
897 if (curDoc()->isDocEmpty()) { 897 if (curDoc()->isDocEmpty()) {
898 KMessageBox::information(this, 898 KMessageBox::information(this,
899 i18n 899 i18n
900 ("Sorry, there's nothing to export.\n" 900 ("Sorry, there's nothing to export.\n"
901 "Please first add some passwords."), 901 "Please first add some passwords."),
902 i18n("nothing to do")); 902 i18n("nothing to do"));
903 return; 903 return;
904 } 904 }
905 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 905 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
906 QString fn(KFileDialog::getSaveFileName(QString::null, 906 QString fn(KFileDialog::getSaveFileName(QString::null,
907 i18n("*|plain-text file"), 907 i18n("*|plain-text file"),
908 this)); 908 this));
909 if (fn == "") { 909 if (fn == "") {
910 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 910 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
911 return; 911 return;
912 } 912 }
913 913
914 PwMerror ret = curDoc()->exportToText(&fn); 914 PwMerror ret = curDoc()->exportToText(&fn);
915 if (ret != e_success) { 915 if (ret != e_success) {
916 KMessageBox::error(this, 916 KMessageBox::error(this,
917 i18n("Error: Couldn't write to file.\n" 917 i18n("Error: Couldn't write to file.\n"
918 "Please check if you have permission to write " 918 "Please check if you have permission to write "
919 "to the file in that directory."), 919 "to the file in that directory."),
920 i18n("error while writing")); 920 i18n("error while writing"));
921 } else 921 } else
922 showStatMsg(i18n("Successfully exported data.")); 922 showStatMsg(i18n("Successfully exported data."));
923 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 923 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
924} 924}
925 925
926bool PwM::importFromText() 926bool PwM::importFromText()
927{ 927{
928 if (!isVirgin()) { 928 if (!isVirgin()) {
929 if (KMessageBox::questionYesNo(this, 929 if (KMessageBox::questionYesNo(this,
930 i18n("Do you want to import the data " 930 i18n("Do you want to import the data "
931 "into the current document? (If you " 931 "into the current document? (If you "
932 "select \"no\", a new document will be " 932 "select \"no\", a new document will be "
933 "opened.)"), 933 "opened.)"),
934 i18n("import into this document?")) 934 i18n("import into this document?"))
935 == KMessageBox::No) { 935 == KMessageBox::No) {
936 // import the data to a new window. 936 // import the data to a new window.
937 PwM *newInstance = init->createMainWnd(); 937 PwM *newInstance = init->createMainWnd();
938 bool ok = newInstance->importFromText(); 938 bool ok = newInstance->importFromText();
939 if (!ok) { 939 if (!ok) {
940 newInstance->setForceQuit(true); 940 newInstance->setForceQuit(true);
941 delete_and_null(newInstance); 941 delete_and_null(newInstance);
942 } 942 }
943 return ok; 943 return ok;
944 } 944 }
945 } 945 }
946 946
947 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 947 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
948 PwMerror ret; 948 PwMerror ret;
949 QString path(KFileDialog::getOpenFileName(QString::null, 949 QString path(KFileDialog::getOpenFileName(QString::null,
950 i18n("*|PWM-exported text file"), 950 i18n("*|PWM-exported text file"),
951 this)); 951 this));
952 if (path == "") 952 if (path == "")
953 goto cancelImport; 953 goto cancelImport;
954 954
955 ret = curDoc()->importFromText(&path, 0); 955 ret = curDoc()->importFromText(&path, 0);
956 if (ret == e_fileFormat) { 956 if (ret == e_fileFormat) {
957 KMessageBox::error(this, 957 KMessageBox::error(this,
958 i18n("Could not read file-format.\n" 958 i18n("Could not read file-format.\n"
959 "This seems to be _not_ a valid file " 959 "This seems to be _not_ a valid file "
960 "exported by PwM."), 960 "exported by PwM."),
961 i18n("invalid file-format")); 961 i18n("invalid file-format"));
962 goto cancelImport; 962 goto cancelImport;
963 } else if (ret == e_invalidArg) { 963 } else if (ret == e_invalidArg) {
964 BUG(); 964 BUG();
965 goto cancelImport; 965 goto cancelImport;
966 } else if (ret != e_success) { 966 } else if (ret != e_success) {
967 KMessageBox::error(this, 967 KMessageBox::error(this,
968 i18n("Could not import file!\n" 968 i18n("Could not import file!\n"
969 "Do you have permission to read this file? " 969 "Do you have permission to read this file? "
970 "Do you have enough free memory?"), 970 "Do you have enough free memory?"),
971 i18n("import failed")); 971 i18n("import failed"));
972 goto cancelImport; 972 goto cancelImport;
973 } 973 }
974 setVirgin(false); 974 setVirgin(false);
975 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 975 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
976 return true; 976 return true;
977 977
978cancelImport: 978cancelImport:
979 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 979 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
980 return false; 980 return false;
981} 981}
982 982
983void PwM::exportToGpasman() 983void PwM::exportToGpasman()
984{ 984{
985 PWM_ASSERT(curDoc()); 985 PWM_ASSERT(curDoc());
986 if (curDoc()->isDocEmpty()) { 986 if (curDoc()->isDocEmpty()) {
987 KMessageBox::information(this, 987 KMessageBox::information(this,
988 i18n 988 i18n
989 ("Sorry, there's nothing to export.\n" 989 ("Sorry, there's nothing to export.\n"
990 "Please first add some passwords."), 990 "Please first add some passwords."),
991 i18n("nothing to do")); 991 i18n("nothing to do"));
992 return; 992 return;
993 } 993 }
994 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 994 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
995 QString fn(KFileDialog::getSaveFileName(QString::null, 995 QString fn(KFileDialog::getSaveFileName(QString::null,
996 i18n("*|Gpasman or Kpasman file"), 996 i18n("*|Gpasman or Kpasman file"),
997 this)); 997 this));
998 if (fn == "") { 998 if (fn == "") {
999 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 999 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1000 return; 1000 return;
1001 } 1001 }
1002 1002
1003 PwMerror ret = curDoc()->exportToGpasman(&fn); 1003 PwMerror ret = curDoc()->exportToGpasman(&fn);
1004 if (ret != e_success) { 1004 if (ret != e_success) {
1005 if (ret == e_noPw) { 1005 if (ret == e_noPw) {
1006 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1006 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1007 return; 1007 return;
1008 } 1008 }
1009 KMessageBox::error(this, 1009 KMessageBox::error(this,
1010 i18n("Error: Couldn't write to file.\n" 1010 i18n("Error: Couldn't write to file.\n"
1011 "Please check if you have permission to write " 1011 "Please check if you have permission to write "
1012 "to the file in that directory."), 1012 "to the file in that directory."),
1013 i18n("error while writing")); 1013 i18n("error while writing"));
1014 } else 1014 } else
1015 showStatMsg(i18n("Successfully exported data.")); 1015 showStatMsg(i18n("Successfully exported data."));
1016 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1016 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1017} 1017}
1018 1018
1019void PwM::exportToKWallet() 1019void PwM::exportToKWallet()
1020{ 1020{
1021#ifdef CONFIG_KWALLETIF 1021#ifdef CONFIG_KWALLETIF
1022 if (!checkAndAskForKWalletEmu()) 1022 if (!checkAndAskForKWalletEmu())
1023 return; 1023 return;
1024 PWM_ASSERT(curDoc()); 1024 PWM_ASSERT(curDoc());
1025 if (curDoc()->isDocEmpty()) { 1025 if (curDoc()->isDocEmpty()) {
1026 KMessageBox::information(this, 1026 KMessageBox::information(this,
1027 i18n 1027 i18n
1028 ("Sorry, there's nothing to export.\n" 1028 ("Sorry, there's nothing to export.\n"
1029 "Please first add some passwords."), 1029 "Please first add some passwords."),
1030 i18n("nothing to do")); 1030 i18n("nothing to do"));
1031 init->initKWalletEmu(); 1031 init->initKWalletEmu();
1032 return; 1032 return;
1033 } 1033 }
1034 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 1034 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
1035 KWalletIf walletIf(this); 1035 KWalletIf walletIf(this);
1036 if (walletIf.kwalletExport(curDoc())) { 1036 if (walletIf.kwalletExport(curDoc())) {
1037 KMessageBox::information(this, 1037 KMessageBox::information(this,
1038 i18n("Successfully exported the data of the current " 1038 i18n("Successfully exported the data of the current "
1039 "document to KWallet."), 1039 "document to KWallet."),
1040 i18n("Successfully exported data.")); 1040 i18n("Successfully exported data."));
1041 showStatMsg(i18n("Successfully exported data.")); 1041 showStatMsg(i18n("Successfully exported data."));
1042 } 1042 }
1043 init->initKWalletEmu(); 1043 init->initKWalletEmu();
1044 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1044 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1045#endif // CONFIG_KWALLETIF 1045#endif // CONFIG_KWALLETIF
1046} 1046}
1047 1047
1048bool PwM::importFromGpasman() 1048bool PwM::importFromGpasman()
1049{ 1049{
1050 if (!isVirgin()) { 1050 if (!isVirgin()) {
1051 if (KMessageBox::questionYesNo(this, 1051 if (KMessageBox::questionYesNo(this,
1052 i18n("Do you want to import the data " 1052 i18n("Do you want to import the data "
1053 "into the current document? (If you " 1053 "into the current document? (If you "
1054 "select \"no\", a new document will be " 1054 "select \"no\", a new document will be "
1055 "opened.)"), 1055 "opened.)"),
1056 i18n("import into this document?")) 1056 i18n("import into this document?"))
1057 == KMessageBox::No) { 1057 == KMessageBox::No) {
1058 // import the data to a new window. 1058 // import the data to a new window.
1059 PwM *newInstance = init->createMainWnd(); 1059 PwM *newInstance = init->createMainWnd();
1060 bool ok = newInstance->importFromGpasman(); 1060 bool ok = newInstance->importFromGpasman();
1061 if (!ok) { 1061 if (!ok) {
1062 newInstance->setForceQuit(true); 1062 newInstance->setForceQuit(true);
1063 delete_and_null(newInstance); 1063 delete_and_null(newInstance);
1064 } 1064 }
1065 return ok; 1065 return ok;
1066 } 1066 }
1067 } 1067 }
1068 1068
1069 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 1069 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
1070 PwMerror ret; 1070 PwMerror ret;
1071 QString path(KFileDialog::getOpenFileName(QString::null, 1071 QString path(KFileDialog::getOpenFileName(QString::null,
1072 i18n("*|Gpasman or Kpasman file"), this)); 1072 i18n("*|Gpasman or Kpasman file"), this));
1073 if (path == "") 1073 if (path == "")
1074 goto cancelImport; 1074 goto cancelImport;
1075 ret = curDoc()->importFromGpasman(&path); 1075 ret = curDoc()->importFromGpasman(&path);
1076 if (ret == e_wrongPw) { 1076 if (ret == e_wrongPw) {
1077 if (KMessageBox::questionYesNo(this, 1077 if (KMessageBox::questionYesNo(this,
1078 i18n 1078 i18n
1079 ("This is probably the wrong master-password" 1079 ("This is probably the wrong master-password"
1080 "you have typed in.\n" 1080 "you have typed in.\n"
1081 "There is no real way to determine the " 1081 "There is no real way to determine the "
1082 "correctness of the password in the Gpasman " 1082 "correctness of the password in the Gpasman "
1083 "file-format. But I think this " 1083 "file-format. But I think this "
1084 "password ist wrong.\n" 1084 "password ist wrong.\n"
1085 "Do you want to continue nevertheless?"), 1085 "Do you want to continue nevertheless?"),
1086 i18n("password error")) 1086 i18n("password error"))
1087 == KMessageBox::No) { 1087 == KMessageBox::No) {
1088 goto cancelImport; 1088 goto cancelImport;
1089 } 1089 }
1090 } else if (ret != e_success) { 1090 } else if (ret != e_success) {
1091 KMessageBox::error(this, 1091 KMessageBox::error(this,
1092 i18n("Could not import file!\n" 1092 i18n("Could not import file!\n"
1093 "Do you have permission to read this file?"), 1093 "Do you have permission to read this file?"),
1094 i18n("import failed")); 1094 i18n("import failed"));
1095 goto cancelImport; 1095 goto cancelImport;
1096 } 1096 }
1097 setVirgin(false); 1097 setVirgin(false);
1098 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1098 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1099 return true; 1099 return true;
1100 1100
1101cancelImport: 1101cancelImport:
1102 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1102 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1103 return false; 1103 return false;
1104} 1104}
1105 1105
1106#ifdef CONFIG_KWALLETIF 1106#ifdef CONFIG_KWALLETIF
1107bool PwM::checkAndAskForKWalletEmu() 1107bool PwM::checkAndAskForKWalletEmu()
1108{ 1108{
1109 if (init->kwalletEmu()) { 1109 if (init->kwalletEmu()) {
1110 /* KWallet emulation is enabled. We can't import/export 1110 /* KWallet emulation is enabled. We can't import/export
1111 * data from/to it, while emulation is active. 1111 * data from/to it, while emulation is active.
1112 */ 1112 */
1113 if (KMessageBox::questionYesNo(this, 1113 if (KMessageBox::questionYesNo(this,
1114 i18n("KWallet emulation is enabled.\n" 1114 i18n("KWallet emulation is enabled.\n"
1115 "You can't import or export data from/to " 1115 "You can't import or export data from/to "
1116 "the original KWallet, while the emulation " 1116 "the original KWallet, while the emulation "
1117 "is active.\n" 1117 "is active.\n"
1118 "Do you want to tempoarly disable the KWallet emulation?"), 1118 "Do you want to tempoarly disable the KWallet emulation?"),
1119 i18n("Tempoarly disable KWallet emulation?")) 1119 i18n("Tempoarly disable KWallet emulation?"))
1120 == KMessageBox::Yes) { 1120 == KMessageBox::Yes) {
1121 init->initKWalletEmu(true); 1121 init->initKWalletEmu(true);
1122 PWM_ASSERT(!init->kwalletEmu()); 1122 PWM_ASSERT(!init->kwalletEmu());
1123 return true; 1123 return true;
1124 } 1124 }
1125 return false; 1125 return false;
1126 } 1126 }
1127 return true; 1127 return true;
1128} 1128}
1129#endif // CONFIG_KWALLETIF 1129#endif // CONFIG_KWALLETIF
1130 1130
1131bool PwM::importKWallet() 1131bool PwM::importKWallet()
1132{ 1132{
1133#ifdef CONFIG_KWALLETIF 1133#ifdef CONFIG_KWALLETIF
1134 if (!checkAndAskForKWalletEmu()) 1134 if (!checkAndAskForKWalletEmu())
1135 return false; 1135 return false;
1136 KWalletIf walletIf(this); 1136 KWalletIf walletIf(this);
1137 if (!isVirgin()) { 1137 if (!isVirgin()) {
1138 if (KMessageBox::questionYesNo(this, 1138 if (KMessageBox::questionYesNo(this,
1139 i18n("Do you want to import the data " 1139 i18n("Do you want to import the data "
1140 "into the current document? (If you " 1140 "into the current document? (If you "
1141 "select \"no\", a new document will be " 1141 "select \"no\", a new document will be "
1142 "opened.)"), 1142 "opened.)"),
1143 i18n("import into this document?")) 1143 i18n("import into this document?"))
1144 == KMessageBox::No) { 1144 == KMessageBox::No) {
1145 // import the data to a new window. 1145 // import the data to a new window.
1146 PwM *newInstance = init->createMainWnd(); 1146 PwM *newInstance = init->createMainWnd();
1147 bool ok = newInstance->importKWallet(); 1147 bool ok = newInstance->importKWallet();
1148 if (!ok) { 1148 if (!ok) {
1149 newInstance->setForceQuit(true); 1149 newInstance->setForceQuit(true);
1150 delete_and_null(newInstance); 1150 delete_and_null(newInstance);
1151 goto exit_fail; 1151 goto exit_fail;
1152 } else { 1152 } else {
1153 goto exit_ok; 1153 goto exit_ok;
1154 } 1154 }
1155 } 1155 }
1156 } 1156 }
1157 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 1157 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
1158 if (!walletIf.kwalletImport(curDoc())) { 1158 if (!walletIf.kwalletImport(curDoc())) {
1159 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1159 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1160 showStatMsg(i18n("KWallet import failed")); 1160 showStatMsg(i18n("KWallet import failed"));
1161 goto exit_fail; 1161 goto exit_fail;
1162 } 1162 }
1163 KMessageBox::information(this, 1163 KMessageBox::information(this,
1164 i18n("Successfully imported the KWallet data " 1164 i18n("Successfully imported the KWallet data "
1165 "into the current document."), 1165 "into the current document."),
1166 i18n("successfully imported")); 1166 i18n("successfully imported"));
1167 showStatMsg(i18n("successfully imported")); 1167 showStatMsg(i18n("successfully imported"));
1168 setVirgin(false); 1168 setVirgin(false);
1169 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1169 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1170 1170
1171exit_ok: 1171exit_ok:
1172 init->initKWalletEmu(); 1172 init->initKWalletEmu();
1173 return true; 1173 return true;
1174 1174
1175exit_fail: 1175exit_fail:
1176 init->initKWalletEmu(); 1176 init->initKWalletEmu();
1177#endif // CONFIG_KWALLETIF 1177#endif // CONFIG_KWALLETIF
1178 return false; 1178 return false;
1179} 1179}
1180 1180
1181void PwM::print_slot() 1181void PwM::print_slot()
1182{ 1182{
1183 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 1183 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
1184#ifndef PWM_EMBEDDED 1184#ifndef PWM_EMBEDDED
1185 PwMPrint p(curDoc(), this); 1185 PwMPrint p(curDoc(), this);
1186 p.printNow(); 1186 p.printNow();
1187#else 1187#else
1188 qDebug("PwM::print_slot , PRINTING IS NOT IMPLEMENTED"); 1188 qDebug("PwM::print_slot , PRINTING IS NOT IMPLEMENTED");
1189#endif 1189#endif
1190 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1190 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1191} 1191}
1192 1192
1193void PwM::genNewCard_slot() 1193void PwM::genNewCard_slot()
1194{ 1194{
1195#ifdef CONFIG_KEYCARD 1195#ifdef CONFIG_KEYCARD
1196 init->keycard()->genNewCard(); 1196 init->keycard()->genNewCard();
1197#endif 1197#endif
1198} 1198}
1199 1199
1200void PwM::eraseCard_slot() 1200void PwM::eraseCard_slot()
1201{ 1201{
1202#ifdef CONFIG_KEYCARD 1202#ifdef CONFIG_KEYCARD
1203 init->keycard()->eraseCard(); 1203 init->keycard()->eraseCard();
1204#endif 1204#endif
1205} 1205}
1206 1206
1207void PwM::readCardId_slot() 1207void PwM::readCardId_slot()
1208{ 1208{
1209#ifdef CONFIG_KEYCARD 1209#ifdef CONFIG_KEYCARD
1210 init->keycard()->displayKey(); 1210 init->keycard()->displayKey();
1211#endif 1211#endif
1212} 1212}
1213 1213
1214void PwM::makeCardBackup_slot() 1214void PwM::makeCardBackup_slot()
1215{ 1215{
1216#ifdef CONFIG_KEYCARD 1216#ifdef CONFIG_KEYCARD
1217 init->keycard()->makeBackupImage(); 1217 init->keycard()->makeBackupImage();
1218#endif 1218#endif
1219} 1219}
1220 1220
1221void PwM::replayCardBackup_slot() 1221void PwM::replayCardBackup_slot()
1222{ 1222{
1223#ifdef CONFIG_KEYCARD 1223#ifdef CONFIG_KEYCARD
1224 init->keycard()->replayBackupImage(); 1224 init->keycard()->replayBackupImage();
1225#endif 1225#endif
1226} 1226}
1227 1227
1228void PwM::execLauncher_slot() 1228void PwM::execLauncher_slot()
1229{ 1229{
1230 PWM_ASSERT(curDoc()); 1230 PWM_ASSERT(curDoc());
1231 if (curDoc()->isDeepLocked()) 1231 if (curDoc()->isDeepLocked())
1232 return; 1232 return;
1233 unsigned int curEntryIndex; 1233 unsigned int curEntryIndex;
1234 if (!view->getCurEntryIndex(&curEntryIndex)) 1234 if (!view->getCurEntryIndex(&curEntryIndex))
1235 return; 1235 return;
1236 bool ret = curDoc()->execLauncher(view->getCurrentCategory(), 1236 bool ret = curDoc()->execLauncher(view->getCurrentCategory(),
1237 curEntryIndex); 1237 curEntryIndex);
1238 if (ret) 1238 if (ret)
1239 showStatMsg(i18n("Executed the \"Launcher\".")); 1239 showStatMsg(i18n("Executed the \"Launcher\"."));
1240 else 1240 else
1241 showStatMsg(i18n("ERROR: Couldn't execute the \"Launcher\"!")); 1241 showStatMsg(i18n("ERROR: Couldn't execute the \"Launcher\"!"));
1242} 1242}
1243 1243
1244void PwM::goToURL_slot() 1244void PwM::goToURL_slot()
1245{ 1245{
1246 PWM_ASSERT(curDoc()); 1246 PWM_ASSERT(curDoc());
1247 if (curDoc()->isDeepLocked()) 1247 if (curDoc()->isDeepLocked())
1248 return; 1248 return;
1249 unsigned int curEntryIndex; 1249 unsigned int curEntryIndex;
1250 if (!view->getCurEntryIndex(&curEntryIndex)) 1250 if (!view->getCurEntryIndex(&curEntryIndex))
1251 return; 1251 return;
1252 bool ret = curDoc()->goToURL(view->getCurrentCategory(), 1252 bool ret = curDoc()->goToURL(view->getCurrentCategory(),
1253 curEntryIndex); 1253 curEntryIndex);
1254 if (ret) 1254 if (ret)
1255 showStatMsg(i18n("started browser with current URL.")); 1255 showStatMsg(i18n("started browser with current URL."));
1256 else 1256 else
1257 showStatMsg(i18n("ERROR: Couldn't start browser! Maybe invalid URL?")); 1257 showStatMsg(i18n("ERROR: Couldn't start browser! Maybe invalid URL?"));
1258} 1258}
1259 1259
1260void PwM::copyToClipboard(const QString &s) 1260void PwM::copyToClipboard(const QString &s)
1261{ 1261{
1262 QClipboard *cb = QApplication::clipboard(); 1262 QClipboard *cb = QApplication::clipboard();
1263#ifndef PWM_EMBEDDED 1263#ifndef PWM_EMBEDDED
1264 if (cb->supportsSelection()) 1264 if (cb->supportsSelection())
1265 cb->setText(s, QClipboard::Selection); 1265 cb->setText(s, QClipboard::Selection);
1266 cb->setText(s, QClipboard::Clipboard); 1266 cb->setText(s, QClipboard::Clipboard);
1267#else 1267#else
1268 cb->setText(s); 1268 cb->setText(s);
1269 1269
1270#endif 1270#endif
1271 1271
1272} 1272}
1273 1273
1274void PwM::showStatMsg(const QString &msg) 1274void PwM::showStatMsg(const QString &msg)
1275{ 1275{
1276#ifndef PWM_EMBEDDED 1276#ifndef PWM_EMBEDDED
1277 KStatusBar *statBar = statusBar(); 1277 KStatusBar *statBar = statusBar();
1278 statBar->message(msg, STATUSBAR_MSG_TIMEOUT * 1000); 1278 statBar->message(msg, STATUSBAR_MSG_TIMEOUT * 1000);
1279#else 1279#else
1280 qDebug("Statusbar : %s",msg.latin1()); 1280 qDebug("Statusbar : %s",msg.latin1());
1281#endif 1281#endif
1282} 1282}
1283 1283
1284void PwM::focusInEvent(QFocusEvent *e) 1284void PwM::focusInEvent(QFocusEvent *e)
1285{ 1285{
1286 if (e->gotFocus()) { 1286 if (e->gotFocus()) {
1287 emit gotFocus(this); 1287 emit gotFocus(this);
1288 } else if (e->lostFocus()) { 1288 } else if (e->lostFocus()) {
1289 emit lostFocus(this); 1289 emit lostFocus(this);
1290 } 1290 }
1291} 1291}
1292 1292
1293 1293
1294#ifdef PWM_EMBEDDED 1294#ifdef PWM_EMBEDDED
1295 1295
1296void PwM::whatsnew_slot() 1296void PwM::whatsnew_slot()
1297{ 1297{
1298 KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" ); 1298 KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" );
1299} 1299}
1300 1300
1301void PwM::showLicense_slot() 1301void PwM::showLicense_slot()
1302{ 1302{
1303 KApplication::showLicence(); 1303 KApplication::showLicence();
1304} 1304}
1305 1305
1306void PwM::faq_slot() 1306void PwM::faq_slot()
1307{ 1307{
1308 KApplication::showFile( "PWM/Pi FAQ", "kdepim/pwmanager/pwmanagerFAQ.txt" ); 1308 KApplication::showFile( "PWM/Pi FAQ", "kdepim/pwmanager/pwmanagerFAQ.txt" );
1309} 1309}
1310 1310
1311void PwM::syncHowTo_slot() 1311void PwM::syncHowTo_slot()
1312{ 1312{
1313 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" ); 1313 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" );
1314} 1314}
1315 1315
1316 1316
1317void PwM::createAboutData_slot() 1317void PwM::createAboutData_slot()
1318{ 1318{
1319 QString version; 1319 QString version;
1320#include <../version> 1320#include <../version>
1321 QMessageBox::about( this, "About PwManager/Pi", 1321 QMessageBox::about( this, "About PwManager/Pi",
1322 "PwManager/Platform-independent\n" 1322 "PwManager/Platform-independent\n"
1323 "(PWM/Pi) " +version + " - " + 1323 "(PWM/Pi) " +version + " - " +
1324#ifdef DESKTOP_VERSION 1324#ifdef DESKTOP_VERSION
1325 "Desktop Edition\n" 1325 "Desktop Edition\n"
1326#else 1326#else
1327 "PDA-Edition\n" 1327 "PDA-Edition\n"
1328 "for: Zaurus 5500 / 7x0 / 8x0\n" 1328 "for: Zaurus 5500 / 7x0 / 8x0\n"
1329#endif 1329#endif
1330 1330
1331 "(c) 2004 Ulf Schenk\n" 1331 "(c) 2004 Ulf Schenk\n"
1332 "(c) 2004 Lutz Rogowski\n" 1332 "(c) 2004 Lutz Rogowski\n"
1333 "(c) 1997-2004, The KDE PIM Team\n" 1333 "(c) 1997-2004, The KDE PIM Team\n"
1334 1334
1335 "(c) Michael Buesch - main programming\nand current maintainer\nmbuesch@freenet.de\n" 1335 "(c) Michael Buesch - main programming\nand current maintainer\nmbuesch@freenet.de\n"
1336 "Matt Scifo - mscifo@o1.com\n" 1336 "Matt Scifo - mscifo@o1.com\n"
1337 "Elias Probst - elias.probst@gmx.de\n" 1337 "Elias Probst - elias.probst@gmx.de\n"
1338 "George Staikos - staikos@kde.org\n" 1338 "George Staikos - staikos@kde.org\n"
1339 "Matthew Palmer - mjp16@uow.edu.au\n" 1339 "Matthew Palmer - mjp16@uow.edu.au\n"
1340 "Olivier Sessink - gpasman@nl.linux.org\n" 1340 "Olivier Sessink - gpasman@nl.linux.org\n"
1341 "The libgcrypt developers -\nBlowfish and SHA1 algorithms\nftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/\n" 1341 "The libgcrypt developers -\nBlowfish and SHA1 algorithms\nftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/\n"
1342 "Troy Engel - tengel@sonic.net\n" 1342 "Troy Engel - tengel@sonic.net\n"
1343 "Wickey - wickey@gmx.at\n" 1343 "Wickey - wickey@gmx.at\n"
1344 "Ian MacGregor - original documentation author.\n" 1344 "Ian MacGregor - original documentation author.\n"
1345 ); 1345 );
1346} 1346}
1347 1347
1348 1348
1349//this are the overwritten callbackmethods from the syncinterface 1349//this are the overwritten callbackmethods from the syncinterface
1350bool PwM::sync(KSyncManager* manager, QString filename, int mode) 1350bool PwM::sync(KSyncManager* manager, QString filename, int mode)
1351{ 1351{
1352 PWM_ASSERT(curDoc()); 1352 PWM_ASSERT(curDoc());
1353 1353
1354 bool ret = curDoc()->sync(manager, filename, mode); 1354 bool ret = curDoc()->sync(manager, filename, mode);
1355 1355
1356 qDebug("PwM::sync save now: ret=%i", ret); 1356 qDebug("PwM::sync save now: ret=%i", ret);
1357 1357
1358 if (ret == true) { 1358 if (ret == true) {
1359 //US BUG: what can we call here to update the view of the current doc? 1359 //US BUG: what can we call here to update the view of the current doc?
1360 //mViewManager->refreshView(); 1360 //mViewManager->refreshView();
1361 1361
1362 //US curDoc()->sync sets the dirtyFlag in case the sync was successfull. 1362 //US curDoc()->sync sets the dirtyFlag in case the sync was successfull.
1363 save(); 1363 save();
1364 } 1364 }
1365 1365
1366 return ret; 1366 return ret;
1367} 1367}
1368#endif 1368#endif
1369 1369
1370 1370
1371#ifndef PWM_EMBEDDED 1371#ifndef PWM_EMBEDDED
1372#include "pwm.moc" 1372#include "pwm.moc"
1373#endif 1373#endif
diff --git a/pwmanager/pwmanager/pwm.h b/pwmanager/pwmanager/pwm.h
index fe1f7a1..116bc66 100644
--- a/pwmanager/pwmanager/pwm.h
+++ b/pwmanager/pwmanager/pwm.h
@@ -1,292 +1,294 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 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#ifndef __PWM_H 20#ifndef __PWM_H
21#define __PWM_H 21#define __PWM_H
22 22
23 23
24#include <kpopupmenu.h> 24#include <kpopupmenu.h>
25#include <klistview.h> 25#include <klistview.h>
26#include <kmainwindow.h> 26#include <kmainwindow.h>
27 27
28#ifndef PWM_EMBEDDED 28#ifndef PWM_EMBEDDED
29#include <kwin.h> 29#include <kwin.h>
30#include <kapp.h> 30#include <kapp.h>
31#include <kdeversion.h> 31#include <kdeversion.h>
32#else 32#else
33#include <ksyncmanager.h> 33#include <ksyncmanager.h>
34#endif 34#endif
35 35
36#include <kaction.h> 36#include <kaction.h>
37 37
38#include <qglobal.h> 38#include <qglobal.h>
39 39
40#include "pwmview.h" 40#include "pwmview.h"
41#include "pwmexception.h" 41#include "pwmexception.h"
42 42
43 43
44/** timeout for displaying a message on the status-bar (in seconds) */ 44/** timeout for displaying a message on the status-bar (in seconds) */
45 #define STATUSBAR_MSG_TIMEOUT5 45 #define STATUSBAR_MSG_TIMEOUT5
46 46
47 47
48class PwMInit; 48class PwMInit;
49class KSyncManager; 49class KSyncManager;
50 50
51/** PwM is the base class of the project */ 51/** PwM is the base class of the project */
52#ifndef PWM_EMBEDDED 52#ifndef PWM_EMBEDDED
53//MOC_SKIP_BEGIN 53//MOC_SKIP_BEGIN
54class PwM : public KMainWindow 54class PwM : public KMainWindow
55//MOC_SKIP_END 55//MOC_SKIP_END
56#else 56#else
57class PwM : public KMainWindow, public KSyncInterface 57class PwM : public KMainWindow, public KSyncInterface
58#endif 58#endif
59{ 59{
60 Q_OBJECT 60 Q_OBJECT
61public: 61public:
62 friend class PwMView; 62 friend class PwMView;
63 /** construtor */ 63 /** construtor */
64 PwM(PwMInit *_init, PwMDoc *doc, 64 PwM(PwMInit *_init, PwMDoc *doc,
65 bool virginity = true, 65 bool virginity = true,
66 QWidget* parent = 0, const char *name = 0); 66 QWidget* parent = 0, const char *name = 0);
67 /** destructor */ 67 /** destructor */
68 ~PwM(); 68 ~PwM();
69 69
70 /** copy some text to the global clipboard */ 70 /** copy some text to the global clipboard */
71 static void copyToClipboard(const QString &s); 71 static void copyToClipboard(const QString &s);
72 72
73 /** returns pointer to the view */ 73 /** returns pointer to the view */
74 PwMView * curView() 74 PwMView * curView()
75 { return view; } 75 { return view; }
76 /** returns pointer to the currently using document. */ 76 /** returns pointer to the currently using document. */
77 PwMDoc * curDoc() 77 PwMDoc * curDoc()
78 { return curView()->document(); } 78 { return curView()->document(); }
79 /** open a new doc with the given filename */ 79 /** open a new doc with the given filename */
80 PwMDoc * openDoc(QString filename, bool openDeepLocked = false); 80 PwMDoc * openDoc(QString filename, bool openDeepLocked = false);
81 /** show a message on the global status bar. 81 /** show a message on the global status bar.
82 * The message times out after some seconds. 82 * The message times out after some seconds.
83 */ 83 */
84 void showStatMsg(const QString &msg); 84 void showStatMsg(const QString &msg);
85 /** ask the user where to save the doc (if it has not been saved, yet) 85 /** ask the user where to save the doc (if it has not been saved, yet)
86 * and write the data to disk. 86 * and write the data to disk.
87 */ 87 */
88 bool save(); 88 bool save();
89 /** ask the user where to save the doc 89 /** ask the user where to save the doc
90 * and write the data to disk. 90 * and write the data to disk.
91 */ 91 */
92 bool saveAs(); 92 bool saveAs();
93 /** force quit. Quit this window, always! Don't minimize it */ 93 /** force quit. Quit this window, always! Don't minimize it */
94 bool isForceQuit() 94 bool isForceQuit()
95 { return forceQuit; } 95 { return forceQuit; }
96 /** set forceQuit */ 96 /** set forceQuit */
97 void setForceQuit(bool force) 97 void setForceQuit(bool force)
98 { forceQuit = force; } 98 { forceQuit = force; }
99 /** force minimize this window */ 99 /** force minimize this window */
100 bool isForceMinimizeToTray() 100 bool isForceMinimizeToTray()
101 { return forceMinimizeToTray; } 101 { return forceMinimizeToTray; }
102 /** set forceMinimizeToTray */ 102 /** set forceMinimizeToTray */
103 void setForceMinimizeToTray(bool force) 103 void setForceMinimizeToTray(bool force)
104 { forceMinimizeToTray = force; } 104 { forceMinimizeToTray = force; }
105 105
106public slots: 106public slots:
107 /** file/new triggered */ 107 /** file/new triggered */
108 void new_slot(); 108 void new_slot();
109 /** file/open triggered */ 109 /** file/open triggered */
110//US ENH 110//US ENH
111 void open_slot(); 111 void open_slot();
112 void open_slot(QString fn); 112 void open_slot(QString fn);
113 /** file/close triggered */ 113 /** file/close triggered */
114 void close_slot(); 114 void close_slot();
115 /** file/quit triggered */ 115 /** file/quit triggered */
116 void quitButton_slot(); 116 void quitButton_slot();
117 /** file/save triggered */ 117 /** file/save triggered */
118 void save_slot(); 118 void save_slot();
119 /** file/saveAs triggered */ 119 /** file/saveAs triggered */
120 void saveAs_slot(); 120 void saveAs_slot();
121 /** file/export/text triggered */ 121 /** file/export/text triggered */
122 void exportToText(); 122 void exportToText();
123 /** file/export/gpasman triggered */ 123 /** file/export/gpasman triggered */
124 void exportToGpasman(); 124 void exportToGpasman();
125 /** file/export/kwallet triggered */ 125 /** file/export/kwallet triggered */
126 void exportToKWallet(); 126 void exportToKWallet();
127 /** file/import/text triggered */ 127 /** file/import/text triggered */
128 bool importFromText(); 128 bool importFromText();
129 /** file/import/gpasman triggered */ 129 /** file/import/gpasman triggered */
130 bool importFromGpasman(); 130 bool importFromGpasman();
131 /** file/import/kwallet triggered */ 131 /** file/import/kwallet triggered */
132 bool importKWallet(); 132 bool importKWallet();
133 /** file/print triggered */ 133 /** file/print triggered */
134 void print_slot(); 134 void print_slot();
135 /** manage/add triggered */ 135 /** manage/add triggered */
136 //US ENH : changed code to run with older MOC 136 //US ENH : changed code to run with older MOC
137
137 void addPwd_slot(); 138 void addPwd_slot();
138 void addPwd_slot(QString *pw, PwMDoc *_doc); 139 void addPwd_slot1(QString *pw, PwMDoc *_doc);
139 /** manage/edit triggered */ 140 /** manage/edit triggered */
140 //US ENH : changed code to run with older MOC 141 //US ENH : changed code to run with older MOC
141 void editPwd_slot(); 142 void editPwd_slot();
142 void editPwd_slot(const QString *category); 143 void editPwd_slot1(const QString *category);
143 void editPwd_slot(const QString *category = 0, const int *index = 0, 144 void editPwd_slot3(const QString *category = 0, const int *index = 0,
144 PwMDoc *_doc = 0); 145 PwMDoc *_doc = 0);
146
145 /** manage/delete triggered */ 147 /** manage/delete triggered */
146 void deletePwd_slot(); 148 void deletePwd_slot();
147 /** execute the "Launcher" entry */ 149 /** execute the "Launcher" entry */
148 void execLauncher_slot(); 150 void execLauncher_slot();
149 /** open browser with URL entry */ 151 /** open browser with URL entry */
150 void goToURL_slot(); 152 void goToURL_slot();
151 /** manage/changeMasterPwd triggered */ 153 /** manage/changeMasterPwd triggered */
152 void changeMasterPwd_slot(); 154 void changeMasterPwd_slot();
153 /** lock current document */ 155 /** lock current document */
154 void lockWnd_slot(); 156 void lockWnd_slot();
155 /** deeplock current document */ 157 /** deeplock current document */
156 void deepLockWnd_slot(); 158 void deepLockWnd_slot();
157 /** window/unlock triggered */ 159 /** window/unlock triggered */
158 void unlockWnd_slot(); 160 void unlockWnd_slot();
159 /** find item */ 161 /** find item */
160 void find_slot(); 162 void find_slot();
161 /** configure clicked */ 163 /** configure clicked */
162 void config_slot(); 164 void config_slot();
163 /** (de)activate the "change master pw" button in the menu-bar */ 165 /** (de)activate the "change master pw" button in the menu-bar */
164 void activateMpButton(bool activate = true); 166 void activateMpButton(bool activate = true);
165 /** generate a new chipcard */ 167 /** generate a new chipcard */
166 void genNewCard_slot(); 168 void genNewCard_slot();
167 /** completely erase the current card */ 169 /** completely erase the current card */
168 void eraseCard_slot(); 170 void eraseCard_slot();
169 /** returns the ID number of the current card */ 171 /** returns the ID number of the current card */
170 void readCardId_slot(); 172 void readCardId_slot();
171 /** make backup image of the current card */ 173 /** make backup image of the current card */
172 void makeCardBackup_slot(); 174 void makeCardBackup_slot();
173 /** write backup image to current card */ 175 /** write backup image to current card */
174 void replayCardBackup_slot(); 176 void replayCardBackup_slot();
175 177
176#ifdef PWM_EMBEDDED 178#ifdef PWM_EMBEDDED
177 void whatsnew_slot(); 179 void whatsnew_slot();
178 void showLicense_slot(); 180 void showLicense_slot();
179 void faq_slot(); 181 void faq_slot();
180 void createAboutData_slot(); 182 void createAboutData_slot();
181 void syncHowTo_slot(); 183 void syncHowTo_slot();
182#endif 184#endif
183 185
184protected: 186protected:
185 /** is this window virgin? */ 187 /** is this window virgin? */
186 bool isVirgin() 188 bool isVirgin()
187 { return virgin; } 189 { return virgin; }
188 /** add/remove virginity */ 190 /** add/remove virginity */
189 void setVirgin(bool v); 191 void setVirgin(bool v);
190 /** initialize the menubar */ 192 /** initialize the menubar */
191 void initMenubar(); 193 void initMenubar();
192 /** initialize the toolbar */ 194 /** initialize the toolbar */
193 void initToolbar(); 195 void initToolbar();
194 /** initialize the window-metrics */ 196 /** initialize the window-metrics */
195 void initMetrics(); 197 void initMetrics();
196 /** close-event */ 198 /** close-event */
197 void closeEvent(QCloseEvent *e); 199 void closeEvent(QCloseEvent *e);
198 /** creates a new PwM-ListView and returns it */ 200 /** creates a new PwM-ListView and returns it */
199 PwMView * makeNewListView(PwMDoc *doc); 201 PwMView * makeNewListView(PwMDoc *doc);
200 /** Window hide-event */ 202 /** Window hide-event */
201 void hideEvent(QHideEvent *); 203 void hideEvent(QHideEvent *);
202 /** is this window minimized? */ 204 /** is this window minimized? */
203 bool isMinimized() 205 bool isMinimized()
204 { 206 {
205#ifndef PWM_EMBEDDED 207#ifndef PWM_EMBEDDED
206 #if KDE_VERSION >= KDE_MAKE_VERSION(3, 2, 0) 208 #if KDE_VERSION >= KDE_MAKE_VERSION(3, 2, 0)
207 return KWin::windowInfo(winId()).isMinimized(); 209 return KWin::windowInfo(winId()).isMinimized();
208 #else // KDE_VERSION 210 #else // KDE_VERSION
209 return KWin::info(winId()).isIconified(); 211 return KWin::info(winId()).isIconified();
210 #endif // KDE_VERSION 212 #endif // KDE_VERSION
211#else 213#else
212 return false; 214 return false;
213#endif 215#endif
214 } 216 }
215 /** window got the focus */ 217 /** window got the focus */
216 void focusInEvent(QFocusEvent *e); 218 void focusInEvent(QFocusEvent *e);
217 /** update the caption string */ 219 /** update the caption string */
218 void updateCaption(); 220 void updateCaption();
219#ifdef CONFIG_KWALLETIF 221#ifdef CONFIG_KWALLETIF
220 /** check if kwalletemu is enabled and ask the user what to do */ 222 /** check if kwalletemu is enabled and ask the user what to do */
221 bool checkAndAskForKWalletEmu(); 223 bool checkAndAskForKWalletEmu();
222#endif // CONFIG_KWALLETIF 224#endif // CONFIG_KWALLETIF
223 225
224protected slots: 226protected slots:
225 /** doc got closed */ 227 /** doc got closed */
226 void docClosed(PwMDoc *doc); 228 void docClosed(PwMDoc *doc);
227 229
228signals: 230signals:
229 /** window got closed (by user or someone else) */ 231 /** window got closed (by user or someone else) */
230 void closed(PwM *wnd); 232 void closed(PwM *wnd);
231 /** window got the focus (was brought to foreground) */ 233 /** window got the focus (was brought to foreground) */
232 void gotFocus(PwM *wnd); 234 void gotFocus(PwM *wnd);
233 /** window lost the focus */ 235 /** window lost the focus */
234 void lostFocus(PwM *wnd); 236 void lostFocus(PwM *wnd);
235 237
236protected: 238protected:
237 /** pointer to the view active in this KMainWindow */ 239 /** pointer to the view active in this KMainWindow */
238 PwMView *view; 240 PwMView *view;
239 /** pointer to the init class */ 241 /** pointer to the init class */
240 PwMInit *init; 242 PwMInit *init;
241 /** has this window already lost its virginity? 243 /** has this window already lost its virginity?
242 * Means is there an open working document 244 * Means is there an open working document
243 */ 245 */
244 bool virgin; 246 bool virgin;
245 /** "file" popup-menu */ 247 /** "file" popup-menu */
246 KPopupMenu *filePopup; 248 KPopupMenu *filePopup;
247 249
248 /** "manage" popup-menu */ 250 /** "manage" popup-menu */
249 KPopupMenu *managePopup; 251 KPopupMenu *managePopup;
250#ifdef CONFIG_KEYCARD 252#ifdef CONFIG_KEYCARD
251 /** "chipcard" popup-menu */ 253 /** "chipcard" popup-menu */
252 KPopupMenu *chipcardPopup; 254 KPopupMenu *chipcardPopup;
253#endif // CONFIG_KEYCARD 255#endif // CONFIG_KEYCARD
254 /** "view" popup-menu */ 256 /** "view" popup-menu */
255 KPopupMenu *viewPopup; 257 KPopupMenu *viewPopup;
256 /** "options" popup-menu */ 258 /** "options" popup-menu */
257 KPopupMenu *optionsPopup; 259 KPopupMenu *optionsPopup;
258 /** "help" popup-menu */ 260 /** "help" popup-menu */
259 KPopupMenu *helpPopup; 261 KPopupMenu *helpPopup;
260 /** "export" popup-menu */ 262 /** "export" popup-menu */
261 KPopupMenu *exportPopup; 263 KPopupMenu *exportPopup;
262 /** "import" popup-menu */ 264 /** "import" popup-menu */
263 KPopupMenu *importPopup; 265 KPopupMenu *importPopup;
264 /** force quit this window? */ 266 /** force quit this window? */
265 bool forceQuit; 267 bool forceQuit;
266 /** force minimize this window to the tray */ 268 /** force minimize this window to the tray */
267 bool forceMinimizeToTray; 269 bool forceMinimizeToTray;
268 270
269 271
270 272
271 273
272 private: 274 private:
273#ifdef PWM_EMBEDDED 275#ifdef PWM_EMBEDDED
274 //this are the overwritten callbackmethods from the syncinterface 276 //this are the overwritten callbackmethods from the syncinterface
275 virtual bool sync(KSyncManager* manager, QString filename, int mode); 277 virtual bool sync(KSyncManager* manager, QString filename, int mode);
276 278
277 // LR ******************************* 279 // LR *******************************
278 // sync stuff! 280 // sync stuff!
279 QPopupMenu *syncPopup; 281 QPopupMenu *syncPopup;
280 KSyncManager* syncManager; 282 KSyncManager* syncManager;
281#endif 283#endif
282 284
283 285
284 286
285 287
286 288
287 289
288 290
289 291
290}; 292};
291 293
292#endif 294#endif
diff --git a/pwmanager/pwmanager/pwmanager.pro b/pwmanager/pwmanager/pwmanager.pro
index 34f7403..7f39c76 100644
--- a/pwmanager/pwmanager/pwmanager.pro
+++ b/pwmanager/pwmanager/pwmanager.pro
@@ -1,168 +1,173 @@
1 TEMPLATE= app 1 TEMPLATE= app
2 CONFIG += qt warn_on 2 CONFIG += qt warn_on
3 3DESTDIR= ../../bin
4
5 TARGET = pwmpi 4 TARGET = pwmpi
6OBJECTS_DIR = obj/$(PLATFORM) 5include( ../../variables.pri )
7MOC_DIR = moc/$(PLATFORM)
8DESTDIR=$(QPEDIR)/bin
9 6
10INCLUDEPATH += . ../../ ../../qtcompat ../../qtcompat/xml ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils $(QPEDIR)/include 7INCLUDEPATH += . ../../ ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils
11DEFINES += PWM_EMBEDDED CONFIG_PWMANAGER_GCRY DESKTOP_VERSION 8DEFINES += PWM_EMBEDDED CONFIG_PWMANAGER_GCRY DESKTOP_VERSION
12 9
13#enable this setting if you want debugoutput for pwmanager 10#enable this setting if you want debugoutput for pwmanager
14#DEFINES += CONFIG_DEBUG 11#DEFINES += CONFIG_DEBUG
15LIBS += -L../libcrypt/$(PLATFORM) 12LIBS += -L../libcrypt/
13LIBS += -L../../bin/
16LIBS += -lmicrokde 14LIBS += -lmicrokde
17LIBS += -lmicroqtcompat
18LIBS += -lmicrokdepim 15LIBS += -lmicrokdepim
19LIBS += -L$(QPEDIR)/lib
20LIBS += -lqpe
21LIBS += -lzlib 16LIBS += -lzlib
22#LIBS += -lbz2
23#LIBS += -lkpmicrogcrypt
24LIBS += -ljpeg
25LIBS += $(QTOPIALIB)
26LIBS += -lkpmicrocipher 17LIBS += -lkpmicrocipher
27LIBS += -lkpmicroerror 18LIBS += -lkpmicroerror
28LIBS += -lkpmicrompi 19LIBS += -lkpmicrompi
29LIBS += -lstdc++ 20LIBS += -lstdc++
30 21
22unix:{
23OBJECTS_DIR = obj/unix
24MOC_DIR = moc/unix
25
26}
27win32:{
28
29DEFINES += _WIN32_
30OBJECTS_DIR = obj/win
31MOC_DIR = moc/win
32QMAKE_LINK += /NODEFAULTLIB:LIBC
33
34}
35
31#INTERFACES = \ 36#INTERFACES = \
32#addentrywnd.ui \ 37#addentrywnd.ui \
33#configwnd.ui \ 38#configwnd.ui \
34#findwnd.ui \ 39#findwnd.ui \
35#getmasterpwwnd.ui \ 40#getmasterpwwnd.ui \
36#pwgenwnd.ui \ 41#pwgenwnd.ui \
37#setmasterpwwnd.ui \ 42#setmasterpwwnd.ui \
38#subtbledit.ui 43#subtbledit.ui
39 44
40#INTERFACES = \ 45#INTERFACES = \
41#subtbledit.ui \ 46#subtbledit.ui \
42 47
43 48
44 49
45#HEADERS = \ 50#HEADERS = \
46#configuration_31compat.h \ 51#configuration_31compat.h \
47#configuration.h \ 52#configuration.h \
48#configwnd.h \ 53#configwnd.h \
49#configwndimpl.h \ 54#configwndimpl.h \
50#selftest.h 55#selftest.h
51#subtbledit.h \ 56#subtbledit.h \
52#subtbleditimpl.h \ 57#subtbleditimpl.h \
53#compressbzip2.h \ 58#compressbzip2.h \
54 59
55HEADERS = \ 60HEADERS = \
56addentrywnd_emb.h \ 61addentrywnd_emb.h \
57addentrywndimpl.h \ 62addentrywndimpl.h \
58base64.h \ 63base64.h \
59binentrygen.h \ 64binentrygen.h \
60blowfish.h \ 65blowfish.h \
61commentbox.h \ 66commentbox.h \
62compiler.h \ 67compiler.h \
63compressgzip.h \ 68compressgzip.h \
64findwnd_emb.h \ 69findwnd_emb.h \
65findwndimpl.h \ 70findwndimpl.h \
66genpasswd.h \ 71genpasswd.h \
67getkeycardwnd.h \ 72getkeycardwnd.h \
68getmasterpwwnd_emb.h \ 73getmasterpwwnd_emb.h \
69getmasterpwwndimpl.h \ 74getmasterpwwndimpl.h \
70globalstuff.h \ 75globalstuff.h \
71gpasmanfile.h \ 76gpasmanfile.h \
72htmlgen.h \ 77htmlgen.h \
73htmlparse.h \ 78htmlparse.h \
74ipc.h \ 79ipc.h \
75libgcryptif.h \ 80libgcryptif.h \
76listobjselectwnd.h \ 81listobjselectwnd.h \
77listviewpwm.h \ 82listviewpwm.h \
78printtext.h \ 83printtext.h \
79pwgenwnd_emb.h \ 84pwgenwnd_emb.h \
80pwgenwndimpl.h \ 85pwgenwndimpl.h \
81pwmdoc.h \ 86pwmdoc.h \
82pwmdocui.h \ 87pwmdocui.h \
83pwmexception.h \ 88pwmexception.h \
84pwm.h \ 89pwm.h \
85pwminit.h \ 90pwminit.h \
86pwmprefs.h \ 91pwmprefs.h \
87pwmprint.h \ 92pwmprint.h \
88pwmtray.h \ 93pwmtray.h \
89pwmview.h \ 94pwmview.h \
90pwmviewstyle_0.h \ 95pwmviewstyle_0.h \
91pwmviewstyle_1.h \ 96pwmviewstyle_1.h \
92pwmviewstyle.h \ 97pwmviewstyle.h \
93randomizer.h \ 98randomizer.h \
94rc2.h \ 99rc2.h \
95rencatwnd.h \ 100rencatwnd.h \
96serializer.h \ 101serializer.h \
97setmasterpwwnd_emb.h \ 102setmasterpwwnd_emb.h \
98setmasterpwwndimpl.h \ 103setmasterpwwndimpl.h \
99sha1.h \ 104sha1.h \
100waitwnd.h \ 105waitwnd.h \
101kcmconfigs/kcmpwmconfig.h \ 106kcmconfigs/kcmpwmconfig.h \
102kcmconfigs/pwmconfigwidget.h 107kcmconfigs/pwmconfigwidget.h
103 108
104#sources that need not be build 109#sources that need not be build
105#SOURCES = \ 110#SOURCES = \
106#advcommeditimpl.cpp \ 111#advcommeditimpl.cpp \
107#configuration.cpp \ 112#configuration.cpp \
108#configwnd.cpp \ 113#configwnd.cpp \
109#configwndimpl.cpp \ 114#configwndimpl.cpp \
110#configuration_31compat.cpp \ 115#configuration_31compat.cpp \
111#htmlparse.cpp \ 116#htmlparse.cpp \
112#printtext.cpp \ 117#printtext.cpp \
113#selftest.cpp \ 118#selftest.cpp \
114#pwmprint.cpp \ 119#pwmprint.cpp \
115#spinforsignal.cpp 120#spinforsignal.cpp
116#subtbledit.cpp \ 121#subtbledit.cpp \
117#subtbleditimpl.cpp \ 122#subtbleditimpl.cpp \
118#compressbzip2.cpp 123#compressbzip2.cpp
119 124
120 125
121SOURCES = \ 126SOURCES = \
122addentrywnd_emb.cpp \ 127addentrywnd_emb.cpp \
123addentrywndimpl.cpp \ 128addentrywndimpl.cpp \
124base64.cpp \ 129base64.cpp \
125binentrygen.cpp \ 130binentrygen.cpp \
126blowfish.cpp \ 131blowfish.cpp \
127commentbox.cpp \ 132commentbox.cpp \
128compressgzip.cpp \ 133compressgzip.cpp \
129findwnd_emb.cpp \ 134findwnd_emb.cpp \
130findwndimpl.cpp \ 135findwndimpl.cpp \
131genpasswd.cpp \ 136genpasswd.cpp \
132getkeycardwnd.cpp \ 137getkeycardwnd.cpp \
133getmasterpwwnd_emb.cpp \ 138getmasterpwwnd_emb.cpp \
134getmasterpwwndimpl.cpp \ 139getmasterpwwndimpl.cpp \
135globalstuff.cpp \ 140globalstuff.cpp \
136gpasmanfile.cpp \ 141gpasmanfile.cpp \
137htmlgen.cpp \ 142htmlgen.cpp \
138ipc.cpp \ 143ipc.cpp \
139libgcryptif.cpp \ 144libgcryptif.cpp \
140listobjselectwnd.cpp \ 145listobjselectwnd.cpp \
141listviewpwm.cpp \ 146listviewpwm.cpp \
142main.cpp \ 147main.cpp \
143pwgenwnd_emb.cpp \ 148pwgenwnd_emb.cpp \
144pwgenwndimpl.cpp \ 149pwgenwndimpl.cpp \
145pwm.cpp \ 150pwm.cpp \
146pwmdoc.cpp \ 151pwmdoc.cpp \
147pwmdocui.cpp \ 152pwmdocui.cpp \
148pwmexception.cpp \ 153pwmexception.cpp \
149pwminit.cpp \ 154pwminit.cpp \
150pwmprefs.cpp \ 155pwmprefs.cpp \
151pwmtray.cpp \ 156pwmtray.cpp \
152pwmview.cpp \ 157pwmview.cpp \
153pwmviewstyle_0.cpp \ 158pwmviewstyle_0.cpp \
154pwmviewstyle_1.cpp \ 159pwmviewstyle_1.cpp \
155pwmviewstyle.cpp \ 160pwmviewstyle.cpp \
156randomizer.cpp \ 161randomizer.cpp \
157rc2.cpp \ 162rc2.cpp \
158rencatwnd.cpp \ 163rencatwnd.cpp \
159serializer.cpp \ 164serializer.cpp \
160setmasterpwwnd_emb.cpp \ 165setmasterpwwnd_emb.cpp \
161setmasterpwwndimpl.cpp \ 166setmasterpwwndimpl.cpp \
162sha1.cpp \ 167sha1.cpp \
163waitwnd.cpp \ 168waitwnd.cpp \
164kcmconfigs/kcmpwmconfig.cpp \ 169kcmconfigs/kcmpwmconfig.cpp \
165kcmconfigs/pwmconfigwidget.cpp 170kcmconfigs/pwmconfigwidget.cpp
166 171
167 172
168 173
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp
index e29e3d1..8869f3a 100644
--- a/pwmanager/pwmanager/pwmdoc.cpp
+++ b/pwmanager/pwmanager/pwmdoc.cpp
@@ -1,3491 +1,3491 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 1.1 of pwmanager 14 * This file is originaly based on version 1.1 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
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//US#include "compressbzip2.h" 28//US#include "compressbzip2.h"
29#include "randomizer.h" 29#include "randomizer.h"
30#include "pwminit.h" 30#include "pwminit.h"
31#include "libgcryptif.h" 31#include "libgcryptif.h"
32#ifdef PWM_EMBEDDED 32#ifdef PWM_EMBEDDED
33#include "pwmprefs.h" 33#include "pwmprefs.h"
34#include "kglobal.h" 34#include "kglobal.h"
35#endif 35#endif
36 36
37#include <kmessagebox.h> 37#include <kmessagebox.h>
38#include <libkcal/syncdefines.h> 38#include <libkcal/syncdefines.h>
39 39
40 40
41#ifdef CONFIG_KWALLETIF 41#ifdef CONFIG_KWALLETIF
42# include "kwalletemu.h" 42# include "kwalletemu.h"
43#endif // CONFIG_KWALLETIF 43#endif // CONFIG_KWALLETIF
44 44
45#include <qdatetime.h> 45#include <qdatetime.h>
46#include <qsize.h> 46#include <qsize.h>
47#include <qfileinfo.h> 47#include <qfileinfo.h>
48#include <qfile.h> 48#include <qfile.h>
49 49
50#include <stdio.h> 50#include <stdio.h>
51#include <stdlib.h> 51#include <stdlib.h>
52#include <errno.h> 52#include <errno.h>
53#include <string.h> 53#include <string.h>
54//US#include <iostream> 54//US#include <iostream>
55#include <algorithm> 55#include <algorithm>
56#include <sys/types.h> 56#include <sys/types.h>
57#include <sys/stat.h> 57#include <sys/stat.h>
58#include <unistd.h> 58#include <unistd.h>
59#include <stdint.h> 59#include <stdint.h>
60 60
61 61
62#ifdef PWM_EMBEDDED 62#ifdef PWM_EMBEDDED
63#ifndef Q_LONG 63#ifndef Q_LONG
64#define Q_LONG long 64#define Q_LONG long
65#endif 65#endif
66 66
67#ifndef Q_ULONG 67#ifndef Q_ULONG
68#define Q_ULONG unsigned long 68#define Q_ULONG unsigned long
69#endif 69#endif
70#endif //PWM_EMBEDDED 70#endif //PWM_EMBEDDED
71 71
72 72
73//TODO: reset to its normal value. 73//TODO: reset to its normal value.
74 #define META_CHECK_TIMER_INTERVAL10/*300*/ /* sek */ 74 #define META_CHECK_TIMER_INTERVAL10/*300*/ /* sek */
75 75
76using namespace std; 76using namespace std;
77 77
78 78
79void PwMDocList::add(PwMDoc *doc, const string &id) 79void PwMDocList::add(PwMDoc *doc, const string &id)
80{ 80{
81#ifdef PWM_DEBUG 81#ifdef PWM_DEBUG
82 // check for existance of object in debug mode only. 82 // check for existance of object in debug mode only.
83 vector<listItem>::iterator begin = docList.begin(), 83 vector<listItem>::iterator begin = docList.begin(),
84 end = docList.end(), 84 end = docList.end(),
85 i = begin; 85 i = begin;
86 while (i != end) { 86 while (i != end) {
87 if (i->doc == doc) { 87 if (i->doc == doc) {
88 BUG(); 88 BUG();
89 return; 89 return;
90 } 90 }
91 ++i; 91 ++i;
92 } 92 }
93#endif 93#endif
94 listItem newItem; 94 listItem newItem;
95 newItem.doc = doc; 95 newItem.doc = doc;
96 newItem.docId = id; 96 newItem.docId = id;
97 docList.push_back(newItem); 97 docList.push_back(newItem);
98} 98}
99 99
100void PwMDocList::edit(PwMDoc *doc, const string &newId) 100void PwMDocList::edit(PwMDoc *doc, const string &newId)
101{ 101{
102 vector<listItem>::iterator begin = docList.begin(), 102 vector<listItem>::iterator begin = docList.begin(),
103 end = docList.end(), 103 end = docList.end(),
104 i = begin; 104 i = begin;
105 while (i != end) { 105 while (i != end) {
106 if (i->doc == doc) { 106 if (i->doc == doc) {
107 i->docId = newId; 107 i->docId = newId;
108 return; 108 return;
109 } 109 }
110 ++i; 110 ++i;
111 } 111 }
112} 112}
113 113
114void PwMDocList::del(PwMDoc *doc) 114void PwMDocList::del(PwMDoc *doc)
115{ 115{
116 vector<listItem>::iterator begin = docList.begin(), 116 vector<listItem>::iterator begin = docList.begin(),
117 end = docList.end(), 117 end = docList.end(),
118 i = begin; 118 i = begin;
119 while (i != end) { 119 while (i != end) {
120 if (i->doc == doc) { 120 if (i->doc == doc) {
121 docList.erase(i); 121 docList.erase(i);
122 return; 122 return;
123 } 123 }
124 ++i; 124 ++i;
125 } 125 }
126} 126}
127 127
128bool PwMDocList::find(const string &id, listItem *ret) 128bool PwMDocList::find(const string &id, listItem *ret)
129{ 129{
130 vector<listItem>::iterator begin = docList.begin(), 130 vector<listItem>::iterator begin = docList.begin(),
131 end = docList.end(), 131 end = docList.end(),
132 i = begin; 132 i = begin;
133 while (i != end) { 133 while (i != end) {
134 if (i->docId == id) { 134 if (i->docId == id) {
135 if (ret) 135 if (ret)
136 *ret = *i; 136 *ret = *i;
137 return true; 137 return true;
138 } 138 }
139 ++i; 139 ++i;
140 } 140 }
141 return false; 141 return false;
142} 142}
143 143
144 144
145 145
146DocTimer::DocTimer(PwMDoc *_doc) 146DocTimer::DocTimer(PwMDoc *_doc)
147 : doc (_doc) 147 : doc (_doc)
148 , mpwLock (0) 148 , mpwLock (0)
149 , autoLockLock (0) 149 , autoLockLock (0)
150 , metaCheckLock (0) 150 , metaCheckLock (0)
151{ 151{
152 mpwTimer = new QTimer; 152 mpwTimer = new QTimer;
153 autoLockTimer = new QTimer; 153 autoLockTimer = new QTimer;
154 metaCheckTimer = new QTimer; 154 metaCheckTimer = new QTimer;
155 connect(mpwTimer, SIGNAL(timeout()), 155 connect(mpwTimer, SIGNAL(timeout()),
156 this, SLOT(mpwTimeout())); 156 this, SLOT(mpwTimeout()));
157 connect(autoLockTimer, SIGNAL(timeout()), 157 connect(autoLockTimer, SIGNAL(timeout()),
158 this, SLOT(autoLockTimeout())); 158 this, SLOT(autoLockTimeout()));
159 connect(metaCheckTimer, SIGNAL(timeout()), 159 connect(metaCheckTimer, SIGNAL(timeout()),
160 this, SLOT(metaCheckTimeout())); 160 this, SLOT(metaCheckTimeout()));
161} 161}
162 162
163DocTimer::~DocTimer() 163DocTimer::~DocTimer()
164{ 164{
165 delete mpwTimer; 165 delete mpwTimer;
166 delete autoLockTimer; 166 delete autoLockTimer;
167 delete metaCheckTimer; 167 delete metaCheckTimer;
168} 168}
169 169
170void DocTimer::start(TimerIDs timer) 170void DocTimer::start(TimerIDs timer)
171{ 171{
172 switch (timer) { 172 switch (timer) {
173 case id_mpwTimer: 173 case id_mpwTimer:
174 if (mpwTimer->isActive()) 174 if (mpwTimer->isActive())
175 mpwTimer->stop(); 175 mpwTimer->stop();
176 doc->setDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); 176 doc->setDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW);
177 mpwTimer->start(conf()->confGlobPwTimeout() * 1000, true); 177 mpwTimer->start(conf()->confGlobPwTimeout() * 1000, true);
178 break; 178 break;
179 case id_autoLockTimer: 179 case id_autoLockTimer:
180 if (autoLockTimer->isActive()) 180 if (autoLockTimer->isActive())
181 autoLockTimer->stop(); 181 autoLockTimer->stop();
182 if (conf()->confGlobLockTimeout() > 0) 182 if (conf()->confGlobLockTimeout() > 0)
183 autoLockTimer->start(conf()->confGlobLockTimeout() * 1000, true); 183 autoLockTimer->start(conf()->confGlobLockTimeout() * 1000, true);
184 break; 184 break;
185 case id_metaCheckTimer: 185 case id_metaCheckTimer:
186 if (metaCheckTimer->isActive()) 186 if (metaCheckTimer->isActive())
187 metaCheckTimer->stop(); 187 metaCheckTimer->stop();
188 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 188 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
189 break; 189 break;
190 } 190 }
191} 191}
192 192
193void DocTimer::stop(TimerIDs timer) 193void DocTimer::stop(TimerIDs timer)
194{ 194{
195 switch (timer) { 195 switch (timer) {
196 case id_mpwTimer: 196 case id_mpwTimer:
197 mpwTimer->stop(); 197 mpwTimer->stop();
198 break; 198 break;
199 case id_autoLockTimer: 199 case id_autoLockTimer:
200 autoLockTimer->stop(); 200 autoLockTimer->stop();
201 break; 201 break;
202 case id_metaCheckTimer: 202 case id_metaCheckTimer:
203 metaCheckTimer->stop(); 203 metaCheckTimer->stop();
204 break; 204 break;
205 } 205 }
206} 206}
207 207
208void DocTimer::getLock(TimerIDs timer) 208void DocTimer::getLock(TimerIDs timer)
209{ 209{
210 switch (timer) { 210 switch (timer) {
211 case id_mpwTimer: 211 case id_mpwTimer:
212 ++mpwLock; 212 ++mpwLock;
213 break; 213 break;
214 case id_autoLockTimer: 214 case id_autoLockTimer:
215 ++autoLockLock; 215 ++autoLockLock;
216 break; 216 break;
217 case id_metaCheckTimer: 217 case id_metaCheckTimer:
218 ++metaCheckLock; 218 ++metaCheckLock;
219 break; 219 break;
220 } 220 }
221} 221}
222 222
223void DocTimer::putLock(TimerIDs timer) 223void DocTimer::putLock(TimerIDs timer)
224{ 224{
225 switch (timer) { 225 switch (timer) {
226 case id_mpwTimer: 226 case id_mpwTimer:
227 if (mpwLock) 227 if (mpwLock)
228 --mpwLock; 228 --mpwLock;
229 break; 229 break;
230 case id_autoLockTimer: 230 case id_autoLockTimer:
231 if (autoLockLock) 231 if (autoLockLock)
232 --autoLockLock; 232 --autoLockLock;
233 break; 233 break;
234 case id_metaCheckTimer: 234 case id_metaCheckTimer:
235 if (metaCheckLock) 235 if (metaCheckLock)
236 --metaCheckLock; 236 --metaCheckLock;
237 break; 237 break;
238 } 238 }
239} 239}
240 240
241void DocTimer::mpwTimeout() 241void DocTimer::mpwTimeout()
242{ 242{
243 if (mpwLock) { 243 if (mpwLock) {
244 mpwTimer->start(1000, true); 244 mpwTimer->start(1000, true);
245 return; 245 return;
246 } 246 }
247 doc->unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); 247 doc->unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW);
248} 248}
249 249
250void DocTimer::autoLockTimeout() 250void DocTimer::autoLockTimeout()
251{ 251{
252 if (autoLockLock) { 252 if (autoLockLock) {
253 autoLockTimer->start(1000, true); 253 autoLockTimer->start(1000, true);
254 return; 254 return;
255 } 255 }
256 if (conf()->confGlobAutoDeepLock() && 256 if (conf()->confGlobAutoDeepLock() &&
257 doc->filename != QString::null && 257 doc->filename != QString::null &&
258 doc->filename != "") { 258 doc->filename != "") {
259 doc->deepLock(true); 259 doc->deepLock(true);
260 } else { 260 } else {
261 doc->lockAll(true); 261 doc->lockAll(true);
262 } 262 }
263} 263}
264 264
265void DocTimer::metaCheckTimeout() 265void DocTimer::metaCheckTimeout()
266{ 266{
267 if (metaCheckLock) { 267 if (metaCheckLock) {
268 // check again in one second. 268 // check again in one second.
269 metaCheckTimer->start(1000, true); 269 metaCheckTimer->start(1000, true);
270 return; 270 return;
271 } 271 }
272 if (doc->isDeepLocked()) { 272 if (doc->isDeepLocked()) {
273 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 273 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
274 return; 274 return;
275 } 275 }
276 if (doc->isDocEmpty()) { 276 if (doc->isDocEmpty()) {
277 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 277 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
278 return; 278 return;
279 } 279 }
280#ifdef CONFIG_KWALLETIF 280#ifdef CONFIG_KWALLETIF
281 KWalletEmu *kwlEmu = doc->init->kwalletEmu(); 281 KWalletEmu *kwlEmu = doc->init->kwalletEmu();
282 if (kwlEmu) 282 if (kwlEmu)
283 kwlEmu->suspendDocSignals(); 283 kwlEmu->suspendDocSignals();
284#endif // CONFIG_KWALLETIF 284#endif // CONFIG_KWALLETIF
285 /* We simply trigger all views to update their 285 /* We simply trigger all views to update their
286 * displayed values. This way they have a chance 286 * displayed values. This way they have a chance
287 * to get notified when some meta changes over time. 287 * to get notified when some meta changes over time.
288 * (for example an entry expired). 288 * (for example an entry expired).
289 * The _view_ is responsive for not updating its 289 * The _view_ is responsive for not updating its
290 * contents if nothing really changed! 290 * contents if nothing really changed!
291 */ 291 */
292 emit doc->dataChanged(doc); 292 emit doc->dataChanged(doc);
293#ifdef CONFIG_KWALLETIF 293#ifdef CONFIG_KWALLETIF
294 if (kwlEmu) 294 if (kwlEmu)
295 kwlEmu->resumeDocSignals(); 295 kwlEmu->resumeDocSignals();
296#endif // CONFIG_KWALLETIF 296#endif // CONFIG_KWALLETIF
297 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 297 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
298} 298}
299 299
300 300
301 301
302PwMDocList PwMDoc::openDocList; 302PwMDocList PwMDoc::openDocList;
303unsigned int PwMDocList::unnamedDocCnt = 1; 303unsigned int PwMDocList::unnamedDocCnt = 1;
304 304
305PwMDoc::PwMDoc(QObject *parent, const char *name) 305PwMDoc::PwMDoc(QObject *parent, const char *name)
306 : PwMDocUi(parent, name) 306 : PwMDocUi(parent, name)
307 , dataChangedLock (0) 307 , dataChangedLock (0)
308{ 308{
309 deleted = false; 309 deleted = false;
310 unnamedNum = 0; 310 unnamedNum = 0;
311 getOpenDocList()->add(this, getTitle().latin1()); 311 getOpenDocList()->add(this, getTitle().latin1());
312 curDocStat = 0; 312 curDocStat = 0;
313 setMaxNumEntries(); 313 setMaxNumEntries();
314 _timer = new DocTimer(this); 314 _timer = new DocTimer(this);
315 timer()->start(DocTimer::id_mpwTimer); 315 timer()->start(DocTimer::id_mpwTimer);
316 timer()->start(DocTimer::id_autoLockTimer); 316 timer()->start(DocTimer::id_autoLockTimer);
317 timer()->start(DocTimer::id_metaCheckTimer); 317 timer()->start(DocTimer::id_metaCheckTimer);
318 addCategory(DEFAULT_CATEGORY, 0, false); 318 addCategory(DEFAULT_CATEGORY, 0, false);
319 listView = 0; 319 listView = 0;
320 emit docCreated(this); 320 emit docCreated(this);
321} 321}
322 322
323PwMDoc::~PwMDoc() 323PwMDoc::~PwMDoc()
324{ 324{
325 emit docClosed(this); 325 emit docClosed(this);
326 getOpenDocList()->del(this); 326 getOpenDocList()->del(this);
327 delete _timer; 327 delete _timer;
328} 328}
329 329
330PwMerror PwMDoc::saveDoc(char compress, const QString *file) 330PwMerror PwMDoc::saveDoc(char compress, const QString *file)
331{ 331{
332 PwMerror ret, e; 332 PwMerror ret, e;
333 string serialized; 333 string serialized;
334 QFile f; 334 QFile f;
335 QString tmpFileMoved(QString::null); 335 QString tmpFileMoved(QString::null);
336 bool wasDeepLocked; 336 bool wasDeepLocked;
337 QString savedFilename(filename); 337 QString savedFilename(filename);
338 338
339 if (!file) { 339 if (!file) {
340 if (filename == "") 340 if (filename == "")
341 return e_filename; 341 return e_filename;
342 if (isDeepLocked()) { 342 if (isDeepLocked()) {
343 /* We don't need to save any data. 343 /* We don't need to save any data.
344 * It's already all on disk, because 344 * It's already all on disk, because
345 * we are deeplocked. 345 * we are deeplocked.
346 */ 346 */
347 unsetDocStatFlag(DOC_STAT_DISK_DIRTY); 347 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
348 ret = e_success; 348 ret = e_success;
349 return ret; 349 return ret;
350 } 350 }
351 } else { 351 } else {
352 if (*file == "" && filename == "") 352 if (*file == "" && filename == "")
353 return e_filename; 353 return e_filename;
354 if (*file != "") 354 if (*file != "")
355 filename = *file; 355 filename = *file;
356 } 356 }
357 357
358 wasDeepLocked = isDeepLocked(); 358 wasDeepLocked = isDeepLocked();
359 if (wasDeepLocked) { 359 if (wasDeepLocked) {
360 /* We are deeplocked. That means all data is already 360 /* We are deeplocked. That means all data is already
361 * on disk. BUT we need to do saving procedure, 361 * on disk. BUT we need to do saving procedure,
362 * because *file != savedFilename. 362 * because *file != savedFilename.
363 * Additionally we need to tempoarly restore 363 * Additionally we need to tempoarly restore
364 * the old "filename", because deepLock() references it. 364 * the old "filename", because deepLock() references it.
365 */ 365 */
366 QString newFilename(filename); 366 QString newFilename(filename);
367 filename = savedFilename; 367 filename = savedFilename;
368 getDataChangedLock(); 368 getDataChangedLock();
369 e = deepLock(false); 369 e = deepLock(false);
370 putDataChangedLock(); 370 putDataChangedLock();
371 filename = newFilename; 371 filename = newFilename;
372 switch (e) { 372 switch (e) {
373 case e_success: 373 case e_success:
374 break; 374 break;
375 case e_wrongPw: 375 case e_wrongPw:
376 case e_noPw: 376 case e_noPw:
377 emitDataChanged(this); 377 emitDataChanged(this);
378 return e; 378 return e;
379 default: 379 default:
380 emitDataChanged(this); 380 emitDataChanged(this);
381 return e_openFile; 381 return e_openFile;
382 } 382 }
383 } 383 }
384 384
385 if (!isPwAvailable()) { 385 if (!isPwAvailable()) {
386 /* password is not available. This means, the 386 /* password is not available. This means, the
387 * document wasn't saved, yet. 387 * document wasn't saved, yet.
388 */ 388 */
389 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD); 389 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD);
390 QString pw(requestNewMpw(&useChipcard)); 390 QString pw(requestNewMpw(&useChipcard));
391 if (pw != "") { 391 if (pw != "") {
392 currentPw = pw; 392 currentPw = pw;
393 } else { 393 } else {
394 return e_noPw; 394 return e_noPw;
395 } 395 }
396 if (useChipcard) { 396 if (useChipcard) {
397 setDocStatFlag(DOC_STAT_USE_CHIPCARD); 397 setDocStatFlag(DOC_STAT_USE_CHIPCARD);
398 } else { 398 } else {
399 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 399 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
400 } 400 }
401 } 401 }
402 402
403 int _cryptAlgo = conf()->confGlobCryptAlgo(); 403 int _cryptAlgo = conf()->confGlobCryptAlgo();
404 int _hashAlgo = conf()->confGlobHashAlgo(); 404 int _hashAlgo = conf()->confGlobHashAlgo();
405 405
406 // sanity check for the selected algorithms 406 // sanity check for the selected algorithms
407 if (_cryptAlgo < PWM_CRYPT_BLOWFISH || 407 if (_cryptAlgo < PWM_CRYPT_BLOWFISH ||
408 _cryptAlgo > PWM_CRYPT_TWOFISH128) { 408 _cryptAlgo > PWM_CRYPT_TWOFISH128) {
409 printWarn("Invalid Crypto-Algorithm selected! " 409 printWarn("Invalid Crypto-Algorithm selected! "
410 "Config-file seems to be corrupt. " 410 "Config-file seems to be corrupt. "
411 "Falling back to Blowfish."); 411 "Falling back to Blowfish.");
412 _cryptAlgo = PWM_CRYPT_BLOWFISH; 412 _cryptAlgo = PWM_CRYPT_BLOWFISH;
413 } 413 }
414 if (_hashAlgo < PWM_HASH_SHA1 || 414 if (_hashAlgo < PWM_HASH_SHA1 ||
415 _hashAlgo > PWM_HASH_TIGER) { 415 _hashAlgo > PWM_HASH_TIGER) {
416 printWarn("Invalid Hash-Algorithm selected! " 416 printWarn("Invalid Hash-Algorithm selected! "
417 "Config-file seems to be corrupt. " 417 "Config-file seems to be corrupt. "
418 "Falling back to SHA1."); 418 "Falling back to SHA1.");
419 _hashAlgo = PWM_HASH_SHA1; 419 _hashAlgo = PWM_HASH_SHA1;
420 } 420 }
421 char cryptAlgo = static_cast<char>(_cryptAlgo); 421 char cryptAlgo = static_cast<char>(_cryptAlgo);
422 char hashAlgo = static_cast<char>(_hashAlgo); 422 char hashAlgo = static_cast<char>(_hashAlgo);
423 423
424 if (conf()->confGlobMakeFileBackup()) { 424 if (conf()->confGlobMakeFileBackup()) {
425 if (!backupFile(filename)) 425 if (!backupFile(filename))
426 return e_fileBackup; 426 return e_fileBackup;
427 } 427 }
428 if (QFile::exists(filename)) { 428 if (QFile::exists(filename)) {
429 /* Move the existing file to some tmp file. 429 /* Move the existing file to some tmp file.
430 * When saving file succeeds, delete tmp file. Otherwise 430 * When saving file succeeds, delete tmp file. Otherwise
431 * move tmp file back. See below. 431 * move tmp file back. See below.
432 */ 432 */
433 Randomizer *rnd = Randomizer::obj(); 433 Randomizer *rnd = Randomizer::obj();
434 char rnd_buf[5]; 434 char rnd_buf[5];
435 sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF, 435 sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF,
436 rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF); 436 rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF);
437 tmpFileMoved = filename + "." + rnd_buf + ".mv"; 437 tmpFileMoved = filename + "." + rnd_buf + ".mv";
438 if (!copyFile(filename, tmpFileMoved)) 438 if (!copyFile(filename, tmpFileMoved))
439 return e_openFile; 439 return e_openFile;
440 if (!QFile::remove(filename)) { 440 if (!QFile::remove(filename)) {
441 printWarn(string("removing orig file ") 441 printWarn(string("removing orig file ")
442 + filename.latin1() 442 + filename.latin1()
443 + " failed!"); 443 + " failed!");
444 } 444 }
445 } 445 }
446 f.setName(filename); 446 f.setName(filename);
447 if (!f.open(IO_ReadWrite)) { 447 if (!f.open(IO_ReadWrite)) {
448 ret = e_openFile; 448 ret = e_openFile;
449 goto out_moveback; 449 goto out_moveback;
450 } 450 }
451 e = writeFileHeader(hashAlgo, hashAlgo, 451 e = writeFileHeader(hashAlgo, hashAlgo,
452 cryptAlgo, compress, 452 cryptAlgo, compress,
453 &currentPw, &f); 453 &currentPw, &f);
454 if (e == e_hashNotImpl) { 454 if (e == e_hashNotImpl) {
455 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed: e_hashNotImpl"); 455 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed: e_hashNotImpl");
456 f.close(); 456 f.close();
457 ret = e_hashNotImpl; 457 ret = e_hashNotImpl;
458 goto out_moveback; 458 goto out_moveback;
459 } else if (e != e_success) { 459 } else if (e != e_success) {
460 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed"); 460 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed");
461 f.close(); 461 f.close();
462 ret = e_writeHeader; 462 ret = e_writeHeader;
463 goto out_moveback; 463 goto out_moveback;
464 } 464 }
465 if (!serializeDta(&serialized)) { 465 if (!serializeDta(&serialized)) {
466 printDebug("PwMDoc::saveDoc(): serializeDta() failed"); 466 printDebug("PwMDoc::saveDoc(): serializeDta() failed");
467 f.close(); 467 f.close();
468 ret = e_serializeDta; 468 ret = e_serializeDta;
469 goto out_moveback; 469 goto out_moveback;
470 } 470 }
471 e = writeDataHash(hashAlgo, &serialized, &f); 471 e = writeDataHash(hashAlgo, &serialized, &f);
472 if (e == e_hashNotImpl) { 472 if (e == e_hashNotImpl) {
473 printDebug("PwMDoc::saveDoc(): writeDataHash() failed: e_hashNotImpl"); 473 printDebug("PwMDoc::saveDoc(): writeDataHash() failed: e_hashNotImpl");
474 f.close(); 474 f.close();
475 ret = e_hashNotImpl; 475 ret = e_hashNotImpl;
476 goto out_moveback; 476 goto out_moveback;
477 } else if (e != e_success) { 477 } else if (e != e_success) {
478 printDebug("PwMDoc::saveDoc(): writeDataHash() failed"); 478 printDebug("PwMDoc::saveDoc(): writeDataHash() failed");
479 f.close(); 479 f.close();
480 ret = e_writeHeader; 480 ret = e_writeHeader;
481 goto out_moveback; 481 goto out_moveback;
482 } 482 }
483 if (!compressDta(&serialized, compress)) { 483 if (!compressDta(&serialized, compress)) {
484 printDebug("PwMDoc::saveDoc(): compressDta() failed"); 484 printDebug("PwMDoc::saveDoc(): compressDta() failed");
485 f.close(); 485 f.close();
486 ret = e_enc; 486 ret = e_enc;
487 goto out_moveback; 487 goto out_moveback;
488 } 488 }
489 e = encrypt(&serialized, &currentPw, &f, cryptAlgo); 489 e = encrypt(&serialized, &currentPw, &f, cryptAlgo);
490 if (e == e_weakPw) { 490 if (e == e_weakPw) {
491 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw"); 491 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw");
492 f.close(); 492 f.close();
493 ret = e_weakPw; 493 ret = e_weakPw;
494 goto out_moveback; 494 goto out_moveback;
495 } else if (e == e_cryptNotImpl) { 495 } else if (e == e_cryptNotImpl) {
496 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl"); 496 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl");
497 f.close(); 497 f.close();
498 ret = e_cryptNotImpl; 498 ret = e_cryptNotImpl;
499 goto out_moveback; 499 goto out_moveback;
500 } else if (e != e_success) { 500 } else if (e != e_success) {
501 printDebug("PwMDoc::saveDoc(): encrypt() failed"); 501 printDebug("PwMDoc::saveDoc(): encrypt() failed");
502 f.close(); 502 f.close();
503 ret = e_enc; 503 ret = e_enc;
504 goto out_moveback; 504 goto out_moveback;
505 } 505 }
506 unsetDocStatFlag(DOC_STAT_DISK_DIRTY); 506 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
507 f.close(); 507 f.close();
508 if (chmod(filename.latin1(), 508 if (chmod(filename.latin1(),
509 conf()->confGlobFilePermissions())) { 509 conf()->confGlobFilePermissions())) {
510 printWarn(string("chmod failed: ") + strerror(errno)); 510 printWarn(string("chmod failed: ") + strerror(errno));
511 } 511 }
512 openDocList.edit(this, getTitle().latin1()); 512 openDocList.edit(this, getTitle().latin1());
513 if (wasDeepLocked) { 513 if (wasDeepLocked) {
514 /* Do _not_ save the data with the deepLock() 514 /* Do _not_ save the data with the deepLock()
515 * call, because this will recurse 515 * call, because this will recurse
516 * into saveDoc() 516 * into saveDoc()
517 */ 517 */
518 deepLock(true, false); 518 deepLock(true, false);
519 /* We don't check return value here, because 519 /* We don't check return value here, because
520 * it won't fail. See NOTE in deepLock() 520 * it won't fail. See NOTE in deepLock()
521 */ 521 */
522 } 522 }
523 if (tmpFileMoved != QString::null) { 523 if (tmpFileMoved != QString::null) {
524 // now remove the moved file. 524 // now remove the moved file.
525 if (!QFile::remove(tmpFileMoved)) { 525 if (!QFile::remove(tmpFileMoved)) {
526 printWarn(string("removing file ") 526 printWarn(string("removing file ")
527 + tmpFileMoved.latin1() 527 + tmpFileMoved.latin1()
528 + " failed!"); 528 + " failed!");
529 } 529 }
530 } 530 }
531 ret = e_success; 531 ret = e_success;
532 printDebug(string("writing file { name: ") 532 printDebug(string("writing file { name: ")
533 + filename.latin1() + " compress: " 533 + filename.latin1() + " compress: "
534 + tostr(static_cast<int>(compress)) + " cryptAlgo: " 534 + tostr(static_cast<int>(compress)) + " cryptAlgo: "
535 + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: " 535 + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: "
536 + tostr(static_cast<int>(hashAlgo)) 536 + tostr(static_cast<int>(hashAlgo))
537 + " }"); 537 + " }");
538 goto out; 538 goto out;
539out_moveback: 539out_moveback:
540 if (tmpFileMoved != QString::null) { 540 if (tmpFileMoved != QString::null) {
541 if (copyFile(tmpFileMoved, filename)) { 541 if (copyFile(tmpFileMoved, filename)) {
542 if (!QFile::remove(tmpFileMoved)) { 542 if (!QFile::remove(tmpFileMoved)) {
543 printWarn(string("removing tmp file ") 543 printWarn(string("removing tmp file ")
544 + filename.latin1() 544 + filename.latin1()
545 + " failed!"); 545 + " failed!");
546 } 546 }
547 } else { 547 } else {
548 printWarn(string("couldn't copy file ") 548 printWarn(string("couldn't copy file ")
549 + tmpFileMoved.latin1() 549 + tmpFileMoved.latin1()
550 + " back to " 550 + " back to "
551 + filename.latin1()); 551 + filename.latin1());
552 } 552 }
553 } 553 }
554out: 554out:
555 return ret; 555 return ret;
556} 556}
557 557
558PwMerror PwMDoc::openDoc(const QString *file, int openLocked) 558PwMerror PwMDoc::openDoc(const QString *file, int openLocked)
559{ 559{
560 PWM_ASSERT(file); 560 PWM_ASSERT(file);
561 PWM_ASSERT(openLocked == 0 || openLocked == 1 || openLocked == 2); 561 PWM_ASSERT(openLocked == 0 || openLocked == 1 || openLocked == 2);
562 string decrypted, dataHash; 562 string decrypted, dataHash;
563 PwMerror ret; 563 PwMerror ret;
564 char cryptAlgo, dataHashType, compress; 564 char cryptAlgo, dataHashType, compress;
565 unsigned int headerLen; 565 unsigned int headerLen;
566 566
567 if (*file == "") 567 if (*file == "")
568 return e_readFile; 568 return e_readFile;
569 filename = *file; 569 filename = *file;
570 /* check if this file is already open. 570 /* check if this file is already open.
571 * This does not catch symlinks! 571 * This does not catch symlinks!
572 */ 572 */
573 if (!isDeepLocked()) { 573 if (!isDeepLocked()) {
574 if (getOpenDocList()->find(filename.latin1())) 574 if (getOpenDocList()->find(filename.latin1()))
575 return e_alreadyOpen; 575 return e_alreadyOpen;
576 } 576 }
577 QFile f(filename); 577 QFile f(filename);
578 578
579 if (openLocked == 2) { 579 if (openLocked == 2) {
580 // open deep-locked 580 // open deep-locked
581 if (!QFile::exists(filename)) 581 if (!QFile::exists(filename))
582 return e_openFile; 582 return e_openFile;
583 if (deepLock(true, false) != e_success) 583 if (deepLock(true, false) != e_success)
584 return e_openFile; 584 return e_openFile;
585 goto out_success; 585 goto out_success;
586 } 586 }
587 587
588 if (!f.open(IO_ReadOnly)) 588 if (!f.open(IO_ReadOnly))
589 return e_openFile; 589 return e_openFile;
590 590
591 ret = checkHeader(&cryptAlgo, &currentPw, &compress, &headerLen, 591 ret = checkHeader(&cryptAlgo, &currentPw, &compress, &headerLen,
592 &dataHashType, &dataHash, &f); 592 &dataHashType, &dataHash, &f);
593 if (ret != e_success) { 593 if (ret != e_success) {
594 printDebug("PwMDoc::openDoc(): checkHeader() failed"); 594 printDebug("PwMDoc::openDoc(): checkHeader() failed");
595 f.close(); 595 f.close();
596 if (ret == e_wrongPw) { 596 if (ret == e_wrongPw) {
597 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 597 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
598 return ret; 598 return ret;
599 } else if (ret == e_noPw || 599 } else if (ret == e_noPw ||
600 ret == e_fileVer || 600 ret == e_fileVer ||
601 ret == e_fileFormat || 601 ret == e_fileFormat ||
602 ret == e_hashNotImpl) { 602 ret == e_hashNotImpl) {
603 return ret; 603 return ret;
604 } else 604 } else
605 return e_readFile; 605 return e_readFile;
606 } 606 }
607 ret = decrypt(&decrypted, headerLen, &currentPw, cryptAlgo, &f); 607 ret = decrypt(&decrypted, headerLen, &currentPw, cryptAlgo, &f);
608 if (ret == e_cryptNotImpl) { 608 if (ret == e_cryptNotImpl) {
609 printDebug("PwMDoc::openDoc(): decrypt() failed: e_cryptNotImpl"); 609 printDebug("PwMDoc::openDoc(): decrypt() failed: e_cryptNotImpl");
610 f.close(); 610 f.close();
611 return e_cryptNotImpl; 611 return e_cryptNotImpl;
612 } else if (ret != e_success) { 612 } else if (ret != e_success) {
613 printDebug("PwMDoc::openDoc(): decrypt() failed"); 613 printDebug("PwMDoc::openDoc(): decrypt() failed");
614 f.close(); 614 f.close();
615 return e_readFile; 615 return e_readFile;
616 } 616 }
617 if (!decompressDta(&decrypted, compress)) { 617 if (!decompressDta(&decrypted, compress)) {
618 printDebug("PwMDoc::openDoc(): decompressDta() failed"); 618 printDebug("PwMDoc::openDoc(): decompressDta() failed");
619 f.close(); 619 f.close();
620 return e_fileCorrupt; 620 return e_fileCorrupt;
621 } 621 }
622 ret = checkDataHash(dataHashType, &dataHash, &decrypted); 622 ret = checkDataHash(dataHashType, &dataHash, &decrypted);
623 if (ret == e_hashNotImpl) { 623 if (ret == e_hashNotImpl) {
624 printDebug("PwMDoc::openDoc(): checkDataHash() failed: e_hashNotImpl"); 624 printDebug("PwMDoc::openDoc(): checkDataHash() failed: e_hashNotImpl");
625 f.close(); 625 f.close();
626 return e_hashNotImpl; 626 return e_hashNotImpl;
627 } else if (ret != e_success) { 627 } else if (ret != e_success) {
628 printDebug("PwMDoc::openDoc(): checkDataHash() failed"); 628 printDebug("PwMDoc::openDoc(): checkDataHash() failed");
629 f.close(); 629 f.close();
630 return e_fileCorrupt; 630 return e_fileCorrupt;
631 } 631 }
632 if (!deSerializeDta(&decrypted, openLocked == 1)) { 632 if (!deSerializeDta(&decrypted, openLocked == 1)) {
633 printDebug("PwMDoc::openDoc(): deSerializeDta() failed"); 633 printDebug("PwMDoc::openDoc(): deSerializeDta() failed");
634 f.close(); 634 f.close();
635 return e_readFile; 635 return e_readFile;
636 } 636 }
637 f.close(); 637 f.close();
638 timer()->start(DocTimer::id_mpwTimer); 638 timer()->start(DocTimer::id_mpwTimer);
639 timer()->start(DocTimer::id_autoLockTimer); 639 timer()->start(DocTimer::id_autoLockTimer);
640out_success: 640out_success:
641 openDocList.edit(this, getTitle().latin1()); 641 openDocList.edit(this, getTitle().latin1());
642 emit docOpened(this); 642 emit docOpened(this);
643 return e_success; 643 return e_success;
644} 644}
645 645
646PwMerror PwMDoc::writeFileHeader(char keyHash, char dataHash, char crypt, char compress, 646PwMerror PwMDoc::writeFileHeader(char keyHash, char dataHash, char crypt, char compress,
647 QString *pw, QFile *f) 647 QString *pw, QFile *f)
648{ 648{
649 PWM_ASSERT(pw); 649 PWM_ASSERT(pw);
650 PWM_ASSERT(f); 650 PWM_ASSERT(f);
651 //US ENH: or maybe a bug: checking here for listView does not make sense because we do not check anywhere else 651 //US ENH: or maybe a bug: checking here for listView does not make sense because we do not check anywhere else
652 //Wenn I sync, I open a doc without a view => listView is 0 => Assertion 652 //Wenn I sync, I open a doc without a view => listView is 0 => Assertion
653 //USPWM_ASSERT(listView); 653 //USPWM_ASSERT(listView);
654 if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) != 654 if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) !=
655 static_cast<Q_LONG>(strlen(FILE_ID_HEADER))) { 655 static_cast<Q_LONG>(strlen(FILE_ID_HEADER))) {
656 return e_writeFile; 656 return e_writeFile;
657 } 657 }
658 if (f->putch(PWM_FILE_VER) == -1 || 658 if (f->putch(PWM_FILE_VER) == -1 ||
659 f->putch(keyHash) == -1 || 659 f->putch(keyHash) == -1 ||
660 f->putch(dataHash) == -1 || 660 f->putch(dataHash) == -1 ||
661 f->putch(crypt) == -1 || 661 f->putch(crypt) == -1 ||
662 f->putch(compress) == -1 || 662 f->putch(compress) == -1 ||
663 f->putch((getDocStatFlag(DOC_STAT_USE_CHIPCARD)) ? 663 f->putch((getDocStatFlag(DOC_STAT_USE_CHIPCARD)) ?
664 (static_cast<char>(0x01)) : (static_cast<char>(0x00))) == -1) { 664 (static_cast<char>(0x01)) : (static_cast<char>(0x00))) == -1) {
665 return e_writeFile; 665 return e_writeFile;
666 } 666 }
667 667
668 // write bytes of NUL-data. These bytes are reserved for future-use. 668 // write bytes of NUL-data. These bytes are reserved for future-use.
669 const int bufSize = 64; 669 const int bufSize = 64;
670 char tmp_buf[bufSize]; 670 char tmp_buf[bufSize];
671 memset(tmp_buf, 0x00, bufSize); 671 memset(tmp_buf, 0x00, bufSize);
672 if (f->writeBlock(tmp_buf, bufSize) != bufSize) 672 if (f->writeBlock(tmp_buf, bufSize) != bufSize)
673 return e_writeFile; 673 return e_writeFile;
674 674
675 switch (keyHash) { 675 switch (keyHash) {
676 case PWM_HASH_SHA1: { 676 case PWM_HASH_SHA1: {
677 const int hashlen = SHA1_HASH_LEN_BYTE; 677 const int hashlen = SHA1_HASH_LEN_BYTE;
678 Sha1 hash; 678 Sha1 hash;
679 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length()); 679 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length());
680 string ret = hash.sha1_read(); 680 string ret = hash.sha1_read();
681 if (f->writeBlock(ret.c_str(), hashlen) != hashlen) 681 if (f->writeBlock(ret.c_str(), hashlen) != hashlen)
682 return e_writeFile; 682 return e_writeFile;
683 break; 683 break;
684 } 684 }
685 case PWM_HASH_SHA256: 685 case PWM_HASH_SHA256:
686 /*... fall through */ 686 /*... fall through */
687 case PWM_HASH_SHA384: 687 case PWM_HASH_SHA384:
688 case PWM_HASH_SHA512: 688 case PWM_HASH_SHA512:
689 case PWM_HASH_MD5: 689 case PWM_HASH_MD5:
690 case PWM_HASH_RMD160: 690 case PWM_HASH_RMD160:
691 case PWM_HASH_TIGER: 691 case PWM_HASH_TIGER:
692 { 692 {
693 if (!LibGCryptIf::available()) 693 if (!LibGCryptIf::available())
694 return e_hashNotImpl; 694 return e_hashNotImpl;
695 LibGCryptIf gc; 695 LibGCryptIf gc;
696 PwMerror err; 696 PwMerror err;
697 unsigned char *buf; 697 unsigned char *buf;
698 size_t hashLen; 698 size_t hashLen;
699 err = gc.hash(&buf, 699 err = gc.hash(&buf,
700 &hashLen, 700 &hashLen,
701 reinterpret_cast<const unsigned char *>(pw->latin1()), 701 reinterpret_cast<const unsigned char *>(pw->latin1()),
702 pw->length(), 702 pw->length(),
703 keyHash); 703 keyHash);
704 if (err != e_success) 704 if (err != e_success)
705 return e_hashNotImpl; 705 return e_hashNotImpl;
706 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen) 706 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen)
707 != static_cast<Q_LONG>(hashLen)) { 707 != static_cast<Q_LONG>(hashLen)) {
708 delete [] buf; 708 delete [] buf;
709 return e_hashNotImpl; 709 return e_hashNotImpl;
710 } 710 }
711 delete [] buf; 711 delete [] buf;
712 break; 712 break;
713 } 713 }
714 default: { 714 default: {
715 return e_hashNotImpl; 715 return e_hashNotImpl;
716 } } 716 } }
717 return e_success; 717 return e_success;
718} 718}
719 719
720PwMerror PwMDoc::checkHeader(char *cryptAlgo, QString *pw, char *compress, 720PwMerror PwMDoc::checkHeader(char *cryptAlgo, QString *pw, char *compress,
721 unsigned int *headerLength, char *dataHashType, 721 unsigned int *headerLength, char *dataHashType,
722 string *dataHash, QFile *f) 722 string *dataHash, QFile *f)
723{ 723{
724 PWM_ASSERT(cryptAlgo); 724 PWM_ASSERT(cryptAlgo);
725 PWM_ASSERT(pw); 725 PWM_ASSERT(pw);
726 PWM_ASSERT(headerLength); 726 PWM_ASSERT(headerLength);
727 PWM_ASSERT(dataHashType); 727 PWM_ASSERT(dataHashType);
728 PWM_ASSERT(dataHash); 728 PWM_ASSERT(dataHash);
729 PWM_ASSERT(f); 729 PWM_ASSERT(f);
730 int tmpRet; 730 int tmpRet;
731 // check "magic" header 731 // check "magic" header
732 const char magicHdr[] = FILE_ID_HEADER; 732 const char magicHdr[] = FILE_ID_HEADER;
733 const int hdrLen = array_size(magicHdr) - 1; 733 const int hdrLen = array_size(magicHdr) - 1;
734 char tmp[hdrLen]; 734 char tmp[hdrLen];
735 if (f->readBlock(tmp, hdrLen) != hdrLen) 735 if (f->readBlock(tmp, hdrLen) != hdrLen)
736 return e_readFile; 736 return e_readFile;
737 if (memcmp(tmp, magicHdr, hdrLen) != 0) 737 if (memcmp(tmp, magicHdr, hdrLen) != 0)
738 return e_fileFormat; 738 return e_fileFormat;
739 // read and check file ver 739 // read and check file ver
740 int fileV = f->getch(); 740 int fileV = f->getch();
741 if (fileV == -1) 741 if (fileV == -1)
742 return e_fileFormat; 742 return e_fileFormat;
743 if (fileV != PWM_FILE_VER) 743 if (fileV != PWM_FILE_VER)
744 return e_fileVer; 744 return e_fileVer;
745 // read hash hash type 745 // read hash hash type
746 int keyHash = f->getch(); 746 int keyHash = f->getch();
747 if (keyHash == -1) 747 if (keyHash == -1)
748 return e_fileFormat; 748 return e_fileFormat;
749 // read data hash type 749 // read data hash type
750 tmpRet = f->getch(); 750 tmpRet = f->getch();
751 if (tmpRet == -1) 751 if (tmpRet == -1)
752 return e_fileFormat; 752 return e_fileFormat;
753 *dataHashType = tmpRet; 753 *dataHashType = tmpRet;
754 // read crypt algo 754 // read crypt algo
755 tmpRet = f->getch(); 755 tmpRet = f->getch();
756 if (tmpRet == -1) 756 if (tmpRet == -1)
757 return e_fileFormat; 757 return e_fileFormat;
758 *cryptAlgo = tmpRet; 758 *cryptAlgo = tmpRet;
759 // get compression-algo 759 // get compression-algo
760 tmpRet = f->getch(); 760 tmpRet = f->getch();
761 if (tmpRet == -1) 761 if (tmpRet == -1)
762 return e_fileFormat; 762 return e_fileFormat;
763 *compress = tmpRet; 763 *compress = tmpRet;
764 // get the MPW-flag 764 // get the MPW-flag
765 int mpw_flag = f->getch(); 765 int mpw_flag = f->getch();
766 if (mpw_flag == -1) 766 if (mpw_flag == -1)
767 return e_fileFormat; 767 return e_fileFormat;
768 if (mpw_flag == 0x01) 768 if (mpw_flag == 0x01)
769 setDocStatFlag(DOC_STAT_USE_CHIPCARD); 769 setDocStatFlag(DOC_STAT_USE_CHIPCARD);
770 else 770 else
771 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 771 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
772 // skip the "RESERVED"-bytes 772 // skip the "RESERVED"-bytes
773 if (!(f->at(f->at() + 64))) 773 if (!(f->at(f->at() + 64)))
774 return e_fileFormat; 774 return e_fileFormat;
775 775
776 *pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 776 *pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
777 if (*pw == "") { 777 if (*pw == "") {
778 /* the user didn't give a master-password 778 /* the user didn't give a master-password
779 * or didn't insert a chipcard 779 * or didn't insert a chipcard
780 */ 780 */
781 return e_noPw; 781 return e_noPw;
782 } 782 }
783 // verify key-hash 783 // verify key-hash
784 switch (keyHash) { 784 switch (keyHash) {
785 case PWM_HASH_SHA1: { 785 case PWM_HASH_SHA1: {
786 // read hash from header 786 // read hash from header
787 const int hashLen = SHA1_HASH_LEN_BYTE; 787 const int hashLen = SHA1_HASH_LEN_BYTE;
788 string readHash; 788 string readHash;
789 int i; 789 int i;
790 for (i = 0; i < hashLen; ++i) 790 for (i = 0; i < hashLen; ++i)
791 readHash.push_back(f->getch()); 791 readHash.push_back(f->getch());
792 Sha1 hash; 792 Sha1 hash;
793 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length()); 793 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length());
794 string ret = hash.sha1_read(); 794 string ret = hash.sha1_read();
795 if (ret != readHash) 795 if (ret != readHash)
796 return e_wrongPw;// hash doesn't match (wrong key) 796 return e_wrongPw;// hash doesn't match (wrong key)
797 break; 797 break;
798 } 798 }
799 case PWM_HASH_SHA256: 799 case PWM_HASH_SHA256:
800 /*... fall through */ 800 /*... fall through */
801 case PWM_HASH_SHA384: 801 case PWM_HASH_SHA384:
802 case PWM_HASH_SHA512: 802 case PWM_HASH_SHA512:
803 case PWM_HASH_MD5: 803 case PWM_HASH_MD5:
804 case PWM_HASH_RMD160: 804 case PWM_HASH_RMD160:
805 case PWM_HASH_TIGER: { 805 case PWM_HASH_TIGER: {
806 if (!LibGCryptIf::available()) 806 if (!LibGCryptIf::available())
807 return e_hashNotImpl; 807 return e_hashNotImpl;
808 LibGCryptIf gc; 808 LibGCryptIf gc;
809 PwMerror err; 809 PwMerror err;
810 unsigned char *buf; 810 unsigned char *buf;
811 size_t hashLen; 811 size_t hashLen;
812 err = gc.hash(&buf, 812 err = gc.hash(&buf,
813 &hashLen, 813 &hashLen,
814 reinterpret_cast<const unsigned char *>(pw->latin1()), 814 reinterpret_cast<const unsigned char *>(pw->latin1()),
815 pw->length(), 815 pw->length(),
816 keyHash); 816 keyHash);
817 if (err != e_success) 817 if (err != e_success)
818 return e_hashNotImpl; 818 return e_hashNotImpl;
819 string calcHash(reinterpret_cast<const char *>(buf), 819 string calcHash(reinterpret_cast<const char *>(buf),
820 static_cast<string::size_type>(hashLen)); 820 static_cast<string::size_type>(hashLen));
821 delete [] buf; 821 delete [] buf;
822 // read hash from header 822 // read hash from header
823 string readHash; 823 string readHash;
824 size_t i; 824 size_t i;
825 for (i = 0; i < hashLen; ++i) 825 for (i = 0; i < hashLen; ++i)
826 readHash.push_back(f->getch()); 826 readHash.push_back(f->getch());
827 if (calcHash != readHash) 827 if (calcHash != readHash)
828 return e_wrongPw;// hash doesn't match (wrong key) 828 return e_wrongPw;// hash doesn't match (wrong key)
829 break; 829 break;
830 } 830 }
831 default: { 831 default: {
832 return e_hashNotImpl; 832 return e_hashNotImpl;
833 } } 833 } }
834 // read the data-hash from the file 834 // read the data-hash from the file
835 unsigned int hashLen, i; 835 unsigned int hashLen, i;
836 switch (*dataHashType) { 836 switch (*dataHashType) {
837 case PWM_HASH_SHA1: 837 case PWM_HASH_SHA1:
838 hashLen = SHA1_HASH_LEN_BYTE; 838 hashLen = SHA1_HASH_LEN_BYTE;
839 break; 839 break;
840 case PWM_HASH_SHA256: 840 case PWM_HASH_SHA256:
841 /*... fall through */ 841 /*... fall through */
842 case PWM_HASH_SHA384: 842 case PWM_HASH_SHA384:
843 case PWM_HASH_SHA512: 843 case PWM_HASH_SHA512:
844 case PWM_HASH_MD5: 844 case PWM_HASH_MD5:
845 case PWM_HASH_RMD160: 845 case PWM_HASH_RMD160:
846 case PWM_HASH_TIGER: { 846 case PWM_HASH_TIGER: {
847 if (!LibGCryptIf::available()) 847 if (!LibGCryptIf::available())
848 return e_hashNotImpl; 848 return e_hashNotImpl;
849 LibGCryptIf gc; 849 LibGCryptIf gc;
850 hashLen = gc.hashLength(*dataHashType); 850 hashLen = gc.hashLength(*dataHashType);
851 if (hashLen == 0) 851 if (hashLen == 0)
852 return e_hashNotImpl; 852 return e_hashNotImpl;
853 break; 853 break;
854 } 854 }
855 default: 855 default:
856 return e_hashNotImpl; 856 return e_hashNotImpl;
857 } 857 }
858 *dataHash = ""; 858 *dataHash = "";
859 for (i = 0; i < hashLen; ++i) { 859 for (i = 0; i < hashLen; ++i) {
860 tmpRet = f->getch(); 860 tmpRet = f->getch();
861 if (tmpRet == -1) 861 if (tmpRet == -1)
862 return e_fileFormat; 862 return e_fileFormat;
863 dataHash->push_back(static_cast<char>(tmpRet)); 863 dataHash->push_back(static_cast<char>(tmpRet));
864 } 864 }
865 *headerLength = f->at(); 865 *headerLength = f->at();
866#ifndef PWM_EMBEDDED 866#ifndef PWM_EMBEDDED
867 printDebug(string("opening file { compress: ") 867 printDebug(string("opening file { compress: ")
868 + tostr(static_cast<int>(*compress)) + " cryptAlgo: " 868 + tostr(static_cast<int>(*compress)) + " cryptAlgo: "
869 + tostr(static_cast<int>(*cryptAlgo)) + " keyHashAlgo: " 869 + tostr(static_cast<int>(*cryptAlgo)) + " keyHashAlgo: "
870 + tostr(static_cast<int>(keyHash)) 870 + tostr(static_cast<int>(keyHash))
871 + " }"); 871 + " }");
872#else 872#else
873 printDebug(string("opening file { compress: ") 873 printDebug(string("opening file { compress: ")
874 + tostr((int)(*compress)) + " cryptAlgo: " 874 + tostr((int)(*compress)) + " cryptAlgo: "
875 + tostr((int)(*cryptAlgo)) + " keyHashAlgo: " 875 + tostr((int)(*cryptAlgo)) + " keyHashAlgo: "
876 + tostr((int)(keyHash)) 876 + tostr((int)(keyHash))
877 + " }"); 877 + " }");
878#endif 878#endif
879 879
880 return e_success; 880 return e_success;
881} 881}
882 882
883PwMerror PwMDoc::writeDataHash(char dataHash, string *d, QFile *f) 883PwMerror PwMDoc::writeDataHash(char dataHash, string *d, QFile *f)
884{ 884{
885 PWM_ASSERT(d); 885 PWM_ASSERT(d);
886 PWM_ASSERT(f); 886 PWM_ASSERT(f);
887 887
888 switch (dataHash) { 888 switch (dataHash) {
889 case PWM_HASH_SHA1: { 889 case PWM_HASH_SHA1: {
890 const int hashLen = SHA1_HASH_LEN_BYTE; 890 const int hashLen = SHA1_HASH_LEN_BYTE;
891 Sha1 h; 891 Sha1 h;
892 h.sha1_write(reinterpret_cast<const byte *>(d->c_str()), d->size()); 892 h.sha1_write(reinterpret_cast<const byte *>(d->c_str()), d->size());
893 string hRet = h.sha1_read(); 893 string hRet = h.sha1_read();
894 if (f->writeBlock(hRet.c_str(), hashLen) != hashLen) 894 if (f->writeBlock(hRet.c_str(), hashLen) != hashLen)
895 return e_writeFile; 895 return e_writeFile;
896 break; 896 break;
897 } 897 }
898 case PWM_HASH_SHA256: 898 case PWM_HASH_SHA256:
899 /*... fall through */ 899 /*... fall through */
900 case PWM_HASH_SHA384: 900 case PWM_HASH_SHA384:
901 case PWM_HASH_SHA512: 901 case PWM_HASH_SHA512:
902 case PWM_HASH_MD5: 902 case PWM_HASH_MD5:
903 case PWM_HASH_RMD160: 903 case PWM_HASH_RMD160:
904 case PWM_HASH_TIGER: { 904 case PWM_HASH_TIGER: {
905 if (!LibGCryptIf::available()) 905 if (!LibGCryptIf::available())
906 return e_hashNotImpl; 906 return e_hashNotImpl;
907 LibGCryptIf gc; 907 LibGCryptIf gc;
908 PwMerror err; 908 PwMerror err;
909 unsigned char *buf; 909 unsigned char *buf;
910 size_t hashLen; 910 size_t hashLen;
911 err = gc.hash(&buf, 911 err = gc.hash(&buf,
912 &hashLen, 912 &hashLen,
913 reinterpret_cast<const unsigned char *>(d->c_str()), 913 reinterpret_cast<const unsigned char *>(d->c_str()),
914 d->size(), 914 d->size(),
915 dataHash); 915 dataHash);
916 if (err != e_success) 916 if (err != e_success)
917 return e_hashNotImpl; 917 return e_hashNotImpl;
918 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen) 918 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen)
919 != static_cast<Q_LONG>(hashLen)) { 919 != static_cast<Q_LONG>(hashLen)) {
920 delete [] buf; 920 delete [] buf;
921 return e_hashNotImpl; 921 return e_hashNotImpl;
922 } 922 }
923 delete [] buf; 923 delete [] buf;
924 break; 924 break;
925 } 925 }
926 default: { 926 default: {
927 return e_hashNotImpl; 927 return e_hashNotImpl;
928 } } 928 } }
929 929
930 return e_success; 930 return e_success;
931} 931}
932 932
933bool PwMDoc::backupFile(const QString &filePath) 933bool PwMDoc::backupFile(const QString &filePath)
934{ 934{
935 QFileInfo fi(filePath); 935 QFileInfo fi(filePath);
936 if (!fi.exists()) 936 if (!fi.exists())
937 return true; // Yes, true is correct. 937 return true; // Yes, true is correct.
938 QString pathOnly(fi.dirPath(true)); 938 QString pathOnly(fi.dirPath(true));
939 QString nameOnly(fi.fileName()); 939 QString nameOnly(fi.fileName());
940 QString backupPath = pathOnly 940 QString backupPath = pathOnly
941 + "/~" 941 + "/~"
942 + nameOnly 942 + nameOnly
943 + ".backup"; 943 + ".backup";
944 return copyFile(filePath, backupPath); 944 return copyFile(filePath, backupPath);
945} 945}
946 946
947bool PwMDoc::copyFile(const QString &src, const QString &dst) 947bool PwMDoc::copyFile(const QString &src, const QString &dst)
948{ 948{
949 QFileInfo fi(src); 949 QFileInfo fi(src);
950 if (!fi.exists()) 950 if (!fi.exists())
951 return false; 951 return false;
952 if (QFile::exists(dst)) { 952 if (QFile::exists(dst)) {
953 if (!QFile::remove(dst)) 953 if (!QFile::remove(dst))
954 return false; 954 return false;
955 } 955 }
956 QFile srcFd(src); 956 QFile srcFd(src);
957 if (!srcFd.open(IO_ReadOnly)) 957 if (!srcFd.open(IO_ReadOnly))
958 return false; 958 return false;
959 QFile dstFd(dst); 959 QFile dstFd(dst);
960 if (!dstFd.open(IO_ReadWrite)) { 960 if (!dstFd.open(IO_ReadWrite)) {
961 srcFd.close(); 961 srcFd.close();
962 return false; 962 return false;
963 } 963 }
964 const int tmpBuf_size = 512; 964 const int tmpBuf_size = 512;
965 char tmpBuf[tmpBuf_size]; 965 char tmpBuf[tmpBuf_size];
966 Q_LONG bytesRead, bytesWritten; 966 Q_LONG bytesRead, bytesWritten;
967 967
968 while (!srcFd.atEnd()) { 968 while (!srcFd.atEnd()) {
969 bytesRead = srcFd.readBlock(tmpBuf, 969 bytesRead = srcFd.readBlock(tmpBuf,
970 static_cast<Q_ULONG>(tmpBuf_size)); 970 static_cast<Q_ULONG>(tmpBuf_size));
971 if (bytesRead == -1) { 971 if (bytesRead == -1) {
972 srcFd.close(); 972 srcFd.close();
973 dstFd.close(); 973 dstFd.close();
974 return false; 974 return false;
975 } 975 }
976 bytesWritten = dstFd.writeBlock(tmpBuf, 976 bytesWritten = dstFd.writeBlock(tmpBuf,
977 static_cast<Q_ULONG>(bytesRead)); 977 static_cast<Q_ULONG>(bytesRead));
978 if (bytesWritten != bytesRead) { 978 if (bytesWritten != bytesRead) {
979 srcFd.close(); 979 srcFd.close();
980 dstFd.close(); 980 dstFd.close();
981 return false; 981 return false;
982 } 982 }
983 } 983 }
984 srcFd.close(); 984 srcFd.close();
985 dstFd.close(); 985 dstFd.close();
986 return true; 986 return true;
987} 987}
988 988
989PwMerror PwMDoc::addEntry(const QString &category, PwMDataItem *d, 989PwMerror PwMDoc::addEntry(const QString &category, PwMDataItem *d,
990 bool dontFlagDirty, bool updateMeta) 990 bool dontFlagDirty, bool updateMeta)
991{ 991{
992 PWM_ASSERT(d); 992 PWM_ASSERT(d);
993 unsigned int cat = 0; 993 unsigned int cat = 0;
994 994
995 if (isDeepLocked()) { 995 if (isDeepLocked()) {
996 PwMerror ret; 996 PwMerror ret;
997 ret = deepLock(false); 997 ret = deepLock(false);
998 if (ret != e_success) 998 if (ret != e_success)
999 return e_lock; 999 return e_lock;
1000 } 1000 }
1001 1001
1002 addCategory(category, &cat); 1002 addCategory(category, &cat);
1003 1003
1004 if (numEntries(category) >= maxEntries) 1004 if (numEntries(category) >= maxEntries)
1005 return e_maxAllowedEntr; 1005 return e_maxAllowedEntr;
1006 1006
1007 vector<unsigned int> foundPositions; 1007 vector<unsigned int> foundPositions;
1008 /* historically this was: 1008 /* historically this was:
1009 *const int searchIn = SEARCH_IN_DESC | SEARCH_IN_NAME | 1009 *const int searchIn = SEARCH_IN_DESC | SEARCH_IN_NAME |
1010 * SEARCH_IN_URL | SEARCH_IN_LAUNCHER; 1010 * SEARCH_IN_URL | SEARCH_IN_LAUNCHER;
1011 * But for now we only search in desc. 1011 * But for now we only search in desc.
1012 * That's a tweak to be KWallet compatible. But it should not add 1012 * That's a tweak to be KWallet compatible. But it should not add
1013 * usability-drop onto PwManager, does it? 1013 * usability-drop onto PwManager, does it?
1014 * (And yes, "int" was a bug. Correct is "unsigned int") 1014 * (And yes, "int" was a bug. Correct is "unsigned int")
1015 */ 1015 */
1016 const unsigned int searchIn = SEARCH_IN_DESC; 1016 const unsigned int searchIn = SEARCH_IN_DESC;
1017 findEntry(cat, *d, searchIn, &foundPositions, true); 1017 findEntry(cat, *d, searchIn, &foundPositions, true);
1018 if (foundPositions.size()) { 1018 if (foundPositions.size()) {
1019 // DOH! We found this entry. 1019 // DOH! We found this entry.
1020 return e_entryExists; 1020 return e_entryExists;
1021 } 1021 }
1022 1022
1023 d->listViewPos = -1; 1023 d->listViewPos = -1;
1024 d->lockStat = conf()->confGlobNewEntrLockStat(); 1024 d->lockStat = conf()->confGlobNewEntrLockStat();
1025 if (updateMeta) { 1025 if (updateMeta) {
1026 d->meta.create = QDateTime::currentDateTime(); 1026 d->meta.create = QDateTime::currentDateTime();
1027 d->meta.update = d->meta.create; 1027 d->meta.update = d->meta.create;
1028 } 1028 }
1029 dti.dta[cat].d.push_back(*d); 1029 dti.dta[cat].d.push_back(*d);
1030 1030
1031 delAllEmptyCat(true); 1031 delAllEmptyCat(true);
1032 1032
1033 if (!dontFlagDirty) 1033 if (!dontFlagDirty)
1034 flagDirty(); 1034 flagDirty();
1035 return e_success; 1035 return e_success;
1036} 1036}
1037 1037
1038PwMerror PwMDoc::addCategory(const QString &category, unsigned int *categoryIndex, 1038PwMerror PwMDoc::addCategory(const QString &category, unsigned int *categoryIndex,
1039 bool checkIfExist) 1039 bool checkIfExist)
1040{ 1040{
1041 if (isDeepLocked()) { 1041 if (isDeepLocked()) {
1042 PwMerror ret; 1042 PwMerror ret;
1043 ret = deepLock(false); 1043 ret = deepLock(false);
1044 if (ret != e_success) 1044 if (ret != e_success)
1045 return e_lock; 1045 return e_lock;
1046 } 1046 }
1047 if (checkIfExist) { 1047 if (checkIfExist) {
1048 if (findCategory(category, categoryIndex)) 1048 if (findCategory(category, categoryIndex))
1049 return e_categoryExists; 1049 return e_categoryExists;
1050 } 1050 }
1051 PwMCategoryItem item; 1051 PwMCategoryItem item;
1052 item.name = category.latin1(); 1052 item.name = category.latin1();
1053 dti.dta.push_back(item); 1053 dti.dta.push_back(item);
1054 if (categoryIndex) 1054 if (categoryIndex)
1055 *categoryIndex = dti.dta.size() - 1; 1055 *categoryIndex = dti.dta.size() - 1;
1056 return e_success; 1056 return e_success;
1057} 1057}
1058 1058
1059bool PwMDoc::delEntry(const QString &category, unsigned int index, bool dontFlagDirty) 1059bool PwMDoc::delEntry(const QString &category, unsigned int index, bool dontFlagDirty)
1060{ 1060{
1061 unsigned int cat = 0; 1061 unsigned int cat = 0;
1062 1062
1063 if (!findCategory(category, &cat)) { 1063 if (!findCategory(category, &cat)) {
1064 BUG(); 1064 BUG();
1065 return false; 1065 return false;
1066 } 1066 }
1067 1067
1068 return delEntry(cat, index, dontFlagDirty); 1068 return delEntry(cat, index, dontFlagDirty);
1069} 1069}
1070 1070
1071bool PwMDoc::delEntry(unsigned int category, unsigned int index, bool dontFlagDirty) 1071bool PwMDoc::delEntry(unsigned int category, unsigned int index, bool dontFlagDirty)
1072{ 1072{
1073 if (isDeepLocked()) 1073 if (isDeepLocked())
1074 return false; 1074 return false;
1075 if (index > dti.dta[category].d.size() - 1) 1075 if (index > dti.dta[category].d.size() - 1)
1076 return false; 1076 return false;
1077 getDataChangedLock(); 1077 getDataChangedLock();
1078 if (!lockAt(category, index, false)) { 1078 if (!lockAt(category, index, false)) {
1079 putDataChangedLock(); 1079 putDataChangedLock();
1080 return false; 1080 return false;
1081 } 1081 }
1082 putDataChangedLock(); 1082 putDataChangedLock();
1083 int lvPos = dti.dta[category].d[index].listViewPos; 1083 int lvPos = dti.dta[category].d[index].listViewPos;
1084 1084
1085 // delete entry 1085 // delete entry
1086 dti.dta[category].d.erase(dti.dta[category].d.begin() + index); 1086 dti.dta[category].d.erase(dti.dta[category].d.begin() + index);
1087 1087
1088 unsigned int i, entries = numEntries(category); 1088 unsigned int i, entries = numEntries(category);
1089 if (!entries) { 1089 if (!entries) {
1090 // no more entries in this category, so 1090 // no more entries in this category, so
1091 // we can delete it, too. 1091 // we can delete it, too.
1092 BUG_ON(!delCategory(category)); 1092 BUG_ON(!delCategory(category));
1093 // delCategory() flags it dirty, so we need not to do so. 1093 // delCategory() flags it dirty, so we need not to do so.
1094 return true; 1094 return true;
1095 } 1095 }
1096 for (i = 0; i < entries; ++i) { 1096 for (i = 0; i < entries; ++i) {
1097 // decrement all listViewPositions that are greater than the deleted. 1097 // decrement all listViewPositions that are greater than the deleted.
1098 if (dti.dta[category].d[i].listViewPos > lvPos) 1098 if (dti.dta[category].d[i].listViewPos > lvPos)
1099 --dti.dta[category].d[i].listViewPos; 1099 --dti.dta[category].d[i].listViewPos;
1100 } 1100 }
1101 1101
1102 if (!dontFlagDirty) 1102 if (!dontFlagDirty)
1103 flagDirty(); 1103 flagDirty();
1104 return true; 1104 return true;
1105} 1105}
1106 1106
1107bool PwMDoc::editEntry(const QString &oldCategory, const QString &newCategory, 1107bool PwMDoc::editEntry(const QString &oldCategory, const QString &newCategory,
1108 unsigned int index, PwMDataItem *d, bool updateMeta) 1108 unsigned int index, PwMDataItem *d, bool updateMeta)
1109{ 1109{
1110 PWM_ASSERT(d); 1110 PWM_ASSERT(d);
1111 unsigned int oldCat = 0; 1111 unsigned int oldCat = 0;
1112 1112
1113 if (!findCategory(oldCategory, &oldCat)) { 1113 if (!findCategory(oldCategory, &oldCat)) {
1114 BUG(); 1114 BUG();
1115 return false; 1115 return false;
1116 } 1116 }
1117 1117
1118 return editEntry(oldCat, newCategory, index, d, updateMeta); 1118 return editEntry(oldCat, newCategory, index, d, updateMeta);
1119} 1119}
1120 1120
1121bool PwMDoc::editEntry(unsigned int oldCategory, const QString &newCategory, 1121bool PwMDoc::editEntry(unsigned int oldCategory, const QString &newCategory,
1122 unsigned int index, PwMDataItem *d, bool updateMeta) 1122 unsigned int index, PwMDataItem *d, bool updateMeta)
1123{ 1123{
1124 if (isDeepLocked()) 1124 if (isDeepLocked())
1125 return false; 1125 return false;
1126 if (updateMeta) { 1126 if (updateMeta) {
1127 d->meta.update = QDateTime::currentDateTime(); 1127 d->meta.update = QDateTime::currentDateTime();
1128 if (d->meta.create.isNull()) { 1128 if (d->meta.create.isNull()) {
1129 d->meta.create = d->meta.update; 1129 d->meta.create = d->meta.update;
1130 } 1130 }
1131 } 1131 }
1132 if (dti.dta[oldCategory].name != newCategory.latin1()) { 1132 if (dti.dta[oldCategory].name != newCategory.latin1()) {
1133 // the user changed the category. 1133 // the user changed the category.
1134 PwMerror ret; 1134 PwMerror ret;
1135 d->rev = 0; 1135 d->rev = 0;
1136 ret = addEntry(newCategory, d, true, false); 1136 ret = addEntry(newCategory, d, true, false);
1137 if (ret != e_success) 1137 if (ret != e_success)
1138 return false; 1138 return false;
1139 if (!delEntry(oldCategory, index, true)) 1139 if (!delEntry(oldCategory, index, true))
1140 return false; 1140 return false;
1141 } else { 1141 } else {
1142 d->rev = dti.dta[oldCategory].d[index].rev + 1; // increment revision counter. 1142 d->rev = dti.dta[oldCategory].d[index].rev + 1; // increment revision counter.
1143 dti.dta[oldCategory].d[index] = *d; 1143 dti.dta[oldCategory].d[index] = *d;
1144 } 1144 }
1145 flagDirty(); 1145 flagDirty();
1146 return true; 1146 return true;
1147} 1147}
1148 1148
1149unsigned int PwMDoc::numEntries(const QString &category) 1149unsigned int PwMDoc::numEntries(const QString &category)
1150{ 1150{
1151 unsigned int cat = 0; 1151 unsigned int cat = 0;
1152 1152
1153 if (!findCategory(category, &cat)) { 1153 if (!findCategory(category, &cat)) {
1154 BUG(); 1154 BUG();
1155 return 0; 1155 return 0;
1156 } 1156 }
1157 1157
1158 return numEntries(cat); 1158 return numEntries(cat);
1159} 1159}
1160 1160
1161bool PwMDoc::serializeDta(string *d) 1161bool PwMDoc::serializeDta(string *d)
1162{ 1162{
1163 PWM_ASSERT(d); 1163 PWM_ASSERT(d);
1164 Serializer ser; 1164 Serializer ser;
1165 if (!ser.serialize(dti)) 1165 if (!ser.serialize(dti))
1166 return false; 1166 return false;
1167 d->assign(ser.getXml()); 1167 d->assign(ser.getXml());
1168 if (!d->size()) 1168 if (!d->size())
1169 return false; 1169 return false;
1170 return true; 1170 return true;
1171} 1171}
1172 1172
1173bool PwMDoc::deSerializeDta(const string *d, bool entriesLocked) 1173bool PwMDoc::deSerializeDta(const string *d, bool entriesLocked)
1174{ 1174{
1175 PWM_ASSERT(d); 1175 PWM_ASSERT(d);
1176#ifndef PWM_EMBEDDED 1176#ifndef PWM_EMBEDDED
1177 try { 1177 try {
1178 1178
1179 Serializer ser(d->c_str()); 1179 Serializer ser(d->c_str());
1180 ser.setDefaultLockStat(entriesLocked); 1180 ser.setDefaultLockStat(entriesLocked);
1181 if (!ser.deSerialize(&dti)) 1181 if (!ser.deSerialize(&dti))
1182 return false; 1182 return false;
1183 } catch (PwMException) { 1183 } catch (PwMException) {
1184 return false; 1184 return false;
1185 } 1185 }
1186#else 1186#else
1187 Serializer ser(d->c_str()); 1187 Serializer ser(d->c_str());
1188 ser.setDefaultLockStat(entriesLocked); 1188 ser.setDefaultLockStat(entriesLocked);
1189 if (!ser.deSerialize(&dti)) 1189 if (!ser.deSerialize(&dti))
1190 return false; 1190 return false;
1191#endif 1191#endif
1192 1192
1193 emitDataChanged(this); 1193 emitDataChanged(this);
1194 return true; 1194 return true;
1195} 1195}
1196 1196
1197bool PwMDoc::getEntry(const QString &category, unsigned int index, 1197bool PwMDoc::getEntry(const QString &category, unsigned int index,
1198 PwMDataItem * d, bool unlockIfLocked) 1198 PwMDataItem * d, bool unlockIfLocked)
1199{ 1199{
1200 PWM_ASSERT(d); 1200 PWM_ASSERT(d);
1201 unsigned int cat = 0; 1201 unsigned int cat = 0;
1202 1202
1203 if (!findCategory(category, &cat)) { 1203 if (!findCategory(category, &cat)) {
1204 BUG(); 1204 BUG();
1205 return false; 1205 return false;
1206 } 1206 }
1207 1207
1208 return getEntry(cat, index, d, unlockIfLocked); 1208 return getEntry(cat, index, d, unlockIfLocked);
1209} 1209}
1210 1210
1211bool PwMDoc::getEntry(unsigned int category, unsigned int index, 1211bool PwMDoc::getEntry(unsigned int category, unsigned int index,
1212 PwMDataItem *d, bool unlockIfLocked) 1212 PwMDataItem *d, bool unlockIfLocked)
1213{ 1213{
1214 if (index > dti.dta[category].d.size() - 1) 1214 if (index > dti.dta[category].d.size() - 1)
1215 return false; 1215 return false;
1216 1216
1217 bool locked = isLocked(category, index); 1217 bool locked = isLocked(category, index);
1218 if (locked) { 1218 if (locked) {
1219 /* this entry is locked. We don't return a password, 1219 /* this entry is locked. We don't return a password,
1220 * until it's unlocked by the user by inserting 1220 * until it's unlocked by the user by inserting
1221 * chipcard or entering the mpw 1221 * chipcard or entering the mpw
1222 */ 1222 */
1223 if (unlockIfLocked) { 1223 if (unlockIfLocked) {
1224 if (!lockAt(category, index, false)) { 1224 if (!lockAt(category, index, false)) {
1225 return false; 1225 return false;
1226 } 1226 }
1227 locked = false; 1227 locked = false;
1228 } 1228 }
1229 } 1229 }
1230 1230
1231 *d = dti.dta[category].d[index]; 1231 *d = dti.dta[category].d[index];
1232 if (locked) 1232 if (locked)
1233 d->pw = LOCKED_STRING.latin1(); 1233 d->pw = LOCKED_STRING.latin1();
1234 1234
1235 return true; 1235 return true;
1236} 1236}
1237 1237
1238PwMerror PwMDoc::getCommentByLvp(const QString &category, int listViewPos, 1238PwMerror PwMDoc::getCommentByLvp(const QString &category, int listViewPos,
1239 string *foundComment) 1239 string *foundComment)
1240{ 1240{
1241 PWM_ASSERT(foundComment); 1241 PWM_ASSERT(foundComment);
1242 unsigned int cat = 0; 1242 unsigned int cat = 0;
1243 1243
1244 if (!findCategory(category, &cat)) 1244 if (!findCategory(category, &cat))
1245 return e_invalidArg; 1245 return e_invalidArg;
1246 1246
1247 unsigned int i, entries = numEntries(cat); 1247 unsigned int i, entries = numEntries(cat);
1248 for (i = 0; i < entries; ++i) { 1248 for (i = 0; i < entries; ++i) {
1249 if (dti.dta[cat].d[i].listViewPos == listViewPos) { 1249 if (dti.dta[cat].d[i].listViewPos == listViewPos) {
1250 *foundComment = dti.dta[cat].d[i].comment; 1250 *foundComment = dti.dta[cat].d[i].comment;
1251 if (dti.dta[cat].d[i].binary) 1251 if (dti.dta[cat].d[i].binary)
1252 return e_binEntry; 1252 return e_binEntry;
1253 return e_normalEntry; 1253 return e_normalEntry;
1254 } 1254 }
1255 } 1255 }
1256 BUG(); 1256 BUG();
1257 return e_generic; 1257 return e_generic;
1258} 1258}
1259 1259
1260bool PwMDoc::compressDta(string *d, char algo) 1260bool PwMDoc::compressDta(string *d, char algo)
1261{ 1261{
1262 PWM_ASSERT(d); 1262 PWM_ASSERT(d);
1263 switch (algo) { 1263 switch (algo) {
1264 case PWM_COMPRESS_GZIP: { 1264 case PWM_COMPRESS_GZIP: {
1265 CompressGzip comp; 1265 CompressGzip comp;
1266 return comp.compress(d); 1266 return comp.compress(d);
1267 /*US } case PWM_COMPRESS_BZIP2: { 1267 /*US } case PWM_COMPRESS_BZIP2: {
1268 CompressBzip2 comp; 1268 CompressBzip2 comp;
1269 return comp.compress(d); 1269 return comp.compress(d);
1270*/ 1270*/
1271 } case PWM_COMPRESS_NONE: { 1271 } case PWM_COMPRESS_NONE: {
1272 return true; 1272 return true;
1273 } default: { 1273 } default: {
1274 BUG(); 1274 BUG();
1275 } 1275 }
1276 } 1276 }
1277 return false; 1277 return false;
1278} 1278}
1279 1279
1280bool PwMDoc::decompressDta(string *d, char algo) 1280bool PwMDoc::decompressDta(string *d, char algo)
1281{ 1281{
1282 PWM_ASSERT(d); 1282 PWM_ASSERT(d);
1283 switch (algo) { 1283 switch (algo) {
1284 case PWM_COMPRESS_GZIP: { 1284 case PWM_COMPRESS_GZIP: {
1285 CompressGzip comp; 1285 CompressGzip comp;
1286 return comp.decompress(d); 1286 return comp.decompress(d);
1287 /*US } case PWM_COMPRESS_BZIP2: { 1287 /*US } case PWM_COMPRESS_BZIP2: {
1288 CompressBzip2 comp; 1288 CompressBzip2 comp;
1289 return comp.decompress(d); 1289 return comp.decompress(d);
1290 */ 1290 */
1291 } case PWM_COMPRESS_NONE: { 1291 } case PWM_COMPRESS_NONE: {
1292 return true; 1292 return true;
1293 } 1293 }
1294 } 1294 }
1295 return false; 1295 return false;
1296} 1296}
1297 1297
1298PwMerror PwMDoc::encrypt(string *d, const QString *pw, QFile *f, char algo) 1298PwMerror PwMDoc::encrypt(string *d, const QString *pw, QFile *f, char algo)
1299{ 1299{
1300 PWM_ASSERT(d); 1300 PWM_ASSERT(d);
1301 PWM_ASSERT(pw); 1301 PWM_ASSERT(pw);
1302 PWM_ASSERT(f); 1302 PWM_ASSERT(f);
1303 1303
1304 size_t encSize; 1304 size_t encSize;
1305 byte *encrypted = 0; 1305 byte *encrypted = 0;
1306 1306
1307 switch (algo) { 1307 switch (algo) {
1308 case PWM_CRYPT_BLOWFISH: { 1308 case PWM_CRYPT_BLOWFISH: {
1309 Blowfish::padNull(d); 1309 Blowfish::padNull(d);
1310 encSize = d->length(); 1310 encSize = d->length();
1311 encrypted = new byte[encSize]; 1311 encrypted = new byte[encSize];
1312 Blowfish bf; 1312 Blowfish bf;
1313 if (bf.bf_setkey((byte *) pw->latin1(), pw->length())) { 1313 if (bf.bf_setkey((byte *) pw->latin1(), pw->length())) {
1314 delete [] encrypted; 1314 delete [] encrypted;
1315 return e_weakPw; 1315 return e_weakPw;
1316 } 1316 }
1317 bf.bf_encrypt((byte *) encrypted, (byte *) d->c_str(), encSize); 1317 bf.bf_encrypt((byte *) encrypted, (byte *) d->c_str(), encSize);
1318 break; 1318 break;
1319 } 1319 }
1320 case PWM_CRYPT_AES128: 1320 case PWM_CRYPT_AES128:
1321 /*... fall through */ 1321 /*... fall through */
1322 case PWM_CRYPT_AES192: 1322 case PWM_CRYPT_AES192:
1323 case PWM_CRYPT_AES256: 1323 case PWM_CRYPT_AES256:
1324 case PWM_CRYPT_3DES: 1324 case PWM_CRYPT_3DES:
1325 case PWM_CRYPT_TWOFISH: 1325 case PWM_CRYPT_TWOFISH:
1326 case PWM_CRYPT_TWOFISH128: { 1326 case PWM_CRYPT_TWOFISH128: {
1327 if (!LibGCryptIf::available()) 1327 if (!LibGCryptIf::available())
1328 return e_cryptNotImpl; 1328 return e_cryptNotImpl;
1329 LibGCryptIf gc; 1329 LibGCryptIf gc;
1330 PwMerror err; 1330 PwMerror err;
1331 unsigned char *plain = new unsigned char[d->length() + 1024]; 1331 unsigned char *plain = new unsigned char[d->length() + 1024];
1332 memcpy(plain, d->c_str(), d->length()); 1332 memcpy(plain, d->c_str(), d->length());
1333 err = gc.encrypt(&encrypted, 1333 err = gc.encrypt(&encrypted,
1334 &encSize, 1334 &encSize,
1335 plain, 1335 plain,
1336 d->length(), 1336 d->length(),
1337 reinterpret_cast<const unsigned char *>(pw->latin1()), 1337 reinterpret_cast<const unsigned char *>(pw->latin1()),
1338 pw->length(), 1338 pw->length(),
1339 algo); 1339 algo);
1340 delete [] plain; 1340 delete [] plain;
1341 if (err != e_success) 1341 if (err != e_success)
1342 return e_cryptNotImpl; 1342 return e_cryptNotImpl;
1343 break; 1343 break;
1344 } 1344 }
1345 default: { 1345 default: {
1346 delete_ifnot_null_array(encrypted); 1346 delete_ifnot_null_array(encrypted);
1347 return e_cryptNotImpl; 1347 return e_cryptNotImpl;
1348 } } 1348 } }
1349 1349
1350 // write encrypted data to file 1350 // write encrypted data to file
1351 if (f->writeBlock(reinterpret_cast<const char *>(encrypted), 1351 if (f->writeBlock(reinterpret_cast<const char *>(encrypted),
1352 static_cast<Q_ULONG>(encSize)) 1352 static_cast<Q_ULONG>(encSize))
1353 != static_cast<Q_LONG>(encSize)) { 1353 != static_cast<Q_LONG>(encSize)) {
1354 delete_ifnot_null_array(encrypted); 1354 delete_ifnot_null_array(encrypted);
1355 return e_writeFile; 1355 return e_writeFile;
1356 } 1356 }
1357 delete_ifnot_null_array(encrypted); 1357 delete_ifnot_null_array(encrypted);
1358 return e_success; 1358 return e_success;
1359} 1359}
1360 1360
1361PwMerror PwMDoc::decrypt(string *d, unsigned int pos, const QString *pw, 1361PwMerror PwMDoc::decrypt(string *d, unsigned int pos, const QString *pw,
1362 char algo, QFile *f) 1362 char algo, QFile *f)
1363{ 1363{
1364 PWM_ASSERT(d); 1364 PWM_ASSERT(d);
1365 PWM_ASSERT(pw); 1365 PWM_ASSERT(pw);
1366 PWM_ASSERT(f); 1366 PWM_ASSERT(f);
1367 1367
1368 unsigned int cryptLen = f->size() - pos; 1368 unsigned int cryptLen = f->size() - pos;
1369 byte *encrypted = new byte[cryptLen]; 1369 byte *encrypted = new byte[cryptLen];
1370 byte *decrypted = new byte[cryptLen]; 1370 byte *decrypted = new byte[cryptLen];
1371 1371
1372 f->at(pos); 1372 f->at(pos);
1373#ifndef PWM_EMBEDDED 1373#ifndef PWM_EMBEDDED
1374 if (f->readBlock(reinterpret_cast<char *>(encrypted), 1374 if (f->readBlock(reinterpret_cast<char *>(encrypted),
1375 static_cast<Q_ULONG>(cryptLen)) 1375 static_cast<Q_ULONG>(cryptLen))
1376 != static_cast<Q_LONG>(cryptLen)) { 1376 != static_cast<Q_LONG>(cryptLen)) {
1377 delete [] encrypted; 1377 delete [] encrypted;
1378 delete [] decrypted; 1378 delete [] decrypted;
1379 return e_readFile; 1379 return e_readFile;
1380 } 1380 }
1381#else 1381#else
1382 if (f->readBlock((char *)(encrypted), 1382 if (f->readBlock((char *)(encrypted),
1383 (unsigned long)(cryptLen)) 1383 (unsigned long)(cryptLen))
1384 != (long)(cryptLen)) { 1384 != (long)(cryptLen)) {
1385 delete [] encrypted; 1385 delete [] encrypted;
1386 delete [] decrypted; 1386 delete [] decrypted;
1387 return e_readFile; 1387 return e_readFile;
1388 } 1388 }
1389#endif 1389#endif
1390 switch (algo) { 1390 switch (algo) {
1391 case PWM_CRYPT_BLOWFISH: { 1391 case PWM_CRYPT_BLOWFISH: {
1392 Blowfish bf; 1392 Blowfish bf;
1393 bf.bf_setkey((byte *) pw->latin1(), pw->length()); 1393 bf.bf_setkey((byte *) pw->latin1(), pw->length());
1394 bf.bf_decrypt(decrypted, encrypted, cryptLen); 1394 bf.bf_decrypt(decrypted, encrypted, cryptLen);
1395 break; 1395 break;
1396 } 1396 }
1397 case PWM_CRYPT_AES128: 1397 case PWM_CRYPT_AES128:
1398 /*... fall through */ 1398 /*... fall through */
1399 case PWM_CRYPT_AES192: 1399 case PWM_CRYPT_AES192:
1400 case PWM_CRYPT_AES256: 1400 case PWM_CRYPT_AES256:
1401 case PWM_CRYPT_3DES: 1401 case PWM_CRYPT_3DES:
1402 case PWM_CRYPT_TWOFISH: 1402 case PWM_CRYPT_TWOFISH:
1403 case PWM_CRYPT_TWOFISH128: { 1403 case PWM_CRYPT_TWOFISH128: {
1404 if (!LibGCryptIf::available()) 1404 if (!LibGCryptIf::available())
1405 return e_cryptNotImpl; 1405 return e_cryptNotImpl;
1406 LibGCryptIf gc; 1406 LibGCryptIf gc;
1407 PwMerror err; 1407 PwMerror err;
1408 err = gc.decrypt(&decrypted, 1408 err = gc.decrypt(&decrypted,
1409 &cryptLen, 1409 &cryptLen,
1410 encrypted, 1410 encrypted,
1411 cryptLen, 1411 cryptLen,
1412 reinterpret_cast<const unsigned char *>(pw->latin1()), 1412 reinterpret_cast<const unsigned char *>(pw->latin1()),
1413 pw->length(), 1413 pw->length(),
1414 algo); 1414 algo);
1415 if (err != e_success) { 1415 if (err != e_success) {
1416 delete [] encrypted; 1416 delete [] encrypted;
1417 delete [] decrypted; 1417 delete [] decrypted;
1418 return e_cryptNotImpl; 1418 return e_cryptNotImpl;
1419 } 1419 }
1420 break; 1420 break;
1421 } 1421 }
1422 default: { 1422 default: {
1423 delete [] encrypted; 1423 delete [] encrypted;
1424 delete [] decrypted; 1424 delete [] decrypted;
1425 return e_cryptNotImpl; 1425 return e_cryptNotImpl;
1426 } } 1426 } }
1427 delete [] encrypted; 1427 delete [] encrypted;
1428#ifndef PWM_EMBEDDED 1428#ifndef PWM_EMBEDDED
1429 d->assign(reinterpret_cast<const char *>(decrypted), 1429 d->assign(reinterpret_cast<const char *>(decrypted),
1430 static_cast<string::size_type>(cryptLen)); 1430 static_cast<string::size_type>(cryptLen));
1431#else 1431#else
1432 d->assign((const char *)(decrypted), 1432 d->assign((const char *)(decrypted),
1433 (string::size_type)(cryptLen)); 1433 (string::size_type)(cryptLen));
1434#endif 1434#endif
1435 delete [] decrypted; 1435 delete [] decrypted;
1436 if (algo == PWM_CRYPT_BLOWFISH) { 1436 if (algo == PWM_CRYPT_BLOWFISH) {
1437 if (!Blowfish::unpadNull(d)) { 1437 if (!Blowfish::unpadNull(d)) {
1438 BUG(); 1438 BUG();
1439 return e_readFile; 1439 return e_readFile;
1440 } 1440 }
1441 } 1441 }
1442 return e_success; 1442 return e_success;
1443} 1443}
1444 1444
1445PwMerror PwMDoc::checkDataHash(char dataHashType, const string *dataHash, 1445PwMerror PwMDoc::checkDataHash(char dataHashType, const string *dataHash,
1446 const string *dataStream) 1446 const string *dataStream)
1447{ 1447{
1448 PWM_ASSERT(dataHash); 1448 PWM_ASSERT(dataHash);
1449 PWM_ASSERT(dataStream); 1449 PWM_ASSERT(dataStream);
1450 switch(dataHashType) { 1450 switch(dataHashType) {
1451 case PWM_HASH_SHA1: { 1451 case PWM_HASH_SHA1: {
1452 Sha1 hash; 1452 Sha1 hash;
1453 hash.sha1_write((byte*)dataStream->c_str(), dataStream->length()); 1453 hash.sha1_write((byte*)dataStream->c_str(), dataStream->length());
1454 string ret = hash.sha1_read(); 1454 string ret = hash.sha1_read();
1455 if (ret != *dataHash) 1455 if (ret != *dataHash)
1456 return e_fileCorrupt; 1456 return e_fileCorrupt;
1457 break; 1457 break;
1458 } 1458 }
1459 case PWM_HASH_SHA256: 1459 case PWM_HASH_SHA256:
1460 /*... fall through */ 1460 /*... fall through */
1461 case PWM_HASH_SHA384: 1461 case PWM_HASH_SHA384:
1462 case PWM_HASH_SHA512: 1462 case PWM_HASH_SHA512:
1463 case PWM_HASH_MD5: 1463 case PWM_HASH_MD5:
1464 case PWM_HASH_RMD160: 1464 case PWM_HASH_RMD160:
1465 case PWM_HASH_TIGER: { 1465 case PWM_HASH_TIGER: {
1466 if (!LibGCryptIf::available()) 1466 if (!LibGCryptIf::available())
1467 return e_hashNotImpl; 1467 return e_hashNotImpl;
1468 LibGCryptIf gc; 1468 LibGCryptIf gc;
1469 PwMerror err; 1469 PwMerror err;
1470 unsigned char *buf; 1470 unsigned char *buf;
1471 size_t hashLen; 1471 size_t hashLen;
1472 err = gc.hash(&buf, 1472 err = gc.hash(&buf,
1473 &hashLen, 1473 &hashLen,
1474 reinterpret_cast<const unsigned char *>(dataStream->c_str()), 1474 reinterpret_cast<const unsigned char *>(dataStream->c_str()),
1475 dataStream->length(), 1475 dataStream->length(),
1476 dataHashType); 1476 dataHashType);
1477 if (err != e_success) 1477 if (err != e_success)
1478 return e_hashNotImpl; 1478 return e_hashNotImpl;
1479 string calcHash(reinterpret_cast<const char *>(buf), 1479 string calcHash(reinterpret_cast<const char *>(buf),
1480 static_cast<string::size_type>(hashLen)); 1480 static_cast<string::size_type>(hashLen));
1481 delete [] buf; 1481 delete [] buf;
1482 if (calcHash != *dataHash) 1482 if (calcHash != *dataHash)
1483 return e_fileCorrupt; 1483 return e_fileCorrupt;
1484 break; 1484 break;
1485 } 1485 }
1486 default: 1486 default:
1487 return e_hashNotImpl; 1487 return e_hashNotImpl;
1488 } 1488 }
1489 return e_success; 1489 return e_success;
1490} 1490}
1491 1491
1492bool PwMDoc::lockAt(unsigned int category, unsigned int index, 1492bool PwMDoc::lockAt(unsigned int category, unsigned int index,
1493 bool lock) 1493 bool lock)
1494{ 1494{
1495 if (index >= numEntries(category)) { 1495 if (index >= numEntries(category)) {
1496 BUG(); 1496 BUG();
1497 return false; 1497 return false;
1498 } 1498 }
1499 if (lock == dti.dta[category].d[index].lockStat) 1499 if (lock == dti.dta[category].d[index].lockStat)
1500 return true; 1500 return true;
1501 1501
1502 if (!lock && currentPw != "") { 1502 if (!lock && currentPw != "") {
1503 // "unlocking" and "password is already set" 1503 // "unlocking" and "password is already set"
1504 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) { 1504 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) {
1505 // unlocking without pw not allowed 1505 // unlocking without pw not allowed
1506 QString pw; 1506 QString pw;
1507 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1507 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1508 if (pw != "") { 1508 if (pw != "") {
1509 if (pw != currentPw) { 1509 if (pw != currentPw) {
1510 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1510 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1511 return false; 1511 return false;
1512 } else { 1512 } else {
1513 timer()->start(DocTimer::id_mpwTimer); 1513 timer()->start(DocTimer::id_mpwTimer);
1514 } 1514 }
1515 } else { 1515 } else {
1516 return false; 1516 return false;
1517 } 1517 }
1518 } else { 1518 } else {
1519 timer()->start(DocTimer::id_mpwTimer); 1519 timer()->start(DocTimer::id_mpwTimer);
1520 } 1520 }
1521 } 1521 }
1522 1522
1523 dti.dta[category].d[index].lockStat = lock; 1523 dti.dta[category].d[index].lockStat = lock;
1524 dti.dta[category].d[index].rev++; // increment revision counter. 1524 dti.dta[category].d[index].rev++; // increment revision counter.
1525 1525
1526 emitDataChanged(this); 1526 emitDataChanged(this);
1527 if (!lock) 1527 if (!lock)
1528 timer()->start(DocTimer::id_autoLockTimer); 1528 timer()->start(DocTimer::id_autoLockTimer);
1529 1529
1530 return true; 1530 return true;
1531 1531
1532} 1532}
1533 1533
1534bool PwMDoc::lockAt(const QString &category,unsigned int index, 1534bool PwMDoc::lockAt(const QString &category,unsigned int index,
1535 bool lock) 1535 bool lock)
1536{ 1536{
1537 unsigned int cat = 0; 1537 unsigned int cat = 0;
1538 1538
1539 if (!findCategory(category, &cat)) { 1539 if (!findCategory(category, &cat)) {
1540 BUG(); 1540 BUG();
1541 return false; 1541 return false;
1542 } 1542 }
1543 1543
1544 return lockAt(cat, index, lock); 1544 return lockAt(cat, index, lock);
1545} 1545}
1546 1546
1547bool PwMDoc::lockAll(bool lock) 1547bool PwMDoc::lockAll(bool lock)
1548{ 1548{
1549 if (!lock && isDeepLocked()) { 1549 if (!lock && isDeepLocked()) {
1550 PwMerror ret; 1550 PwMerror ret;
1551 ret = deepLock(false); 1551 ret = deepLock(false);
1552 if (ret != e_success) 1552 if (ret != e_success)
1553 return false; 1553 return false;
1554 return true; 1554 return true;
1555 } 1555 }
1556 if (isDocEmpty()) { 1556 if (isDocEmpty()) {
1557 return true; 1557 return true;
1558 } 1558 }
1559 if (!lock && currentPw != "") { 1559 if (!lock && currentPw != "") {
1560 // unlocking and password is already set 1560 // unlocking and password is already set
1561 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) { 1561 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) {
1562 // unlocking without pw not allowed 1562 // unlocking without pw not allowed
1563 QString pw; 1563 QString pw;
1564 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1564 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1565 if (pw != "") { 1565 if (pw != "") {
1566 if (pw != currentPw) { 1566 if (pw != currentPw) {
1567 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1567 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1568 return false; 1568 return false;
1569 } else { 1569 } else {
1570 timer()->start(DocTimer::id_mpwTimer); 1570 timer()->start(DocTimer::id_mpwTimer);
1571 } 1571 }
1572 } else { 1572 } else {
1573 return false; 1573 return false;
1574 } 1574 }
1575 } else { 1575 } else {
1576 timer()->start(DocTimer::id_mpwTimer); 1576 timer()->start(DocTimer::id_mpwTimer);
1577 } 1577 }
1578 } 1578 }
1579 1579
1580 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), 1580 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(),
1581 catEnd = dti.dta.end(), 1581 catEnd = dti.dta.end(),
1582 catI = catBegin; 1582 catI = catBegin;
1583 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 1583 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
1584 while (catI != catEnd) { 1584 while (catI != catEnd) {
1585 entrBegin = catI->d.begin(); 1585 entrBegin = catI->d.begin();
1586 entrEnd = catI->d.end(); 1586 entrEnd = catI->d.end();
1587 entrI = entrBegin; 1587 entrI = entrBegin;
1588 while (entrI != entrEnd) { 1588 while (entrI != entrEnd) {
1589 entrI->lockStat = lock; 1589 entrI->lockStat = lock;
1590 entrI->rev++; // increment revision counter. 1590 entrI->rev++; // increment revision counter.
1591 ++entrI; 1591 ++entrI;
1592 } 1592 }
1593 ++catI; 1593 ++catI;
1594 } 1594 }
1595 1595
1596 emitDataChanged(this); 1596 emitDataChanged(this);
1597 if (lock) 1597 if (lock)
1598 timer()->stop(DocTimer::id_autoLockTimer); 1598 timer()->stop(DocTimer::id_autoLockTimer);
1599 else 1599 else
1600 timer()->start(DocTimer::id_autoLockTimer); 1600 timer()->start(DocTimer::id_autoLockTimer);
1601 1601
1602 return true; 1602 return true;
1603} 1603}
1604 1604
1605bool PwMDoc::isLocked(const QString &category, unsigned int index) 1605bool PwMDoc::isLocked(const QString &category, unsigned int index)
1606{ 1606{
1607 unsigned int cat = 0; 1607 unsigned int cat = 0;
1608 1608
1609 if (!findCategory(category, &cat)) { 1609 if (!findCategory(category, &cat)) {
1610 BUG(); 1610 BUG();
1611 return false; 1611 return false;
1612 } 1612 }
1613 1613
1614 return isLocked(cat, index); 1614 return isLocked(cat, index);
1615} 1615}
1616 1616
1617bool PwMDoc::unlockAll_tempoary(bool revert) 1617bool PwMDoc::unlockAll_tempoary(bool revert)
1618{ 1618{
1619 static vector< vector<bool> > *oldLockStates = 0; 1619 static vector< vector<bool> > *oldLockStates = 0;
1620 static bool wasDeepLocked; 1620 static bool wasDeepLocked;
1621 1621
1622 if (revert) {// revert the unlocking 1622 if (revert) {// revert the unlocking
1623 if (oldLockStates) { 1623 if (oldLockStates) {
1624 /* we actually _have_ unlocked something, because 1624 /* we actually _have_ unlocked something, because
1625 * we have allocated space for the oldLockStates. 1625 * we have allocated space for the oldLockStates.
1626 * So, go on and revert them! 1626 * So, go on and revert them!
1627 */ 1627 */
1628 if (wasDeepLocked) { 1628 if (wasDeepLocked) {
1629 PwMerror ret = deepLock(true); 1629 PwMerror ret = deepLock(true);
1630 if (ret == e_success) { 1630 if (ret == e_success) {
1631 /* deep-lock succeed. We are save. 1631 /* deep-lock succeed. We are save.
1632 * (but if it failed, just go on 1632 * (but if it failed, just go on
1633 * lock them normally) 1633 * lock them normally)
1634 */ 1634 */
1635 delete_and_null(oldLockStates); 1635 delete_and_null(oldLockStates);
1636 timer()->start(DocTimer::id_autoLockTimer); 1636 timer()->start(DocTimer::id_autoLockTimer);
1637 printDebug("tempoary unlocking of dta " 1637 printDebug("tempoary unlocking of dta "
1638 "reverted by deep-locking."); 1638 "reverted by deep-locking.");
1639 return true; 1639 return true;
1640 } 1640 }
1641 printDebug("deep-lock failed while reverting! " 1641 printDebug("deep-lock failed while reverting! "
1642 "Falling back to normal-lock."); 1642 "Falling back to normal-lock.");
1643 } 1643 }
1644 if (unlikely(!wasDeepLocked && 1644 if (unlikely(!wasDeepLocked &&
1645 numCategories() != oldLockStates->size())) { 1645 numCategories() != oldLockStates->size())) {
1646 /* DOH! We have modified "dta" while 1646 /* DOH! We have modified "dta" while
1647 * it was unlocked tempoary. DON'T DO THIS! 1647 * it was unlocked tempoary. DON'T DO THIS!
1648 */ 1648 */
1649 BUG(); 1649 BUG();
1650 delete_and_null(oldLockStates); 1650 delete_and_null(oldLockStates);
1651 timer()->start(DocTimer::id_autoLockTimer); 1651 timer()->start(DocTimer::id_autoLockTimer);
1652 return false; 1652 return false;
1653 } 1653 }
1654 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), 1654 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(),
1655 catEnd = dti.dta.end(), 1655 catEnd = dti.dta.end(),
1656 catI = catBegin; 1656 catI = catBegin;
1657 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 1657 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
1658 vector< vector<bool> >::iterator oldCatStatI = oldLockStates->begin(); 1658 vector< vector<bool> >::iterator oldCatStatI = oldLockStates->begin();
1659 vector<bool>::iterator oldEntrStatBegin, 1659 vector<bool>::iterator oldEntrStatBegin,
1660 oldEntrStatEnd, 1660 oldEntrStatEnd,
1661 oldEntrStatI; 1661 oldEntrStatI;
1662 while (catI != catEnd) { 1662 while (catI != catEnd) {
1663 entrBegin = catI->d.begin(); 1663 entrBegin = catI->d.begin();
1664 entrEnd = catI->d.end(); 1664 entrEnd = catI->d.end();
1665 entrI = entrBegin; 1665 entrI = entrBegin;
1666 if (likely(!wasDeepLocked)) { 1666 if (likely(!wasDeepLocked)) {
1667 oldEntrStatBegin = oldCatStatI->begin(); 1667 oldEntrStatBegin = oldCatStatI->begin();
1668 oldEntrStatEnd = oldCatStatI->end(); 1668 oldEntrStatEnd = oldCatStatI->end();
1669 oldEntrStatI = oldEntrStatBegin; 1669 oldEntrStatI = oldEntrStatBegin;
1670 if (unlikely(catI->d.size() != oldCatStatI->size())) { 1670 if (unlikely(catI->d.size() != oldCatStatI->size())) {
1671 /* DOH! We have modified "dta" while 1671 /* DOH! We have modified "dta" while
1672 * it was unlocked tempoary. DON'T DO THIS! 1672 * it was unlocked tempoary. DON'T DO THIS!
1673 */ 1673 */
1674 BUG(); 1674 BUG();
1675 delete_and_null(oldLockStates); 1675 delete_and_null(oldLockStates);
1676 timer()->start(DocTimer::id_autoLockTimer); 1676 timer()->start(DocTimer::id_autoLockTimer);
1677 return false; 1677 return false;
1678 } 1678 }
1679 } 1679 }
1680 while (entrI != entrEnd) { 1680 while (entrI != entrEnd) {
1681 if (wasDeepLocked) { 1681 if (wasDeepLocked) {
1682 /* this is an error-fallback if 1682 /* this is an error-fallback if
1683 * deeplock didn't succeed 1683 * deeplock didn't succeed
1684 */ 1684 */
1685 entrI->lockStat = true; 1685 entrI->lockStat = true;
1686 } else { 1686 } else {
1687 entrI->lockStat = *oldEntrStatI; 1687 entrI->lockStat = *oldEntrStatI;
1688 } 1688 }
1689 ++entrI; 1689 ++entrI;
1690 if (likely(!wasDeepLocked)) 1690 if (likely(!wasDeepLocked))
1691 ++oldEntrStatI; 1691 ++oldEntrStatI;
1692 } 1692 }
1693 ++catI; 1693 ++catI;
1694 if (likely(!wasDeepLocked)) 1694 if (likely(!wasDeepLocked))
1695 ++oldCatStatI; 1695 ++oldCatStatI;
1696 } 1696 }
1697 delete_and_null(oldLockStates); 1697 delete_and_null(oldLockStates);
1698 if (unlikely(wasDeepLocked)) { 1698 if (unlikely(wasDeepLocked)) {
1699 /* error fallback... */ 1699 /* error fallback... */
1700 unsetDocStatFlag(DOC_STAT_DEEPLOCKED); 1700 unsetDocStatFlag(DOC_STAT_DEEPLOCKED);
1701 emitDataChanged(this); 1701 emitDataChanged(this);
1702 printDebug("WARNING: unlockAll_tempoary(true) " 1702 printDebug("WARNING: unlockAll_tempoary(true) "
1703 "deeplock fallback!"); 1703 "deeplock fallback!");
1704 } 1704 }
1705 printDebug("tempoary unlocking of dta reverted."); 1705 printDebug("tempoary unlocking of dta reverted.");
1706 } else { 1706 } else {
1707 printDebug("unlockAll_tempoary(true): nothing to do."); 1707 printDebug("unlockAll_tempoary(true): nothing to do.");
1708 } 1708 }
1709 timer()->start(DocTimer::id_autoLockTimer); 1709 timer()->start(DocTimer::id_autoLockTimer);
1710 } else {// unlock all data tempoary 1710 } else {// unlock all data tempoary
1711 if (unlikely(oldLockStates != 0)) { 1711 if (unlikely(oldLockStates != 0)) {
1712 /* DOH! We have already unlocked the data tempoarly. 1712 /* DOH! We have already unlocked the data tempoarly.
1713 * No need to do it twice. ;) 1713 * No need to do it twice. ;)
1714 */ 1714 */
1715 BUG(); 1715 BUG();
1716 return false; 1716 return false;
1717 } 1717 }
1718 wasDeepLocked = false; 1718 wasDeepLocked = false;
1719 bool mustUnlock = false; 1719 bool mustUnlock = false;
1720 if (isDeepLocked()) { 1720 if (isDeepLocked()) {
1721 PwMerror ret; 1721 PwMerror ret;
1722 while (1) { 1722 while (1) {
1723 ret = deepLock(false); 1723 ret = deepLock(false);
1724 if (ret == e_success) { 1724 if (ret == e_success) {
1725 break; 1725 break;
1726 } else if (ret == e_wrongPw) { 1726 } else if (ret == e_wrongPw) {
1727 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1727 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1728 } else { 1728 } else {
1729 printDebug("deep-unlocking failed while " 1729 printDebug("deep-unlocking failed while "
1730 "tempoary unlocking!"); 1730 "tempoary unlocking!");
1731 return false; 1731 return false;
1732 } 1732 }
1733 } 1733 }
1734 wasDeepLocked = true; 1734 wasDeepLocked = true;
1735 mustUnlock = true; 1735 mustUnlock = true;
1736 } else { 1736 } else {
1737 // first check if it's needed to unlock some entries 1737 // first check if it's needed to unlock some entries
1738 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), 1738 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(),
1739 catEnd = dti.dta.end(), 1739 catEnd = dti.dta.end(),
1740 catI = catBegin; 1740 catI = catBegin;
1741 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 1741 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
1742 while (catI != catEnd) { 1742 while (catI != catEnd) {
1743 entrBegin = catI->d.begin(); 1743 entrBegin = catI->d.begin();
1744 entrEnd = catI->d.end(); 1744 entrEnd = catI->d.end();
1745 entrI = entrBegin; 1745 entrI = entrBegin;
1746 while (entrI != entrEnd) { 1746 while (entrI != entrEnd) {
1747 if (entrI->lockStat == true) { 1747 if (entrI->lockStat == true) {
1748 mustUnlock = true; 1748 mustUnlock = true;
1749 break; 1749 break;
1750 } 1750 }
1751 ++entrI; 1751 ++entrI;
1752 } 1752 }
1753 if (mustUnlock) 1753 if (mustUnlock)
1754 break; 1754 break;
1755 ++catI; 1755 ++catI;
1756 } 1756 }
1757 } 1757 }
1758 if (!mustUnlock) { 1758 if (!mustUnlock) {
1759 // nothing to do. 1759 // nothing to do.
1760 timer()->stop(DocTimer::id_autoLockTimer); 1760 timer()->stop(DocTimer::id_autoLockTimer);
1761 printDebug("unlockAll_tempoary(): nothing to do."); 1761 printDebug("unlockAll_tempoary(): nothing to do.");
1762 return true; 1762 return true;
1763 } else if (!wasDeepLocked) { 1763 } else if (!wasDeepLocked) {
1764 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW) && 1764 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW) &&
1765 currentPw != "") { 1765 currentPw != "") {
1766 /* we can't unlock without mpw, so 1766 /* we can't unlock without mpw, so
1767 * we need to ask for it. 1767 * we need to ask for it.
1768 */ 1768 */
1769 QString pw; 1769 QString pw;
1770 while (1) { 1770 while (1) {
1771 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1771 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1772 if (pw == "") { 1772 if (pw == "") {
1773 return false; 1773 return false;
1774 } else if (pw == currentPw) { 1774 } else if (pw == currentPw) {
1775 break; 1775 break;
1776 } 1776 }
1777 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1777 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1778 } 1778 }
1779 } 1779 }
1780 } 1780 }
1781 timer()->stop(DocTimer::id_autoLockTimer); 1781 timer()->stop(DocTimer::id_autoLockTimer);
1782 oldLockStates = new vector< vector<bool> >; 1782 oldLockStates = new vector< vector<bool> >;
1783 vector<bool> tmp_vec; 1783 vector<bool> tmp_vec;
1784 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), 1784 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(),
1785 catEnd = dti.dta.end(), 1785 catEnd = dti.dta.end(),
1786 catI = catBegin; 1786 catI = catBegin;
1787 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 1787 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
1788 while (catI != catEnd) { 1788 while (catI != catEnd) {
1789 entrBegin = catI->d.begin(); 1789 entrBegin = catI->d.begin();
1790 entrEnd = catI->d.end(); 1790 entrEnd = catI->d.end();
1791 entrI = entrBegin; 1791 entrI = entrBegin;
1792 while (entrI != entrEnd) { 1792 while (entrI != entrEnd) {
1793 if (!wasDeepLocked) { 1793 if (!wasDeepLocked) {
1794 tmp_vec.push_back(entrI->lockStat); 1794 tmp_vec.push_back(entrI->lockStat);
1795 } 1795 }
1796 entrI->lockStat = false; 1796 entrI->lockStat = false;
1797 ++entrI; 1797 ++entrI;
1798 } 1798 }
1799 if (!wasDeepLocked) { 1799 if (!wasDeepLocked) {
1800 oldLockStates->push_back(tmp_vec); 1800 oldLockStates->push_back(tmp_vec);
1801 tmp_vec.clear(); 1801 tmp_vec.clear();
1802 } 1802 }
1803 ++catI; 1803 ++catI;
1804 } 1804 }
1805 printDebug("tempoary unlocked dta."); 1805 printDebug("tempoary unlocked dta.");
1806 } 1806 }
1807 1807
1808 return true; 1808 return true;
1809} 1809}
1810 1810
1811PwMerror PwMDoc::deepLock(bool lock, bool saveToFile) 1811PwMerror PwMDoc::deepLock(bool lock, bool saveToFile)
1812{ 1812{
1813 PwMerror ret; 1813 PwMerror ret;
1814 /* NOTE: saveDoc() depends on this function to return 1814 /* NOTE: saveDoc() depends on this function to return
1815 * e_success if saveToFile == false 1815 * e_success if saveToFile == false
1816 */ 1816 */
1817 1817
1818 if (lock) { 1818 if (lock) {
1819 if (isDeepLocked()) 1819 if (isDeepLocked())
1820 return e_lock; 1820 return e_lock;
1821 if (saveToFile) { 1821 if (saveToFile) {
1822 if (isDocEmpty()) 1822 if (isDocEmpty())
1823 return e_docIsEmpty; 1823 return e_docIsEmpty;
1824 ret = saveDoc(conf()->confGlobCompression()); 1824 ret = saveDoc(conf()->confGlobCompression());
1825 if (ret == e_filename) { 1825 if (ret == e_filename) {
1826 /* the doc wasn't saved to a file 1826 /* the doc wasn't saved to a file
1827 * by the user, yet. 1827 * by the user, yet.
1828 */ 1828 */
1829 cantDeeplock_notSavedMsgBox(); 1829 cantDeeplock_notSavedMsgBox();
1830 return e_docNotSaved; 1830 return e_docNotSaved;
1831 } else if (ret != e_success) { 1831 } else if (ret != e_success) {
1832 return e_lock; 1832 return e_lock;
1833 } 1833 }
1834 } 1834 }
1835 timer()->stop(DocTimer::id_autoLockTimer); 1835 timer()->stop(DocTimer::id_autoLockTimer);
1836 clearDoc(); 1836 clearDoc();
1837 PwMDataItem d; 1837 PwMDataItem d;
1838 d.desc = IS_DEEPLOCKED_SHORTMSG.latin1(); 1838 d.desc = IS_DEEPLOCKED_SHORTMSG.latin1();
1839 d.comment = IS_DEEPLOCKED_MSG.latin1(); 1839 d.comment = IS_DEEPLOCKED_MSG.latin1();
1840 d.listViewPos = 0; 1840 d.listViewPos = 0;
1841 addEntry(DEFAULT_CATEGORY, &d, true); 1841 addEntry(DEFAULT_CATEGORY, &d, true);
1842 lockAt(DEFAULT_CATEGORY, 0, true); 1842 lockAt(DEFAULT_CATEGORY, 0, true);
1843 unsetDocStatFlag(DOC_STAT_DISK_DIRTY); 1843 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
1844 setDocStatFlag(DOC_STAT_DEEPLOCKED); 1844 setDocStatFlag(DOC_STAT_DEEPLOCKED);
1845 } else { 1845 } else {
1846 if (!isDeepLocked()) 1846 if (!isDeepLocked())
1847 return e_lock; 1847 return e_lock;
1848 ret = openDoc(&filename, (conf()->confGlobUnlockOnOpen()) 1848 ret = openDoc(&filename, (conf()->confGlobUnlockOnOpen())
1849 ? 0 : 1); 1849 ? 0 : 1);
1850 if (ret == e_wrongPw) { 1850 if (ret == e_wrongPw) {
1851 return e_wrongPw; 1851 return e_wrongPw;
1852 } else if (ret != e_success) { 1852 } else if (ret != e_success) {
1853 printDebug(string("PwMDoc::deepLock(false): ERR! openDoc() == ") 1853 printDebug(string("PwMDoc::deepLock(false): ERR! openDoc() == ")
1854 + tostr(static_cast<int>(ret))); 1854 + tostr(static_cast<int>(ret)));
1855 return e_lock; 1855 return e_lock;
1856 } 1856 }
1857 unsetDocStatFlag(DOC_STAT_DEEPLOCKED); 1857 unsetDocStatFlag(DOC_STAT_DEEPLOCKED);
1858 timer()->start(DocTimer::id_autoLockTimer); 1858 timer()->start(DocTimer::id_autoLockTimer);
1859 } 1859 }
1860 1860
1861 emitDataChanged(this); 1861 emitDataChanged(this);
1862 return e_success; 1862 return e_success;
1863} 1863}
1864 1864
1865void PwMDoc::_deepUnlock() 1865void PwMDoc::_deepUnlock()
1866{ 1866{
1867 deepLock(false); 1867 deepLock(false);
1868} 1868}
1869 1869
1870void PwMDoc::clearDoc() 1870void PwMDoc::clearDoc()
1871{ 1871{
1872 dti.clear(); 1872 dti.clear();
1873 PwMCategoryItem d; 1873 PwMCategoryItem d;
1874 d.name = DEFAULT_CATEGORY.latin1(); 1874 d.name = DEFAULT_CATEGORY.latin1();
1875 dti.dta.push_back(d); 1875 dti.dta.push_back(d);
1876 currentPw = ""; 1876 currentPw = "";
1877 unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); 1877 unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW);
1878} 1878}
1879 1879
1880void PwMDoc::changeCurrentPw() 1880void PwMDoc::changeCurrentPw()
1881{ 1881{
1882 if (currentPw == "") 1882 if (currentPw == "")
1883 return; // doc hasn't been saved. No mpw available. 1883 return; // doc hasn't been saved. No mpw available.
1884 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD); 1884 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD);
1885 QString pw = requestMpwChange(&currentPw, &useChipcard); 1885 QString pw = requestMpwChange(&currentPw, &useChipcard);
1886 if (pw == "") 1886 if (pw == "")
1887 return; 1887 return;
1888 if (useChipcard) 1888 if (useChipcard)
1889 setDocStatFlag(DOC_STAT_USE_CHIPCARD); 1889 setDocStatFlag(DOC_STAT_USE_CHIPCARD);
1890 else 1890 else
1891 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 1891 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
1892 setCurrentPw(pw); 1892 setCurrentPw(pw);
1893} 1893}
1894 1894
1895void PwMDoc::setListViewPos(const QString &category, unsigned int index, 1895void PwMDoc::setListViewPos(const QString &category, unsigned int index,
1896 int pos) 1896 int pos)
1897{ 1897{
1898 unsigned int cat = 0; 1898 unsigned int cat = 0;
1899 1899
1900 if (!findCategory(category, &cat)) { 1900 if (!findCategory(category, &cat)) {
1901 BUG(); 1901 BUG();
1902 return; 1902 return;
1903 } 1903 }
1904 setListViewPos(cat, index, pos); 1904 setListViewPos(cat, index, pos);
1905} 1905}
1906 1906
1907void PwMDoc::setListViewPos(unsigned int category, unsigned int index, 1907void PwMDoc::setListViewPos(unsigned int category, unsigned int index,
1908 int pos) 1908 int pos)
1909{ 1909{
1910 dti.dta[category].d[index].listViewPos = pos; 1910 dti.dta[category].d[index].listViewPos = pos;
1911 1911
1912/* FIXME workaround: don't flag dirty, because this function sometimes 1912/* FIXME workaround: don't flag dirty, because this function sometimes
1913 * get's called when it shouldn't. It's because PwMView assumes 1913 * get's called when it shouldn't. It's because PwMView assumes
1914 * the user resorted the UI on behalf of signal layoutChanged(). 1914 * the user resorted the UI on behalf of signal layoutChanged().
1915 * This is somewhat broken and incorrect, but I've no other 1915 * This is somewhat broken and incorrect, but I've no other
1916 * solution for now. 1916 * solution for now.
1917 */ 1917 */
1918 //setDocStatFlag(DOC_STAT_DISK_DIRTY); 1918 //setDocStatFlag(DOC_STAT_DISK_DIRTY);
1919} 1919}
1920 1920
1921int PwMDoc::getListViewPos(const QString &category, unsigned int index) 1921int PwMDoc::getListViewPos(const QString &category, unsigned int index)
1922{ 1922{
1923 unsigned int cat = 0; 1923 unsigned int cat = 0;
1924 1924
1925 if (!findCategory(category, &cat)) { 1925 if (!findCategory(category, &cat)) {
1926 BUG(); 1926 BUG();
1927 return -1; 1927 return -1;
1928 } 1928 }
1929 1929
1930 return dti.dta[cat].d[index].listViewPos; 1930 return dti.dta[cat].d[index].listViewPos;
1931} 1931}
1932 1932
1933void PwMDoc::findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn, 1933void PwMDoc::findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn,
1934 vector<unsigned int> *foundPositions, bool breakAfterFound, 1934 vector<unsigned int> *foundPositions, bool breakAfterFound,
1935 bool caseSensitive, bool exactWordMatch, bool sortByLvp) 1935 bool caseSensitive, bool exactWordMatch, bool sortByLvp)
1936{ 1936{
1937 PWM_ASSERT(foundPositions); 1937 PWM_ASSERT(foundPositions);
1938 PWM_ASSERT(searchIn); 1938 PWM_ASSERT(searchIn);
1939 foundPositions->clear(); 1939 foundPositions->clear();
1940 1940
1941 unsigned int i, entries = numEntries(category); 1941 unsigned int i, entries = numEntries(category);
1942 for (i = 0; i < entries; ++i) { 1942 for (i = 0; i < entries; ++i) {
1943 if (searchIn & SEARCH_IN_DESC) { 1943 if (searchIn & SEARCH_IN_DESC) {
1944 if (!compareString(find.desc, dti.dta[category].d[i].desc, 1944 if (!compareString(find.desc, dti.dta[category].d[i].desc,
1945 caseSensitive, exactWordMatch)) { 1945 caseSensitive, exactWordMatch)) {
1946 continue; 1946 continue;
1947 } 1947 }
1948 } 1948 }
1949 if (searchIn & SEARCH_IN_NAME) { 1949 if (searchIn & SEARCH_IN_NAME) {
1950 if (!compareString(find.name, dti.dta[category].d[i].name, 1950 if (!compareString(find.name, dti.dta[category].d[i].name,
1951 caseSensitive, exactWordMatch)) { 1951 caseSensitive, exactWordMatch)) {
1952 continue; 1952 continue;
1953 } 1953 }
1954 } 1954 }
1955 if (searchIn & SEARCH_IN_PW) { 1955 if (searchIn & SEARCH_IN_PW) {
1956 bool wasLocked = isLocked(category, i); 1956 bool wasLocked = isLocked(category, i);
1957 getDataChangedLock(); 1957 getDataChangedLock();
1958 lockAt(category, i, false); 1958 lockAt(category, i, false);
1959 if (!compareString(find.pw, dti.dta[category].d[i].pw, 1959 if (!compareString(find.pw, dti.dta[category].d[i].pw,
1960 caseSensitive, exactWordMatch)) { 1960 caseSensitive, exactWordMatch)) {
1961 lockAt(category, i, wasLocked); 1961 lockAt(category, i, wasLocked);
1962 putDataChangedLock(); 1962 putDataChangedLock();
1963 continue; 1963 continue;
1964 } 1964 }
1965 lockAt(category, i, wasLocked); 1965 lockAt(category, i, wasLocked);
1966 putDataChangedLock(); 1966 putDataChangedLock();
1967 } 1967 }
1968 if (searchIn & SEARCH_IN_COMMENT) { 1968 if (searchIn & SEARCH_IN_COMMENT) {
1969 if (!compareString(find.comment, dti.dta[category].d[i].comment, 1969 if (!compareString(find.comment, dti.dta[category].d[i].comment,
1970 caseSensitive, exactWordMatch)) { 1970 caseSensitive, exactWordMatch)) {
1971 continue; 1971 continue;
1972 } 1972 }
1973 } 1973 }
1974 if (searchIn & SEARCH_IN_URL) { 1974 if (searchIn & SEARCH_IN_URL) {
1975 if (!compareString(find.url, dti.dta[category].d[i].url, 1975 if (!compareString(find.url, dti.dta[category].d[i].url,
1976 caseSensitive, exactWordMatch)) { 1976 caseSensitive, exactWordMatch)) {
1977 continue; 1977 continue;
1978 } 1978 }
1979 } 1979 }
1980 if (searchIn & SEARCH_IN_LAUNCHER) { 1980 if (searchIn & SEARCH_IN_LAUNCHER) {
1981 if (!compareString(find.launcher, dti.dta[category].d[i].launcher, 1981 if (!compareString(find.launcher, dti.dta[category].d[i].launcher,
1982 caseSensitive, exactWordMatch)) { 1982 caseSensitive, exactWordMatch)) {
1983 continue; 1983 continue;
1984 } 1984 }
1985 } 1985 }
1986 1986
1987 // all selected "searchIn" matched. 1987 // all selected "searchIn" matched.
1988 foundPositions->push_back(i); 1988 foundPositions->push_back(i);
1989 if (breakAfterFound) 1989 if (breakAfterFound)
1990 break; 1990 break;
1991 } 1991 }
1992 1992
1993 if (sortByLvp && foundPositions->size() > 1) { 1993 if (sortByLvp && foundPositions->size() > 1) {
1994 vector< pair<unsigned int /* foundPosition (real doc pos) */, 1994 vector< pair<unsigned int /* foundPosition (real doc pos) */,
1995 unsigned int /* lvp-pos */> > tmp_vec; 1995 unsigned int /* lvp-pos */> > tmp_vec;
1996 1996
1997 unsigned int i, items = foundPositions->size(); 1997 unsigned int i, items = foundPositions->size();
1998 pair<unsigned int, unsigned int> tmp_pair; 1998 pair<unsigned int, unsigned int> tmp_pair;
1999 for (i = 0; i < items; ++i) { 1999 for (i = 0; i < items; ++i) {
2000 tmp_pair.first = (*foundPositions)[i]; 2000 tmp_pair.first = (*foundPositions)[i];
2001 tmp_pair.second = dti.dta[category].d[(*foundPositions)[i]].listViewPos; 2001 tmp_pair.second = dti.dta[category].d[(*foundPositions)[i]].listViewPos;
2002 tmp_vec.push_back(tmp_pair); 2002 tmp_vec.push_back(tmp_pair);
2003 } 2003 }
2004 sort(tmp_vec.begin(), tmp_vec.end(), dta_lvp_greater()); 2004 sort(tmp_vec.begin(), tmp_vec.end(), dta_lvp_greater());
2005 foundPositions->clear(); 2005 foundPositions->clear();
2006 for (i = 0; i < items; ++i) { 2006 for (i = 0; i < items; ++i) {
2007 foundPositions->push_back(tmp_vec[i].first); 2007 foundPositions->push_back(tmp_vec[i].first);
2008 } 2008 }
2009 } 2009 }
2010} 2010}
2011 2011
2012void PwMDoc::findEntry(const QString &category, PwMDataItem find, unsigned int searchIn, 2012void PwMDoc::findEntry(const QString &category, PwMDataItem find, unsigned int searchIn,
2013 vector<unsigned int> *foundPositions, bool breakAfterFound, 2013 vector<unsigned int> *foundPositions, bool breakAfterFound,
2014 bool caseSensitive, bool exactWordMatch, bool sortByLvp) 2014 bool caseSensitive, bool exactWordMatch, bool sortByLvp)
2015{ 2015{
2016 PWM_ASSERT(foundPositions); 2016 PWM_ASSERT(foundPositions);
2017 unsigned int cat = 0; 2017 unsigned int cat = 0;
2018 2018
2019 if (!findCategory(category, &cat)) { 2019 if (!findCategory(category, &cat)) {
2020 foundPositions->clear(); 2020 foundPositions->clear();
2021 return; 2021 return;
2022 } 2022 }
2023 2023
2024 findEntry(cat, find, searchIn, foundPositions, breakAfterFound, 2024 findEntry(cat, find, searchIn, foundPositions, breakAfterFound,
2025 caseSensitive, exactWordMatch, sortByLvp); 2025 caseSensitive, exactWordMatch, sortByLvp);
2026} 2026}
2027 2027
2028bool PwMDoc::compareString(const string &s1, const string &s2, bool caseSensitive, 2028bool PwMDoc::compareString(const string &s1, const string &s2, bool caseSensitive,
2029 bool exactWordMatch) 2029 bool exactWordMatch)
2030{ 2030{
2031 QString _s1(s1.c_str()); 2031 QString _s1(s1.c_str());
2032 QString _s2(s2.c_str()); 2032 QString _s2(s2.c_str());
2033 if (!caseSensitive) { 2033 if (!caseSensitive) {
2034 _s1 = _s1.lower(); 2034 _s1 = _s1.lower();
2035 _s2 = _s2.lower(); 2035 _s2 = _s2.lower();
2036 } 2036 }
2037 if (exactWordMatch ? (_s1 == _s2) : (_s2.find(_s1) != -1)) 2037 if (exactWordMatch ? (_s1 == _s2) : (_s2.find(_s1) != -1))
2038 return true; 2038 return true;
2039 return false; 2039 return false;
2040} 2040}
2041 2041
2042bool PwMDoc::findCategory(const QString &name, unsigned int *index) 2042bool PwMDoc::findCategory(const QString &name, unsigned int *index)
2043{ 2043{
2044 vector<PwMCategoryItem>::iterator i = dti.dta.begin(), 2044 vector<PwMCategoryItem>::iterator i = dti.dta.begin(),
2045 end = dti.dta.end(); 2045 end = dti.dta.end();
2046 while (i != end) { 2046 while (i != end) {
2047 if ((*i).name == name.latin1()) { 2047 if ((*i).name == name.latin1()) {
2048 if (index) { 2048 if (index) {
2049 *index = i - dti.dta.begin(); 2049 *index = i - dti.dta.begin();
2050 } 2050 }
2051 return true; 2051 return true;
2052 } 2052 }
2053 ++i; 2053 ++i;
2054 } 2054 }
2055 return false; 2055 return false;
2056} 2056}
2057 2057
2058bool PwMDoc::renameCategory(const QString &category, const QString &newName) 2058bool PwMDoc::renameCategory(const QString &category, const QString &newName)
2059{ 2059{
2060 unsigned int cat = 0; 2060 unsigned int cat = 0;
2061 2061
2062 if (!findCategory(category, &cat)) 2062 if (!findCategory(category, &cat))
2063 return false; 2063 return false;
2064 2064
2065 return renameCategory(cat, newName); 2065 return renameCategory(cat, newName);
2066} 2066}
2067 2067
2068bool PwMDoc::renameCategory(unsigned int category, const QString &newName, 2068bool PwMDoc::renameCategory(unsigned int category, const QString &newName,
2069 bool dontFlagDirty) 2069 bool dontFlagDirty)
2070{ 2070{
2071 if (category > numCategories() - 1) 2071 if (category > numCategories() - 1)
2072 return false; 2072 return false;
2073 2073
2074 dti.dta[category].name = newName.latin1(); 2074 dti.dta[category].name = newName.latin1();
2075 if (!dontFlagDirty) 2075 if (!dontFlagDirty)
2076 flagDirty(); 2076 flagDirty();
2077 2077
2078 return true; 2078 return true;
2079} 2079}
2080 2080
2081bool PwMDoc::delCategory(const QString &category) 2081bool PwMDoc::delCategory(const QString &category)
2082{ 2082{
2083 unsigned int cat = 0; 2083 unsigned int cat = 0;
2084 2084
2085 if (!findCategory(category, &cat)) 2085 if (!findCategory(category, &cat))
2086 return false; 2086 return false;
2087 2087
2088 return delCategory(cat); 2088 return delCategory(cat);
2089} 2089}
2090 2090
2091bool PwMDoc::delCategory(unsigned int category, bool dontFlagDirty) 2091bool PwMDoc::delCategory(unsigned int category, bool dontFlagDirty)
2092{ 2092{
2093 if (category > numCategories() - 1) 2093 if (category > numCategories() - 1)
2094 return false; 2094 return false;
2095 2095
2096 // We don't delete it, if it is the last existing 2096 // We don't delete it, if it is the last existing
2097 // category! Instead we rename it to "Default". 2097 // category! Instead we rename it to "Default".
2098 if (numCategories() > 1) { 2098 if (numCategories() > 1) {
2099 dti.dta.erase(dti.dta.begin() + category); 2099 dti.dta.erase(dti.dta.begin() + category);
2100 } else { 2100 } else {
2101 renameCategory(category, DEFAULT_CATEGORY, dontFlagDirty); 2101 renameCategory(category, DEFAULT_CATEGORY, dontFlagDirty);
2102 return true; 2102 return true;
2103 } 2103 }
2104 if (!dontFlagDirty) 2104 if (!dontFlagDirty)
2105 flagDirty(); 2105 flagDirty();
2106 2106
2107 return true; 2107 return true;
2108} 2108}
2109 2109
2110void PwMDoc::delAllEmptyCat(bool dontFlagDirty) 2110void PwMDoc::delAllEmptyCat(bool dontFlagDirty)
2111{ 2111{
2112 vector<PwMCategoryItem>::iterator begin = dti.dta.begin(), 2112 vector<PwMCategoryItem>::iterator begin = dti.dta.begin(),
2113 end = dti.dta.end(), 2113 end = dti.dta.end(),
2114 i = begin; 2114 i = begin;
2115 while (i != end) { 2115 while (i != end) {
2116 if (i->d.empty()) { 2116 if (i->d.empty()) {
2117 delCategory(begin - i, dontFlagDirty); 2117 delCategory(begin - i, dontFlagDirty);
2118 } 2118 }
2119 ++i; 2119 ++i;
2120 } 2120 }
2121} 2121}
2122 2122
2123void PwMDoc::getCategoryList(vector<string> *list) 2123void PwMDoc::getCategoryList(vector<string> *list)
2124{ 2124{
2125 PWM_ASSERT(list); 2125 PWM_ASSERT(list);
2126 list->clear(); 2126 list->clear();
2127 vector<PwMCategoryItem>::iterator i = dti.dta.begin(), 2127 vector<PwMCategoryItem>::iterator i = dti.dta.begin(),
2128 end = dti.dta.end(); 2128 end = dti.dta.end();
2129 while (i != end) { 2129 while (i != end) {
2130 list->push_back(i->name); 2130 list->push_back(i->name);
2131 ++i; 2131 ++i;
2132 } 2132 }
2133} 2133}
2134 2134
2135void PwMDoc::getCategoryList(QStringList *list) 2135void PwMDoc::getCategoryList(QStringList *list)
2136{ 2136{
2137 PWM_ASSERT(list); 2137 PWM_ASSERT(list);
2138 list->clear(); 2138 list->clear();
2139 vector<PwMCategoryItem>::iterator i = dti.dta.begin(), 2139 vector<PwMCategoryItem>::iterator i = dti.dta.begin(),
2140 end = dti.dta.end(); 2140 end = dti.dta.end();
2141 while (i != end) { 2141 while (i != end) {
2142#ifndef PWM_EMBEDDED 2142#ifndef PWM_EMBEDDED
2143 list->push_back(i->name.c_str()); 2143 list->push_back(i->name.c_str());
2144#else 2144#else
2145 list->append(i->name.c_str()); 2145 list->append(i->name.c_str());
2146#endif 2146#endif
2147 ++i; 2147 ++i;
2148 } 2148 }
2149} 2149}
2150 2150
2151void PwMDoc::getEntryList(const QString &category, QStringList *list) 2151void PwMDoc::getEntryList(const QString &category, QStringList *list)
2152{ 2152{
2153 PWM_ASSERT(list); 2153 PWM_ASSERT(list);
2154 unsigned int cat = 0; 2154 unsigned int cat = 0;
2155 if (!findCategory(category, &cat)) { 2155 if (!findCategory(category, &cat)) {
2156 list->clear(); 2156 list->clear();
2157 return; 2157 return;
2158 } 2158 }
2159 getEntryList(cat, list); 2159 getEntryList(cat, list);
2160} 2160}
2161 2161
2162void PwMDoc::getEntryList(const QString &category, vector<string> *list) 2162void PwMDoc::getEntryList(const QString &category, vector<string> *list)
2163{ 2163{
2164 PWM_ASSERT(list); 2164 PWM_ASSERT(list);
2165 unsigned int cat = 0; 2165 unsigned int cat = 0;
2166 if (!findCategory(category, &cat)) { 2166 if (!findCategory(category, &cat)) {
2167 list->clear(); 2167 list->clear();
2168 return; 2168 return;
2169 } 2169 }
2170 getEntryList(cat, list); 2170 getEntryList(cat, list);
2171} 2171}
2172 2172
2173void PwMDoc::getEntryList(unsigned int category, vector<string> *list) 2173void PwMDoc::getEntryList(unsigned int category, vector<string> *list)
2174{ 2174{
2175 PWM_ASSERT(list); 2175 PWM_ASSERT(list);
2176 list->clear(); 2176 list->clear();
2177 vector<PwMDataItem>::iterator begin = dti.dta[category].d.begin(), 2177 vector<PwMDataItem>::iterator begin = dti.dta[category].d.begin(),
2178 end = dti.dta[category].d.end(), 2178 end = dti.dta[category].d.end(),
2179 i = begin; 2179 i = begin;
2180 while (i != end) { 2180 while (i != end) {
2181 list->push_back(i->desc); 2181 list->push_back(i->desc);
2182 ++i; 2182 ++i;
2183 } 2183 }
2184} 2184}
2185 2185
2186void PwMDoc::getEntryList(unsigned int category, QStringList *list) 2186void PwMDoc::getEntryList(unsigned int category, QStringList *list)
2187{ 2187{
2188 PWM_ASSERT(list); 2188 PWM_ASSERT(list);
2189 list->clear(); 2189 list->clear();
2190 vector<PwMDataItem>::iterator begin = dti.dta[category].d.begin(), 2190 vector<PwMDataItem>::iterator begin = dti.dta[category].d.begin(),
2191 end = dti.dta[category].d.end(), 2191 end = dti.dta[category].d.end(),
2192 i = begin; 2192 i = begin;
2193 while (i != end) { 2193 while (i != end) {
2194#ifndef PWM_EMBEDDED 2194#ifndef PWM_EMBEDDED
2195 list->push_back(i->desc.c_str()); 2195 list->push_back(i->desc.c_str());
2196#else 2196#else
2197 list->append(i->desc.c_str()); 2197 list->append(i->desc.c_str());
2198#endif 2198#endif
2199 ++i; 2199 ++i;
2200 } 2200 }
2201} 2201}
2202 2202
2203bool PwMDoc::execLauncher(const QString &category, unsigned int entryIndex) 2203bool PwMDoc::execLauncher(const QString &category, unsigned int entryIndex)
2204{ 2204{
2205 unsigned int cat = 0; 2205 unsigned int cat = 0;
2206 2206
2207 if (!findCategory(category, &cat)) 2207 if (!findCategory(category, &cat))
2208 return false; 2208 return false;
2209 2209
2210 return execLauncher(cat, entryIndex); 2210 return execLauncher(cat, entryIndex);
2211} 2211}
2212 2212
2213bool PwMDoc::execLauncher(unsigned int category, unsigned int entryIndex) 2213bool PwMDoc::execLauncher(unsigned int category, unsigned int entryIndex)
2214{ 2214{
2215 if (geteuid() == 0) { 2215 if (geteuid() == 0) {
2216 rootAlertMsgBox(); 2216 rootAlertMsgBox();
2217 return false; 2217 return false;
2218 } 2218 }
2219 QString command(dti.dta[category].d[entryIndex].launcher.c_str()); 2219 QString command(dti.dta[category].d[entryIndex].launcher.c_str());
2220 bool wasLocked = isLocked(category, entryIndex); 2220 bool wasLocked = isLocked(category, entryIndex);
2221 2221
2222 if (command.find("$p") != -1) { 2222 if (command.find("$p") != -1) {
2223 /* the user requested the password to be included 2223 /* the user requested the password to be included
2224 * into the command. We have to ask for the password, 2224 * into the command. We have to ask for the password,
2225 * if it's locked. We do that by unlocking the entry 2225 * if it's locked. We do that by unlocking the entry
2226 */ 2226 */
2227 if (!lockAt(category, entryIndex, false)) 2227 if (!lockAt(category, entryIndex, false))
2228 return false; 2228 return false;
2229 } 2229 }
2230#ifndef PWM_EMBEDDED 2230#ifndef PWM_EMBEDDED
2231 command.replace("$d", dti.dta[category].d[entryIndex].desc.c_str()); 2231 command.replace("$d", dti.dta[category].d[entryIndex].desc.c_str());
2232 command.replace("$n", dti.dta[category].d[entryIndex].name.c_str()); 2232 command.replace("$n", dti.dta[category].d[entryIndex].name.c_str());
2233 command.replace("$p", dti.dta[category].d[entryIndex].pw.c_str()); 2233 command.replace("$p", dti.dta[category].d[entryIndex].pw.c_str());
2234 command.replace("$u", dti.dta[category].d[entryIndex].url.c_str()); 2234 command.replace("$u", dti.dta[category].d[entryIndex].url.c_str());
2235 command.replace("$c", dti.dta[category].d[entryIndex].comment.c_str()); 2235 command.replace("$c", dti.dta[category].d[entryIndex].comment.c_str());
2236#else 2236#else
2237 command.replace(QRegExp("$d"), dti.dta[category].d[entryIndex].desc.c_str()); 2237 command.replace(QRegExp("$d"), dti.dta[category].d[entryIndex].desc.c_str());
2238 command.replace(QRegExp("$n"), dti.dta[category].d[entryIndex].name.c_str()); 2238 command.replace(QRegExp("$n"), dti.dta[category].d[entryIndex].name.c_str());
2239 command.replace(QRegExp("$p"), dti.dta[category].d[entryIndex].pw.c_str()); 2239 command.replace(QRegExp("$p"), dti.dta[category].d[entryIndex].pw.c_str());
2240 command.replace(QRegExp("$u"), dti.dta[category].d[entryIndex].url.c_str()); 2240 command.replace(QRegExp("$u"), dti.dta[category].d[entryIndex].url.c_str());
2241 command.replace(QRegExp("$c"), dti.dta[category].d[entryIndex].comment.c_str()); 2241 command.replace(QRegExp("$c"), dti.dta[category].d[entryIndex].comment.c_str());
2242#endif 2242#endif
2243 command.append(" &"); 2243 command.append(" &");
2244 2244
2245 QString customXterm(conf()->confGlobXtermCommand()); 2245 QString customXterm(conf()->confGlobXtermCommand());
2246 if (!customXterm.isEmpty()) 2246 if (!customXterm.isEmpty())
2247 command = customXterm + " " + command; 2247 command = customXterm + " " + command;
2248 2248
2249 system(command.latin1()); 2249 system(command.latin1());
2250 2250
2251 lockAt(category, entryIndex, wasLocked); 2251 lockAt(category, entryIndex, wasLocked);
2252 return true; 2252 return true;
2253} 2253}
2254 2254
2255bool PwMDoc::goToURL(const QString &category, unsigned int entryIndex) 2255bool PwMDoc::goToURL(const QString &category, unsigned int entryIndex)
2256{ 2256{
2257 unsigned int cat = 0; 2257 unsigned int cat = 0;
2258 2258
2259 if (!findCategory(category, &cat)) 2259 if (!findCategory(category, &cat))
2260 return false; 2260 return false;
2261 2261
2262 return goToURL(cat, entryIndex); 2262 return goToURL(cat, entryIndex);
2263} 2263}
2264 2264
2265bool PwMDoc::goToURL(unsigned int category, unsigned int entryIndex) 2265bool PwMDoc::goToURL(unsigned int category, unsigned int entryIndex)
2266{ 2266{
2267 if (geteuid() == 0) { 2267 if (geteuid() == 0) {
2268 rootAlertMsgBox(); 2268 rootAlertMsgBox();
2269 return false; 2269 return false;
2270 } 2270 }
2271 QString url(dti.dta[category].d[entryIndex].url.c_str()); 2271 QString url(dti.dta[category].d[entryIndex].url.c_str());
2272 if (url.isEmpty()) 2272 if (url.isEmpty())
2273 return false; 2273 return false;
2274 2274
2275 QString customBrowser(conf()->confGlobBrowserCommand()); 2275 QString customBrowser(conf()->confGlobBrowserCommand());
2276 if (!customBrowser.isEmpty()) { 2276 if (!customBrowser.isEmpty()) {
2277 browserProc.clearArguments(); 2277 browserProc.clearArguments();
2278 browserProc << customBrowser << url; 2278 browserProc << customBrowser << url;
2279 if (browserProc.start(KProcess::DontCare)) 2279 if (browserProc.start(KProcess::DontCare))
2280 return true; 2280 return true;
2281 } 2281 }
2282 2282
2283 browserProc.clearArguments(); 2283 browserProc.clearArguments();
2284 browserProc << "konqueror" << url; 2284 browserProc << "konqueror" << url;
2285 if (browserProc.start(KProcess::DontCare)) 2285 if (browserProc.start(KProcess::DontCare))
2286 return true; 2286 return true;
2287 2287
2288 browserProc.clearArguments(); 2288 browserProc.clearArguments();
2289 browserProc << "mozilla" << url; 2289 browserProc << "mozilla" << url;
2290 if (browserProc.start(KProcess::DontCare)) 2290 if (browserProc.start(KProcess::DontCare))
2291 return true; 2291 return true;
2292 2292
2293 browserProc.clearArguments(); 2293 browserProc.clearArguments();
2294 browserProc << "opera" << url; 2294 browserProc << "opera" << url;
2295 if (browserProc.start(KProcess::DontCare)) 2295 if (browserProc.start(KProcess::DontCare))
2296 return true; 2296 return true;
2297 return false; 2297 return false;
2298} 2298}
2299 2299
2300PwMerror PwMDoc::exportToText(const QString *file) 2300PwMerror PwMDoc::exportToText(const QString *file)
2301{ 2301{
2302 PWM_ASSERT(file); 2302 PWM_ASSERT(file);
2303 if (QFile::exists(*file)) { 2303 if (QFile::exists(*file)) {
2304 if (!QFile::remove(*file)) 2304 if (!QFile::remove(*file))
2305 return e_accessFile; 2305 return e_accessFile;
2306 } 2306 }
2307 QFile f(*file); 2307 QFile f(*file);
2308 if (!f.open(IO_ReadWrite)) 2308 if (!f.open(IO_ReadWrite))
2309 return e_openFile; 2309 return e_openFile;
2310 2310
2311 if (!unlockAll_tempoary()) { 2311 if (!unlockAll_tempoary()) {
2312 f.close(); 2312 f.close();
2313 return e_lock; 2313 return e_lock;
2314 } 2314 }
2315 2315
2316 // write header 2316 // write header
2317 string header = i18n("Password table generated by\nPwM v").latin1(); 2317 string header = i18n("Password table generated by\nPwM v").latin1();
2318 header += PACKAGE_VER; 2318 header += PACKAGE_VER;
2319 header += i18n("\non ").latin1(); 2319 header += i18n("\non ").latin1();
2320 QDate currDate = QDate::currentDate(); 2320 QDate currDate = QDate::currentDate();
2321 QTime currTime = QTime::currentTime(); 2321 QTime currTime = QTime::currentTime();
2322 2322
2323#ifndef PWM_EMBEDDED 2323#ifndef PWM_EMBEDDED
2324 header += currDate.toString("ddd MMMM d ").latin1(); 2324 header += currDate.toString("ddd MMMM d ").latin1();
2325 header += currTime.toString("hh:mm:ss ").latin1(); 2325 header += currTime.toString("hh:mm:ss ").latin1();
2326#else 2326#else
2327 QString dfs = KGlobal::locale()->dateFormatShort(); 2327 QString dfs = KGlobal::locale()->dateFormatShort();
2328 bool ampm = KGlobal::locale()->use12Clock(); 2328 bool ampm = KGlobal::locale()->use12Clock();
2329 KGlobal::locale()->setDateFormatShort("%A %B %d"); 2329 KGlobal::locale()->setDateFormatShort("%A %B %d");
2330 KGlobal::locale()->setHore24Format(true); 2330 KGlobal::locale()->setHore24Format(true);
2331 2331
2332 header += KGlobal::locale()->formatDate(currDate, true, KLocale::Userdefined); 2332 header += KGlobal::locale()->formatDate(currDate, true, KLocale::Userdefined).latin1();
2333 header += KGlobal::locale()->formatTime(currTime, true); 2333 header += KGlobal::locale()->formatTime(currTime, true).latin1();
2334 KGlobal::locale()->setDateFormatShort(dfs); 2334 KGlobal::locale()->setDateFormatShort(dfs);
2335 KGlobal::locale()->setHore24Format(!ampm); 2335 KGlobal::locale()->setHore24Format(!ampm);
2336 2336
2337#endif 2337#endif
2338 header += tostr(currDate.year()); 2338 header += tostr(currDate.year());
2339 header += "\n==============================\n\n"; 2339 header += "\n==============================\n\n";
2340 2340
2341 2341
2342#ifndef PWM_EMBEDDED 2342#ifndef PWM_EMBEDDED
2343 if (f.writeBlock(header.c_str(), header.length()) != (Q_LONG)header.length()) { 2343 if (f.writeBlock(header.c_str(), header.length()) != (Q_LONG)header.length()) {
2344 unlockAll_tempoary(true); 2344 unlockAll_tempoary(true);
2345 f.close(); 2345 f.close();
2346 return e_writeFile; 2346 return e_writeFile;
2347 } 2347 }
2348#else 2348#else
2349 if (f.writeBlock(header.c_str(), header.length()) != (long)header.length()) { 2349 if (f.writeBlock(header.c_str(), header.length()) != (long)header.length()) {
2350 unlockAll_tempoary(true); 2350 unlockAll_tempoary(true);
2351 f.close(); 2351 f.close();
2352 return e_writeFile; 2352 return e_writeFile;
2353 } 2353 }
2354#endif 2354#endif
2355 unsigned int i, numCat = numCategories(); 2355 unsigned int i, numCat = numCategories();
2356 unsigned int j, numEnt; 2356 unsigned int j, numEnt;
2357 string exp; 2357 string exp;
2358 for (i = 0; i < numCat; ++i) { 2358 for (i = 0; i < numCat; ++i) {
2359 numEnt = numEntries(i); 2359 numEnt = numEntries(i);
2360 2360
2361 exp = "\n== Category: "; 2361 exp = "\n== Category: ";
2362 exp += dti.dta[i].name; 2362 exp += dti.dta[i].name;
2363 exp += " ==\n"; 2363 exp += " ==\n";
2364#ifndef PWM_EMBEDDED 2364#ifndef PWM_EMBEDDED
2365 if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) { 2365 if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) {
2366 unlockAll_tempoary(true); 2366 unlockAll_tempoary(true);
2367 f.close(); 2367 f.close();
2368 return e_writeFile; 2368 return e_writeFile;
2369 } 2369 }
2370#else 2370#else
2371 if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) { 2371 if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) {
2372 unlockAll_tempoary(true); 2372 unlockAll_tempoary(true);
2373 f.close(); 2373 f.close();
2374 return e_writeFile; 2374 return e_writeFile;
2375 } 2375 }
2376#endif 2376#endif
2377 for (j = 0; j < numEnt; ++j) { 2377 for (j = 0; j < numEnt; ++j) {
2378 exp = "\n-- "; 2378 exp = "\n-- ";
2379 exp += dti.dta[i].d[j].desc; 2379 exp += dti.dta[i].d[j].desc;
2380 exp += " --\n"; 2380 exp += " --\n";
2381 2381
2382 exp += i18n("Username: ").latin1(); 2382 exp += i18n("Username: ").latin1();
2383 exp += dti.dta[i].d[j].name; 2383 exp += dti.dta[i].d[j].name;
2384 exp += "\n"; 2384 exp += "\n";
2385 2385
2386 exp += i18n("Password: ").latin1(); 2386 exp += i18n("Password: ").latin1();
2387 exp += dti.dta[i].d[j].pw; 2387 exp += dti.dta[i].d[j].pw;
2388 exp += "\n"; 2388 exp += "\n";
2389 2389
2390 exp += i18n("Comment: ").latin1(); 2390 exp += i18n("Comment: ").latin1();
2391 exp += dti.dta[i].d[j].comment; 2391 exp += dti.dta[i].d[j].comment;
2392 exp += "\n"; 2392 exp += "\n";
2393 2393
2394 exp += i18n("URL: ").latin1(); 2394 exp += i18n("URL: ").latin1();
2395 exp += dti.dta[i].d[j].url; 2395 exp += dti.dta[i].d[j].url;
2396 exp += "\n"; 2396 exp += "\n";
2397 2397
2398 exp += i18n("Launcher: ").latin1(); 2398 exp += i18n("Launcher: ").latin1();
2399 exp += dti.dta[i].d[j].launcher; 2399 exp += dti.dta[i].d[j].launcher;
2400 exp += "\n"; 2400 exp += "\n";
2401 2401
2402#ifndef PWM_EMBEDDED 2402#ifndef PWM_EMBEDDED
2403 if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) { 2403 if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) {
2404 unlockAll_tempoary(true); 2404 unlockAll_tempoary(true);
2405 f.close(); 2405 f.close();
2406 return e_writeFile; 2406 return e_writeFile;
2407 } 2407 }
2408#else 2408#else
2409 if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) { 2409 if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) {
2410 unlockAll_tempoary(true); 2410 unlockAll_tempoary(true);
2411 f.close(); 2411 f.close();
2412 return e_writeFile; 2412 return e_writeFile;
2413 } 2413 }
2414#endif 2414#endif
2415 } 2415 }
2416 } 2416 }
2417 unlockAll_tempoary(true); 2417 unlockAll_tempoary(true);
2418 f.close(); 2418 f.close();
2419 2419
2420 return e_success; 2420 return e_success;
2421} 2421}
2422 2422
2423PwMerror PwMDoc::importFromText(const QString *file, int format) 2423PwMerror PwMDoc::importFromText(const QString *file, int format)
2424{ 2424{
2425 PWM_ASSERT(file); 2425 PWM_ASSERT(file);
2426 if (format == 0) 2426 if (format == 0)
2427 return importText_PwM(file); 2427 return importText_PwM(file);
2428 else if (format == -1) { 2428 else if (format == -1) {
2429 // probe for all formats 2429 // probe for all formats
2430 if (importText_PwM(file) == e_success) 2430 if (importText_PwM(file) == e_success)
2431 return e_success; 2431 return e_success;
2432 dti.clear(); 2432 dti.clear();
2433 emitDataChanged(this); 2433 emitDataChanged(this);
2434 // add next format here... 2434 // add next format here...
2435 return e_fileFormat; 2435 return e_fileFormat;
2436 } 2436 }
2437 return e_invalidArg; 2437 return e_invalidArg;
2438} 2438}
2439 2439
2440PwMerror PwMDoc::importText_PwM(const QString *file) 2440PwMerror PwMDoc::importText_PwM(const QString *file)
2441{ 2441{
2442#ifndef PWM_EMBEDDED 2442#ifndef PWM_EMBEDDED
2443 PWM_ASSERT(file); 2443 PWM_ASSERT(file);
2444 FILE *f; 2444 FILE *f;
2445 int tmp; 2445 int tmp;
2446 ssize_t ret; 2446 ssize_t ret;
2447 string curCat; 2447 string curCat;
2448 unsigned int entriesRead = 0; 2448 unsigned int entriesRead = 0;
2449 PwMDataItem currItem; 2449 PwMDataItem currItem;
2450 f = fopen(file->latin1(), "r"); 2450 f = fopen(file->latin1(), "r");
2451 if (!f) 2451 if (!f)
2452 return e_openFile; 2452 return e_openFile;
2453 size_t ch_tmp_size = 1024; 2453 size_t ch_tmp_size = 1024;
2454 char *ch_tmp = (char*)malloc(ch_tmp_size); 2454 char *ch_tmp = (char*)malloc(ch_tmp_size);
2455 if (!ch_tmp) { 2455 if (!ch_tmp) {
2456 fclose(f); 2456 fclose(f);
2457 return e_outOfMem; 2457 return e_outOfMem;
2458 } 2458 }
2459 2459
2460 // - check header 2460 // - check header
2461 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) // skip first line. 2461 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) // skip first line.
2462 goto formatError; 2462 goto formatError;
2463 // check version-string and return version in "ch_tmp". 2463 // check version-string and return version in "ch_tmp".
2464 if (fscanf(f, "PwM v%s", ch_tmp) != 1) { 2464 if (fscanf(f, "PwM v%s", ch_tmp) != 1) {
2465 // header not recognized as PwM generated header 2465 // header not recognized as PwM generated header
2466 goto formatError; 2466 goto formatError;
2467 } 2467 }
2468 // set filepointer behind version-string-line previously checked 2468 // set filepointer behind version-string-line previously checked
2469 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2469 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2470 goto formatError; 2470 goto formatError;
2471 // skip next line containing the build-date 2471 // skip next line containing the build-date
2472 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2472 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2473 goto formatError; 2473 goto formatError;
2474 // read header termination line 2474 // read header termination line
2475 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2475 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2476 goto formatError; 2476 goto formatError;
2477 if (strcmp(ch_tmp, "==============================\n")) 2477 if (strcmp(ch_tmp, "==============================\n"))
2478 goto formatError; 2478 goto formatError;
2479 2479
2480 // - read entries 2480 // - read entries
2481 do { 2481 do {
2482 // find beginning of next category 2482 // find beginning of next category
2483 do { 2483 do {
2484 tmp = fgetc(f); 2484 tmp = fgetc(f);
2485 } while (tmp == '\n' && tmp != EOF); 2485 } while (tmp == '\n' && tmp != EOF);
2486 if (tmp == EOF) 2486 if (tmp == EOF)
2487 break; 2487 break;
2488 2488
2489 // decrement filepos by one 2489 // decrement filepos by one
2490 fseek(f, -1, SEEK_CUR); 2490 fseek(f, -1, SEEK_CUR);
2491 // read cat-name 2491 // read cat-name
2492 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2492 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2493 goto formatError; 2493 goto formatError;
2494 // check cat-name format 2494 // check cat-name format
2495 if (memcmp(ch_tmp, "== Category: ", 13) != 0) 2495 if (memcmp(ch_tmp, "== Category: ", 13) != 0)
2496 goto formatError; 2496 goto formatError;
2497 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " ==", 3) != 0) 2497 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " ==", 3) != 0)
2498 goto formatError; 2498 goto formatError;
2499 // copy cat-name 2499 // copy cat-name
2500 curCat.assign(ch_tmp + 13, strlen(ch_tmp) - 1 - 16); 2500 curCat.assign(ch_tmp + 13, strlen(ch_tmp) - 1 - 16);
2501 2501
2502 do { 2502 do {
2503 // find beginning of next entry 2503 // find beginning of next entry
2504 do { 2504 do {
2505 tmp = fgetc(f); 2505 tmp = fgetc(f);
2506 } while (tmp == '\n' && tmp != EOF && tmp != '='); 2506 } while (tmp == '\n' && tmp != EOF && tmp != '=');
2507 if (tmp == EOF) 2507 if (tmp == EOF)
2508 break; 2508 break;
2509 if (tmp == '=') { 2509 if (tmp == '=') {
2510 fseek(f, -1, SEEK_CUR); 2510 fseek(f, -1, SEEK_CUR);
2511 break; 2511 break;
2512 } 2512 }
2513 // decrement filepos by one 2513 // decrement filepos by one
2514 fseek(f, -1, SEEK_CUR); 2514 fseek(f, -1, SEEK_CUR);
2515 // read desc-line 2515 // read desc-line
2516 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2516 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2517 goto formatError; 2517 goto formatError;
2518 // check desc-line format 2518 // check desc-line format
2519 if (memcmp(ch_tmp, "-- ", 3) != 0) 2519 if (memcmp(ch_tmp, "-- ", 3) != 0)
2520 goto formatError; 2520 goto formatError;
2521 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " --", 3) != 0) 2521 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " --", 3) != 0)
2522 goto formatError; 2522 goto formatError;
2523 // add desc-line 2523 // add desc-line
2524 currItem.desc.assign(ch_tmp + 3, strlen(ch_tmp) - 1 - 6); 2524 currItem.desc.assign(ch_tmp + 3, strlen(ch_tmp) - 1 - 6);
2525 2525
2526 // read username-line 2526 // read username-line
2527 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2527 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2528 goto formatError; 2528 goto formatError;
2529 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.name)) 2529 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.name))
2530 goto formatError; 2530 goto formatError;
2531 2531
2532 // read pw-line 2532 // read pw-line
2533 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2533 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2534 goto formatError; 2534 goto formatError;
2535 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.pw)) 2535 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.pw))
2536 goto formatError; 2536 goto formatError;
2537 2537
2538 // read comment-line 2538 // read comment-line
2539 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2539 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2540 goto formatError; 2540 goto formatError;
2541 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.comment)) 2541 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.comment))
2542 goto formatError; 2542 goto formatError;
2543 2543
2544 // read URL-line 2544 // read URL-line
2545 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2545 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2546 goto formatError; 2546 goto formatError;
2547 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.url)) 2547 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.url))
2548 goto formatError; 2548 goto formatError;
2549 2549
2550 // read launcher-line 2550 // read launcher-line
2551 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2551 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2552 goto formatError; 2552 goto formatError;
2553 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.launcher)) 2553 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.launcher))
2554 goto formatError; 2554 goto formatError;
2555 2555
2556 currItem.lockStat = true; 2556 currItem.lockStat = true;
2557 currItem.listViewPos = -1; 2557 currItem.listViewPos = -1;
2558 addEntry(curCat.c_str(), &currItem, true); 2558 addEntry(curCat.c_str(), &currItem, true);
2559 ++entriesRead; 2559 ++entriesRead;
2560 } while (1); 2560 } while (1);
2561 } while (1); 2561 } while (1);
2562 if (!entriesRead) 2562 if (!entriesRead)
2563 goto formatError; 2563 goto formatError;
2564 2564
2565 free(ch_tmp); 2565 free(ch_tmp);
2566 fclose(f); 2566 fclose(f);
2567 flagDirty(); 2567 flagDirty();
2568 return e_success; 2568 return e_success;
2569 2569
2570 formatError: 2570 formatError:
2571 free(ch_tmp); 2571 free(ch_tmp);
2572 fclose(f); 2572 fclose(f);
2573 return e_fileFormat; 2573 return e_fileFormat;
2574#else 2574#else
2575 PWM_ASSERT(file); 2575 PWM_ASSERT(file);
2576 QFile f(file->latin1()); 2576 QFile f(file->latin1());
2577 int tmp; 2577 int tmp;
2578 ssize_t ret; 2578 ssize_t ret;
2579 string curCat; 2579 string curCat;
2580 unsigned int entriesRead = 0; 2580 unsigned int entriesRead = 0;
2581 PwMDataItem currItem; 2581 PwMDataItem currItem;
2582 bool res = f.open(IO_ReadOnly); 2582 bool res = f.open(IO_ReadOnly);
2583 if (res == false) 2583 if (res == false)
2584 return e_openFile; 2584 return e_openFile;
2585 2585
2586 unsigned int ch_tmp_size = 1024; 2586 unsigned int ch_tmp_size = 1024;
2587 char *ch_tmp = (char*)malloc(ch_tmp_size); 2587 char *ch_tmp = (char*)malloc(ch_tmp_size);
2588 if (!ch_tmp) { 2588 if (!ch_tmp) {
2589 f.close(); 2589 f.close();
2590 return e_outOfMem; 2590 return e_outOfMem;
2591 } 2591 }
2592 2592
2593 // - check header 2593 // - check header
2594 if (f.readLine(ch_tmp, ch_tmp_size) == -1) // skip first line. 2594 if (f.readLine(ch_tmp, ch_tmp_size) == -1) // skip first line.
2595 goto formatError; 2595 goto formatError;
2596 2596
2597 //US read fileversion first, then check if ok. 2597 //US read fileversion first, then check if ok.
2598 if (f.readLine(ch_tmp, ch_tmp_size) == -1) 2598 if (f.readLine(ch_tmp, ch_tmp_size) == -1)
2599 goto formatError; 2599 goto formatError;
2600 2600
2601 // check version-string and return version in "ch_tmp". 2601 // check version-string and return version in "ch_tmp".
2602 //US if (fscanf(f, "PwM v%s", ch_tmp) != 1) { 2602 //US if (fscanf(f, "PwM v%s", ch_tmp) != 1) {
2603 //US // header not recognized as PwM generated header 2603 //US // header not recognized as PwM generated header
2604 //US goto formatError; 2604 //US goto formatError;
2605 //US} 2605 //US}
2606 //US set filepointer behind version-string-line previously checked 2606 //US set filepointer behind version-string-line previously checked
2607 //US if (f.readLine(ch_tmp, ch_tmp_size) == -1) 2607 //US if (f.readLine(ch_tmp, ch_tmp_size) == -1)
2608 //US goto formatError; 2608 //US goto formatError;
2609 // skip next line containing the build-date 2609 // skip next line containing the build-date
2610 if (f.readLine(ch_tmp, ch_tmp_size) == -1) 2610 if (f.readLine(ch_tmp, ch_tmp_size) == -1)
2611 goto formatError; 2611 goto formatError;
2612 // read header termination line 2612 // read header termination line
2613 if (f.readLine(ch_tmp, ch_tmp_size) == -1) 2613 if (f.readLine(ch_tmp, ch_tmp_size) == -1)
2614 goto formatError; 2614 goto formatError;
2615 if (strcmp(ch_tmp, "==============================\n")) 2615 if (strcmp(ch_tmp, "==============================\n"))
2616 goto formatError; 2616 goto formatError;
2617 2617
2618 // - read entries 2618 // - read entries
2619 do { 2619 do {
2620 // find beginning of next category 2620 // find beginning of next category
2621 do { 2621 do {
2622 tmp = f.getch(); 2622 tmp = f.getch();
2623 } while (tmp == '\n' && tmp != EOF); 2623 } while (tmp == '\n' && tmp != EOF);
2624 if (tmp == EOF) 2624 if (tmp == EOF)
2625 break; 2625 break;
2626 2626
2627 // decrement filepos by one 2627 // decrement filepos by one
2628 f.at(f.at()-1); 2628 f.at(f.at()-1);
2629 // read cat-name 2629 // read cat-name
2630 if (f.readLine(ch_tmp, ch_tmp_size) == -1) 2630 if (f.readLine(ch_tmp, ch_tmp_size) == -1)
2631 goto formatError; 2631 goto formatError;
2632 // check cat-name format 2632 // check cat-name format
2633 if (memcmp(ch_tmp, "== Category: ", 13) != 0) 2633 if (memcmp(ch_tmp, "== Category: ", 13) != 0)
2634 goto formatError; 2634 goto formatError;
2635 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " ==", 3) != 0) 2635 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " ==", 3) != 0)
2636 goto formatError; 2636 goto formatError;
2637 // copy cat-name 2637 // copy cat-name
2638 curCat.assign(ch_tmp + 13, strlen(ch_tmp) - 1 - 16); 2638 curCat.assign(ch_tmp + 13, strlen(ch_tmp) - 1 - 16);
2639 2639
2640 do { 2640 do {
2641 // find beginning of next entry 2641 // find beginning of next entry
2642 do { 2642 do {
2643 tmp = f.getch(); 2643 tmp = f.getch();
2644 } while (tmp == '\n' && tmp != EOF && tmp != '='); 2644 } while (tmp == '\n' && tmp != EOF && tmp != '=');
2645 if (tmp == EOF) 2645 if (tmp == EOF)
2646 break; 2646 break;
2647 if (tmp == '=') { 2647 if (tmp == '=') {
2648 f.at(f.at()-1); 2648 f.at(f.at()-1);
2649 break; 2649 break;
2650 } 2650 }
2651 // decrement filepos by one 2651 // decrement filepos by one
2652 f.at(f.at()-1); 2652 f.at(f.at()-1);
2653 // read desc-line 2653 // read desc-line
2654 if (f.readLine(ch_tmp, ch_tmp_size) == -1) 2654 if (f.readLine(ch_tmp, ch_tmp_size) == -1)
2655 goto formatError; 2655 goto formatError;
2656 // check desc-line format 2656 // check desc-line format
2657 if (memcmp(ch_tmp, "-- ", 3) != 0) 2657 if (memcmp(ch_tmp, "-- ", 3) != 0)
2658 goto formatError; 2658 goto formatError;
2659 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " --", 3) != 0) 2659 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " --", 3) != 0)
2660 goto formatError; 2660 goto formatError;
2661 // add desc-line 2661 // add desc-line
2662 currItem.desc.assign(ch_tmp + 3, strlen(ch_tmp) - 1 - 6); 2662 currItem.desc.assign(ch_tmp + 3, strlen(ch_tmp) - 1 - 6);
2663 2663
2664 // read username-line 2664 // read username-line
2665 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1) 2665 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1)
2666 goto formatError; 2666 goto formatError;
2667 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.name)) 2667 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.name))
2668 goto formatError; 2668 goto formatError;
2669 2669
2670 // read pw-line 2670 // read pw-line
2671 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1) 2671 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1)
2672 goto formatError; 2672 goto formatError;
2673 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.pw)) 2673 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.pw))
2674 goto formatError; 2674 goto formatError;
2675 2675
2676 // read comment-line 2676 // read comment-line
2677 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1) 2677 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1)
2678 goto formatError; 2678 goto formatError;
2679 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.comment)) 2679 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.comment))
2680 goto formatError; 2680 goto formatError;
2681 2681
2682 // read URL-line 2682 // read URL-line
2683 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1) 2683 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1)
2684 goto formatError; 2684 goto formatError;
2685 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.url)) 2685 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.url))
2686 goto formatError; 2686 goto formatError;
2687 2687
2688 // read launcher-line 2688 // read launcher-line
2689 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1) 2689 if ((ret = f.readLine(ch_tmp, ch_tmp_size)) == -1)
2690 goto formatError; 2690 goto formatError;
2691 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.launcher)) 2691 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.launcher))
2692 goto formatError; 2692 goto formatError;
2693 2693
2694 currItem.lockStat = true; 2694 currItem.lockStat = true;
2695 currItem.listViewPos = -1; 2695 currItem.listViewPos = -1;
2696 addEntry(curCat.c_str(), &currItem, true); 2696 addEntry(curCat.c_str(), &currItem, true);
2697 ++entriesRead; 2697 ++entriesRead;
2698 } while (1); 2698 } while (1);
2699 } while (1); 2699 } while (1);
2700 if (!entriesRead) 2700 if (!entriesRead)
2701 goto formatError; 2701 goto formatError;
2702 2702
2703 free(ch_tmp); 2703 free(ch_tmp);
2704 f.close(); 2704 f.close();
2705 flagDirty(); 2705 flagDirty();
2706 return e_success; 2706 return e_success;
2707 2707
2708 formatError: 2708 formatError:
2709 free(ch_tmp); 2709 free(ch_tmp);
2710 f.close(); 2710 f.close();
2711 return e_fileFormat; 2711 return e_fileFormat;
2712 2712
2713#endif 2713#endif
2714 2714
2715} 2715}
2716 2716
2717bool PwMDoc::textExtractEntry_PwM(const char *in, ssize_t in_size, string *out) 2717bool PwMDoc::textExtractEntry_PwM(const char *in, ssize_t in_size, string *out)
2718{ 2718{
2719 PWM_ASSERT(in && out); 2719 PWM_ASSERT(in && out);
2720 ssize_t i = 0, len = in_size - 1; 2720 ssize_t i = 0, len = in_size - 1;
2721 while (i < len) { 2721 while (i < len) {
2722 if (in[i] == ':') 2722 if (in[i] == ':')
2723 break; 2723 break;
2724 ++i; 2724 ++i;
2725 } 2725 }
2726 i += 2; 2726 i += 2;
2727 *out = ""; 2727 *out = "";
2728 out->append(in + i, in_size - i - 1); 2728 out->append(in + i, in_size - i - 1);
2729 return true; 2729 return true;
2730} 2730}
2731 2731
2732PwMerror PwMDoc::exportToGpasman(const QString *file) 2732PwMerror PwMDoc::exportToGpasman(const QString *file)
2733{ 2733{
2734 PWM_ASSERT(file); 2734 PWM_ASSERT(file);
2735 GpasmanFile gp; 2735 GpasmanFile gp;
2736 int ret; 2736 int ret;
2737 2737
2738 if (!unlockAll_tempoary()) 2738 if (!unlockAll_tempoary())
2739 return e_lock; 2739 return e_lock;
2740 2740
2741 QString gpmPassword; 2741 QString gpmPassword;
2742 while (1) { 2742 while (1) {
2743 gpmPassword = requestNewMpw(0); 2743 gpmPassword = requestNewMpw(0);
2744 if (gpmPassword == "") { 2744 if (gpmPassword == "") {
2745 unlockAll_tempoary(true); 2745 unlockAll_tempoary(true);
2746 return e_noPw; 2746 return e_noPw;
2747 } 2747 }
2748 if (gpmPassword.length() < 4) { 2748 if (gpmPassword.length() < 4) {
2749 gpmPwLenErrMsgBox(); 2749 gpmPwLenErrMsgBox();
2750 } else { 2750 } else {
2751 break; 2751 break;
2752 } 2752 }
2753 } 2753 }
2754 2754
2755 ret = gp.save_init(file->latin1(), gpmPassword.latin1()); 2755 ret = gp.save_init(file->latin1(), gpmPassword.latin1());
2756 if (ret != 1) { 2756 if (ret != 1) {
2757 unlockAll_tempoary(true); 2757 unlockAll_tempoary(true);
2758 return e_accessFile; 2758 return e_accessFile;
2759 } 2759 }
2760 2760
2761 char *entry[4]; 2761 char *entry[4];
2762 unsigned int numCat = numCategories(), i; 2762 unsigned int numCat = numCategories(), i;
2763 unsigned int numEntr, j; 2763 unsigned int numEntr, j;
2764 int descLen, nameLen, pwLen, commentLen; 2764 int descLen, nameLen, pwLen, commentLen;
2765 for (i = 0; i < numCat; ++i) { 2765 for (i = 0; i < numCat; ++i) {
2766 numEntr = numEntries(i); 2766 numEntr = numEntries(i);
2767 for (j = 0; j < numEntr; ++j) { 2767 for (j = 0; j < numEntr; ++j) {
2768 descLen = dti.dta[i].d[j].desc.length(); 2768 descLen = dti.dta[i].d[j].desc.length();
2769 nameLen = dti.dta[i].d[j].name.length(); 2769 nameLen = dti.dta[i].d[j].name.length();
2770 pwLen = dti.dta[i].d[j].pw.length(); 2770 pwLen = dti.dta[i].d[j].pw.length();
2771 commentLen = dti.dta[i].d[j].comment.length(); 2771 commentLen = dti.dta[i].d[j].comment.length();
2772 entry[0] = new char[descLen + 1]; 2772 entry[0] = new char[descLen + 1];
2773 entry[1] = new char[nameLen + 1]; 2773 entry[1] = new char[nameLen + 1];
2774 entry[2] = new char[pwLen + 1]; 2774 entry[2] = new char[pwLen + 1];
2775 entry[3] = new char[commentLen + 1]; 2775 entry[3] = new char[commentLen + 1];
2776 strcpy(entry[0], descLen == 0 ? " " : dti.dta[i].d[j].desc.c_str()); 2776 strcpy(entry[0], descLen == 0 ? " " : dti.dta[i].d[j].desc.c_str());
2777 strcpy(entry[1], nameLen == 0 ? " " : dti.dta[i].d[j].name.c_str()); 2777 strcpy(entry[1], nameLen == 0 ? " " : dti.dta[i].d[j].name.c_str());
2778 strcpy(entry[2], pwLen == 0 ? " " : dti.dta[i].d[j].pw.c_str()); 2778 strcpy(entry[2], pwLen == 0 ? " " : dti.dta[i].d[j].pw.c_str());
2779 strcpy(entry[3], commentLen == 0 ? " " : dti.dta[i].d[j].comment.c_str()); 2779 strcpy(entry[3], commentLen == 0 ? " " : dti.dta[i].d[j].comment.c_str());
2780 entry[0][descLen == 0 ? descLen + 1 : descLen] = '\0'; 2780 entry[0][descLen == 0 ? descLen + 1 : descLen] = '\0';
2781 entry[1][nameLen == 0 ? nameLen + 1 : nameLen] = '\0'; 2781 entry[1][nameLen == 0 ? nameLen + 1 : nameLen] = '\0';
2782 entry[2][pwLen == 0 ? pwLen + 1 : pwLen] = '\0'; 2782 entry[2][pwLen == 0 ? pwLen + 1 : pwLen] = '\0';
2783 entry[3][commentLen == 0 ? commentLen + 1 : commentLen] = '\0'; 2783 entry[3][commentLen == 0 ? commentLen + 1 : commentLen] = '\0';
2784 2784
2785 ret = gp.save_entry(entry); 2785 ret = gp.save_entry(entry);
2786 if (ret == -1){ 2786 if (ret == -1){
2787 delete [] entry[0]; 2787 delete [] entry[0];
2788 delete [] entry[1]; 2788 delete [] entry[1];
2789 delete [] entry[2]; 2789 delete [] entry[2];
2790 delete [] entry[3]; 2790 delete [] entry[3];
2791 gp.save_finalize(); 2791 gp.save_finalize();
2792 unlockAll_tempoary(true); 2792 unlockAll_tempoary(true);
2793 return e_writeFile; 2793 return e_writeFile;
2794 } 2794 }
2795 2795
2796 delete [] entry[0]; 2796 delete [] entry[0];
2797 delete [] entry[1]; 2797 delete [] entry[1];
2798 delete [] entry[2]; 2798 delete [] entry[2];
2799 delete [] entry[3]; 2799 delete [] entry[3];
2800 } 2800 }
2801 } 2801 }
2802 unlockAll_tempoary(true); 2802 unlockAll_tempoary(true);
2803 if (gp.save_finalize() == -1) 2803 if (gp.save_finalize() == -1)
2804 return e_writeFile; 2804 return e_writeFile;
2805 2805
2806 return e_success; 2806 return e_success;
2807} 2807}
2808 2808
2809PwMerror PwMDoc::importFromGpasman(const QString *file) 2809PwMerror PwMDoc::importFromGpasman(const QString *file)
2810{ 2810{
2811 PWM_ASSERT(file); 2811 PWM_ASSERT(file);
2812 QString pw = requestMpw(false); 2812 QString pw = requestMpw(false);
2813 if (pw == "") 2813 if (pw == "")
2814 return e_noPw; 2814 return e_noPw;
2815 GpasmanFile gp; 2815 GpasmanFile gp;
2816 int ret, i; 2816 int ret, i;
2817 PwMerror ret2; 2817 PwMerror ret2;
2818 char *entry[4]; 2818 char *entry[4];
2819 PwMDataItem tmpData; 2819 PwMDataItem tmpData;
2820 ret = gp.load_init(file->latin1(), pw.latin1()); 2820 ret = gp.load_init(file->latin1(), pw.latin1());
2821 if (ret != 1) 2821 if (ret != 1)
2822 return e_accessFile; 2822 return e_accessFile;
2823 2823
2824 do { 2824 do {
2825 ret = gp.load_entry(entry); 2825 ret = gp.load_entry(entry);
2826 if(ret != 1) 2826 if(ret != 1)
2827 break; 2827 break;
2828 tmpData.desc = entry[0]; 2828 tmpData.desc = entry[0];
2829 tmpData.name = entry[1]; 2829 tmpData.name = entry[1];
2830 tmpData.pw = entry[2]; 2830 tmpData.pw = entry[2];
2831 tmpData.comment = entry[3]; 2831 tmpData.comment = entry[3];
2832 tmpData.lockStat = true; 2832 tmpData.lockStat = true;
2833 tmpData.listViewPos = -1; 2833 tmpData.listViewPos = -1;
2834 ret2 = addEntry(DEFAULT_CATEGORY, &tmpData, true); 2834 ret2 = addEntry(DEFAULT_CATEGORY, &tmpData, true);
2835 for (i = 0; i < 4; ++i) 2835 for (i = 0; i < 4; ++i)
2836 free(entry[i]); 2836 free(entry[i]);
2837 if (ret2 == e_maxAllowedEntr) { 2837 if (ret2 == e_maxAllowedEntr) {
2838 gp.load_finalize(); 2838 gp.load_finalize();
2839 return e_maxAllowedEntr; 2839 return e_maxAllowedEntr;
2840 } 2840 }
2841 } while (1); 2841 } while (1);
2842 gp.load_finalize(); 2842 gp.load_finalize();
2843 if (isDocEmpty()) 2843 if (isDocEmpty())
2844 return e_wrongPw; // we assume this. 2844 return e_wrongPw; // we assume this.
2845 2845
2846 flagDirty(); 2846 flagDirty();
2847 return e_success; 2847 return e_success;
2848} 2848}
2849 2849
2850 2850
2851//US: we use the stl sort algorythm to sort all elements in the order 2851//US: we use the stl sort algorythm to sort all elements in the order
2852//of its listViewPos (in the order 1,2,3,5,...,x,-1, -1, -1 2852//of its listViewPos (in the order 1,2,3,5,...,x,-1, -1, -1
2853struct PwMDataItemListViewPosSort 2853struct PwMDataItemListViewPosSort
2854{ 2854{
2855 bool operator()(PwMDataItem* rpStart, PwMDataItem* rpEnd) 2855 bool operator()(PwMDataItem* rpStart, PwMDataItem* rpEnd)
2856 { 2856 {
2857 //qDebug("pwMDoc::PwMDataItemListViewPosSort()"); 2857 //qDebug("pwMDoc::PwMDataItemListViewPosSort()");
2858 if ((rpEnd)->listViewPos < 0) 2858 if ((rpEnd)->listViewPos < 0)
2859 return false; 2859 return false;
2860 else 2860 else
2861 return (rpStart)->listViewPos < (rpEnd)->listViewPos; 2861 return (rpStart)->listViewPos < (rpEnd)->listViewPos;
2862 } 2862 }
2863}; 2863};
2864 2864
2865void PwMDoc::ensureLvp() 2865void PwMDoc::ensureLvp()
2866{ 2866{
2867 if (isDocEmpty()) 2867 if (isDocEmpty())
2868 return; 2868 return;
2869 2869
2870 //US ENH BUG: when using syncronizing, this way of sorting 2870 //US ENH BUG: when using syncronizing, this way of sorting
2871 //is not sufficient, because there might be empty spaces 2871 //is not sufficient, because there might be empty spaces
2872 // at the beginning. But the old algorythm only can add elements 2872 // at the beginning. But the old algorythm only can add elements
2873 //to the end.The result are crashes because of list overflows 2873 //to the end.The result are crashes because of list overflows
2874 //we need something to fill all gaps. 2874 //we need something to fill all gaps.
2875 vector<PwMDataItem*> sorted; 2875 vector<PwMDataItem*> sorted;
2876 vector< PwMDataItem*>::iterator sortedBegin, 2876 vector< PwMDataItem*>::iterator sortedBegin,
2877 sortedEnd, 2877 sortedEnd,
2878 sortedI; 2878 sortedI;
2879 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), 2879 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(),
2880 catEnd = dti.dta.end(), 2880 catEnd = dti.dta.end(),
2881 catI = catBegin; 2881 catI = catBegin;
2882 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 2882 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
2883 int lvpTop, tmpLvp; 2883 int lvpTop, tmpLvp;
2884 2884
2885 //qDebug("collect:"); 2885 //qDebug("collect:");
2886 2886
2887 while (catI != catEnd) { 2887 while (catI != catEnd) {
2888 lvpTop = -1; 2888 lvpTop = -1;
2889 sorted.clear(); 2889 sorted.clear();
2890 2890
2891 entrBegin = catI->d.begin(); 2891 entrBegin = catI->d.begin();
2892 entrEnd = catI->d.end(); 2892 entrEnd = catI->d.end();
2893 entrI = entrBegin; 2893 entrI = entrBegin;
2894 2894
2895 //US: we use the stl sort algorythm to sort all elements in the order 2895 //US: we use the stl sort algorythm to sort all elements in the order
2896 //of its listViewPos (in the order 1,2,2,3,5,...,x,-1, -1, -1 2896 //of its listViewPos (in the order 1,2,2,3,5,...,x,-1, -1, -1
2897 while (entrI != entrEnd) { 2897 while (entrI != entrEnd) {
2898 //qDebug("found: %s, pos=%i", (*entrI).desc.c_str(), (*entrI).listViewPos); 2898 //qDebug("found: %s, pos=%i", (*entrI).desc.c_str(), (*entrI).listViewPos);
2899 sorted.push_back((PwMDataItem*)&(*entrI)); 2899 sorted.push_back((PwMDataItem*)&(*entrI));
2900 ++entrI; 2900 ++entrI;
2901 } 2901 }
2902 2902
2903 sortedBegin = sorted.begin(); 2903 sortedBegin = sorted.begin();
2904 sortedEnd = sorted.end(); 2904 sortedEnd = sorted.end();
2905 2905
2906 sort(sortedBegin, sortedEnd, PwMDataItemListViewPosSort()); 2906 sort(sortedBegin, sortedEnd, PwMDataItemListViewPosSort());
2907 2907
2908 // qDebug("resort:"); 2908 // qDebug("resort:");
2909 //now we have all sorted in a collection 2909 //now we have all sorted in a collection
2910 //Now start with the sorted and reset listviewpos. 2910 //Now start with the sorted and reset listviewpos.
2911 sortedBegin = sorted.begin(); 2911 sortedBegin = sorted.begin();
2912 sortedEnd = sorted.end(); 2912 sortedEnd = sorted.end();
2913 sortedI = sortedBegin; 2913 sortedI = sortedBegin;
2914 2914
2915 while (sortedI != sortedEnd) { 2915 while (sortedI != sortedEnd) {
2916 // qDebug("reset defined: %s, from pos=%i to pos=%i", (*sortedI)->desc.c_str(), (*sortedI)->listViewPos, lvpTop+1); 2916 // qDebug("reset defined: %s, from pos=%i to pos=%i", (*sortedI)->desc.c_str(), (*sortedI)->listViewPos, lvpTop+1);
2917 (*sortedI)->listViewPos = ++lvpTop; 2917 (*sortedI)->listViewPos = ++lvpTop;
2918 ++sortedI; 2918 ++sortedI;
2919 } 2919 }
2920 2920
2921 /*/debug 2921 /*/debug
2922 entrBegin = catI->d.begin(); 2922 entrBegin = catI->d.begin();
2923 entrEnd = catI->d.end(); 2923 entrEnd = catI->d.end();
2924 entrI = entrBegin; 2924 entrI = entrBegin;
2925 2925
2926 while (entrI != entrEnd) { 2926 while (entrI != entrEnd) {
2927 qDebug("check: %s, pos=%i", (*entrI).desc.c_str(), (*entrI).listViewPos); 2927 qDebug("check: %s, pos=%i", (*entrI).desc.c_str(), (*entrI).listViewPos);
2928 ++entrI; 2928 ++entrI;
2929 } 2929 }
2930 */ 2930 */
2931 2931
2932 ++catI; 2932 ++catI;
2933 } 2933 }
2934} 2934}
2935 2935
2936QString PwMDoc::getTitle() 2936QString PwMDoc::getTitle()
2937{ 2937{
2938 /* NOTE: We have to ensure, that the returned title 2938 /* NOTE: We have to ensure, that the returned title
2939 * is unique and not reused somewhere else while 2939 * is unique and not reused somewhere else while
2940 * this document is valid (open). 2940 * this document is valid (open).
2941 */ 2941 */
2942 QString title(getFilename()); 2942 QString title(getFilename());
2943 2943
2944 //US ENH: The whole filename on PDAs is too long. So use only the last characters 2944 //US ENH: The whole filename on PDAs is too long. So use only the last characters
2945 if (QApplication::desktop()->width() < 640) 2945 if (QApplication::desktop()->width() < 640)
2946 { 2946 {
2947 if (title.length() > 30) 2947 if (title.length() > 30)
2948 title = "..." + title.right(30); 2948 title = "..." + title.right(30);
2949 2949
2950 } 2950 }
2951 2951
2952 2952
2953 if (title.isEmpty()) { 2953 if (title.isEmpty()) {
2954 if (unnamedNum == 0) { 2954 if (unnamedNum == 0) {
2955 unnamedNum = PwMDocList::getNewUnnamedNumber(); 2955 unnamedNum = PwMDocList::getNewUnnamedNumber();
2956 PWM_ASSERT(unnamedNum != 0); 2956 PWM_ASSERT(unnamedNum != 0);
2957 } 2957 }
2958 title = DEFAULT_TITLE; 2958 title = DEFAULT_TITLE;
2959 title += " "; 2959 title += " ";
2960 title += tostr(unnamedNum).c_str(); 2960 title += tostr(unnamedNum).c_str();
2961 } 2961 }
2962 return title; 2962 return title;
2963} 2963}
2964 2964
2965bool PwMDoc::tryDelete() 2965bool PwMDoc::tryDelete()
2966{ 2966{
2967 if (deleted) 2967 if (deleted)
2968 return true; 2968 return true;
2969 int ret; 2969 int ret;
2970 if (isDirty()) { 2970 if (isDirty()) {
2971 ret = dirtyAskSave(getTitle()); 2971 ret = dirtyAskSave(getTitle());
2972 if (ret == 0) { // save to disk 2972 if (ret == 0) { // save to disk
2973 if (!saveDocUi(this)) 2973 if (!saveDocUi(this))
2974 goto out_ignore; 2974 goto out_ignore;
2975 } else if (ret == 1) { // don't save and delete 2975 } else if (ret == 1) { // don't save and delete
2976 goto out_accept; 2976 goto out_accept;
2977 } else { // cancel operation 2977 } else { // cancel operation
2978 goto out_ignore; 2978 goto out_ignore;
2979 } 2979 }
2980 } 2980 }
2981out_accept: 2981out_accept:
2982 deleted = true; 2982 deleted = true;
2983 delete this; 2983 delete this;
2984 return true; 2984 return true;
2985out_ignore: 2985out_ignore:
2986 return false; 2986 return false;
2987} 2987}
2988 2988
2989 2989
2990 2990
2991#ifdef PWM_EMBEDDED 2991#ifdef PWM_EMBEDDED
2992//US ENH: this is the magic function that syncronizes the this doc with the remote doc 2992//US ENH: this is the magic function that syncronizes the this doc with the remote doc
2993//US it could have been defined as static, but I did not want to. 2993//US it could have been defined as static, but I did not want to.
2994PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* syncRemote, int mode ) 2994PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* syncRemote, int mode )
2995{ 2995{
2996 int addedPasswordsLocal = 0; 2996 int addedPasswordsLocal = 0;
2997 int addedPasswordsRemote = 0; 2997 int addedPasswordsRemote = 0;
2998 int deletedPasswordsRemote = 0; 2998 int deletedPasswordsRemote = 0;
2999 int deletedPasswordsLocal = 0; 2999 int deletedPasswordsLocal = 0;
3000 int changedLocal = 0; 3000 int changedLocal = 0;
3001 int changedRemote = 0; 3001 int changedRemote = 0;
3002 3002
3003 PwMSyncItem* syncItemLocal; 3003 PwMSyncItem* syncItemLocal;
3004 PwMSyncItem* syncItemRemote; 3004 PwMSyncItem* syncItemRemote;
3005 3005
3006 QString mCurrentSyncName = manager->getCurrentSyncName(); 3006 QString mCurrentSyncName = manager->getCurrentSyncName();
3007 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 3007 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
3008 3008
3009 bool fullDateRange = false; 3009 bool fullDateRange = false;
3010 int take; 3010 int take;
3011 // local->resetTempSyncStat(); 3011 // local->resetTempSyncStat();
3012 QDateTime mLastSync = QDateTime::currentDateTime(); 3012 QDateTime mLastSync = QDateTime::currentDateTime();
3013 QDateTime modifiedSync = mLastSync; 3013 QDateTime modifiedSync = mLastSync;
3014 3014
3015 unsigned int index; 3015 unsigned int index;
3016 //Step 1. Find syncinfo in Local file and create if not existent. 3016 //Step 1. Find syncinfo in Local file and create if not existent.
3017 bool found = syncLocal->findSyncData(mCurrentSyncDevice, &index); 3017 bool found = syncLocal->findSyncData(mCurrentSyncDevice, &index);
3018 if (found == false) 3018 if (found == false)
3019 { 3019 {
3020 PwMSyncItem newSyncItemLocal; 3020 PwMSyncItem newSyncItemLocal;
3021 newSyncItemLocal.syncName = mCurrentSyncDevice; 3021 newSyncItemLocal.syncName = mCurrentSyncDevice.latin1();
3022 newSyncItemLocal.lastSyncDate = mLastSync; 3022 newSyncItemLocal.lastSyncDate = mLastSync;
3023 syncLocal->addSyncDataEntry(&newSyncItemLocal, true); 3023 syncLocal->addSyncDataEntry(&newSyncItemLocal, true);
3024 found = syncLocal->findSyncData(mCurrentSyncDevice, &index); 3024 found = syncLocal->findSyncData(mCurrentSyncDevice, &index);
3025 if (found == false) { 3025 if (found == false) {
3026 qDebug("PwMDoc::syncronize : newly created local sync data could not be found"); 3026 qDebug("PwMDoc::syncronize : newly created local sync data could not be found");
3027 return e_syncError; 3027 return e_syncError;
3028 } 3028 }
3029 } 3029 }
3030 3030
3031 syncItemLocal = syncLocal->getSyncDataEntry(index); 3031 syncItemLocal = syncLocal->getSyncDataEntry(index);
3032 qDebug("Last Sync Local %s ", syncItemLocal->lastSyncDate.toString().latin1()); 3032 qDebug("Last Sync Local %s ", syncItemLocal->lastSyncDate.toString().latin1());
3033 3033
3034 //Step 2. Find syncinfo in remote file and create if not existent. 3034 //Step 2. Find syncinfo in remote file and create if not existent.
3035 found = syncRemote->findSyncData(mCurrentSyncName, &index); 3035 found = syncRemote->findSyncData(mCurrentSyncName, &index);
3036 if (found == false) 3036 if (found == false)
3037 { 3037 {
3038 qDebug("FULLDATE 1"); 3038 qDebug("FULLDATE 1");
3039 fullDateRange = true; 3039 fullDateRange = true;
3040 PwMSyncItem newSyncItemRemote; 3040 PwMSyncItem newSyncItemRemote;
3041 newSyncItemRemote.syncName = mCurrentSyncName; 3041 newSyncItemRemote.syncName = mCurrentSyncName.latin1();
3042 newSyncItemRemote.lastSyncDate = mLastSync; 3042 newSyncItemRemote.lastSyncDate = mLastSync;
3043 syncRemote->addSyncDataEntry(&newSyncItemRemote, true); 3043 syncRemote->addSyncDataEntry(&newSyncItemRemote, true);
3044 found = syncRemote->findSyncData(mCurrentSyncName, &index); 3044 found = syncRemote->findSyncData(mCurrentSyncName, &index);
3045 if (found == false) { 3045 if (found == false) {
3046 qDebug("PwMDoc::syncronize : newly created remote sync data could not be found"); 3046 qDebug("PwMDoc::syncronize : newly created remote sync data could not be found");
3047 return e_syncError; 3047 return e_syncError;
3048 } 3048 }
3049 } 3049 }
3050 3050
3051 syncItemRemote = syncRemote->getSyncDataEntry(index); 3051 syncItemRemote = syncRemote->getSyncDataEntry(index);
3052 qDebug("Last Sync Remote %s ", syncItemRemote->lastSyncDate.toString().latin1()); 3052 qDebug("Last Sync Remote %s ", syncItemRemote->lastSyncDate.toString().latin1());
3053 //and remove the found entry here. We will reenter it later again. 3053 //and remove the found entry here. We will reenter it later again.
3054 //US syncRemote->delSyncDataEntry(index, true); 3054 //US syncRemote->delSyncDataEntry(index, true);
3055 3055
3056 3056
3057 if ( syncItemLocal->lastSyncDate == mLastSync ) { 3057 if ( syncItemLocal->lastSyncDate == mLastSync ) {
3058 qDebug("FULLDATE 2"); 3058 qDebug("FULLDATE 2");
3059 fullDateRange = true; 3059 fullDateRange = true;
3060 } 3060 }
3061 3061
3062 if ( ! fullDateRange ) { 3062 if ( ! fullDateRange ) {
3063 if ( syncItemLocal->lastSyncDate != syncItemRemote->lastSyncDate ) { 3063 if ( syncItemLocal->lastSyncDate != syncItemRemote->lastSyncDate ) {
3064 3064
3065 fullDateRange = true; 3065 fullDateRange = true;
3066 qDebug("FULLDATE 3 %s %s", syncItemLocal->lastSyncDate.toString().latin1() , syncItemRemote->lastSyncDate.toString().latin1() ); 3066 qDebug("FULLDATE 3 %s %s", syncItemLocal->lastSyncDate.toString().latin1() , syncItemRemote->lastSyncDate.toString().latin1() );
3067 } 3067 }
3068 } 3068 }
3069 // fullDateRange = true; // debug only! 3069 // fullDateRange = true; // debug only!
3070 if ( fullDateRange ) 3070 if ( fullDateRange )
3071 mLastSync = QDateTime::currentDateTime().addDays( -100*365); 3071 mLastSync = QDateTime::currentDateTime().addDays( -100*365);
3072 else 3072 else
3073 mLastSync = syncItemLocal->lastSyncDate; 3073 mLastSync = syncItemLocal->lastSyncDate;
3074 3074
3075 3075
3076 qDebug("*************************** "); 3076 qDebug("*************************** ");
3077 qDebug("mLastSync %s ",mLastSync.toString().latin1() ); 3077 qDebug("mLastSync %s ",mLastSync.toString().latin1() );
3078 QStringList er = syncRemote->getIDEntryList(); 3078 QStringList er = syncRemote->getIDEntryList();
3079 PwMDataItem* inRemote ;//= er.first(); 3079 PwMDataItem* inRemote ;//= er.first();
3080 PwMDataItem* inLocal; 3080 PwMDataItem* inLocal;
3081 unsigned int catLocal, indexLocal; 3081 unsigned int catLocal, indexLocal;
3082 unsigned int catRemote, indexRemote; 3082 unsigned int catRemote, indexRemote;
3083 3083
3084 QString uid; 3084 QString uid;
3085 manager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count()); 3085 manager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count());
3086 3086
3087 int modulo = (er.count()/10)+1; 3087 int modulo = (er.count()/10)+1;
3088 unsigned int incCounter = 0; 3088 unsigned int incCounter = 0;
3089 while ( incCounter < er.count()) { 3089 while ( incCounter < er.count()) {
3090 if (manager->isProgressBarCanceled()) 3090 if (manager->isProgressBarCanceled())
3091 return e_syncError; 3091 return e_syncError;
3092 if ( incCounter % modulo == 0 ) 3092 if ( incCounter % modulo == 0 )
3093 manager->showProgressBar(incCounter); 3093 manager->showProgressBar(incCounter);
3094 3094
3095 uid = er[ incCounter ]; 3095 uid = er[ incCounter ];
3096 qDebug("sync uid %s from remote file", uid.latin1()); 3096 qDebug("sync uid %s from remote file", uid.latin1());
3097 3097
3098 qApp->processEvents(); 3098 qApp->processEvents();
3099 3099
3100 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); 3100 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal );
3101 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote ); 3101 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote );
3102 PWM_ASSERT(inRemote); 3102 PWM_ASSERT(inRemote);
3103 if ( inLocal != 0 ) { // maybe conflict - same uid in both files 3103 if ( inLocal != 0 ) { // maybe conflict - same uid in both files
3104 if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) { 3104 if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) {
3105 qDebug("take %d %s ", take, inLocal->desc.c_str()); 3105 qDebug("take %d %s ", take, inLocal->desc.c_str());
3106 if ( take == 3 ) 3106 if ( take == 3 )
3107 return e_syncError; 3107 return e_syncError;
3108 if ( take == 1 ) {// take local 3108 if ( take == 1 ) {// take local
3109 int oldlistpos = inRemote->listViewPos; 3109 int oldlistpos = inRemote->listViewPos;
3110 (*inRemote) = (*inLocal); 3110 (*inRemote) = (*inLocal);
3111 inRemote->listViewPos = oldlistpos; 3111 inRemote->listViewPos = oldlistpos;
3112 ++changedRemote; 3112 ++changedRemote;
3113 } else { // take == 2 take remote 3113 } else { // take == 2 take remote
3114 int oldlistpos = inLocal->listViewPos; 3114 int oldlistpos = inLocal->listViewPos;
3115 (*inLocal) = (*inRemote); 3115 (*inLocal) = (*inRemote);
3116 inLocal->listViewPos = oldlistpos; 3116 inLocal->listViewPos = oldlistpos;
3117 ++changedLocal; 3117 ++changedLocal;
3118 } 3118 }
3119 } 3119 }
3120 } else { // no conflict 3120 } else { // no conflict
3121 if ( inRemote->meta.update > mLastSync || mode == 5 ) { 3121 if ( inRemote->meta.update > mLastSync || mode == 5 ) {
3122 inRemote->meta.update = modifiedSync; 3122 inRemote->meta.update = modifiedSync;
3123 3123
3124 //first check if we have a matching category in the local file 3124 //first check if we have a matching category in the local file
3125 const string* remotecat = syncRemote->getCategory(catRemote); 3125 const string* remotecat = syncRemote->getCategory(catRemote);
3126 //US syncRemote->insertAddressee( inRemote, false ); 3126 //US syncRemote->insertAddressee( inRemote, false );
3127 //US syncLocal->insertAddressee( inRemote, false ); 3127 //US syncLocal->insertAddressee( inRemote, false );
3128 syncLocal->addEntry(remotecat->c_str(), inRemote, true, false); 3128 syncLocal->addEntry(remotecat->c_str(), inRemote, true, false);
3129 3129
3130 ++addedPasswordsLocal; 3130 ++addedPasswordsLocal;
3131 } else { 3131 } else {
3132 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR); 3132 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR);
3133 syncRemote->delEntry(catRemote, indexRemote, true); 3133 syncRemote->delEntry(catRemote, indexRemote, true);
3134 //USsyncRemote->removeAddressee( inRemote ); 3134 //USsyncRemote->removeAddressee( inRemote );
3135 ++deletedPasswordsRemote; 3135 ++deletedPasswordsRemote;
3136 } 3136 }
3137 } 3137 }
3138 3138
3139 ++incCounter; 3139 ++incCounter;
3140 } 3140 }
3141 3141
3142 3142
3143 er.clear(); 3143 er.clear();
3144 QStringList el = syncLocal->getIDEntryList(); 3144 QStringList el = syncLocal->getIDEntryList();
3145 modulo = (el.count()/10)+1; 3145 modulo = (el.count()/10)+1;
3146 3146
3147 manager->showProgressBar(0, i18n("Add / remove addressees"), el.count()); 3147 manager->showProgressBar(0, i18n("Add / remove addressees"), el.count());
3148 incCounter = 0; 3148 incCounter = 0;
3149 while ( incCounter < el.count()) { 3149 while ( incCounter < el.count()) {
3150 qApp->processEvents(); 3150 qApp->processEvents();
3151 if (manager->isProgressBarCanceled()) 3151 if (manager->isProgressBarCanceled())
3152 return e_syncError; 3152 return e_syncError;
3153 if ( incCounter % modulo == 0 ) 3153 if ( incCounter % modulo == 0 )
3154 manager->showProgressBar(incCounter); 3154 manager->showProgressBar(incCounter);
3155 uid = el[ incCounter ]; 3155 uid = el[ incCounter ];
3156 qDebug("sync uid %s from local file", uid.latin1()); 3156 qDebug("sync uid %s from local file", uid.latin1());
3157 3157
3158 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); 3158 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal );
3159 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote ); 3159 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote );
3160 PWM_ASSERT(inLocal); 3160 PWM_ASSERT(inLocal);
3161 3161
3162 if ( inRemote == 0 ) { 3162 if ( inRemote == 0 ) {
3163 if ( inLocal->meta.update < mLastSync && mode != 4 ) { 3163 if ( inLocal->meta.update < mLastSync && mode != 4 ) {
3164 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL); 3164 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL);
3165 syncLocal->delEntry(catLocal, indexLocal, true); 3165 syncLocal->delEntry(catLocal, indexLocal, true);
3166 //USsyncLocal->removeAddressee( inLocal ); 3166 //USsyncLocal->removeAddressee( inLocal );
3167 ++deletedPasswordsLocal; 3167 ++deletedPasswordsLocal;
3168 } else { 3168 } else {
3169 if ( ! manager->mWriteBackExistingOnly ) { 3169 if ( ! manager->mWriteBackExistingOnly ) {
3170 ++addedPasswordsRemote; 3170 ++addedPasswordsRemote;
3171 inLocal->meta.update = modifiedSync; 3171 inLocal->meta.update = modifiedSync;
3172 3172
3173 //first check if we have a matching category in the remote file 3173 //first check if we have a matching category in the remote file
3174 const string* localcat = syncLocal->getCategory(catLocal); 3174 const string* localcat = syncLocal->getCategory(catLocal);
3175 3175
3176 //USsyncLocal->insertAddressee( inLocal, false ); 3176 //USsyncLocal->insertAddressee( inLocal, false );
3177 PwMDataItem newEntry; 3177 PwMDataItem newEntry;
3178 newEntry = *inLocal; 3178 newEntry = *inLocal;
3179 inRemote = &newEntry; 3179 inRemote = &newEntry;
3180 3180
3181 //USsyncRemote->insertAddressee( inRemote, false ); 3181 //USsyncRemote->insertAddressee( inRemote, false );
3182 syncRemote->addEntry(localcat->c_str(), inRemote, true, false); 3182 syncRemote->addEntry(localcat->c_str(), inRemote, true, false);
3183 3183
3184 } 3184 }
3185 } 3185 }
3186 3186
3187 } 3187 }
3188 ++incCounter; 3188 ++incCounter;
3189 } 3189 }
3190 el.clear(); 3190 el.clear();
3191 manager->hideProgressBar(); 3191 manager->hideProgressBar();
3192 3192
3193 // Now write the info back into the sync data space of the files 3193 // Now write the info back into the sync data space of the files
3194 3194
3195 mLastSync = QDateTime::currentDateTime().addSecs( 1 ); 3195 mLastSync = QDateTime::currentDateTime().addSecs( 1 );
3196 // get rid of micro seconds 3196 // get rid of micro seconds
3197 QTime t = mLastSync.time(); 3197 QTime t = mLastSync.time();
3198 mLastSync.setTime( QTime (t.hour (), t.minute (), t.second () ) ); 3198 mLastSync.setTime( QTime (t.hour (), t.minute (), t.second () ) );
3199 3199
3200 3200
3201 syncItemLocal->lastSyncDate = mLastSync; 3201 syncItemLocal->lastSyncDate = mLastSync;
3202 syncItemRemote->lastSyncDate = mLastSync; 3202 syncItemRemote->lastSyncDate = mLastSync;
3203 3203
3204 QString mes; 3204 QString mes;
3205 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 ); 3205 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 );
3206 if ( manager->mShowSyncSummary ) { 3206 if ( manager->mShowSyncSummary ) {
3207 KMessageBox::information(0, mes, i18n("PWM/Pi Synchronization") ); 3207 KMessageBox::information(0, mes, i18n("PWM/Pi Synchronization") );
3208 } 3208 }
3209 qDebug( mes ); 3209 qDebug( mes );
3210 return e_success; 3210 return e_success;
3211} 3211}
3212 3212
3213 3213
3214int PwMDoc::takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime lastSync, int mode , bool full ) 3214int PwMDoc::takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime lastSync, int mode , bool full )
3215{ 3215{
3216 // 0 equal 3216 // 0 equal
3217 // 1 take local 3217 // 1 take local
3218 // 2 take remote 3218 // 2 take remote
3219 // 3 cancel 3219 // 3 cancel
3220 QDateTime localMod = local->meta.update; 3220 QDateTime localMod = local->meta.update;
3221 QDateTime remoteMod = remote->meta.update; 3221 QDateTime remoteMod = remote->meta.update;
3222 3222
3223 //US QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 3223 //US QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
3224 3224
3225 if ( localMod == remoteMod ) 3225 if ( localMod == remoteMod )
3226 return 0; 3226 return 0;
3227 3227
3228 qDebug(" %d %d conflict on %s %s ", mode, full, local->desc.c_str(), remote->desc.c_str() ); 3228 qDebug(" %d %d conflict on %s %s ", mode, full, local->desc.c_str(), remote->desc.c_str() );
3229 3229
3230 //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , localMod, remote->lastModified().toString().latin1(), remoteMod); 3230 //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , localMod, remote->lastModified().toString().latin1(), remoteMod);
3231 //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() ); 3231 //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() );
3232 //full = true; //debug only 3232 //full = true; //debug only
3233 if ( full ) { 3233 if ( full ) {
3234 bool equ = ( (*local) == (*remote) ); 3234 bool equ = ( (*local) == (*remote) );
3235 if ( equ ) { 3235 if ( equ ) {
3236 //qDebug("equal "); 3236 //qDebug("equal ");
3237 if ( mode < SYNC_PREF_FORCE_LOCAL ) 3237 if ( mode < SYNC_PREF_FORCE_LOCAL )
3238 return 0; 3238 return 0;
3239 3239
3240 }//else //debug only 3240 }//else //debug only
3241 //qDebug("not equal %s %s ", local->desc.c_str(), remote->desc.c_str()); 3241 //qDebug("not equal %s %s ", local->desc.c_str(), remote->desc.c_str());
3242 } 3242 }
3243 3243
3244 int result; 3244 int result;
3245 bool localIsNew; 3245 bool localIsNew;
3246 //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() ); 3246 //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() );
3247 3247
3248 if ( full && mode < SYNC_PREF_NEWEST ) 3248 if ( full && mode < SYNC_PREF_NEWEST )
3249 mode = SYNC_PREF_ASK; 3249 mode = SYNC_PREF_ASK;
3250 3250
3251 switch( mode ) { 3251 switch( mode ) {
3252 case SYNC_PREF_LOCAL: 3252 case SYNC_PREF_LOCAL:
3253 if ( lastSync > remoteMod ) 3253 if ( lastSync > remoteMod )
3254 return 1; 3254 return 1;
3255 if ( lastSync > localMod ) 3255 if ( lastSync > localMod )
3256 return 2; 3256 return 2;
3257 return 1; 3257 return 1;
3258 break; 3258 break;
3259 case SYNC_PREF_REMOTE: 3259 case SYNC_PREF_REMOTE:
3260 if ( lastSync > remoteMod ) 3260 if ( lastSync > remoteMod )
3261 return 1; 3261 return 1;
3262 if ( lastSync > localMod ) 3262 if ( lastSync > localMod )
3263 return 2; 3263 return 2;
3264 return 2; 3264 return 2;
3265 break; 3265 break;
3266 case SYNC_PREF_NEWEST: 3266 case SYNC_PREF_NEWEST:
3267 if ( localMod > remoteMod ) 3267 if ( localMod > remoteMod )
3268 return 1; 3268 return 1;
3269 else 3269 else
3270 return 2; 3270 return 2;
3271 break; 3271 break;
3272 case SYNC_PREF_ASK: 3272 case SYNC_PREF_ASK:
3273 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); 3273 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() );
3274 if ( lastSync > remoteMod ) 3274 if ( lastSync > remoteMod )
3275 return 1; 3275 return 1;
3276 if ( lastSync > localMod ) 3276 if ( lastSync > localMod )
3277 return 2; 3277 return 2;
3278 localIsNew = localMod >= remoteMod; 3278 localIsNew = localMod >= remoteMod;
3279 //qDebug("conflict! ************************************** "); 3279 //qDebug("conflict! ************************************** ");
3280 { 3280 {
3281 PwMDataItemChooser acd ( *local,*remote, localIsNew , 0/*this*/ ); 3281 PwMDataItemChooser acd ( *local,*remote, localIsNew , 0/*this*/ );
3282 result = acd.executeD(localIsNew); 3282 result = acd.executeD(localIsNew);
3283 return result; 3283 return result;
3284 } 3284 }
3285 break; 3285 break;
3286 case SYNC_PREF_FORCE_LOCAL: 3286 case SYNC_PREF_FORCE_LOCAL:
3287 return 1; 3287 return 1;
3288 break; 3288 break;
3289 case SYNC_PREF_FORCE_REMOTE: 3289 case SYNC_PREF_FORCE_REMOTE:
3290 return 2; 3290 return 2;
3291 break; 3291 break;
3292 3292
3293 default: 3293 default:
3294 // SYNC_PREF_TAKE_BOTH not implemented 3294 // SYNC_PREF_TAKE_BOTH not implemented
3295 break; 3295 break;
3296 } 3296 }
3297 return 0; 3297 return 0;
3298} 3298}
3299 3299
3300 3300
3301 3301
3302 3302
3303//this are the overwritten callbackmethods from the syncinterface 3303//this are the overwritten callbackmethods from the syncinterface
3304bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode) 3304bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode)
3305{ 3305{
3306 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 3306 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
3307 3307
3308 //1) unlock local file first if necessary (ask for password) 3308 //1) unlock local file first if necessary (ask for password)
3309 if (this->isDeepLocked()) { 3309 if (this->isDeepLocked()) {
3310 PwMerror ret = this->deepLock(false); 3310 PwMerror ret = this->deepLock(false);
3311 if (ret != e_success) 3311 if (ret != e_success)
3312 return false; 3312 return false;
3313 } 3313 }
3314 3314
3315 //2) construct and open a new doc on the stack(automatic cleanup of remote file). 3315 //2) construct and open a new doc on the stack(automatic cleanup of remote file).
3316 PwMDoc syncTarget(this, "synctarget"); 3316 PwMDoc syncTarget(this, "synctarget");
3317 PwMDoc* pSyncTarget = &syncTarget; 3317 PwMDoc* pSyncTarget = &syncTarget;
3318 3318
3319 3319
3320 PwMerror err = pSyncTarget->openDoc(&filename, 1 /*== open with all entries locked*/); 3320 PwMerror err = pSyncTarget->openDoc(&filename, 1 /*== open with all entries locked*/);
3321 3321
3322 if (err == e_alreadyOpen) { 3322 if (err == e_alreadyOpen) {
3323 PwMDocList::listItem li; 3323 PwMDocList::listItem li;
3324 if (getOpenDocList()->find(filename.latin1(), &li)) 3324 if (getOpenDocList()->find(filename.latin1(), &li))
3325 pSyncTarget = li.doc; 3325 pSyncTarget = li.doc;
3326 else { 3326 else {
3327 qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1()); 3327 qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1());
3328 return false; 3328 return false;
3329 } 3329 }
3330 } 3330 }
3331 else if (err != e_success) { 3331 else if (err != e_success) {
3332 qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1()); 3332 qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1());
3333 return false; 3333 return false;
3334 } 3334 }
3335 3335
3336 qDebug("PWM file loaded %s,sync mode %d",filename.latin1(), mode ); 3336 qDebug("PWM file loaded %s,sync mode %d",filename.latin1(), mode );
3337 3337
3338 3338
3339 //3) unlock remote file first if necessary (ask for password) 3339 //3) unlock remote file first if necessary (ask for password)
3340 if (pSyncTarget->isDeepLocked()) { 3340 if (pSyncTarget->isDeepLocked()) {
3341 PwMerror ret = pSyncTarget->deepLock(false); 3341 PwMerror ret = pSyncTarget->deepLock(false);
3342 if (ret != e_success) 3342 if (ret != e_success)
3343 return false; 3343 return false;
3344 } 3344 }
3345 3345
3346 3346
3347 err = syncronize(manager, this, pSyncTarget, mode ); 3347 err = syncronize(manager, this, pSyncTarget, mode );
3348 3348
3349 if (err == e_success) { 3349 if (err == e_success) {
3350 if ( manager->mWriteBackFile ){ 3350 if ( manager->mWriteBackFile ){
3351 qDebug("Saving remote PWManager file"); 3351 qDebug("Saving remote PWManager file");
3352 err = pSyncTarget->saveDoc(conf()->confGlobCompression()); 3352 err = pSyncTarget->saveDoc(conf()->confGlobCompression());
3353 if (err != e_success) { 3353 if (err != e_success) {
3354 qDebug("PwmDoc::sync: Sync failed. Error %i while storing file %s",err, filename.latin1()); 3354 qDebug("PwmDoc::sync: Sync failed. Error %i while storing file %s",err, filename.latin1());
3355 return false; 3355 return false;
3356 } 3356 }
3357 } 3357 }
3358 3358
3359 flagDirty(); 3359 flagDirty();
3360 return true; 3360 return true;
3361 } 3361 }
3362 else { 3362 else {
3363 return false; 3363 return false;
3364 } 3364 }
3365} 3365}
3366 3366
3367#endif 3367#endif
3368 3368
3369 3369
3370bool PwMDoc::findSyncData(const QString &syncname, unsigned int *index) 3370bool PwMDoc::findSyncData(const QString &syncname, unsigned int *index)
3371{ 3371{
3372 vector<PwMSyncItem>::iterator i = dti.syncDta.begin(), 3372 vector<PwMSyncItem>::iterator i = dti.syncDta.begin(),
3373 end = dti.syncDta.end(); 3373 end = dti.syncDta.end();
3374 3374
3375 while (i != end) { 3375 while (i != end) {
3376 if ((*i).syncName == syncname.latin1()) { 3376 if ((*i).syncName == syncname.latin1()) {
3377 if (index) { 3377 if (index) {
3378 *index = i - dti.syncDta.begin(); 3378 *index = i - dti.syncDta.begin();
3379 } 3379 }
3380 return true; 3380 return true;
3381 } 3381 }
3382 ++i; 3382 ++i;
3383 } 3383 }
3384 return false; 3384 return false;
3385}; 3385};
3386 3386
3387/** add new syncdataentry */ 3387/** add new syncdataentry */
3388PwMerror PwMDoc::addSyncDataEntry(PwMSyncItem *d, bool dontFlagDirty) 3388PwMerror PwMDoc::addSyncDataEntry(PwMSyncItem *d, bool dontFlagDirty)
3389{ 3389{
3390 PWM_ASSERT(d); 3390 PWM_ASSERT(d);
3391 3391
3392 if (isDeepLocked()) { 3392 if (isDeepLocked()) {
3393 PwMerror ret; 3393 PwMerror ret;
3394 ret = deepLock(false); 3394 ret = deepLock(false);
3395 if (ret != e_success) 3395 if (ret != e_success)
3396 return e_lock; 3396 return e_lock;
3397 } 3397 }
3398 unsigned int index; 3398 unsigned int index;
3399 3399
3400 const QString tmp = d->syncName.c_str(); 3400 const QString tmp = d->syncName.c_str();
3401 bool exists = findSyncData(d->syncName.c_str(), &index); 3401 bool exists = findSyncData(d->syncName.c_str(), &index);
3402 3402
3403 if (exists == true) { 3403 if (exists == true) {
3404 // DOH! We found this entry. 3404 // DOH! We found this entry.
3405 return e_entryExists; 3405 return e_entryExists;
3406 } 3406 }
3407 3407
3408 dti.syncDta.push_back(*d); 3408 dti.syncDta.push_back(*d);
3409 3409
3410 if (!dontFlagDirty) 3410 if (!dontFlagDirty)
3411 flagDirty(); 3411 flagDirty();
3412 return e_success; 3412 return e_success;
3413} 3413}
3414 3414
3415 3415
3416 3416
3417/** delete syncdata entry */ 3417/** delete syncdata entry */
3418bool PwMDoc::delSyncDataEntry(unsigned int index, bool dontFlagDirty) 3418bool PwMDoc::delSyncDataEntry(unsigned int index, bool dontFlagDirty)
3419{ 3419{
3420 if (isDeepLocked()) 3420 if (isDeepLocked())
3421 return false; 3421 return false;
3422 if (index > dti.syncDta.size() - 1) 3422 if (index > dti.syncDta.size() - 1)
3423 return false; 3423 return false;
3424 3424
3425 // delete entry 3425 // delete entry
3426 dti.syncDta.erase(dti.syncDta.begin() + index); 3426 dti.syncDta.erase(dti.syncDta.begin() + index);
3427 3427
3428 if (!dontFlagDirty) 3428 if (!dontFlagDirty)
3429 flagDirty(); 3429 flagDirty();
3430 return true; 3430 return true;
3431} 3431}
3432 3432
3433 3433
3434PwMDataItem* PwMDoc::findEntryByID(const QString &uid, unsigned int *category, unsigned int *index) 3434PwMDataItem* PwMDoc::findEntryByID(const QString &uid, unsigned int *category, unsigned int *index)
3435{ 3435{
3436 vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(), 3436 vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(),
3437 catend = dti.dta.end(); 3437 catend = dti.dta.end();
3438 3438
3439 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 3439 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
3440 3440
3441 while (catcounter != catend) { 3441 while (catcounter != catend) {
3442 entrBegin = catcounter->d.begin(); 3442 entrBegin = catcounter->d.begin();
3443 entrEnd = catcounter->d.end(); 3443 entrEnd = catcounter->d.end();
3444 entrI = entrBegin; 3444 entrI = entrBegin;
3445 while (entrI != entrEnd) { 3445 while (entrI != entrEnd) {
3446 if ((*entrI).meta.uniqueid == uid.latin1()) { 3446 if ((*entrI).meta.uniqueid == uid.latin1()) {
3447 if (category) 3447 if (category)
3448 *category = catcounter - dti.dta.begin(); 3448 *category = catcounter - dti.dta.begin();
3449 if (index) 3449 if (index)
3450 *index = entrI - entrBegin; 3450 *index = entrI - entrBegin;
3451 3451
3452 return &(*entrI); 3452 return &(*entrI);
3453 } 3453 }
3454 ++entrI; 3454 ++entrI;
3455 } 3455 }
3456 ++catcounter; 3456 ++catcounter;
3457 } 3457 }
3458 3458
3459 return 0; 3459 return 0;
3460} 3460}
3461 3461
3462QStringList PwMDoc::getIDEntryList() 3462QStringList PwMDoc::getIDEntryList()
3463{ 3463{
3464 QStringList results; 3464 QStringList results;
3465 3465
3466 vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(), 3466 vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(),
3467 catend = dti.dta.end(); 3467 catend = dti.dta.end();
3468 3468
3469 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 3469 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
3470 3470
3471 while (catcounter != catend) { 3471 while (catcounter != catend) {
3472 entrBegin = catcounter->d.begin(); 3472 entrBegin = catcounter->d.begin();
3473 entrEnd = catcounter->d.end(); 3473 entrEnd = catcounter->d.end();
3474 entrI = entrBegin; 3474 entrI = entrBegin;
3475 while (entrI != entrEnd) { 3475 while (entrI != entrEnd) {
3476 results.append( (*entrI).meta.uniqueid.c_str() ); 3476 results.append( (*entrI).meta.uniqueid.c_str() );
3477 ++entrI; 3477 ++entrI;
3478 } 3478 }
3479 ++catcounter; 3479 ++catcounter;
3480 } 3480 }
3481 3481
3482 return results; 3482 return results;
3483} 3483}
3484 3484
3485 3485
3486 3486
3487 3487
3488 3488
3489#ifndef PWM_EMBEDDED 3489#ifndef PWM_EMBEDDED
3490#include "pwmdoc.moc" 3490#include "pwmdoc.moc"
3491#endif 3491#endif
diff --git a/pwmanager/pwmanager/pwminit.cpp b/pwmanager/pwmanager/pwminit.cpp
index 8946443..ea9e330 100644
--- a/pwmanager/pwmanager/pwminit.cpp
+++ b/pwmanager/pwmanager/pwminit.cpp
@@ -1,632 +1,640 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2004 by Michael Buesch * 3 * copyright (C) 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 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 "pwminit.h" 20#include "pwminit.h"
21#include "randomizer.h" 21#include "randomizer.h"
22#include <qdir.h>
22 23
23#ifndef PWM_EMBEDDED 24#ifndef PWM_EMBEDDED
24#include "selftest.h" 25#include "selftest.h"
25#include "configuration.h" 26#include "configuration.h"
26#else 27#else
27#include "pwmprefs.h" 28#include "pwmprefs.h"
28#endif 29#endif
29 30
30#include "pwm.h" 31#include "pwm.h"
31#include "pwmexception.h" 32#include "pwmexception.h"
32#include "pwmtray.h" 33#include "pwmtray.h"
33#include "pwmdoc.h" 34#include "pwmdoc.h"
34 35
35#ifdef CONFIG_KWALLETIF 36#ifdef CONFIG_KWALLETIF
36# include "kwalletemu.h" 37# include "kwalletemu.h"
37#endif // CONFIG_KWALLETIF 38#endif // CONFIG_KWALLETIF
38#ifdef CONFIG_KEYCARD 39#ifdef CONFIG_KEYCARD
39# include "pwmkeycard.h" 40# include "pwmkeycard.h"
40#endif // CONFIG_KEYCARD 41#endif // CONFIG_KEYCARD
41 42
42#include <qmessagebox.h> 43#include <qmessagebox.h>
43 44
44#include <kmessagebox.h> 45#include <kmessagebox.h>
45#ifndef PWM_EMBEDDED 46#ifndef PWM_EMBEDDED
46#include <kcmdlineargs.h> 47#include <kcmdlineargs.h>
47#include <kwin.h> 48#include <kwin.h>
48#include <dcopclient.h> 49#include <dcopclient.h>
49#endif 50#endif
50 51
51#include <kapplication.h> 52#include <kapplication.h>
52#include <kiconloader.h> 53#include <kiconloader.h>
53 54
54#include <signal.h> 55#include <signal.h>
55 56
56static PwMInit *sig_init_pointer; 57static PwMInit *sig_init_pointer;
57static NOREGPARM void sig_handler(int signum) 58static NOREGPARM void sig_handler(int signum)
58{ 59{
59 switch (signum) { 60 switch (signum) {
60 case SIGINT: 61 case SIGINT:
61 case SIGTERM: 62 case SIGTERM:
62 sig_init_pointer->shutdownApp(20 + signum); 63 sig_init_pointer->shutdownApp(20 + signum);
63 break; 64 break;
64 default: 65 default:
65 printDebug(string("unhandled signal ") 66 printDebug(string("unhandled signal ")
66 + tostr(signum)); 67 + tostr(signum));
67 } 68 }
68} 69}
69 70
70 71
71 72
72 73
73PwMInit::PwMInit(PwMApplication *_app) 74PwMInit::PwMInit(PwMApplication *_app)
74 : runStatus (unknown) 75 : runStatus (unknown)
75 , _curWidget (0) 76 , _curWidget (0)
76 , _dcopClient (0) 77 , _dcopClient (0)
77 , _kwalletEmu (0) 78 , _kwalletEmu (0)
78 , _keycard (0) 79 , _keycard (0)
79 , _tray (0) 80 , _tray (0)
80{ 81{
81 sig_init_pointer = this; 82 sig_init_pointer = this;
82 app = _app; 83 app = _app;
83} 84}
84 85
85PwMInit::~PwMInit() 86PwMInit::~PwMInit()
86{ 87{
87#ifndef PWM_EMBEDDED 88#ifndef PWM_EMBEDDED
88 SelfTest::cancel(); 89 SelfTest::cancel();
89 // close all open mainwnds 90 // close all open mainwnds
90 QValueList<PwM *>::iterator i = _mainWndList.begin(), 91 QValueList<PwM *>::iterator i = _mainWndList.begin(),
91 end = _mainWndList.end(); 92 end = _mainWndList.end();
92 93
93#else 94#else
94 // close all open mainwnds 95 // close all open mainwnds
95 QValueList<PwM *>::Iterator i = _mainWndList.begin(), 96 QValueList<PwM *>::Iterator i = _mainWndList.begin(),
96 end = _mainWndList.end(); 97 end = _mainWndList.end();
97#endif 98#endif
98 while (i != end) { 99 while (i != end) {
99 disconnect(*i, SIGNAL(closed(PwM *)), 100 disconnect(*i, SIGNAL(closed(PwM *)),
100 this, SLOT(mainWndClosed(PwM *))); 101 this, SLOT(mainWndClosed(PwM *)));
101 delete *i; 102 delete *i;
102 ++i; 103 ++i;
103 } 104 }
104 _mainWndList.clear(); 105 _mainWndList.clear();
105 // close all remaining open documents 106 // close all remaining open documents
106 PwMDocList *_dl = PwMDoc::getOpenDocList(); 107 PwMDocList *_dl = PwMDoc::getOpenDocList();
107 vector<PwMDocList::listItem> dl = *(_dl->getList()); 108 vector<PwMDocList::listItem> dl = *(_dl->getList());
108 vector<PwMDocList::listItem>::iterator i2 = dl.begin(), 109 vector<PwMDocList::listItem>::iterator i2 = dl.begin(),
109 end2 = dl.end(); 110 end2 = dl.end();
110 while (i2 != end2) { 111 while (i2 != end2) {
111 delete (*i2).doc; 112 delete (*i2).doc;
112 ++i2; 113 ++i2;
113 } 114 }
114 115
115#ifdef CONFIG_KWALLETIF 116#ifdef CONFIG_KWALLETIF
116 delete_ifnot_null(_kwalletEmu); 117 delete_ifnot_null(_kwalletEmu);
117#endif // CONFIG_KWALLETIF 118#endif // CONFIG_KWALLETIF
118#ifdef CONFIG_KEYCARD 119#ifdef CONFIG_KEYCARD
119 delete_ifnot_null(_keycard); 120 delete_ifnot_null(_keycard);
120#endif // CONFIG_KEYCARD 121#endif // CONFIG_KEYCARD
121 delete_ifnot_null(_tray); 122 delete_ifnot_null(_tray);
122 123
123 Randomizer::cleanup(); 124 Randomizer::cleanup();
124#ifndef PWM_EMBEDDED 125#ifndef PWM_EMBEDDED
125 Configuration::cleanup(); 126 Configuration::cleanup();
126#endif 127#endif
127} 128}
128 129
129void PwMInit::initializeApp() 130void PwMInit::initializeApp()
130{ 131{
132 qDebug("PwMInit::initializeApp() ");
131 PWM_ASSERT(runStatus == unknown); 133 PWM_ASSERT(runStatus == unknown);
132 runStatus = init; 134 runStatus = init;
133 initPosixSignalHandler(); 135 initPosixSignalHandler();
134 Randomizer::init(); 136 Randomizer::init();
135#ifndef PWM_EMBEDDED 137#ifndef PWM_EMBEDDED
136 Configuration::init(); 138 Configuration::init();
137#endif 139#endif
138 initDCOP(); 140 initDCOP();
139 initKWalletEmu(); 141 initKWalletEmu();
140 initKeycard(); 142 initKeycard();
141 initTray(); 143 initTray();
142 handleCmdLineArgs(); 144 handleCmdLineArgs();
143 145 qDebug("handle ");
144 bool openDeeplocked = false; 146 bool openDeeplocked = false;
145 if (conf()->confGlobAutostartDeepLocked() || 147 if (conf()->confGlobAutostartDeepLocked() ||
146 savedCmd.open_deeplocked) 148 savedCmd.open_deeplocked)
147 openDeeplocked = true; 149 openDeeplocked = true;
148 if (conf()->confWndAutoMinimizeOnStart() || 150 if ( false ){
149 savedCmd.minToTray) { 151 // LR is not working
152 //if (conf()->confWndAutoMinimizeOnStart() ||
153 // savedCmd.minToTray) {
150 PwMDoc *newDoc = createDoc(); 154 PwMDoc *newDoc = createDoc();
155 qDebug(" createDoc()");
151 if (!newDoc->openDocUi(newDoc, 156 if (!newDoc->openDocUi(newDoc,
152 conf()->confGlobAutoStart(), 157 conf()->confGlobAutoStart(),
153 openDeeplocked)) { 158 openDeeplocked)) {
154 delete newDoc; 159 delete newDoc;
160 }
155 161
156 //US ENH for embedded devices: in the case of failure, open a document the default way 162 //US ENH for embedded devices: in the case of failure, open a document the default way
157 createMainWnd(conf()->confGlobAutoStart(), 163 createMainWnd(conf()->confGlobAutoStart(),
158 openDeeplocked, 164 openDeeplocked,
159 true, 165 true,
160 0, 166 0,
161 savedCmd.minimized); 167 savedCmd.minimized);
162 168
163 169
164 170
165 171
166 } 172 //}
167 } else { 173 } else {
168 createMainWnd(conf()->confGlobAutoStart(), 174 createMainWnd(conf()->confGlobAutoStart(),
169 openDeeplocked, 175 openDeeplocked,
170 true, 176 true,
171 0, 177 0,
172 savedCmd.minimized); 178 savedCmd.minimized);
173 } 179 }
174 180
175 runStatus = running; 181 runStatus = running;
176} 182}
177 183
178void PwMInit::shutdownApp(int exitStatus) 184void PwMInit::shutdownApp(int exitStatus)
179{ 185{
180 printDebug(string("PwMInit::shutdownApp(") 186 printDebug(string("PwMInit::shutdownApp(")
181 + tostr(exitStatus) + ") called."); 187 + tostr(exitStatus) + ") called.");
182 PWM_ASSERT((runStatus == running) || (runStatus == init)); 188 PWM_ASSERT((runStatus == running) || (runStatus == init));
183 runStatus = shutdown; 189 runStatus = shutdown;
184 QApplication::exit(exitStatus); 190 QApplication::exit(exitStatus);
185 /* The destructor of PwMInit is called when control 191 /* The destructor of PwMInit is called when control
186 * leaves main() 192 * leaves main()
187 */ 193 */
188} 194}
189 195
190void PwMInit::initPosixSignalHandler() 196void PwMInit::initPosixSignalHandler()
191{ 197{
192 signal(SIGINT, sig_handler); 198 signal(SIGINT, sig_handler);
193 signal(SIGTERM, sig_handler); 199 signal(SIGTERM, sig_handler);
194} 200}
195 201
196void PwMInit::initDCOP() 202void PwMInit::initDCOP()
197{ 203{
198#ifndef PWM_EMBEDDED 204#ifndef PWM_EMBEDDED
199 _dcopClient = app->dcopClient(); 205 _dcopClient = app->dcopClient();
200 _dcopClient->setNotifications(true); 206 _dcopClient->setNotifications(true);
201#endif 207#endif
202 208
203} 209}
204 210
205void PwMInit::initKWalletEmu(bool forceDisable, bool forceReload) 211void PwMInit::initKWalletEmu(bool forceDisable, bool forceReload)
206{ 212{
207#ifdef CONFIG_KWALLETIF 213#ifdef CONFIG_KWALLETIF
208 if (!conf()->confGlobKwalletEmu() || 214 if (!conf()->confGlobKwalletEmu() ||
209 forceDisable) { 215 forceDisable) {
210 delete_ifnot_null(_kwalletEmu); 216 delete_ifnot_null(_kwalletEmu);
211 return; 217 return;
212 } 218 }
213 try { 219 try {
214 if (_kwalletEmu && forceReload) 220 if (_kwalletEmu && forceReload)
215 delete_and_null(_kwalletEmu); 221 delete_and_null(_kwalletEmu);
216 if (!_kwalletEmu) 222 if (!_kwalletEmu)
217 _kwalletEmu = new KWalletEmu(this); 223 _kwalletEmu = new KWalletEmu(this);
218 } catch (PwMException e) { 224 } catch (PwMException e) {
219 string errMsg("initializing KWallet emulation failed. ID: "); 225 string errMsg("initializing KWallet emulation failed. ID: ");
220 errMsg += tostr(static_cast<int>(e.getId())); 226 errMsg += tostr(static_cast<int>(e.getId()));
221 errMsg += " err-message: "; 227 errMsg += " err-message: ";
222 errMsg += e.getMessage(); 228 errMsg += e.getMessage();
223 printWarn(errMsg); 229 printWarn(errMsg);
224 return; 230 return;
225 } 231 }
226#else // CONFIG_KWALLETIF 232#else // CONFIG_KWALLETIF
227 PARAM_UNUSED(forceDisable); 233 PARAM_UNUSED(forceDisable);
228 PARAM_UNUSED(forceReload); 234 PARAM_UNUSED(forceReload);
229#endif // CONFIG_KWALLETIF 235#endif // CONFIG_KWALLETIF
230} 236}
231 237
232void PwMInit::initKeycard() 238void PwMInit::initKeycard()
233{ 239{
234#ifdef CONFIG_KEYCARD 240#ifdef CONFIG_KEYCARD
235 PWM_ASSERT(!_keycard); 241 PWM_ASSERT(!_keycard);
236 _keycard = new PwMKeyCard(this); 242 _keycard = new PwMKeyCard(this);
237#endif // CONFIG_KEYCARD 243#endif // CONFIG_KEYCARD
238} 244}
239 245
240void PwMInit::initTray() 246void PwMInit::initTray()
241{ 247{
242#ifdef PWM_EMBEDDED 248#ifdef PWM_EMBEDDED
243 //US ENH : embedded version does not support a tray 249 //US ENH : embedded version does not support a tray
244 return; 250 return;
245#endif 251#endif
246 252
247 if (!conf()->confGlobTray()) { 253 if (!conf()->confGlobTray()) {
248 if (!_tray) 254 if (!_tray)
249 return; 255 return;
250 _tray->hide(); 256 _tray->hide();
251 delete_and_null(_tray); 257 delete_and_null(_tray);
252 return; 258 return;
253 } 259 }
254 if (_tray) 260 if (_tray)
255 return; 261 return;
256 _tray = new PwMTray(this); 262 _tray = new PwMTray(this);
257 connect(_tray, SIGNAL(quitSelected()), 263 connect(_tray, SIGNAL(quitSelected()),
258 this, SLOT(removeTrayAndQuit())); 264 this, SLOT(removeTrayAndQuit()));
259 connect(_tray, SIGNAL(closed(PwMTray *)), 265 connect(_tray, SIGNAL(closed(PwMTray *)),
260 this, SLOT(trayIconClosed(PwMTray *))); 266 this, SLOT(trayIconClosed(PwMTray *)));
261 KIconLoader icons; 267 KIconLoader icons;
262#ifndef PWM_EMBEDDED 268#ifndef PWM_EMBEDDED
263 _tray->setPixmap(icons.loadIcon(PACKAGE_NAME, KIcon::Small)); 269 _tray->setPixmap(icons.loadIcon(PACKAGE_NAME, KIcon::Small));
264#endif 270#endif
265 _tray->show(); 271 _tray->show();
266 // connect the signals of all open documents. 272 // connect the signals of all open documents.
267 const vector<PwMDocList::listItem> *dl = PwMDoc::getOpenDocList()->getList(); 273 const vector<PwMDocList::listItem> *dl = PwMDoc::getOpenDocList()->getList();
268 vector<PwMDocList::listItem>::const_iterator i = dl->begin(), 274 vector<PwMDocList::listItem>::const_iterator i = dl->begin(),
269 end = dl->end(); 275 end = dl->end();
270 while (i != end) { 276 while (i != end) {
271 _tray->connectDocToTray((*i).doc); 277 _tray->connectDocToTray((*i).doc);
272 ++i; 278 ++i;
273 } 279 }
274} 280}
275 281
276void PwMInit::removeTrayAndQuit() 282void PwMInit::removeTrayAndQuit()
277{ 283{
278 PWM_ASSERT(_tray); 284 PWM_ASSERT(_tray);
279 // _tray is deleted in ~PwMInit 285 // _tray is deleted in ~PwMInit
280 shutdownApp(0); 286 shutdownApp(0);
281} 287}
282 288
283PwM * PwMInit::createMainWnd(const QString &loadFile, 289PwM * PwMInit::createMainWnd(const QString &loadFile,
284 bool loadFileDeepLocked, 290 bool loadFileDeepLocked,
285 bool virginity, 291 bool virginity,
286 PwMDoc *doc, 292 PwMDoc *doc,
287 bool minimized) 293 bool minimized)
288{ 294{
295 qDebug("PwMInit::createMainWnd ");
289 PwM *newWnd; 296 PwM *newWnd;
290 if (!doc) 297 if (!doc)
291 doc = createDoc(); 298 doc = createDoc();
292 newWnd = new PwM(this, doc, virginity); 299 newWnd = new PwM(this, doc, virginity);
293#ifndef PWM_EMBEDDED 300#ifndef PWM_EMBEDDED
294 _mainWndList.push_back(newWnd); 301 _mainWndList.push_back(newWnd);
295#else 302#else
296 _mainWndList.append(newWnd); 303 _mainWndList.append(newWnd);
297#endif 304#endif
298 connect(newWnd, SIGNAL(closed(PwM *)), 305 connect(newWnd, SIGNAL(closed(PwM *)),
299 this, SLOT(mainWndClosed(PwM *))); 306 this, SLOT(mainWndClosed(PwM *)));
300 connect(newWnd, SIGNAL(gotFocus(PwM *)), 307 connect(newWnd, SIGNAL(gotFocus(PwM *)),
301 this, SLOT(setCurWidget(PwM *))); 308 this, SLOT(setCurWidget(PwM *)));
302 connect(newWnd, SIGNAL(lostFocus(PwM *)), 309 connect(newWnd, SIGNAL(lostFocus(PwM *)),
303 this, SLOT(resetCurWidget())); 310 this, SLOT(resetCurWidget()));
304 311
305 //US ENH 312 //US ENH
306#ifndef PWM_EMBEDDED 313#ifndef PWM_EMBEDDED
307 if (minimized) 314 if (minimized)
308 newWnd->showMinimized(); 315 newWnd->showMinimized();
309 else 316 else
310 newWnd->show(); 317 newWnd->show();
311 318
312#else //PWM_EMBEDDED 319#else //PWM_EMBEDDED
313 320
314#ifndef DESKTOP_VERSION 321#ifndef DESKTOP_VERSION
315 app->showMainWidget( newWnd ); 322 app->showMainWidget( newWnd );
316#else //DESKTOP_VERSION 323#else //DESKTOP_VERSION
317 app->setMainWidget( newWnd ); 324 app->setMainWidget( newWnd );
318 newWnd->resize (640, 480 ); 325 newWnd->resize (640, 480 );
319 newWnd->show(); 326 newWnd->show();
327 qDebug("show ");
320#endif //DESKTOP_VERSION 328#endif //DESKTOP_VERSION
321 329
322#endif //PWM_EMBEDDED 330#endif //PWM_EMBEDDED
323 331
324 if (loadFile != QString::null && 332 if (loadFile != QString::null &&
325 loadFile != "") { 333 loadFile != "") {
326 newWnd->openDoc(loadFile, loadFileDeepLocked); 334 newWnd->openDoc(loadFile, loadFileDeepLocked);
327 } 335 }
328 return newWnd; 336 return newWnd;
329} 337}
330 338
331PwMDoc * PwMInit::createDoc() 339PwMDoc * PwMInit::createDoc()
332{ 340{
333 PwMDoc *doc = new PwMDoc(this); 341 PwMDoc *doc = new PwMDoc(this);
334#ifdef CONFIG_KEYCARD 342#ifdef CONFIG_KEYCARD
335 doc->setPwMKeyCard(keycard()); 343 doc->setPwMKeyCard(keycard());
336#endif 344#endif
337#ifdef CONFIG_KWALLETIF 345#ifdef CONFIG_KWALLETIF
338 if (kwalletEmu()) 346 if (kwalletEmu())
339 kwalletEmu()->connectDocSignals(doc); 347 kwalletEmu()->connectDocSignals(doc);
340#endif 348#endif
341 349
342 if (_tray) 350 if (_tray)
343 _tray->connectDocToTray(doc); 351 _tray->connectDocToTray(doc);
344 352
345 return doc; 353 return doc;
346 354
347} 355}
348 356
349void PwMInit::mainWndClosed(PwM *wnd) 357void PwMInit::mainWndClosed(PwM *wnd)
350{ 358{
351 bool doMinimizeToTray = false; 359 bool doMinimizeToTray = false;
352 bool doDeleteDoc = false; 360 bool doDeleteDoc = false;
353#ifndef PWM_EMBEDDED 361#ifndef PWM_EMBEDDED
354 dcopClient()->suspend(); 362 dcopClient()->suspend();
355 dcopClient()->setAcceptCalls(false); 363 dcopClient()->setAcceptCalls(false);
356#endif 364#endif
357again: 365again:
358 366
359 if (wnd->isForceMinimizeToTray()) { 367 if (wnd->isForceMinimizeToTray()) {
360 if (unlikely(!_tray)) { 368 if (unlikely(!_tray)) {
361 /* This should not happen! If we set forceMinimizeToTray , 369 /* This should not happen! If we set forceMinimizeToTray ,
362 * we must be sure that _tray exists. 370 * we must be sure that _tray exists.
363 */ 371 */
364 BUG(); 372 BUG();
365 wnd->setForceMinimizeToTray(false); 373 wnd->setForceMinimizeToTray(false);
366 goto again; 374 goto again;
367 } 375 }
368 doMinimizeToTray = true; 376 doMinimizeToTray = true;
369 } else { 377 } else {
370 // Ask to minimize to tray. If not, delete doc. 378 // Ask to minimize to tray. If not, delete doc.
371 if (_tray && 379 if (_tray &&
372 runStatus != shutdown && 380 runStatus != shutdown &&
373 !wnd->isForceQuit() && 381 !wnd->isForceQuit() &&
374 !wnd->curDoc()->isDeleted()) { 382 !wnd->curDoc()->isDeleted()) {
375 if (conf()->confWndClose()) 383 if (conf()->confWndClose())
376 doDeleteDoc = true; 384 doDeleteDoc = true;
377 else 385 else
378 doMinimizeToTray = true; 386 doMinimizeToTray = true;
379 } else { 387 } else {
380 doDeleteDoc = true; 388 doDeleteDoc = true;
381 } 389 }
382 } 390 }
383 391
384 if (doMinimizeToTray) { 392 if (doMinimizeToTray) {
385 393
386 PWM_ASSERT(_tray); 394 PWM_ASSERT(_tray);
387 int mmlock = conf()->confGlobMinimizeLock(); 395 int mmlock = conf()->confGlobMinimizeLock();
388 switch (mmlock) { 396 switch (mmlock) {
389 case 0: // don't lock anything 397 case 0: // don't lock anything
390 break; 398 break;
391 case 1: // normal lock 399 case 1: // normal lock
392 wnd->curDoc()->lockAll(true); 400 wnd->curDoc()->lockAll(true);
393 break; 401 break;
394 case 2: // deep-lock 402 case 2: // deep-lock
395 wnd->curDoc()->deepLock(); 403 wnd->curDoc()->deepLock();
396 break; 404 break;
397 default: 405 default:
398 WARN(); 406 WARN();
399 } 407 }
400 } else if (doDeleteDoc) { 408 } else if (doDeleteDoc) {
401 if (!wnd->curDoc()->tryDelete()) { 409 if (!wnd->curDoc()->tryDelete()) {
402 /* We failed deleting the doc, 410 /* We failed deleting the doc,
403 * so open a new window with it, again. 411 * so open a new window with it, again.
404 */ 412 */
405 createMainWnd(QString::null, false, 413 createMainWnd(QString::null, false,
406 false, wnd->curDoc()); 414 false, wnd->curDoc());
407 } 415 }
408 } 416 }
409#ifndef PWM_EMBEDDED 417#ifndef PWM_EMBEDDED
410 // find the closed window in the "mainWndList" and delete it. 418 // find the closed window in the "mainWndList" and delete it.
411 QValueList<PwM *>::iterator i = _mainWndList.begin(), 419 QValueList<PwM *>::iterator i = _mainWndList.begin(),
412 end = _mainWndList.end(); 420 end = _mainWndList.end();
413#else 421#else
414 // find the closed window in the "mainWndList" and delete it. 422 // find the closed window in the "mainWndList" and delete it.
415 QValueList<PwM *>::Iterator i = _mainWndList.begin(), 423 QValueList<PwM *>::Iterator i = _mainWndList.begin(),
416 end = _mainWndList.end(); 424 end = _mainWndList.end();
417#endif 425#endif
418 while (i != end) { 426 while (i != end) {
419 if (*i == wnd) { 427 if (*i == wnd) {
420#ifndef PWM_EMBEDDED 428#ifndef PWM_EMBEDDED
421 _mainWndList.erase(i); 429 _mainWndList.erase(i);
422#else 430#else
423 _mainWndList.remove(i); 431 _mainWndList.remove(i);
424#endif 432#endif
425 goto out_success; 433 goto out_success;
426 } 434 }
427 ++i; 435 ++i;
428 } 436 }
429 BUG(); 437 BUG();
430out_success: 438out_success:
431#ifndef PWM_EMBEDDED 439#ifndef PWM_EMBEDDED
432 if (!_mainWndList.size()) 440 if (!_mainWndList.size())
433#else 441#else
434 if (!_mainWndList.count()) 442 if (!_mainWndList.count())
435#endif 443#endif
436 444
437 { 445 {
438 /* If there's no main window and no tray icon 446 /* If there's no main window and no tray icon
439 * left, we have no user interface, so we can 447 * left, we have no user interface, so we can
440 * shut down the application. 448 * shut down the application.
441 */ 449 */
442 if (!_tray) { 450 if (!_tray) {
443#ifndef PWM_EMBEDDED 451#ifndef PWM_EMBEDDED
444 dcopClient()->setAcceptCalls(true); 452 dcopClient()->setAcceptCalls(true);
445 dcopClient()->resume(); 453 dcopClient()->resume();
446#endif 454#endif
447 shutdownApp(0); 455 shutdownApp(0);
448 return; 456 return;
449 } 457 }
450 /* There is no widget left, so set 458 /* There is no widget left, so set
451 * _curWidget to 0 459 * _curWidget to 0
452 */ 460 */
453 resetCurWidget(); 461 resetCurWidget();
454 } 462 }
455#ifndef PWM_EMBEDDED 463#ifndef PWM_EMBEDDED
456 dcopClient()->setAcceptCalls(true); 464 dcopClient()->setAcceptCalls(true);
457 dcopClient()->resume(); 465 dcopClient()->resume();
458#endif 466#endif
459} 467}
460 468
461void PwMInit::trayIconClosed(PwMTray *tray) 469void PwMInit::trayIconClosed(PwMTray *tray)
462{ 470{
463 if (runStatus != running) 471 if (runStatus != running)
464 return; 472 return;
465 PARAM_UNUSED(tray); 473 PARAM_UNUSED(tray);
466 PWM_ASSERT(tray == _tray); 474 PWM_ASSERT(tray == _tray);
467 /* If there's no main wnd left we have to 475 /* If there's no main wnd left we have to
468 * shutdown the app (same as in mainWndClosed()) 476 * shutdown the app (same as in mainWndClosed())
469 */ 477 */
470#ifndef PWM_EMBEDDED 478#ifndef PWM_EMBEDDED
471 if (!_mainWndList.size()) 479 if (!_mainWndList.size())
472 shutdownApp(0); 480 shutdownApp(0);
473#else 481#else
474 if (!_mainWndList.count()) 482 if (!_mainWndList.count())
475 shutdownApp(0); 483 shutdownApp(0);
476#endif 484#endif
477} 485}
478 486
479void PwMInit::handleCmdLineArgs(bool initial) 487void PwMInit::handleCmdLineArgs(bool initial)
480{ 488{
481#ifndef PWM_EMBEDDED 489#ifndef PWM_EMBEDDED
482 KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); 490 KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
483 PWM_ASSERT(args); 491 PWM_ASSERT(args);
484 int i, numArgs = args->count(); 492 int i, numArgs = args->count();
485 const char *curArg; 493 const char *curArg;
486 494
487 // read all cmdline options 495 // read all cmdline options
488 savedCmd.open_deeplocked = args->isSet("open-deeplocked"); 496 savedCmd.open_deeplocked = args->isSet("open-deeplocked");
489 savedCmd.minimized = args->isSet("minimized"); 497 savedCmd.minimized = args->isSet("minimized");
490 savedCmd.minToTray = args->isSet("mintray"); 498 savedCmd.minToTray = args->isSet("mintray");
491 savedCmd.skipSelfTest = args->isSet("skip-self-test"); 499 savedCmd.skipSelfTest = args->isSet("skip-self-test");
492 if (savedCmd.minimized && 500 if (savedCmd.minimized &&
493 savedCmd.minToTray) { 501 savedCmd.minToTray) {
494 printInfo(i18n("Commandline option \"--minimized\" and " 502 printInfo(i18n("Commandline option \"--minimized\" and "
495 "\"--mintray\" selected. These are incompatible. " 503 "\"--mintray\" selected. These are incompatible. "
496 "\"--mintray\" will be selected.").latin1()); 504 "\"--mintray\" will be selected.").latin1());
497 } 505 }
498 /* Iterate through all non-option arguments. 506 /* Iterate through all non-option arguments.
499 * Every non-option arg is a filename to open. 507 * Every non-option arg is a filename to open.
500 */ 508 */
501 for (i = 0; i < numArgs; ++i) { 509 for (i = 0; i < numArgs; ++i) {
502 curArg = args->arg(i); 510 curArg = args->arg(i);
503 PWM_ASSERT(curArg); 511 PWM_ASSERT(curArg);
504 if (savedCmd.minToTray) { 512 if (savedCmd.minToTray) {
505 PwMDoc *newDoc = createDoc(); 513 PwMDoc *newDoc = createDoc();
506 if (!newDoc->openDocUi(newDoc, 514 if (!newDoc->openDocUi(newDoc,
507 curArg, 515 curArg,
508 savedCmd.open_deeplocked)) { 516 savedCmd.open_deeplocked)) {
509 delete newDoc; 517 delete newDoc;
510 } 518 }
511 } else { 519 } else {
512 PwM *newInstance = createMainWnd(QString::null, 520 PwM *newInstance = createMainWnd(QString::null,
513 false, 521 false,
514 true, 522 true,
515 0, 523 0,
516 savedCmd.minimized); 524 savedCmd.minimized);
517 PwMDoc *newDoc = newInstance->openDoc(curArg, 525 PwMDoc *newDoc = newInstance->openDoc(curArg,
518 savedCmd.open_deeplocked); 526 savedCmd.open_deeplocked);
519 if (!newDoc) { 527 if (!newDoc) {
520 newInstance->setForceQuit(true); 528 newInstance->setForceQuit(true);
521 delete_and_null(newInstance); 529 delete_and_null(newInstance);
522 } 530 }
523 } 531 }
524 } 532 }
525 533
526 if (savedCmd.minToTray) { 534 if (savedCmd.minToTray) {
527 minimizeAllMainWnd(true); 535 minimizeAllMainWnd(true);
528 } else if (savedCmd.minimized) { 536 } else if (savedCmd.minimized) {
529 minimizeAllMainWnd(false); 537 minimizeAllMainWnd(false);
530 } 538 }
531 if (!savedCmd.skipSelfTest && initial) { 539 if (!savedCmd.skipSelfTest && initial) {
532 SelfTest::schedule(); 540 SelfTest::schedule();
533 } 541 }
534 args->clear(); 542 args->clear();
535#endif 543#endif
536} 544}
537 545
538void PwMInit::minimizeAllMainWnd(bool toTray) 546void PwMInit::minimizeAllMainWnd(bool toTray)
539{ 547{
540#ifndef PWM_EMBEDDED 548#ifndef PWM_EMBEDDED
541 if (!_mainWndList.size()) 549 if (!_mainWndList.size())
542 return; 550 return;
543#else 551#else
544 if (!_mainWndList.count()) 552 if (!_mainWndList.count())
545 return; 553 return;
546#endif 554#endif
547 const QValueList<PwM *> *ml = mainWndList(); 555 const QValueList<PwM *> *ml = mainWndList();
548#ifndef PWM_EMBEDDED 556#ifndef PWM_EMBEDDED
549 QValueList<PwM *>::const_iterator it = ml->begin(), 557 QValueList<PwM *>::const_iterator it = ml->begin(),
550 end = ml->end(); 558 end = ml->end();
551#else 559#else
552 QValueList<PwM *>::ConstIterator it = ml->begin(), 560 QValueList<PwM *>::ConstIterator it = ml->begin(),
553 end = ml->end(); 561 end = ml->end();
554#endif 562#endif
555 PwM *wnd; 563 PwM *wnd;
556 if (toTray && _tray) { 564 if (toTray && _tray) {
557 /* minimize to tray. 565 /* minimize to tray.
558 * close all mainWnd. 566 * close all mainWnd.
559 */ 567 */
560 while (it != end) { 568 while (it != end) {
561 wnd = *it; 569 wnd = *it;
562 wnd->setForceMinimizeToTray(true); 570 wnd->setForceMinimizeToTray(true);
563 wnd->close_slot(); 571 wnd->close_slot();
564 ++it; 572 ++it;
565 } 573 }
566 } else { 574 } else {
567 // normal minimize 575 // normal minimize
568 while (it != end) { 576 while (it != end) {
569 wnd = *it; 577 wnd = *it;
570 wnd->hide(); 578 wnd->hide();
571 wnd->showMinimized(); 579 wnd->showMinimized();
572 ++it; 580 ++it;
573 } 581 }
574 } 582 }
575} 583}
576 584
577#ifdef PWM_EMBEDDED 585#ifdef PWM_EMBEDDED
578 586
579#ifndef DESKTOP_VERSION 587#ifndef DESKTOP_VERSION
580 588
581PwMApplication::PwMApplication(int & argc, char ** argv) 589PwMApplication::PwMApplication(int & argc, char ** argv)
582 : QPEApplication( argc, argv ) 590 : QPEApplication( argc, argv )
583 , init (0) 591 , init (0)
584{ 592{
585 this->setKeepRunning (); 593 this->setKeepRunning ();
586} 594}
587 595
588PwMApplication::~PwMApplication() 596PwMApplication::~PwMApplication()
589{ 597{
590 delete_ifnot_null(init); 598 delete_ifnot_null(init);
591} 599}
592#else //DESKTOP_VERSION 600#else //DESKTOP_VERSION
593 601
594PwMApplication::PwMApplication(int & argc, char ** argv) 602PwMApplication::PwMApplication(int & argc, char ** argv)
595 : QApplication( argc, argv ) 603 : QApplication( argc, argv )
596 , init (0) 604 , init (0)
597{ 605{
598 setStyle( new QPlatinumStyle ()); 606 setStyle( new QPlatinumStyle ());
599 QString hdir = QDir::homeDirPath(); 607 QString hdir = QDir::homeDirPath();
600 // there is a bug when creating dirs for WIN 98 608 // there is a bug when creating dirs for WIN 98
601 // it is difficult to fix, because we have no WIN 98 runnung 609 // it is difficult to fix, because we have no WIN 98 runnung
602 // such that we try it to create the dirs at startup here 610 // such that we try it to create the dirs at startup here
603 if ( hdir == "C:\\" ) 611 if ( hdir == "C:\\" )
604 { 612 {
605 // win 98 or ME 613 // win 98 or ME
606 QDir app_dir; 614 QDir app_dir;
607 if ( !app_dir.exists("C:\\kdepim") ) 615 if ( !app_dir.exists("C:\\kdepim") )
608 app_dir.mkdir ("C:\\kdepim"); 616 app_dir.mkdir ("C:\\kdepim");
609 if ( !app_dir.exists("C:\\kdepim\\apps") ) 617 if ( !app_dir.exists("C:\\kdepim\\apps") )
610 app_dir.mkdir ("C:\\kdepim\\apps"); 618 app_dir.mkdir ("C:\\kdepim\\apps");
611 if ( !app_dir.exists("C:\\kdepim\\config") ) 619 if ( !app_dir.exists("C:\\kdepim\\config") )
612 app_dir.mkdir ("C:\\kdepim\\config"); 620 app_dir.mkdir ("C:\\kdepim\\config");
613 if ( !app_dir.exists("C:\\kdepim\\apps\\pwmanager") ) 621 if ( !app_dir.exists("C:\\kdepim\\apps\\pwmanager") )
614 app_dir.mkdir ("C:\\kdepim\\apps\\pwmanager"); 622 app_dir.mkdir ("C:\\kdepim\\apps\\pwmanager");
615 } 623 }
616} 624}
617 625
618PwMApplication::~PwMApplication() 626PwMApplication::~PwMApplication()
619{ 627{
620 delete_ifnot_null(init); 628 delete_ifnot_null(init);
621} 629}
622 630
623#endif //DESKTOP_VERSION 631#endif //DESKTOP_VERSION
624 632
625#endif //PWM_EMBEDDED 633#endif //PWM_EMBEDDED
626 634
627 635
628 636
629 637
630#ifndef PWM_EMBEDDED 638#ifndef PWM_EMBEDDED
631#include "pwminit.moc" 639#include "pwminit.moc"
632#endif 640#endif
diff --git a/pwmanager/pwmanager/serializer.cpp b/pwmanager/pwmanager/serializer.cpp
index 2d6498e..ed0f754 100644
--- a/pwmanager/pwmanager/serializer.cpp
+++ b/pwmanager/pwmanager/serializer.cpp
@@ -1,780 +1,784 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2004 by Michael Buesch * 3 * copyright (C) 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12 12
13/*************************************************************************** 13/***************************************************************************
14 * copyright (C) 2004 by Ulf Schenk 14 * copyright (C) 2004 by Ulf Schenk
15 * This file is originaly based on version 1.1 of pwmanager 15 * This file is originaly based on version 1.1 of pwmanager
16 * and was modified to run on embedded devices that run microkde 16 * and was modified to run on embedded devices that run microkde
17 * 17 *
18 * $Id$ 18 * $Id$
19 **************************************************************************/ 19 **************************************************************************/
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_DEBUG0 30 #define SERIALIZER_DEBUG0
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" 44#define SYNC_ROOT "s"
45#define SYNC_TARGET_PREFIX "t" 45#define SYNC_TARGET_PREFIX "t"
46#define SYNC_TARGET_NAME "n" 46#define SYNC_TARGET_NAME "n"
47 47
48 48
49/* This is compatibility stuff. 49/* This is compatibility stuff.
50 * The names of the entries have changed and here are the 50 * The names of the entries have changed and here are the
51 * new and old ones 51 * new and old ones
52 */ 52 */
53 #define ROOT_MAGIC_OLD "PwM-xml-dat" 53 #define ROOT_MAGIC_OLD "PwM-xml-dat"
54 #define VER_STR_OLD "ver" 54 #define VER_STR_OLD "ver"
55 #define COMPAT_VER_OLD "0x02" 55 #define COMPAT_VER_OLD "0x02"
56 #define CAT_ROOT_OLD "categories" 56 #define CAT_ROOT_OLD "categories"
57 #define CAT_PREFIX_OLD "cat_" 57 #define CAT_PREFIX_OLD "cat_"
58 #define CAT_NAME_OLD "name" 58 #define CAT_NAME_OLD "name"
59 #define ENTRY_PREFIX_OLD"entry_" 59 #define ENTRY_PREFIX_OLD"entry_"
60 #define ENTRY_DESC_OLD "desc" 60 #define ENTRY_DESC_OLD "desc"
61 #define ENTRY_NAME_OLD "name" 61 #define ENTRY_NAME_OLD "name"
62 #define ENTRY_PW_OLD "pw" 62 #define ENTRY_PW_OLD "pw"
63 #define ENTRY_COMMENT_OLD"comment" 63 #define ENTRY_COMMENT_OLD"comment"
64 #define ENTRY_URL_OLD "url" 64 #define ENTRY_URL_OLD "url"
65 #define ENTRY_LAUNCHER_OLD"launcher" 65 #define ENTRY_LAUNCHER_OLD"launcher"
66 #define ENTRY_LVP_OLD "listViewPos" 66 #define ENTRY_LVP_OLD "listViewPos"
67 #define ENTRY_BIN_OLD "b" 67 #define ENTRY_BIN_OLD "b"
68 #define ENTRY_META_OLD "m" 68 #define ENTRY_META_OLD "m"
69 69
70 #define ROOT_MAGIC_NEW "P" 70 #define ROOT_MAGIC_NEW "P"
71 #define VER_STR_NEW "v" 71 #define VER_STR_NEW "v"
72 #define COMPAT_VER_NEW "2" 72 #define COMPAT_VER_NEW "2"
73 #define CAT_ROOT_NEW "c" 73 #define CAT_ROOT_NEW "c"
74 #define CAT_PREFIX_NEW "c" 74 #define CAT_PREFIX_NEW "c"
75 #define CAT_NAME_NEW "n" 75 #define CAT_NAME_NEW "n"
76 #define ENTRY_PREFIX_NEW"e" 76 #define ENTRY_PREFIX_NEW"e"
77 #define ENTRY_DESC_NEW "d" 77 #define ENTRY_DESC_NEW "d"
78 #define ENTRY_NAME_NEW "n" 78 #define ENTRY_NAME_NEW "n"
79 #define ENTRY_PW_NEW "p" 79 #define ENTRY_PW_NEW "p"
80 #define ENTRY_COMMENT_NEW"c" 80 #define ENTRY_COMMENT_NEW"c"
81 #define ENTRY_URL_NEW "u" 81 #define ENTRY_URL_NEW "u"
82 #define ENTRY_LAUNCHER_NEW"l" 82 #define ENTRY_LAUNCHER_NEW"l"
83 #define ENTRY_LVP_NEW "v" 83 #define ENTRY_LVP_NEW "v"
84 #define ENTRY_BIN_NEW ENTRY_BIN_OLD 84 #define ENTRY_BIN_NEW ENTRY_BIN_OLD
85 #define ENTRY_META_NEW ENTRY_META_OLD 85 #define ENTRY_META_NEW ENTRY_META_OLD
86 86
87#if USE_OLD_TAGS != 0 87#if USE_OLD_TAGS != 0
88 # define ROOT_MAGIC_WR ROOT_MAGIC_OLD 88 # define ROOT_MAGIC_WR ROOT_MAGIC_OLD
89 # define VER_STR_WR VER_STR_OLD 89 # define VER_STR_WR VER_STR_OLD
90 # define COMPAT_VER_WR COMPAT_VER_OLD 90 # define COMPAT_VER_WR COMPAT_VER_OLD
91 # define CAT_ROOT_WR CAT_ROOT_OLD 91 # define CAT_ROOT_WR CAT_ROOT_OLD
92 # define CAT_PREFIX_WR CAT_PREFIX_OLD 92 # define CAT_PREFIX_WR CAT_PREFIX_OLD
93 # define CAT_NAME_WR CAT_NAME_OLD 93 # define CAT_NAME_WR CAT_NAME_OLD
94 # define ENTRY_PREFIX_WRENTRY_PREFIX_OLD 94 # define ENTRY_PREFIX_WRENTRY_PREFIX_OLD
95 # define ENTRY_DESC_WR ENTRY_DESC_OLD 95 # define ENTRY_DESC_WR ENTRY_DESC_OLD
96 # define ENTRY_NAME_WR ENTRY_NAME_OLD 96 # define ENTRY_NAME_WR ENTRY_NAME_OLD
97 # define ENTRY_PW_WR ENTRY_PW_OLD 97 # define ENTRY_PW_WR ENTRY_PW_OLD
98 # define ENTRY_COMMENT_WRENTRY_COMMENT_OLD 98 # define ENTRY_COMMENT_WRENTRY_COMMENT_OLD
99 # define ENTRY_URL_WR ENTRY_URL_OLD 99 # define ENTRY_URL_WR ENTRY_URL_OLD
100 # define ENTRY_LAUNCHER_WRENTRY_LAUNCHER_OLD 100 # define ENTRY_LAUNCHER_WRENTRY_LAUNCHER_OLD
101 # define ENTRY_LVP_WR ENTRY_LVP_OLD 101 # define ENTRY_LVP_WR ENTRY_LVP_OLD
102 # define ENTRY_BIN_WR ENTRY_BIN_OLD 102 # define ENTRY_BIN_WR ENTRY_BIN_OLD
103 # define ENTRY_META_WR ENTRY_META_OLD 103 # define ENTRY_META_WR ENTRY_META_OLD
104#else 104#else
105 # define ROOT_MAGIC_WR ROOT_MAGIC_NEW 105 # define ROOT_MAGIC_WR ROOT_MAGIC_NEW
106 # define VER_STR_WR VER_STR_NEW 106 # define VER_STR_WR VER_STR_NEW
107 # define COMPAT_VER_WR COMPAT_VER_NEW 107 # define COMPAT_VER_WR COMPAT_VER_NEW
108 # define CAT_ROOT_WR CAT_ROOT_NEW 108 # define CAT_ROOT_WR CAT_ROOT_NEW
109 # define CAT_PREFIX_WR CAT_PREFIX_NEW 109 # define CAT_PREFIX_WR CAT_PREFIX_NEW
110 # define CAT_NAME_WR CAT_NAME_NEW 110 # define CAT_NAME_WR CAT_NAME_NEW
111 # define ENTRY_PREFIX_WRENTRY_PREFIX_NEW 111 # define ENTRY_PREFIX_WRENTRY_PREFIX_NEW
112 # define ENTRY_DESC_WR ENTRY_DESC_NEW 112 # define ENTRY_DESC_WR ENTRY_DESC_NEW
113 # define ENTRY_NAME_WR ENTRY_NAME_NEW 113 # define ENTRY_NAME_WR ENTRY_NAME_NEW
114 # define ENTRY_PW_WR ENTRY_PW_NEW 114 # define ENTRY_PW_WR ENTRY_PW_NEW
115 # define ENTRY_COMMENT_WRENTRY_COMMENT_NEW 115 # define ENTRY_COMMENT_WRENTRY_COMMENT_NEW
116 # define ENTRY_URL_WR ENTRY_URL_NEW 116 # define ENTRY_URL_WR ENTRY_URL_NEW
117 # define ENTRY_LAUNCHER_WRENTRY_LAUNCHER_NEW 117 # define ENTRY_LAUNCHER_WRENTRY_LAUNCHER_NEW
118 # define ENTRY_LVP_WR ENTRY_LVP_NEW 118 # define ENTRY_LVP_WR ENTRY_LVP_NEW
119 # define ENTRY_BIN_WR ENTRY_BIN_NEW 119 # define ENTRY_BIN_WR ENTRY_BIN_NEW
120 # define ENTRY_META_WR ENTRY_META_NEW 120 # define ENTRY_META_WR ENTRY_META_NEW
121#endif 121#endif
122 122
123 123
124Serializer::Serializer() 124Serializer::Serializer()
125{ 125{
126 defaultLockStat = true; 126 defaultLockStat = true;
127//US BUG: I needed to specify a document name. Otherwise impl will not be created for serializing 127//US BUG: I needed to specify a document name. Otherwise impl will not be created for serializing
128#ifndef PWM_EMBEDDED 128#ifndef PWM_EMBEDDED
129 domDoc = new QDomDocument; 129 domDoc = new QDomDocument;
130#else 130#else
131 domDoc = new QDomDocument("mydoc"); 131 domDoc = new QDomDocument("mydoc");
132#endif 132#endif
133} 133}
134 134
135Serializer::Serializer(const QCString &buffer) 135Serializer::Serializer(const QCString &buffer)
136{ 136{
137 defaultLockStat = true; 137 defaultLockStat = true;
138//US BUG: I needed to specify a document name. Otherwise impl will not be created for serializing 138//US BUG: I needed to specify a document name. Otherwise impl will not be created for serializing
139#ifndef PWM_EMBEDDED 139#ifndef PWM_EMBEDDED
140 domDoc = new QDomDocument; 140 domDoc = new QDomDocument;
141#else 141#else
142 domDoc = new QDomDocument("mydoc"); 142 domDoc = new QDomDocument("mydoc");
143#endif 143#endif
144 144
145 if (!parseXml(buffer)) { 145 if (!parseXml(buffer)) {
146 delete domDoc; 146 delete domDoc;
147#ifndef PWM_EMBEDDED 147#ifndef PWM_EMBEDDED
148 throw PwMException(PwMException::EX_PARSE); 148 throw PwMException(PwMException::EX_PARSE);
149#else 149#else
150 qDebug("Serializer::Serializer : Parse Exception "); 150 qDebug("Serializer::Serializer : Parse Exception ");
151#endif 151#endif
152 } 152 }
153} 153}
154 154
155Serializer::~Serializer() 155Serializer::~Serializer()
156{ 156{
157 delete_ifnot_null(domDoc); 157 delete_ifnot_null(domDoc);
158} 158}
159 159
160void Serializer::clear() 160void Serializer::clear()
161{ 161{
162 delete_ifnot_null(domDoc); 162 delete_ifnot_null(domDoc);
163 domDoc = new QDomDocument; 163 domDoc = new QDomDocument;
164} 164}
165 165
166bool Serializer::parseXml(const QCString &buffer) 166bool Serializer::parseXml(const QCString &buffer)
167{ 167{
168 PWM_ASSERT(domDoc); 168 PWM_ASSERT(domDoc);
169#ifndef PWM_EMBEDDED 169#ifndef PWM_EMBEDDED
170 if (!domDoc->setContent(buffer, true)) 170 if (!domDoc->setContent(buffer, true))
171 return false; 171 return false;
172#else 172#else
173#ifdef DESKTOP_VERSION
174 if (!domDoc->setContent(buffer, true))
175#else
173 if (!domDoc->setContent(buffer)) 176 if (!domDoc->setContent(buffer))
177#endif
174 return false; 178 return false;
175#endif 179#endif
176 if (!checkValid()) 180 if (!checkValid())
177 return false; 181 return false;
178 return true; 182 return true;
179} 183}
180 184
181QCString Serializer::getXml() 185QCString Serializer::getXml()
182{ 186{
183 PWM_ASSERT(domDoc); 187 PWM_ASSERT(domDoc);
184 188
185#ifndef PWM_EMBEDDED 189#ifndef PWM_EMBEDDED
186#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0 190#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0
187 QCString tmp(domDoc->toCString(8)); 191 QCString tmp(domDoc->toCString(8));
188 printDebug("<BEGIN Serializer::getXml() dump>\n"); 192 printDebug("<BEGIN Serializer::getXml() dump>\n");
189 cout << tmp << endl; 193 cout << tmp << endl;
190 printDebug("<END Serializer::getXml() dump>"); 194 printDebug("<END Serializer::getXml() dump>");
191#endif // DEBUG 195#endif // DEBUG
192 196
193 QCString ret(domDoc->toCString(0)); 197 QCString ret(domDoc->toCString(0));
194 ret.replace('\n', ""); 198 ret.replace('\n', "");
195 return ret; 199 return ret;
196#else 200#else
197 201
198#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0 202#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0
199 QCString tmp(" " + domDoc->toCString()); 203 QCString tmp(" " + domDoc->toCString());
200 printDebug("<BEGIN Serializer::getXml() dump>\n"); 204 printDebug("<BEGIN Serializer::getXml() dump>\n");
201 qDebug(tmp); 205 qDebug(tmp);
202 cout << tmp << endl; 206 cout << tmp << endl;
203 printDebug("<END Serializer::getXml() dump>"); 207 printDebug("<END Serializer::getXml() dump>");
204#endif // DEBUG 208#endif // DEBUG
205 209
206 QCString ret(domDoc->toCString()); 210 QCString ret(domDoc->toCString());
207 ret.replace(QRegExp("\n"), ""); 211 ret.replace(QRegExp("\n"), "");
208 return ret; 212 return ret;
209 213
210#endif 214#endif
211} 215}
212 216
213bool Serializer::serialize(PwMItem &dta) 217bool Serializer::serialize(PwMItem &dta)
214{ 218{
215 PWM_ASSERT(domDoc); 219 PWM_ASSERT(domDoc);
216 QDomElement root(genNewRoot()); 220 QDomElement root(genNewRoot());
217 QDomElement catNode(domDoc->createElement(CAT_ROOT_WR)); 221 QDomElement catNode(domDoc->createElement(CAT_ROOT_WR));
218 QDomElement syncNode(domDoc->createElement(SYNC_ROOT)); 222 QDomElement syncNode(domDoc->createElement(SYNC_ROOT));
219 if (!addSyncData(&syncNode, dta.syncDta)) 223 if (!addSyncData(&syncNode, dta.syncDta))
220 return false; 224 return false;
221 root.appendChild(syncNode); 225 root.appendChild(syncNode);
222 if (!addCategories(&catNode, dta.dta)) 226 if (!addCategories(&catNode, dta.dta))
223 return false; 227 return false;
224 root.appendChild(catNode); 228 root.appendChild(catNode);
225 return true; 229 return true;
226} 230}
227 231
228bool Serializer::deSerialize(PwMItem *dta) 232bool Serializer::deSerialize(PwMItem *dta)
229{ 233{
230 PWM_ASSERT(domDoc); 234 PWM_ASSERT(domDoc);
231 PWM_ASSERT(dta); 235 PWM_ASSERT(dta);
232 QDomElement root(domDoc->documentElement()); 236 QDomElement root(domDoc->documentElement());
233 QDomNode n; 237 QDomNode n;
234 238
235 dta->clear(); 239 dta->clear();
236 for (n = root.firstChild(); !n.isNull(); n = n.nextSibling()) { 240 for (n = root.firstChild(); !n.isNull(); n = n.nextSibling()) {
237 // find <categories> ... </categories> 241 // find <categories> ... </categories>
238 // <c> ... </c> 242 // <c> ... </c>
239 if (n.nodeName() == CAT_ROOT_NEW || 243 if (n.nodeName() == CAT_ROOT_NEW ||
240 n.nodeName() == CAT_ROOT_OLD) { 244 n.nodeName() == CAT_ROOT_OLD) {
241 if (!readCategories(n, &(dta->dta))) { 245 if (!readCategories(n, &(dta->dta))) {
242 return false; 246 return false;
243 } 247 }
244 continue; 248 continue;
245 } 249 }
246 else if (n.nodeName() == SYNC_ROOT) { 250 else if (n.nodeName() == SYNC_ROOT) {
247 if (!readSyncData(n, &(dta->syncDta))) { 251 if (!readSyncData(n, &(dta->syncDta))) {
248 return false; 252 return false;
249 } 253 }
250 continue; 254 continue;
251 } 255 }
252 256
253 /* NOTE: We can stop processing here, as we 257 /* NOTE: We can stop processing here, as we
254 * don't have more nodes in root, yet. 258 * don't have more nodes in root, yet.
255 */ 259 */
256 return false; 260 return false;
257 261
258 } 262 }
259 return true; 263 return true;
260} 264}
261 265
262bool Serializer::readCategories(const QDomNode &n, 266bool Serializer::readCategories(const QDomNode &n,
263 vector<PwMCategoryItem> *dta) 267 vector<PwMCategoryItem> *dta)
264{ 268{
265 QDomNodeList nl(n.childNodes()); 269 QDomNodeList nl(n.childNodes());
266 QDomNode cur; 270 QDomNode cur;
267 QString name; 271 QString name;
268 unsigned int numCat = nl.count(), i; 272 unsigned int numCat = nl.count(), i;
269 PwMCategoryItem curCat; 273 PwMCategoryItem curCat;
270 vector<PwMDataItem> curEntr; 274 vector<PwMDataItem> curEntr;
271 275
272 if (!numCat) { 276 if (!numCat) {
273 printDebug("Serializer::readCategories(): empty"); 277 printDebug("Serializer::readCategories(): empty");
274 return false; 278 return false;
275 } 279 }
276 for (i = 0; i < numCat; ++i) { 280 for (i = 0; i < numCat; ++i) {
277 cur = nl.item(i); 281 cur = nl.item(i);
278 if (cur.nodeName().left(1) == CAT_PREFIX_NEW || 282 if (cur.nodeName().left(1) == CAT_PREFIX_NEW ||
279 cur.nodeName().left(4) == CAT_PREFIX_OLD) { 283 cur.nodeName().left(4) == CAT_PREFIX_OLD) {
280 name = cur.toElement().attribute(CAT_NAME_NEW); 284 name = cur.toElement().attribute(CAT_NAME_NEW);
281 if (name == QString::null) 285 if (name == QString::null)
282 name = cur.toElement().attribute(CAT_NAME_OLD); 286 name = cur.toElement().attribute(CAT_NAME_OLD);
283 PWM_ASSERT(name != QString::null); 287 PWM_ASSERT(name != QString::null);
284 PWM_ASSERT(name != ""); 288 PWM_ASSERT(name != "");
285 curCat.clear(); 289 curCat.clear();
286 curCat.name = name.latin1(); 290 curCat.name = name.latin1();
287 if (!readEntries(cur, &curEntr)) { 291 if (!readEntries(cur, &curEntr)) {
288 dta->clear(); 292 dta->clear();
289 return false; 293 return false;
290 } 294 }
291 curCat.d = curEntr; 295 curCat.d = curEntr;
292 dta->push_back(curCat); 296 dta->push_back(curCat);
293 } else { 297 } else {
294 printDebug("Serializer::readCategories(): uh? not a category?"); 298 printDebug("Serializer::readCategories(): uh? not a category?");
295 } 299 }
296 } 300 }
297 return true; 301 return true;
298} 302}
299 303
300bool Serializer::readEntries(const QDomNode &n, 304bool Serializer::readEntries(const QDomNode &n,
301 vector<PwMDataItem> *dta) 305 vector<PwMDataItem> *dta)
302{ 306{
303 QDomNodeList nl(n.childNodes()); 307 QDomNodeList nl(n.childNodes());
304 QDomNode cur; 308 QDomNode cur;
305 unsigned int numEntr = nl.count(), i; 309 unsigned int numEntr = nl.count(), i;
306 PwMDataItem curEntr; 310 PwMDataItem curEntr;
307 //US BUG: to initialize all values of curEntr with meaningfulldata, 311 //US BUG: to initialize all values of curEntr with meaningfulldata,
308 // we call clear on it. Reason: Information in the file we will read might be incomplete. 312 // we call clear on it. Reason: Information in the file we will read might be incomplete.
309 // e.g. the metadata is missing. 313 // e.g. the metadata is missing.
310 curEntr.clear(true); 314 curEntr.clear(true);
311 315
312 dta->clear(); 316 dta->clear();
313 for (i = 0; i < numEntr; ++i) { 317 for (i = 0; i < numEntr; ++i) {
314 cur = nl.item(i); 318 cur = nl.item(i);
315 if (cur.nodeName().left(1) == ENTRY_PREFIX_NEW || 319 if (cur.nodeName().left(1) == ENTRY_PREFIX_NEW ||
316 cur.nodeName().left(6) == ENTRY_PREFIX_OLD) { 320 cur.nodeName().left(6) == ENTRY_PREFIX_OLD) {
317 if (!extractEntry(cur, &curEntr)) { 321 if (!extractEntry(cur, &curEntr)) {
318 return false; 322 return false;
319 } 323 }
320 dta->push_back(curEntr); 324 dta->push_back(curEntr);
321 } else { 325 } else {
322 printDebug("Serializer::readEntries(): hm? not an entry?"); 326 printDebug("Serializer::readEntries(): hm? not an entry?");
323 } 327 }
324 } 328 }
325 return true; 329 return true;
326} 330}
327 331
328bool Serializer::extractEntry(const QDomNode &n, 332bool Serializer::extractEntry(const QDomNode &n,
329 PwMDataItem *dta) 333 PwMDataItem *dta)
330{ 334{
331 QDomNodeList nl(n.childNodes()); 335 QDomNodeList nl(n.childNodes());
332 QDomNode cur, cdata; 336 QDomNode cur, cdata;
333 unsigned int cnt = nl.count(), i; 337 unsigned int cnt = nl.count(), i;
334 QString name, text; 338 QString name, text;
335 339
336 if (!cnt) { 340 if (!cnt) {
337 printDebug("Serializer::extractEntry(): empty"); 341 printDebug("Serializer::extractEntry(): empty");
338 return false; 342 return false;
339 } 343 }
340 dta->clear(); 344 dta->clear();
341 for (i = 0; i < cnt; ++i) { 345 for (i = 0; i < cnt; ++i) {
342 cur = nl.item(i); 346 cur = nl.item(i);
343 name = cur.nodeName(); 347 name = cur.nodeName();
344 cdata = cur.firstChild(); 348 cdata = cur.firstChild();
345 if (unlikely(cdata.isCDATASection())) { 349 if (unlikely(cdata.isCDATASection())) {
346 text = cdata.toCDATASection().data(); 350 text = cdata.toCDATASection().data();
347 } else if (likely(cur.isElement())) { 351 } else if (likely(cur.isElement())) {
348 text = cur.toElement().text(); 352 text = cur.toElement().text();
349 } else { 353 } else {
350 printDebug("Serializer::extractEntry(): neither CDATA nor element."); 354 printDebug("Serializer::extractEntry(): neither CDATA nor element.");
351 return false; 355 return false;
352 } 356 }
353 if (text == " ") 357 if (text == " ")
354 text = ""; // for backward compatibility. 358 text = ""; // for backward compatibility.
355 if (name == ENTRY_DESC_NEW || 359 if (name == ENTRY_DESC_NEW ||
356 name == ENTRY_DESC_OLD) { 360 name == ENTRY_DESC_OLD) {
357 dta->desc = unescapeEntryData(text).latin1(); 361 dta->desc = unescapeEntryData(text).latin1();
358 } else if (name == ENTRY_NAME_NEW || 362 } else if (name == ENTRY_NAME_NEW ||
359 name == ENTRY_NAME_OLD) { 363 name == ENTRY_NAME_OLD) {
360 dta->name = unescapeEntryData(text).latin1(); 364 dta->name = unescapeEntryData(text).latin1();
361 } else if (name == ENTRY_PW_NEW || 365 } else if (name == ENTRY_PW_NEW ||
362 name == ENTRY_PW_OLD) { 366 name == ENTRY_PW_OLD) {
363 dta->pw = unescapeEntryData(text).latin1(); 367 dta->pw = unescapeEntryData(text).latin1();
364 } else if (name == ENTRY_COMMENT_NEW || 368 } else if (name == ENTRY_COMMENT_NEW ||
365 name == ENTRY_COMMENT_OLD) { 369 name == ENTRY_COMMENT_OLD) {
366 dta->comment = unescapeEntryData(text).latin1(); 370 dta->comment = unescapeEntryData(text).latin1();
367 } else if (name == ENTRY_URL_NEW || 371 } else if (name == ENTRY_URL_NEW ||
368 name == ENTRY_URL_OLD) { 372 name == ENTRY_URL_OLD) {
369 dta->url = unescapeEntryData(text).latin1(); 373 dta->url = unescapeEntryData(text).latin1();
370 } else if (name == ENTRY_LAUNCHER_NEW || 374 } else if (name == ENTRY_LAUNCHER_NEW ||
371 name == ENTRY_LAUNCHER_OLD) { 375 name == ENTRY_LAUNCHER_OLD) {
372 dta->launcher = unescapeEntryData(text).latin1(); 376 dta->launcher = unescapeEntryData(text).latin1();
373 } else if (name == ENTRY_LVP_NEW || 377 } else if (name == ENTRY_LVP_NEW ||
374 name == ENTRY_LVP_OLD) { 378 name == ENTRY_LVP_OLD) {
375 dta->listViewPos = strtol(text.latin1(), 0, 10); 379 dta->listViewPos = strtol(text.latin1(), 0, 10);
376 } else if (name == ENTRY_BIN_NEW) { 380 } else if (name == ENTRY_BIN_NEW) {
377 // ENTRY_BIN_NEW == ENTRY_BIN_OLD 381 // ENTRY_BIN_NEW == ENTRY_BIN_OLD
378 if (text == "0") { 382 if (text == "0") {
379 dta->binary = false; 383 dta->binary = false;
380 } else { 384 } else {
381 dta->binary = true; 385 dta->binary = true;
382 } 386 }
383 } else if (name == ENTRY_META_NEW) { 387 } else if (name == ENTRY_META_NEW) {
384 // ENTRY_META_NEW == ENTRY_META_OLD 388 // ENTRY_META_NEW == ENTRY_META_OLD
385 if (!extractMeta(cur, &dta->meta)) 389 if (!extractMeta(cur, &dta->meta))
386 return false; 390 return false;
387 } else { 391 } else {
388 printDebug(string("Serializer::extractEntry(): invalid: ") 392 printDebug(string("Serializer::extractEntry(): invalid: ")
389 + name.latin1()); 393 + name.latin1());
390 } 394 }
391 } 395 }
392 dta->lockStat = defaultLockStat; 396 dta->lockStat = defaultLockStat;
393 return true; 397 return true;
394} 398}
395 399
396bool Serializer::extractMeta(const QDomNode &n, 400bool Serializer::extractMeta(const QDomNode &n,
397 PwMMetaData *dta) 401 PwMMetaData *dta)
398{ 402{
399 QDomNode cur(n.firstChild()); 403 QDomNode cur(n.firstChild());
400 QString name, val; 404 QString name, val;
401 while (!cur.isNull()) { 405 while (!cur.isNull()) {
402 name = cur.nodeName(); 406 name = cur.nodeName();
403 val = cur.toElement().text(); 407 val = cur.toElement().text();
404 if (val == "") { 408 if (val == "") {
405 cur = cur.nextSibling(); 409 cur = cur.nextSibling();
406 continue; 410 continue;
407 } 411 }
408 412
409 //US BUG: The transformation of an empty date into an ISO date and back is different on different systems/compilers. 413 //US BUG: The transformation of an empty date into an ISO date and back is different on different systems/compilers.
410 //because of that it is possible that here some values are not set, which means they are null. 414 //because of that it is possible that here some values are not set, which means they are null.
411 //US ENH: at the same moment we need backwardcompatibility. So older versions might have stored invalid dates. 415 //US ENH: at the same moment we need backwardcompatibility. So older versions might have stored invalid dates.
412 416
413 QDateTime dtval; //dtval should be invalid by definition. 417 QDateTime dtval; //dtval should be invalid by definition.
414 418
415 if ((name == META_CREATE_DATE) || 419 if ((name == META_CREATE_DATE) ||
416 (name == META_VALID_DATE) || 420 (name == META_VALID_DATE) ||
417 (name == META_EXPIRE_DATE) || 421 (name == META_EXPIRE_DATE) ||
418 (name == META_UPDATE_DATE)) 422 (name == META_UPDATE_DATE))
419 { 423 {
420 //qDebug("Serializer::extractMeta:: val:%s, empty:%i, length:%i",val.utf8(), val.isEmpty(), val.length()); 424 //qDebug("Serializer::extractMeta:: val:%s, empty:%i, length:%i",val.utf8(), val.isEmpty(), val.length());
421 425
422#ifndef PWM_EMBEDDED 426#ifndef PWM_EMBEDDED
423 dtval = QDateTime::fromString(val, Qt::ISODate); 427 dtval = QDateTime::fromString(val, Qt::ISODate);
424#else 428#else
425 bool ok; 429 bool ok;
426 dtval = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); 430 dtval = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok);
427 431
428 if (ok == false) 432 if (ok == false)
429 qDebug("Serializer::extractMeta invalid date or time !!!!!!!!!!!!!"); 433 qDebug("Serializer::extractMeta invalid date or time !!!!!!!!!!!!!");
430#endif 434#endif
431 435
432 //if the parsed data is wrong, dtval should be invalid at this time. 436 //if the parsed data is wrong, dtval should be invalid at this time.
433 437
434 } 438 }
435 439
436 if (name == META_CREATE_DATE) { 440 if (name == META_CREATE_DATE) {
437 dta->create = dtval; 441 dta->create = dtval;
438 } else if (name == META_VALID_DATE) { 442 } else if (name == META_VALID_DATE) {
439 dta->valid = dtval; 443 dta->valid = dtval;
440 } else if (name == META_EXPIRE_DATE) { 444 } else if (name == META_EXPIRE_DATE) {
441 dta->expire = dtval; 445 dta->expire = dtval;
442 } else if (name == META_UPDATE_DATE) { 446 } else if (name == META_UPDATE_DATE) {
443 dta->update = dtval; 447 dta->update = dtval;
444 } else if (name == META_UPDATE_INT) { 448 } else if (name == META_UPDATE_INT) {
445 dta->updateInt = strtoul(val.latin1(), 0, 10); 449 dta->updateInt = strtoul(val.latin1(), 0, 10);
446 } else if (name == META_UNIQUEID) { 450 } else if (name == META_UNIQUEID) {
447 dta->uniqueid = unescapeEntryData(val).latin1(); 451 dta->uniqueid = unescapeEntryData(val).latin1();
448 } else { 452 } else {
449 printDebug(string("extractMeta(): invalid: ") 453 printDebug(string("extractMeta(): invalid: ")
450 + name.latin1()); 454 + name.latin1());
451 } 455 }
452 456
453 cur = cur.nextSibling(); 457 cur = cur.nextSibling();
454 } 458 }
455 return true; 459 return true;
456} 460}
457 461
458bool Serializer::checkValid() 462bool Serializer::checkValid()
459{ 463{
460 PWM_ASSERT(domDoc); 464 PWM_ASSERT(domDoc);
461 QDomElement root(domDoc->documentElement()); 465 QDomElement root(domDoc->documentElement());
462 if (root.nodeName() != ROOT_MAGIC_NEW && 466 if (root.nodeName() != ROOT_MAGIC_NEW &&
463 root.nodeName() != ROOT_MAGIC_OLD) { 467 root.nodeName() != ROOT_MAGIC_OLD) {
464 printDebug("Serializer: wrong magic"); 468 printDebug("Serializer: wrong magic");
465 return false; 469 return false;
466 } 470 }
467 if (root.attribute(VER_STR_NEW) != COMPAT_VER_NEW && 471 if (root.attribute(VER_STR_NEW) != COMPAT_VER_NEW &&
468 root.attribute(VER_STR_OLD) != COMPAT_VER_OLD) { 472 root.attribute(VER_STR_OLD) != COMPAT_VER_OLD) {
469 printDebug("Serializer: wrong version"); 473 printDebug("Serializer: wrong version");
470 return false; 474 return false;
471 } 475 }
472 return true; 476 return true;
473} 477}
474 478
475QDomElement Serializer::genNewRoot() 479QDomElement Serializer::genNewRoot()
476{ 480{
477 PWM_ASSERT(domDoc); 481 PWM_ASSERT(domDoc);
478 QDomElement root(domDoc->createElement(ROOT_MAGIC_WR)); 482 QDomElement root(domDoc->createElement(ROOT_MAGIC_WR));
479 root.setAttribute(VER_STR_WR, COMPAT_VER_WR); 483 root.setAttribute(VER_STR_WR, COMPAT_VER_WR);
480 domDoc->appendChild(root); 484 domDoc->appendChild(root);
481 return root; 485 return root;
482} 486}
483 487
484bool Serializer::addCategories(QDomElement *e, 488bool Serializer::addCategories(QDomElement *e,
485 const vector<PwMCategoryItem> &dta) 489 const vector<PwMCategoryItem> &dta)
486{ 490{
487 unsigned int numCat = dta.size(), i; 491 unsigned int numCat = dta.size(), i;
488 QString curId, curName; 492 QString curId, curName;
489 QDomElement curCat; 493 QDomElement curCat;
490 494
491 for (i = 0; i < numCat; ++i) { 495 for (i = 0; i < numCat; ++i) {
492 curId = CAT_PREFIX_WR; 496 curId = CAT_PREFIX_WR;
493 curId += tostr(i).c_str(); 497 curId += tostr(i).c_str();
494 curName = dta[i].name.c_str(); 498 curName = dta[i].name.c_str();
495 curCat = domDoc->createElement(curId); 499 curCat = domDoc->createElement(curId);
496 curCat.setAttribute(CAT_NAME_WR, curName); 500 curCat.setAttribute(CAT_NAME_WR, curName);
497 if (!addEntries(&curCat, dta[i].d)) { 501 if (!addEntries(&curCat, dta[i].d)) {
498 return false; 502 return false;
499 } 503 }
500 e->appendChild(curCat); 504 e->appendChild(curCat);
501 } 505 }
502 return true; 506 return true;
503} 507}
504 508
505bool Serializer::addEntries(QDomElement *e, 509bool Serializer::addEntries(QDomElement *e,
506 const vector<PwMDataItem> &dta) 510 const vector<PwMDataItem> &dta)
507{ 511{
508 unsigned int numEntr = dta.size(), i; 512 unsigned int numEntr = dta.size(), i;
509 QString curId; 513 QString curId;
510 QDomElement curEntr; 514 QDomElement curEntr;
511 515
512 for (i = 0; i < numEntr; ++i) { 516 for (i = 0; i < numEntr; ++i) {
513 curId = ENTRY_PREFIX_WR; 517 curId = ENTRY_PREFIX_WR;
514 curId += tostr(i).c_str(); 518 curId += tostr(i).c_str();
515 curEntr = domDoc->createElement(curId); 519 curEntr = domDoc->createElement(curId);
516 if (!writeEntry(&curEntr, dta[i])) { 520 if (!writeEntry(&curEntr, dta[i])) {
517 return false; 521 return false;
518 } 522 }
519 e->appendChild(curEntr); 523 e->appendChild(curEntr);
520 } 524 }
521 return true; 525 return true;
522} 526}
523 527
524bool Serializer::writeEntry(QDomElement *e, 528bool Serializer::writeEntry(QDomElement *e,
525 const PwMDataItem &_dta) 529 const PwMDataItem &_dta)
526{ 530{
527#if WRITE_CDATA_SEC != 0 531#if WRITE_CDATA_SEC != 0
528 # define new_text(x)domDoc->createCDATASection(x) 532 # define new_text(x)domDoc->createCDATASection(x)
529 QDomCDATASection curText; 533 QDomCDATASection curText;
530#else 534#else
531 # define new_text(x)domDoc->createTextNode(x) 535 # define new_text(x)domDoc->createTextNode(x)
532 QDomText curText; 536 QDomText curText;
533#endif 537#endif
534 538
535 QDomText plainText; 539 QDomText plainText;
536 QDomElement tag; 540 QDomElement tag;
537 541
538 // begin -- This is for compatibility with the old serializer 542 // begin -- This is for compatibility with the old serializer
539 PwMDataItem dta = _dta; 543 PwMDataItem dta = _dta;
540 if (!dta.desc.size()) 544 if (!dta.desc.size())
541 dta.desc = " "; 545 dta.desc = " ";
542 if (!dta.name.size()) 546 if (!dta.name.size())
543 dta.name = " "; 547 dta.name = " ";
544 if (!dta.pw.size()) 548 if (!dta.pw.size())
545 dta.pw = " "; 549 dta.pw = " ";
546 if (!dta.comment.size()) 550 if (!dta.comment.size())
547 dta.comment = " "; 551 dta.comment = " ";
548 if (!dta.url.size()) 552 if (!dta.url.size())
549 dta.url = " "; 553 dta.url = " ";
550 if (!dta.launcher.size()) 554 if (!dta.launcher.size())
551 dta.launcher = " "; 555 dta.launcher = " ";
552 // end -- This is for compatibility with the old serializer 556 // end -- This is for compatibility with the old serializer
553 557
554 tag = domDoc->createElement(ENTRY_DESC_WR); 558 tag = domDoc->createElement(ENTRY_DESC_WR);
555 curText = new_text(escapeEntryData(dta.desc.c_str())); 559 curText = new_text(escapeEntryData(dta.desc.c_str()));
556 tag.appendChild(curText); 560 tag.appendChild(curText);
557 e->appendChild(tag); 561 e->appendChild(tag);
558 562
559 tag = domDoc->createElement(ENTRY_NAME_WR); 563 tag = domDoc->createElement(ENTRY_NAME_WR);
560 curText = new_text(escapeEntryData(dta.name.c_str())); 564 curText = new_text(escapeEntryData(dta.name.c_str()));
561 tag.appendChild(curText); 565 tag.appendChild(curText);
562 e->appendChild(tag); 566 e->appendChild(tag);
563 567
564 tag = domDoc->createElement(ENTRY_PW_WR); 568 tag = domDoc->createElement(ENTRY_PW_WR);
565 curText = new_text(escapeEntryData(dta.pw.c_str())); 569 curText = new_text(escapeEntryData(dta.pw.c_str()));
566 tag.appendChild(curText); 570 tag.appendChild(curText);
567 e->appendChild(tag); 571 e->appendChild(tag);
568 572
569 tag = domDoc->createElement(ENTRY_COMMENT_WR); 573 tag = domDoc->createElement(ENTRY_COMMENT_WR);
570 curText = new_text(escapeEntryData(dta.comment.c_str())); 574 curText = new_text(escapeEntryData(dta.comment.c_str()));
571 tag.appendChild(curText); 575 tag.appendChild(curText);
572 e->appendChild(tag); 576 e->appendChild(tag);
573 577
574 tag = domDoc->createElement(ENTRY_URL_WR); 578 tag = domDoc->createElement(ENTRY_URL_WR);
575 curText = new_text(escapeEntryData(dta.url.c_str())); 579 curText = new_text(escapeEntryData(dta.url.c_str()));
576 tag.appendChild(curText); 580 tag.appendChild(curText);
577 e->appendChild(tag); 581 e->appendChild(tag);
578 582
579 tag = domDoc->createElement(ENTRY_LAUNCHER_WR); 583 tag = domDoc->createElement(ENTRY_LAUNCHER_WR);
580 curText = new_text(escapeEntryData(dta.launcher.c_str())); 584 curText = new_text(escapeEntryData(dta.launcher.c_str()));
581 tag.appendChild(curText); 585 tag.appendChild(curText);
582 e->appendChild(tag); 586 e->appendChild(tag);
583 587
584 tag = domDoc->createElement(ENTRY_LVP_WR); 588 tag = domDoc->createElement(ENTRY_LVP_WR);
585 plainText = domDoc->createTextNode(tostr(dta.listViewPos).c_str()); 589 plainText = domDoc->createTextNode(tostr(dta.listViewPos).c_str());
586 tag.appendChild(plainText); 590 tag.appendChild(plainText);
587 e->appendChild(tag); 591 e->appendChild(tag);
588 592
589 tag = domDoc->createElement(ENTRY_BIN_WR); 593 tag = domDoc->createElement(ENTRY_BIN_WR);
590 if (dta.binary) 594 if (dta.binary)
591 plainText = domDoc->createTextNode("1"); 595 plainText = domDoc->createTextNode("1");
592 else 596 else
593 plainText = domDoc->createTextNode("0"); 597 plainText = domDoc->createTextNode("0");
594 tag.appendChild(plainText); 598 tag.appendChild(plainText);
595 e->appendChild(tag); 599 e->appendChild(tag);
596 600
597 tag = domDoc->createElement(ENTRY_META_WR); 601 tag = domDoc->createElement(ENTRY_META_WR);
598 if (!writeMeta(&tag, dta.meta)) 602 if (!writeMeta(&tag, dta.meta))
599 return false; 603 return false;
600 e->appendChild(tag); 604 e->appendChild(tag);
601 605
602#undef new_text 606#undef new_text
603 return true; 607 return true;
604} 608}
605 609
606bool Serializer::writeMeta(QDomElement *e, 610bool Serializer::writeMeta(QDomElement *e,
607 const PwMMetaData &dta) 611 const PwMMetaData &dta)
608{ 612{
609 QDomText text; 613 QDomText text;
610 QDomElement tag; 614 QDomElement tag;
611 615
612 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers. 616 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers.
613 //So do not transform an empty value at all. 617 //So do not transform an empty value at all.
614 if (dta.create.isValid()) 618 if (dta.create.isValid())
615 { 619 {
616 tag = domDoc->createElement(META_CREATE_DATE); 620 tag = domDoc->createElement(META_CREATE_DATE);
617#ifndef PWM_EMBEDDED 621#ifndef PWM_EMBEDDED
618 text = domDoc->createTextNode(dta.create.toString(Qt::ISODate)); 622 text = domDoc->createTextNode(dta.create.toString(Qt::ISODate));
619#else 623#else
620 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.create, KLocale::ISODate)); 624 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.create, KLocale::ISODate));
621#endif 625#endif
622 tag.appendChild(text); 626 tag.appendChild(text);
623 e->appendChild(tag); 627 e->appendChild(tag);
624 } 628 }
625 629
626 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers. 630 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers.
627 //So do not transform an empty value at all. 631 //So do not transform an empty value at all.
628 if (dta.valid.isValid()) 632 if (dta.valid.isValid())
629 { 633 {
630 tag = domDoc->createElement(META_VALID_DATE); 634 tag = domDoc->createElement(META_VALID_DATE);
631#ifndef PWM_EMBEDDED 635#ifndef PWM_EMBEDDED
632 text = domDoc->createTextNode(dta.valid.toString(Qt::ISODate)); 636 text = domDoc->createTextNode(dta.valid.toString(Qt::ISODate));
633#else 637#else
634 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.valid, KLocale::ISODate)); 638 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.valid, KLocale::ISODate));
635#endif 639#endif
636 tag.appendChild(text); 640 tag.appendChild(text);
637 e->appendChild(tag); 641 e->appendChild(tag);
638 } 642 }
639 643
640 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers. 644 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers.
641 //So do not transform an empty value at all. 645 //So do not transform an empty value at all.
642 if (dta.expire.isValid()) 646 if (dta.expire.isValid())
643 { 647 {
644 tag = domDoc->createElement(META_EXPIRE_DATE); 648 tag = domDoc->createElement(META_EXPIRE_DATE);
645#ifndef PWM_EMBEDDED 649#ifndef PWM_EMBEDDED
646 text = domDoc->createTextNode(dta.expire.toString(Qt::ISODate)); 650 text = domDoc->createTextNode(dta.expire.toString(Qt::ISODate));
647#else 651#else
648 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.expire, KLocale::ISODate)); 652 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.expire, KLocale::ISODate));
649#endif 653#endif
650 tag.appendChild(text); 654 tag.appendChild(text);
651 e->appendChild(tag); 655 e->appendChild(tag);
652 } 656 }
653 657
654 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers. 658 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers.
655 //So do not transform an empty value at all. 659 //So do not transform an empty value at all.
656 if (dta.update.isValid()) 660 if (dta.update.isValid())
657 { 661 {
658 tag = domDoc->createElement(META_UPDATE_DATE); 662 tag = domDoc->createElement(META_UPDATE_DATE);
659#ifndef PWM_EMBEDDED 663#ifndef PWM_EMBEDDED
660 text = domDoc->createTextNode(dta.update.toString(Qt::ISODate)); 664 text = domDoc->createTextNode(dta.update.toString(Qt::ISODate));
661#else 665#else
662 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.update, KLocale::ISODate)); 666 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.update, KLocale::ISODate));
663#endif 667#endif
664 tag.appendChild(text); 668 tag.appendChild(text);
665 e->appendChild(tag); 669 e->appendChild(tag);
666 } 670 }
667 671
668 tag = domDoc->createElement(META_UPDATE_INT); 672 tag = domDoc->createElement(META_UPDATE_INT);
669 text = domDoc->createTextNode(tostr(dta.updateInt).c_str()); 673 text = domDoc->createTextNode(tostr(dta.updateInt).c_str());
670 tag.appendChild(text); 674 tag.appendChild(text);
671 e->appendChild(tag); 675 e->appendChild(tag);
672 676
673 tag = domDoc->createElement(META_UNIQUEID); 677 tag = domDoc->createElement(META_UNIQUEID);
674 text = domDoc->createTextNode(escapeEntryData(dta.uniqueid.c_str())); 678 text = domDoc->createTextNode(escapeEntryData(dta.uniqueid.c_str()));
675 tag.appendChild(text); 679 tag.appendChild(text);
676 e->appendChild(tag); 680 e->appendChild(tag);
677 681
678#undef new_text 682#undef new_text
679 return true; 683 return true;
680} 684}
681 685
682QString Serializer::escapeEntryData(QString dta) 686QString Serializer::escapeEntryData(QString dta)
683{ 687{
684#ifndef PWM_EMBEDDED 688#ifndef PWM_EMBEDDED
685 dta.replace('\n', "$>--endl--<$"); 689 dta.replace('\n', "$>--endl--<$");
686 dta.replace("]]>", "||>"); 690 dta.replace("]]>", "||>");
687#else 691#else
688 dta.replace(QRegExp("\n"), "$>--endl--<$"); 692 dta.replace(QRegExp("\n"), "$>--endl--<$");
689 dta.replace(QRegExp("]]>"), "||>"); 693 dta.replace(QRegExp("]]>"), "||>");
690#endif 694#endif
691 return dta; 695 return dta;
692} 696}
693 697
694QString Serializer::unescapeEntryData(QString dta) 698QString Serializer::unescapeEntryData(QString dta)
695{ 699{
696#ifndef PWM_EMBEDDED 700#ifndef PWM_EMBEDDED
697 dta.replace("$>--endl--<$", "\n"); 701 dta.replace("$>--endl--<$", "\n");
698 dta.replace("||>", "]]>"); 702 dta.replace("||>", "]]>");
699#else 703#else
700 dta.replace(QRegExp("\\$>--endl--<\\$"), "\n"); 704 dta.replace(QRegExp("\\$>--endl--<\\$"), "\n");
701 dta.replace(QRegExp("||>"), "]]>"); 705 dta.replace(QRegExp("||>"), "]]>");
702#endif 706#endif
703 return dta; 707 return dta;
704} 708}
705 709
706 710
707//US ENH: the following methods are getting used to write/read sync entries 711//US ENH: the following methods are getting used to write/read sync entries
708/** read the syncentries in the node "n" */ 712/** read the syncentries in the node "n" */
709bool Serializer::readSyncData(const QDomNode &n, vector<PwMSyncItem> *dta) 713bool Serializer::readSyncData(const QDomNode &n, vector<PwMSyncItem> *dta)
710{ 714{
711 QDomNodeList nl(n.childNodes()); 715 QDomNodeList nl(n.childNodes());
712 QDomNode cur; 716 QDomNode cur;
713 717
714 QString devicename, val; 718 QString devicename, val;
715 unsigned int numSync = nl.count(), i; 719 unsigned int numSync = nl.count(), i;
716 PwMSyncItem curSync; 720 PwMSyncItem curSync;
717 bool ok = true; 721 bool ok = true;
718 722
719 if (!numSync) { 723 if (!numSync) {
720 //no sync entries is a possible result 724 //no sync entries is a possible result
721 printDebug("Serializer::readSyncData(): empty"); 725 printDebug("Serializer::readSyncData(): empty");
722 return true; 726 return true;
723 } 727 }
724 for (i = 0; i < numSync; ++i) { 728 for (i = 0; i < numSync; ++i) {
725 cur = nl.item(i); 729 cur = nl.item(i);
726 if (cur.nodeName().left(1) == SYNC_TARGET_PREFIX) { 730 if (cur.nodeName().left(1) == SYNC_TARGET_PREFIX) {
727 devicename = cur.toElement().attribute(SYNC_TARGET_NAME); 731 devicename = cur.toElement().attribute(SYNC_TARGET_NAME);
728 val = cur.toElement().text(); 732 val = cur.toElement().text();
729 733
730 if ((val == "") || (devicename == QString::null)) { 734 if ((val == "") || (devicename == QString::null)) {
731 printDebug("Serializer::readSyncData(): empty synctarget name or syncdate"); 735 printDebug("Serializer::readSyncData(): empty synctarget name or syncdate");
732 continue; 736 continue;
733 } 737 }
734 738
735 curSync.syncName = devicename; 739 curSync.syncName = devicename.latin1();
736#ifndef PWM_EMBEDDED 740#ifndef PWM_EMBEDDED
737 curSync.lastSyncDate = QDateTime::fromString(val, Qt::ISODate); 741 curSync.lastSyncDate = QDateTime::fromString(val, Qt::ISODate);
738#else 742#else
739 curSync.lastSyncDate = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); 743 curSync.lastSyncDate = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok);
740 if (ok == false) 744 if (ok == false)
741 qDebug("Serializer::readSyncData(): could not parse syncdate:%s",val.latin1()); 745 qDebug("Serializer::readSyncData(): could not parse syncdate:%s",val.latin1());
742 746
743#endif 747#endif
744 dta->push_back(curSync); 748 dta->push_back(curSync);
745 } 749 }
746 } 750 }
747 return true; 751 return true;
748 752
749} 753}
750 754
751 755
752 756
753bool Serializer::addSyncData(QDomElement *e, 757bool Serializer::addSyncData(QDomElement *e,
754 const vector<PwMSyncItem> &dta) 758 const vector<PwMSyncItem> &dta)
755{ 759{
756 unsigned int numSync = dta.size(), i; 760 unsigned int numSync = dta.size(), i;
757 QString curId, curDeviceName; 761 QString curId, curDeviceName;
758 QDomElement curSync; 762 QDomElement curSync;
759 QDomText text; 763 QDomText text;
760 764
761 for (i = 0; i < numSync; ++i) { 765 for (i = 0; i < numSync; ++i) {
762 curId = SYNC_TARGET_PREFIX; 766 curId = SYNC_TARGET_PREFIX;
763 curId += tostr(i).c_str(); 767 curId += tostr(i).c_str();
764 curDeviceName = dta[i].syncName.c_str(); 768 curDeviceName = dta[i].syncName.c_str();
765 curSync = domDoc->createElement(curId); 769 curSync = domDoc->createElement(curId);
766 curSync.setAttribute(SYNC_TARGET_NAME, curDeviceName); 770 curSync.setAttribute(SYNC_TARGET_NAME, curDeviceName);
767 771
768#ifndef PWM_EMBEDDED 772#ifndef PWM_EMBEDDED
769 text = domDoc->createTextNode(dta[i].lastSyncDate.toString(Qt::ISODate)); 773 text = domDoc->createTextNode(dta[i].lastSyncDate.toString(Qt::ISODate));
770#else 774#else
771 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta[i].lastSyncDate, KLocale::ISODate)); 775 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta[i].lastSyncDate, KLocale::ISODate));
772#endif 776#endif
773 curSync.appendChild(text); 777 curSync.appendChild(text);
774 778
775 e->appendChild(curSync); 779 e->appendChild(curSync);
776 780
777 } 781 }
778 return true; 782 return true;
779} 783}
780 784