summaryrefslogtreecommitdiffabout
path: root/pwmanager
authorulf69 <ulf69>2004-10-18 02:55:13 (UTC)
committer ulf69 <ulf69>2004-10-18 02:55:13 (UTC)
commit2fd3f09238a624b1a91793d43b5f3653e2b34763 (patch) (unidiff)
tree07cff893e261ad594ff44d7ab2e8e457a88d6390 /pwmanager
parent4e7fac5fdb4c0dace10cada64f036c56bb29fe58 (diff)
downloadkdepimpi-2fd3f09238a624b1a91793d43b5f3653e2b34763.zip
kdepimpi-2fd3f09238a624b1a91793d43b5f3653e2b34763.tar.gz
kdepimpi-2fd3f09238a624b1a91793d43b5f3653e2b34763.tar.bz2
*** empty log message ***
Diffstat (limited to 'pwmanager') (more/less context) (ignore whitespace changes)
-rw-r--r--pwmanager/pwmanager/pwm.cpp57
-rw-r--r--pwmanager/pwmanager/pwm.h8
-rw-r--r--pwmanager/pwmanager/pwmdoc.cpp85
-rw-r--r--pwmanager/pwmanager/pwmdoc.h39
-rw-r--r--pwmanager/pwmanager/pwmview.cpp92
-rw-r--r--pwmanager/pwmanager/pwmview.h25
-rw-r--r--pwmanager/pwmanager/serializer.cpp126
7 files changed, 287 insertions, 145 deletions
diff --git a/pwmanager/pwmanager/pwm.cpp b/pwmanager/pwmanager/pwm.cpp
index 014e809..57b4432 100644
--- a/pwmanager/pwmanager/pwm.cpp
+++ b/pwmanager/pwmanager/pwm.cpp
@@ -7,751 +7,762 @@
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}; 137};
137#endif 138#endif
138 139
139// Button IDs for toolbar 140// Button IDs for toolbar
140enum { 141enum {
141 BUTTON_TOOL_NEW = 0, 142 BUTTON_TOOL_NEW = 0,
142 BUTTON_TOOL_OPEN, 143 BUTTON_TOOL_OPEN,
143 BUTTON_TOOL_SAVE, 144 BUTTON_TOOL_SAVE,
144 BUTTON_TOOL_SAVEAS, 145 BUTTON_TOOL_SAVEAS,
145 BUTTON_TOOL_PRINT, 146 BUTTON_TOOL_PRINT,
146 BUTTON_TOOL_ADD, 147 BUTTON_TOOL_ADD,
147 BUTTON_TOOL_EDIT, 148 BUTTON_TOOL_EDIT,
148 BUTTON_TOOL_DEL, 149 BUTTON_TOOL_DEL,
149 BUTTON_TOOL_FIND, 150 BUTTON_TOOL_FIND,
150 BUTTON_TOOL_LOCK, 151 BUTTON_TOOL_LOCK,
151 BUTTON_TOOL_DEEPLOCK, 152 BUTTON_TOOL_DEEPLOCK,
152 BUTTON_TOOL_UNLOCK 153 BUTTON_TOOL_UNLOCK
153}; 154};
154 155
155 156
156PwM::PwM(PwMInit *_init, PwMDoc *doc, 157PwM::PwM(PwMInit *_init, PwMDoc *doc,
157 bool virginity, 158 bool virginity,
158 QWidget *parent, const char *name) 159 QWidget *parent, const char *name)
159 : KMainWindow(parent, name) 160 : KMainWindow(parent, "HALLO")
160 , forceQuit (false) 161 , forceQuit (false)
161 , forceMinimizeToTray (false) 162 , forceMinimizeToTray (false)
162{ 163{
163 init = _init; 164 init = _init;
164 connect(doc, SIGNAL(docClosed(PwMDoc *)), 165 connect(doc, SIGNAL(docClosed(PwMDoc *)),
165 this, SLOT(docClosed(PwMDoc *))); 166 this, SLOT(docClosed(PwMDoc *)));
166 initMenubar(); 167 initMenubar();
167 initToolbar(); 168 initToolbar();
168 initMetrics(); 169 initMetrics();
169 setVirgin(virginity); 170 setVirgin(virginity);
170 setFocusPolicy(QWidget::WheelFocus); 171 setFocusPolicy(QWidget::WheelFocus);
171#ifndef PWM_EMBEDDED 172#ifndef PWM_EMBEDDED
172 statusBar()->show(); 173 statusBar()->show();
173#endif 174#endif
174 view = makeNewListView(doc); 175 view = makeNewListView(doc);
175 setCentralWidget(view); 176 setCentralWidget(view);
176 updateCaption(); 177 updateCaption();
177 showStatMsg(i18n("Ready.")); 178 showStatMsg(i18n("Ready."));
178} 179}
179 180
180PwM::~PwM() 181PwM::~PwM()
181{ 182{
182 disconnect(curDoc(), SIGNAL(docClosed(PwMDoc *)), 183 disconnect(curDoc(), SIGNAL(docClosed(PwMDoc *)),
183 this, SLOT(docClosed(PwMDoc *))); 184 this, SLOT(docClosed(PwMDoc *)));
184 conf()->confWndMainWndSize(size()); 185 conf()->confWndMainWndSize(size());
185 emit closed(this); 186 emit closed(this);
186 delete view; 187 delete view;
187} 188}
188 189
189void PwM::initMenubar() 190void PwM::initMenubar()
190{ 191{
191 KIconLoader* picons; 192 KIconLoader* picons;
192#ifndef PWM_EMBEDDED 193#ifndef PWM_EMBEDDED
193 KIconLoader icons; 194 KIconLoader icons;
194 picons = &icons; 195 picons = &icons;
195#else 196#else
196 picons = KGlobal::iconLoader(); 197 picons = KGlobal::iconLoader();
197 198
198 199
199 syncPopup = new KPopupMenu(this); 200 syncPopup = new KPopupMenu(this);
200 201
201 syncManager = new KSyncManager((QWidget*)this, (KSyncInterface*)this, KSyncManager::PWMPI, PWMPrefs::instance(), syncPopup); 202 syncManager = new KSyncManager((QWidget*)this, (KSyncInterface*)this, KSyncManager::PWMPI, PWMPrefs::instance(), syncPopup);
202 syncManager->setBlockSave(false); 203 syncManager->setBlockSave(false);
203 204
204 connect ( syncPopup, SIGNAL( activated ( int ) ), syncManager, SLOT (slotSyncMenu( int ) ) ); 205 connect ( syncPopup, SIGNAL( activated ( int ) ), syncManager, SLOT (slotSyncMenu( int ) ) );
205 syncManager->fillSyncMenu(); 206 syncManager->fillSyncMenu();
206 207
207#endif 208#endif
208 filePopup = new KPopupMenu(this); 209 filePopup = new KPopupMenu(this);
209 importPopup = new KPopupMenu(filePopup); 210 importPopup = new KPopupMenu(filePopup);
210 exportPopup = new KPopupMenu(filePopup); 211 exportPopup = new KPopupMenu(filePopup);
211 managePopup = new KPopupMenu(this); 212 managePopup = new KPopupMenu(this);
212#ifdef CONFIG_KEYCARD 213#ifdef CONFIG_KEYCARD
213 chipcardPopup = new KPopupMenu(this); 214 chipcardPopup = new KPopupMenu(this);
214#endif // CONFIG_KEYCARD 215#endif // CONFIG_KEYCARD
215 viewPopup = new KPopupMenu(this); 216 viewPopup = new KPopupMenu(this);
216 optionsPopup = new KPopupMenu(this); 217 optionsPopup = new KPopupMenu(this);
217 218
218// "file" popup menu 219// "file" popup menu
219 filePopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)), 220 filePopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)),
220 i18n("&New"), this, 221 i18n("&New"), this,
221 SLOT(new_slot()), 0, BUTTON_POPUP_FILE_NEW); 222 SLOT(new_slot()), 0, BUTTON_POPUP_FILE_NEW);
222 filePopup->insertItem(QIconSet(picons->loadIcon("fileopen", KIcon::Small)), 223 filePopup->insertItem(QIconSet(picons->loadIcon("fileopen", KIcon::Small)),
223 i18n("&Open"), this, 224 i18n("&Open"), this,
224 SLOT(open_slot()), 0, BUTTON_POPUP_FILE_OPEN); 225 SLOT(open_slot()), 0, BUTTON_POPUP_FILE_OPEN);
225 filePopup->insertItem(QIconSet(picons->loadIcon("fileclose", KIcon::Small)), 226 filePopup->insertItem(QIconSet(picons->loadIcon("fileclose", KIcon::Small)),
226 i18n("&Close"), this, 227 i18n("&Close"), this,
227 SLOT(close_slot()), 0, BUTTON_POPUP_FILE_CLOSE); 228 SLOT(close_slot()), 0, BUTTON_POPUP_FILE_CLOSE);
228 filePopup->insertSeparator(); 229 filePopup->insertSeparator();
229 filePopup->insertItem(QIconSet(picons->loadIcon("filesave", KIcon::Small)), 230 filePopup->insertItem(QIconSet(picons->loadIcon("filesave", KIcon::Small)),
230 i18n("&Save"), this, 231 i18n("&Save"), this,
231 SLOT(save_slot()), 0, BUTTON_POPUP_FILE_SAVE); 232 SLOT(save_slot()), 0, BUTTON_POPUP_FILE_SAVE);
232 filePopup->insertItem(QIconSet(picons->loadIcon("filesaveas", KIcon::Small)), 233 filePopup->insertItem(QIconSet(picons->loadIcon("filesaveas", KIcon::Small)),
233 i18n("Save &as..."), 234 i18n("Save &as..."),
234 this, SLOT(saveAs_slot()), 0, 235 this, SLOT(saveAs_slot()), 0,
235 BUTTON_POPUP_FILE_SAVEAS); 236 BUTTON_POPUP_FILE_SAVEAS);
236 filePopup->insertSeparator(); 237 filePopup->insertSeparator();
237 // "file/export" popup menu 238 // "file/export" popup menu
238 exportPopup->insertItem(i18n("&Text-file..."), this, 239 exportPopup->insertItem(i18n("&Text-file..."), this,
239 SLOT(exportToText()), 0, BUTTON_POPUP_EXPORT_TEXT); 240 SLOT(exportToText()), 0, BUTTON_POPUP_EXPORT_TEXT);
240 exportPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this, 241 exportPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this,
241 SLOT(exportToGpasman()), 0, BUTTON_POPUP_EXPORT_GPASMAN); 242 SLOT(exportToGpasman()), 0, BUTTON_POPUP_EXPORT_GPASMAN);
242#ifdef CONFIG_KWALLETIF 243#ifdef CONFIG_KWALLETIF
243 exportPopup->insertItem(i18n("&KWallet..."), this, 244 exportPopup->insertItem(i18n("&KWallet..."), this,
244 SLOT(exportToKWallet()), 0, BUTTON_POPUP_EXPORT_KWALLET); 245 SLOT(exportToKWallet()), 0, BUTTON_POPUP_EXPORT_KWALLET);
245#endif 246#endif
246 filePopup->insertItem(QIconSet(picons->loadIcon("fileexport", KIcon::Small)), 247 filePopup->insertItem(QIconSet(picons->loadIcon("fileexport", KIcon::Small)),
247 i18n("E&xport"), exportPopup, 248 i18n("E&xport"), exportPopup,
248 BUTTON_POPUP_FILE_EXPORT); 249 BUTTON_POPUP_FILE_EXPORT);
249 // "file/import" popup menu 250 // "file/import" popup menu
250 importPopup->insertItem(i18n("&Text-file..."), this, 251 importPopup->insertItem(i18n("&Text-file..."), this,
251 SLOT(importFromText()), 0, BUTTON_POPUP_IMPORT_TEXT); 252 SLOT(importFromText()), 0, BUTTON_POPUP_IMPORT_TEXT);
252 importPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this, 253 importPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this,
253 SLOT(importFromGpasman()), 0, BUTTON_POPUP_IMPORT_GPASMAN); 254 SLOT(importFromGpasman()), 0, BUTTON_POPUP_IMPORT_GPASMAN);
254#ifdef CONFIG_KWALLETIF 255#ifdef CONFIG_KWALLETIF
255 importPopup->insertItem(i18n("&KWallet..."), this, 256 importPopup->insertItem(i18n("&KWallet..."), this,
256 SLOT(importKWallet()), 0, BUTTON_POPUP_IMPORT_KWALLET); 257 SLOT(importKWallet()), 0, BUTTON_POPUP_IMPORT_KWALLET);
257#endif 258#endif
258 filePopup->insertItem(QIconSet(picons->loadIcon("fileimport", KIcon::Small)), 259 filePopup->insertItem(QIconSet(picons->loadIcon("fileimport", KIcon::Small)),
259 i18n("I&mport"), importPopup, 260 i18n("I&mport"), importPopup,
260 BUTTON_POPUP_FILE_IMPORT); 261 BUTTON_POPUP_FILE_IMPORT);
261 filePopup->insertSeparator(); 262 filePopup->insertSeparator();
262 filePopup->insertItem(QIconSet(picons->loadIcon("fileprint", KIcon::Small)), 263 filePopup->insertItem(QIconSet(picons->loadIcon("fileprint", KIcon::Small)),
263 i18n("&Print..."), this, 264 i18n("&Print..."), this,
264 SLOT(print_slot()), 0, BUTTON_POPUP_FILE_PRINT); 265 SLOT(print_slot()), 0, BUTTON_POPUP_FILE_PRINT);
265 filePopup->insertSeparator(); 266 filePopup->insertSeparator();
266 filePopup->insertItem(QIconSet(picons->loadIcon("exit", KIcon::Small)), 267 filePopup->insertItem(QIconSet(picons->loadIcon("exit", KIcon::Small)),
267 i18n("&Quit"), this, 268 i18n("&Quit"), this,
268 SLOT(quitButton_slot()), 0, BUTTON_POPUP_FILE_QUIT); 269 SLOT(quitButton_slot()), 0, BUTTON_POPUP_FILE_QUIT);
269 menuBar()->insertItem(i18n("&File"), filePopup); 270 menuBar()->insertItem(i18n("&File"), filePopup);
270// "manage" popup menu 271// "manage" popup menu
271 managePopup->insertItem(QIconSet(picons->loadIcon("pencil", KIcon::Small)), 272 managePopup->insertItem(QIconSet(picons->loadIcon("pencil", KIcon::Small)),
272 i18n("&Add password"), this, 273 i18n("&Add password"), this,
273 SLOT(addPwd_slot()), 0, 274 SLOT(addPwd_slot()), 0,
274 BUTTON_POPUP_MANAGE_ADD); 275 BUTTON_POPUP_MANAGE_ADD);
275 managePopup->insertItem(QIconSet(picons->loadIcon("edit", KIcon::Small)), 276 managePopup->insertItem(QIconSet(picons->loadIcon("edit", KIcon::Small)),
276 i18n("&Edit"), this, SLOT(editPwd_slot()), 0, 277 i18n("&Edit"), this, SLOT(editPwd_slot()), 0,
277 BUTTON_POPUP_MANAGE_EDIT); 278 BUTTON_POPUP_MANAGE_EDIT);
278 managePopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)), 279 managePopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)),
279 i18n("&Delete"), this, SLOT(deletePwd_slot()), 280 i18n("&Delete"), this, SLOT(deletePwd_slot()),
280 0, BUTTON_POPUP_MANAGE_DEL); 281 0, BUTTON_POPUP_MANAGE_DEL);
281 managePopup->insertSeparator(); 282 managePopup->insertSeparator();
282 managePopup->insertItem(QIconSet(picons->loadIcon("rotate", KIcon::Small)), 283 managePopup->insertItem(QIconSet(picons->loadIcon("rotate", KIcon::Small)),
283 i18n("Change &Master Password"), this, 284 i18n("Change &Master Password"), this,
284 SLOT(changeMasterPwd_slot()), 0, 285 SLOT(changeMasterPwd_slot()), 0,
285 BUTTON_POPUP_MANAGE_CHANGEMP); 286 BUTTON_POPUP_MANAGE_CHANGEMP);
286 menuBar()->insertItem(i18n("&Manage"), managePopup); 287 menuBar()->insertItem(i18n("&Manage"), managePopup);
287// "chipcard" popup menu 288// "chipcard" popup menu
288#ifdef CONFIG_KEYCARD 289#ifdef CONFIG_KEYCARD
289 chipcardPopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)), 290 chipcardPopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)),
290 i18n("&Generate new key-card"), this, 291 i18n("&Generate new key-card"), this,
291 SLOT(genNewCard_slot()), 0, 292 SLOT(genNewCard_slot()), 0,
292 BUTTON_POPUP_CHIPCARD_GENNEW); 293 BUTTON_POPUP_CHIPCARD_GENNEW);
293 chipcardPopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)), 294 chipcardPopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)),
294 i18n("&Erase key-card"), this, 295 i18n("&Erase key-card"), this,
295 SLOT(eraseCard_slot()), 0, 296 SLOT(eraseCard_slot()), 0,
296 BUTTON_POPUP_CHIPCARD_DEL); 297 BUTTON_POPUP_CHIPCARD_DEL);
297 chipcardPopup->insertItem(QIconSet(picons->loadIcon("", KIcon::Small)), 298 chipcardPopup->insertItem(QIconSet(picons->loadIcon("", KIcon::Small)),
298 i18n("Read card-&ID"), this, 299 i18n("Read card-&ID"), this,
299 SLOT(readCardId_slot()), 0, 300 SLOT(readCardId_slot()), 0,
300 BUTTON_POPUP_CHIPCARD_READID); 301 BUTTON_POPUP_CHIPCARD_READID);
301 chipcardPopup->insertSeparator(); 302 chipcardPopup->insertSeparator();
302 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2rightarrow", KIcon::Small)), 303 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2rightarrow", KIcon::Small)),
303 i18n("&Make card backup-image"), this, 304 i18n("&Make card backup-image"), this,
304 SLOT(makeCardBackup_slot()), 0, 305 SLOT(makeCardBackup_slot()), 0,
305 BUTTON_POPUP_CHIPCARD_SAVEBACKUP); 306 BUTTON_POPUP_CHIPCARD_SAVEBACKUP);
306 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2leftarrow", KIcon::Small)), 307 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2leftarrow", KIcon::Small)),
307 i18n("&Replay card backup-image"), this, 308 i18n("&Replay card backup-image"), this,
308 SLOT(replayCardBackup_slot()), 0, 309 SLOT(replayCardBackup_slot()), 0,
309 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP); 310 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP);
310 menuBar()->insertItem(i18n("&Chipcard manager"), chipcardPopup); 311 menuBar()->insertItem(i18n("&Chipcard manager"), chipcardPopup);
311#endif // CONFIG_KEYCARD 312#endif // CONFIG_KEYCARD
312// "view" popup menu 313// "view" popup menu
313 viewPopup->insertItem(QIconSet(picons->loadIcon("find", KIcon::Small)), 314 viewPopup->insertItem(QIconSet(picons->loadIcon("find", KIcon::Small)),
314 i18n("&Find"), this, 315 i18n("&Find"), this,
315 SLOT(find_slot()), 0, BUTTON_POPUP_VIEW_FIND); 316 SLOT(find_slot()), 0, BUTTON_POPUP_VIEW_FIND);
316 viewPopup->insertSeparator(); 317 viewPopup->insertSeparator();
317 viewPopup->insertItem(QIconSet(picons->loadIcon("halfencrypted", KIcon::Small)), 318 viewPopup->insertItem(QIconSet(picons->loadIcon("halfencrypted", KIcon::Small)),
318 i18n("&Lock all entries"), this, 319 i18n("&Lock all entries"), this,
319 SLOT(lockWnd_slot()), 0, 320 SLOT(lockWnd_slot()), 0,
320 BUTTON_POPUP_VIEW_LOCK); 321 BUTTON_POPUP_VIEW_LOCK);
321 viewPopup->insertItem(QIconSet(picons->loadIcon("encrypted", KIcon::Small)), 322 viewPopup->insertItem(QIconSet(picons->loadIcon("encrypted", KIcon::Small)),
322 i18n("&Deep-lock all entries"), this, 323 i18n("&Deep-lock all entries"), this,
323 SLOT(deepLockWnd_slot()), 0, 324 SLOT(deepLockWnd_slot()), 0,
324 BUTTON_POPUP_VIEW_DEEPLOCK); 325 BUTTON_POPUP_VIEW_DEEPLOCK);
325 viewPopup->insertItem(QIconSet(picons->loadIcon("decrypted", KIcon::Small)), 326 viewPopup->insertItem(QIconSet(picons->loadIcon("decrypted", KIcon::Small)),
326 i18n("&Unlock all entries"), this, 327 i18n("&Unlock all entries"), this,
327 SLOT(unlockWnd_slot()), 0, 328 SLOT(unlockWnd_slot()), 0,
328 BUTTON_POPUP_VIEW_UNLOCK); 329 BUTTON_POPUP_VIEW_UNLOCK);
329 menuBar()->insertItem(i18n("&View"), viewPopup); 330 menuBar()->insertItem(i18n("&View"), viewPopup);
330// "options" popup menu 331// "options" popup menu
331 optionsPopup->insertItem(QIconSet(picons->loadIcon("configure", KIcon::Small)), 332 optionsPopup->insertItem(QIconSet(picons->loadIcon("configure", KIcon::Small)),
332 i18n("&Configure..."), this, 333 i18n("&Configure..."), this,
333 SLOT(config_slot()), 334 SLOT(config_slot()),
334 BUTTON_POPUP_OPTIONS_CONFIG); 335 BUTTON_POPUP_OPTIONS_CONFIG);
335 menuBar()->insertItem(i18n("&Options"), optionsPopup); 336 menuBar()->insertItem(i18n("&Options"), optionsPopup);
336// "help" popup menu 337// "help" popup menu
337#ifndef PWM_EMBEDDED 338#ifndef PWM_EMBEDDED
338 helpPopup = helpMenu(QString::null, false); 339 helpPopup = helpMenu(QString::null, false);
339#else 340#else
340 menuBar()->insertItem(i18n("&Sync"), syncPopup); 341 menuBar()->insertItem(i18n("&Sync"), syncPopup);
341 342
342 343
343 344
344 345
345 346
346 helpPopup = new KPopupMenu(this); 347 helpPopup = new KPopupMenu(this);
347 348
348 349
349 helpPopup->insertItem(i18n("&License"), this, 350 helpPopup->insertItem(i18n("&License"), this,
350 SLOT(showLicense_slot()), 0, 351 SLOT(showLicense_slot()), 0,
351 BUTTON_POPUP_HELP_LICENSE); 352 BUTTON_POPUP_HELP_LICENSE);
352 353
353 helpPopup->insertItem(i18n("&Faq"), this, 354 helpPopup->insertItem(i18n("&Faq"), this,
354 SLOT(faq_slot()), 0, 355 SLOT(faq_slot()), 0,
355 BUTTON_POPUP_HELP_FAQ); 356 BUTTON_POPUP_HELP_FAQ);
356 357
357 helpPopup->insertItem(i18n("&About PwManager"), this, 358 helpPopup->insertItem(i18n("&About PwManager"), this,
358 SLOT(createAboutData_slot()), 0, 359 SLOT(createAboutData_slot()), 0,
359 BUTTON_POPUP_HELP_ABOUT); 360 BUTTON_POPUP_HELP_ABOUT);
360 361
362 helpPopup->insertItem(i18n("&Sync HowTo"), this,
363 SLOT(syncHowTo_slot()), 0,
364 BUTTON_POPUP_HELP_SYNC);
365
361#endif 366#endif
362 menuBar()->insertItem(i18n("&Help"), helpPopup); 367 menuBar()->insertItem(i18n("&Help"), helpPopup);
363 368
364} 369}
365 370
366void PwM::initToolbar() 371void PwM::initToolbar()
367{ 372{
368 KIconLoader* picons; 373 KIconLoader* picons;
369#ifndef PWM_EMBEDDED 374#ifndef PWM_EMBEDDED
370 KIconLoader icons; 375 KIconLoader icons;
371 picons = &icons; 376 picons = &icons;
372#else 377#else
373 picons = KGlobal::iconLoader(); 378 picons = KGlobal::iconLoader();
374#endif 379#endif
375 380
376#ifdef PWM_EMBEDDED 381#ifdef PWM_EMBEDDED
377 if ( QApplication::desktop()->width() > 320 ) 382 if ( QApplication::desktop()->width() > 320 )
378#endif 383#endif
379 { 384 {
380 toolBar()->insertButton(picons->loadIcon("filenew", KIcon::Toolbar), 385 toolBar()->insertButton(picons->loadIcon("filenew", KIcon::Toolbar),
381 BUTTON_TOOL_NEW, SIGNAL(clicked(int)), this, 386 BUTTON_TOOL_NEW, SIGNAL(clicked(int)), this,
382 SLOT(new_slot()), true, i18n("New")); 387 SLOT(new_slot()), true, i18n("New"));
383 toolBar()->insertButton(picons->loadIcon("fileopen", KIcon::Toolbar), 388 toolBar()->insertButton(picons->loadIcon("fileopen", KIcon::Toolbar),
384 BUTTON_TOOL_OPEN, SIGNAL(clicked(int)), this, 389 BUTTON_TOOL_OPEN, SIGNAL(clicked(int)), this,
385 SLOT(open_slot()), true, i18n("Open")); 390 SLOT(open_slot()), true, i18n("Open"));
386 toolBar()->insertSeparator(); 391 toolBar()->insertSeparator();
387 } 392 }
388 toolBar()->insertButton(picons->loadIcon("filesave", KIcon::Toolbar), 393 toolBar()->insertButton(picons->loadIcon("filesave", KIcon::Toolbar),
389 BUTTON_TOOL_SAVE, SIGNAL(clicked(int)), this, 394 BUTTON_TOOL_SAVE, SIGNAL(clicked(int)), this,
390 SLOT(save_slot()), true, i18n("Save")); 395 SLOT(save_slot()), true, i18n("Save"));
391 toolBar()->insertButton(picons->loadIcon("filesaveas", KIcon::Toolbar), 396 toolBar()->insertButton(picons->loadIcon("filesaveas", KIcon::Toolbar),
392 BUTTON_TOOL_SAVEAS, SIGNAL(clicked(int)), this, 397 BUTTON_TOOL_SAVEAS, SIGNAL(clicked(int)), this,
393 SLOT(saveAs_slot()), true, i18n("Save as")); 398 SLOT(saveAs_slot()), true, i18n("Save as"));
394 toolBar()->insertButton(picons->loadIcon("fileprint", KIcon::Toolbar), 399 toolBar()->insertButton(picons->loadIcon("fileprint", KIcon::Toolbar),
395 BUTTON_TOOL_PRINT, SIGNAL(clicked(int)), this, 400 BUTTON_TOOL_PRINT, SIGNAL(clicked(int)), this,
396 SLOT(print_slot()), true, i18n("Print...")); 401 SLOT(print_slot()), true, i18n("Print..."));
397 toolBar()->insertSeparator(); 402 toolBar()->insertSeparator();
398 toolBar()->insertButton(picons->loadIcon("pencil", KIcon::Toolbar), 403 toolBar()->insertButton(picons->loadIcon("pencil", KIcon::Toolbar),
399 BUTTON_TOOL_ADD, SIGNAL(clicked(int)), this, 404 BUTTON_TOOL_ADD, SIGNAL(clicked(int)), this,
400 SLOT(addPwd_slot()), true, 405 SLOT(addPwd_slot()), true,
401 i18n("Add password")); 406 i18n("Add password"));
402 toolBar()->insertButton(picons->loadIcon("edit", KIcon::Toolbar), 407 toolBar()->insertButton(picons->loadIcon("edit", KIcon::Toolbar),
403 BUTTON_TOOL_EDIT, SIGNAL(clicked(int)), this, 408 BUTTON_TOOL_EDIT, SIGNAL(clicked(int)), this,
404 SLOT(editPwd_slot()), true, 409 SLOT(editPwd_slot()), true,
405 i18n("Edit password")); 410 i18n("Edit password"));
406 toolBar()->insertButton(picons->loadIcon("editdelete", KIcon::Toolbar), 411 toolBar()->insertButton(picons->loadIcon("editdelete", KIcon::Toolbar),
407 BUTTON_TOOL_DEL, SIGNAL(clicked(int)), this, 412 BUTTON_TOOL_DEL, SIGNAL(clicked(int)), this,
408 SLOT(deletePwd_slot()), true, 413 SLOT(deletePwd_slot()), true,
409 i18n("Delete password")); 414 i18n("Delete password"));
410 toolBar()->insertSeparator(); 415 toolBar()->insertSeparator();
411 toolBar()->insertButton(picons->loadIcon("find", KIcon::Toolbar), 416 toolBar()->insertButton(picons->loadIcon("find", KIcon::Toolbar),
412 BUTTON_TOOL_FIND, SIGNAL(clicked(int)), this, 417 BUTTON_TOOL_FIND, SIGNAL(clicked(int)), this,
413 SLOT(find_slot()), true, i18n("Find entry")); 418 SLOT(find_slot()), true, i18n("Find entry"));
414 toolBar()->insertSeparator(); 419 toolBar()->insertSeparator();
415 toolBar()->insertButton(picons->loadIcon("halfencrypted", KIcon::Toolbar), 420 toolBar()->insertButton(picons->loadIcon("halfencrypted", KIcon::Toolbar),
416 BUTTON_TOOL_LOCK, SIGNAL(clicked(int)), this, 421 BUTTON_TOOL_LOCK, SIGNAL(clicked(int)), this,
417 SLOT(lockWnd_slot()), true, 422 SLOT(lockWnd_slot()), true,
418 i18n("Lock all entries")); 423 i18n("Lock all entries"));
419 toolBar()->insertButton(picons->loadIcon("encrypted", KIcon::Toolbar), 424 toolBar()->insertButton(picons->loadIcon("encrypted", KIcon::Toolbar),
420 BUTTON_TOOL_DEEPLOCK, SIGNAL(clicked(int)), this, 425 BUTTON_TOOL_DEEPLOCK, SIGNAL(clicked(int)), this,
421 SLOT(deepLockWnd_slot()), true, 426 SLOT(deepLockWnd_slot()), true,
422 i18n("Deep-Lock all entries")); 427 i18n("Deep-Lock all entries"));
423 toolBar()->insertButton(picons->loadIcon("decrypted", KIcon::Toolbar), 428 toolBar()->insertButton(picons->loadIcon("decrypted", KIcon::Toolbar),
424 BUTTON_TOOL_UNLOCK, SIGNAL(clicked(int)), this, 429 BUTTON_TOOL_UNLOCK, SIGNAL(clicked(int)), this,
425 SLOT(unlockWnd_slot()), true, 430 SLOT(unlockWnd_slot()), true,
426 i18n("Unlock all entries")); 431 i18n("Unlock all entries"));
427} 432}
428 433
429void PwM::initMetrics() 434void PwM::initMetrics()
430{ 435{
431 QSize s = conf()->confWndMainWndSize(); 436 QSize s = conf()->confWndMainWndSize();
432 if (s.isValid()) 437 if (s.isValid())
433 resize(s); 438 resize(s);
434 else 439 else
435 resize(DEFAULT_SIZE); 440 resize(DEFAULT_SIZE);
436} 441}
437 442
438void PwM::updateCaption() 443void PwM::updateCaption()
439{ 444{
440 setPlainCaption(curDoc()->getTitle() + " - " PROG_NAME " " PACKAGE_VER); 445 setPlainCaption(curDoc()->getTitle() + " - " PROG_NAME " " PACKAGE_VER);
441} 446}
442 447
443void PwM::hideEvent(QHideEvent *) 448void PwM::hideEvent(QHideEvent *)
444{ 449{
445 if (isMinimized()) { 450 if (isMinimized()) {
446 if (init->tray()) { 451 if (init->tray()) {
447 forceMinimizeToTray = true; 452 forceMinimizeToTray = true;
448 close(); 453 close();
449 } 454 }
450 int mmlock = conf()->confGlobMinimizeLock(); 455 int mmlock = conf()->confGlobMinimizeLock();
451 switch (mmlock) { 456 switch (mmlock) {
452 case 0: // don't lock anything 457 case 0: // don't lock anything
453 break; 458 break;
454 case 1: {// normal lock 459 case 1: {// normal lock
455 curDoc()->lockAll(true); 460 curDoc()->lockAll(true);
456 break; 461 break;
457 } case 2: {// deep-lock 462 } case 2: {// deep-lock
458 curDoc()->deepLock(); 463 curDoc()->deepLock();
459 break; 464 break;
460 } default: 465 } default:
461 WARN(); 466 WARN();
462 } 467 }
463 } 468 }
464} 469}
465 470
466void PwM::setVirgin(bool v) 471void PwM::setVirgin(bool v)
467{ 472{
468 if (virgin == v) 473 if (virgin == v)
469 return; 474 return;
470 virgin = v; 475 virgin = v;
471 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVE, !v); 476 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVE, !v);
472 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVEAS, !v); 477 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVEAS, !v);
473 filePopup->setItemEnabled(BUTTON_POPUP_FILE_EXPORT, !v); 478 filePopup->setItemEnabled(BUTTON_POPUP_FILE_EXPORT, !v);
474 filePopup->setItemEnabled(BUTTON_POPUP_FILE_PRINT, !v); 479 filePopup->setItemEnabled(BUTTON_POPUP_FILE_PRINT, !v);
475 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_EDIT, !v); 480 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_EDIT, !v);
476 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_DEL, !v); 481 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_DEL, !v);
477 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, !v); 482 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, !v);
478 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_LOCK, !v); 483 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_LOCK, !v);
479 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_DEEPLOCK, !v); 484 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_DEEPLOCK, !v);
480 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_UNLOCK, !v); 485 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_UNLOCK, !v);
481 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_FIND, !v); 486 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_FIND, !v);
482 toolBar()->setItemEnabled(BUTTON_TOOL_SAVE, !v); 487 toolBar()->setItemEnabled(BUTTON_TOOL_SAVE, !v);
483 toolBar()->setItemEnabled(BUTTON_TOOL_SAVEAS, !v); 488 toolBar()->setItemEnabled(BUTTON_TOOL_SAVEAS, !v);
484 toolBar()->setItemEnabled(BUTTON_TOOL_PRINT, !v); 489 toolBar()->setItemEnabled(BUTTON_TOOL_PRINT, !v);
485 toolBar()->setItemEnabled(BUTTON_TOOL_EDIT, !v); 490 toolBar()->setItemEnabled(BUTTON_TOOL_EDIT, !v);
486 toolBar()->setItemEnabled(BUTTON_TOOL_DEL, !v); 491 toolBar()->setItemEnabled(BUTTON_TOOL_DEL, !v);
487 toolBar()->setItemEnabled(BUTTON_TOOL_LOCK, !v); 492 toolBar()->setItemEnabled(BUTTON_TOOL_LOCK, !v);
488 toolBar()->setItemEnabled(BUTTON_TOOL_DEEPLOCK, !v); 493 toolBar()->setItemEnabled(BUTTON_TOOL_DEEPLOCK, !v);
489 toolBar()->setItemEnabled(BUTTON_TOOL_UNLOCK, !v); 494 toolBar()->setItemEnabled(BUTTON_TOOL_UNLOCK, !v);
490 toolBar()->setItemEnabled(BUTTON_TOOL_FIND, !v); 495 toolBar()->setItemEnabled(BUTTON_TOOL_FIND, !v);
491} 496}
492 497
493void PwM::new_slot() 498void PwM::new_slot()
494{ 499{
495 init->createMainWnd(); 500 init->createMainWnd();
496} 501}
497 502
498//US ENH 503//US ENH
499void PwM::open_slot() 504void PwM::open_slot()
500{ 505{
501 open_slot(""); 506 open_slot("");
502} 507}
503 508
504void PwM::open_slot(QString fn) 509void PwM::open_slot(QString fn)
505{ 510{
506 openDoc(fn); 511 openDoc(fn);
507} 512}
508 513
509PwMDoc * PwM::openDoc(QString filename, bool openDeepLocked) 514PwMDoc * PwM::openDoc(QString filename, bool openDeepLocked)
510{ 515{
511 if (!isVirgin()) { 516 if (!isVirgin()) {
512 // open the document in a new window. 517 // open the document in a new window.
513 PwM *newInstance = init->createMainWnd(); 518 PwM *newInstance = init->createMainWnd();
514 PwMDoc *newDoc = newInstance->openDoc(filename, openDeepLocked); 519 PwMDoc *newDoc = newInstance->openDoc(filename, openDeepLocked);
515 if (!newDoc) { 520 if (!newDoc) {
516 newInstance->setForceQuit(true); 521 newInstance->setForceQuit(true);
517 delete_and_null(newInstance); 522 delete_and_null(newInstance);
518 } 523 }
519 return newDoc; 524 return newDoc;
520 } 525 }
521 526
522 if (!curDoc()->openDocUi(curDoc(), filename, openDeepLocked)) 527 if (!curDoc()->openDocUi(curDoc(), filename, openDeepLocked))
523 return 0; 528 return 0;
524 showStatMsg(i18n("Successfully opened file.")); 529 showStatMsg(i18n("Successfully opened file."));
525 updateCaption(); 530 updateCaption();
526 setVirgin(false); 531 setVirgin(false);
527 return curDoc(); 532 return curDoc();
528} 533}
529 534
530PwMView * PwM::makeNewListView(PwMDoc *doc) 535PwMView * PwM::makeNewListView(PwMDoc *doc)
531{ 536{
532 PwMView *ret = new PwMView(this, this, doc); 537 PwMView *ret = new PwMView(this, this, doc);
533 ret->setFont(conf()->confGlobEntryFont()); 538 ret->setFont(conf()->confGlobEntryFont());
534 ret->show(); 539 ret->show();
535 return ret; 540 return ret;
536} 541}
537 542
538void PwM::close_slot() 543void PwM::close_slot()
539{ 544{
540 close(); 545 close();
541} 546}
542 547
543void PwM::quitButton_slot() 548void PwM::quitButton_slot()
544{ 549{
545 init->shutdownApp(0); 550 init->shutdownApp(0);
546} 551}
547 552
548void PwM::save_slot() 553void PwM::save_slot()
549{ 554{
550 save(); 555 save();
551} 556}
552 557
553bool PwM::save() 558bool PwM::save()
554{ 559{
555 if (!curDoc()->saveDocUi(curDoc())) 560 if (!curDoc()->saveDocUi(curDoc()))
556 return false; 561 return false;
557 showStatMsg(i18n("Successfully saved data.")); 562 showStatMsg(i18n("Successfully saved data."));
558 updateCaption(); 563 updateCaption();
559 return true; 564 return true;
560} 565}
561 566
562void PwM::saveAs_slot() 567void PwM::saveAs_slot()
563{ 568{
564 saveAs(); 569 saveAs();
565} 570}
566 571
567bool PwM::saveAs() 572bool PwM::saveAs()
568{ 573{
569 if (!curDoc()->saveAsDocUi(curDoc())) 574 if (!curDoc()->saveAsDocUi(curDoc()))
570 return false; 575 return false;
571 showStatMsg(i18n("Successfully saved data.")); 576 showStatMsg(i18n("Successfully saved data."));
572 updateCaption(); 577 updateCaption();
573 return true; 578 return true;
574} 579}
575 580
576//US ENH : changed code to run with older MOC 581//US ENH : changed code to run with older MOC
577void PwM::addPwd_slot() 582void PwM::addPwd_slot()
578{ 583{
579 addPwd_slot(0, 0); 584 addPwd_slot(0, 0);
580} 585}
581 586
582void PwM::addPwd_slot(QString *pw, PwMDoc *_doc) 587void PwM::addPwd_slot(QString *pw, PwMDoc *_doc)
583{ 588{
584 PwMDoc *doc; 589 PwMDoc *doc;
585 if (_doc) { 590 if (_doc) {
586 doc = _doc; 591 doc = _doc;
587 } else { 592 } else {
588 doc = curDoc(); 593 doc = curDoc();
589 } 594 }
590 PWM_ASSERT(doc); 595 PWM_ASSERT(doc);
591 doc->timer()->getLock(DocTimer::id_autoLockTimer); 596 doc->timer()->getLock(DocTimer::id_autoLockTimer);
592#ifndef PWM_EMBEDDED 597#ifndef PWM_EMBEDDED
593 AddEntryWndImpl w; 598 AddEntryWndImpl w;
594#else 599#else
595 AddEntryWndImpl w(this, "addentrywndimpl"); 600 AddEntryWndImpl w(this, "addentrywndimpl");
596#endif 601#endif
597 602
598 vector<string> catList; 603 vector<string> catList;
599 doc->getCategoryList(&catList); 604 doc->getCategoryList(&catList);
600 unsigned i, size = catList.size(); 605 unsigned i, size = catList.size();
601 for (i = 0; i < size; ++i) { 606 for (i = 0; i < size; ++i) {
602 w.addCategory(catList[i].c_str()); 607 w.addCategory(catList[i].c_str());
603 } 608 }
604 w.setCurrCategory(view->getCurrentCategory()); 609 w.setCurrCategory(view->getCurrentCategory());
605 if (pw) 610 if (pw)
606 w.pwLineEdit->setText(*pw); 611 w.pwLineEdit->setText(*pw);
607 612
608 tryAgain: 613 tryAgain:
609 if (w.exec() == 1) 614 if (w.exec() == 1)
610 { 615 {
611 PwMDataItem d; 616 PwMDataItem d;
617
618 //US BUG: to initialize all values of curEntr with meaningfulldata,
619 // we call clear on it. Reason: Metadata will be uninitialized otherwise.
620 // another option would be to create a constructor for PwMDataItem
621 d.clear(true);
622
612 d.desc = w.getDescription().latin1(); 623 d.desc = w.getDescription().latin1();
613 d.name = w.getUsername().latin1(); 624 d.name = w.getUsername().latin1();
614 d.pw = w.getPassword().latin1(); 625 d.pw = w.getPassword().latin1();
615 d.comment = w.getComment().latin1(); 626 d.comment = w.getComment().latin1();
616 d.url = w.getUrl().latin1(); 627 d.url = w.getUrl().latin1();
617 d.launcher = w.getLauncher().latin1(); 628 d.launcher = w.getLauncher().latin1();
618 PwMerror ret = doc->addEntry(w.getCategory(), &d); 629 PwMerror ret = doc->addEntry(w.getCategory(), &d);
619 if (ret == e_entryExists) { 630 if (ret == e_entryExists) {
620 KMessageBox::error(this, 631 KMessageBox::error(this,
621 i18n 632 i18n
622 ("An entry with this \"Description\", " 633 ("An entry with this \"Description\",\n"
623 "does already exist.\n" 634 "does already exist.\n"
624 "Please select another description."), 635 "Please select another description."),
625 i18n("entry already exists.")); 636 i18n("entry already exists."));
626 goto tryAgain; 637 goto tryAgain;
627 } else if (ret == e_maxAllowedEntr) { 638 } else if (ret == e_maxAllowedEntr) {
628 KMessageBox::error(this, i18n("The maximum possible number of entries " 639 KMessageBox::error(this, i18n("The maximum possible number of\nentries"
629 "has been reached. You can't add more entries."), 640 "has been reached.\nYou can't add more entries."),
630 i18n("maximum number of entries")); 641 i18n("maximum number of entries"));
631 doc->timer()->putLock(DocTimer::id_autoLockTimer); 642 doc->timer()->putLock(DocTimer::id_autoLockTimer);
632 return; 643 return;
633 } 644 }
634 } 645 }
635 setVirgin(false); 646 setVirgin(false);
636 doc->timer()->putLock(DocTimer::id_autoLockTimer); 647 doc->timer()->putLock(DocTimer::id_autoLockTimer);
637} 648}
638 649
639//US ENH : changed code to run with older MOC 650//US ENH : changed code to run with older MOC
640void PwM::editPwd_slot() 651void PwM::editPwd_slot()
641{ 652{
642 editPwd_slot(0,0,0); 653 editPwd_slot(0,0,0);
643} 654}
644 655
645void PwM::editPwd_slot(const QString *category) 656void PwM::editPwd_slot(const QString *category)
646{ 657{
647 editPwd_slot(category, 0, 0); 658 editPwd_slot(category, 0, 0);
648} 659}
649 660
650void PwM::editPwd_slot(const QString *category, const int *index, 661void PwM::editPwd_slot(const QString *category, const int *index,
651 PwMDoc *_doc) 662 PwMDoc *_doc)
652{ 663{
653 PwMDoc *doc; 664 PwMDoc *doc;
654 if (_doc) { 665 if (_doc) {
655 doc = _doc; 666 doc = _doc;
656 } else { 667 } else {
657 doc = curDoc(); 668 doc = curDoc();
658 } 669 }
659 PWM_ASSERT(doc); 670 PWM_ASSERT(doc);
660 if (doc->isDocEmpty()) 671 if (doc->isDocEmpty())
661 return; 672 return;
662 if (doc->isDeepLocked()) 673 if (doc->isDeepLocked())
663 return; 674 return;
664 doc->timer()->getLock(DocTimer::id_autoLockTimer); 675 doc->timer()->getLock(DocTimer::id_autoLockTimer);
665 unsigned int curEntryIndex; 676 unsigned int curEntryIndex;
666 if (index) { 677 if (index) {
667 curEntryIndex = *index; 678 curEntryIndex = *index;
668 } else { 679 } else {
669 if (!(view->getCurEntryIndex(&curEntryIndex))) { 680 if (!(view->getCurEntryIndex(&curEntryIndex))) {
670 printDebug("couldn't get index. Maybe we have a binary entry here."); 681 printDebug("couldn't get index. Maybe we have a binary entry here.");
671 doc->timer()->putLock(DocTimer::id_autoLockTimer); 682 doc->timer()->putLock(DocTimer::id_autoLockTimer);
672 return; 683 return;
673 } 684 }
674 } 685 }
675 QString curCategory; 686 QString curCategory;
676 if (category) { 687 if (category) {
677 curCategory = *category; 688 curCategory = *category;
678 } else { 689 } else {
679 curCategory = view->getCurrentCategory(); 690 curCategory = view->getCurrentCategory();
680 } 691 }
681 PwMDataItem currItem; 692 PwMDataItem currItem;
682 if (!doc->getEntry(curCategory, curEntryIndex, &currItem, true)) { 693 if (!doc->getEntry(curCategory, curEntryIndex, &currItem, true)) {
683 doc->timer()->putLock(DocTimer::id_autoLockTimer); 694 doc->timer()->putLock(DocTimer::id_autoLockTimer);
684 return; 695 return;
685 } 696 }
686 BUG_ON(currItem.binary); 697 BUG_ON(currItem.binary);
687 698
688 AddEntryWndImpl w; 699 AddEntryWndImpl w;
689 vector<string> catList; 700 vector<string> catList;
690 doc->getCategoryList(&catList); 701 doc->getCategoryList(&catList);
691 unsigned i, size = catList.size(); 702 unsigned i, size = catList.size();
692 for (i = 0; i < size; ++i) { 703 for (i = 0; i < size; ++i) {
693 w.addCategory(catList[i].c_str()); 704 w.addCategory(catList[i].c_str());
694 } 705 }
695 w.setCurrCategory(curCategory); 706 w.setCurrCategory(curCategory);
696 w.setDescription(currItem.desc.c_str()); 707 w.setDescription(currItem.desc.c_str());
697 w.setUsername(currItem.name.c_str()); 708 w.setUsername(currItem.name.c_str());
698 w.setPassword(currItem.pw.c_str()); 709 w.setPassword(currItem.pw.c_str());
699 w.setUrl(currItem.url.c_str()); 710 w.setUrl(currItem.url.c_str());
700 w.setLauncher(currItem.launcher.c_str()); 711 w.setLauncher(currItem.launcher.c_str());
701 w.setComment(currItem.comment.c_str()); 712 w.setComment(currItem.comment.c_str());
702 if (w.exec() == 1) { 713 if (w.exec() == 1) {
703 currItem.desc = w.getDescription().latin1(); 714 currItem.desc = w.getDescription().latin1();
704 currItem.name = w.getUsername().latin1(); 715 currItem.name = w.getUsername().latin1();
705 currItem.pw = w.getPassword().latin1(); 716 currItem.pw = w.getPassword().latin1();
706 currItem.comment = w.getComment().latin1(); 717 currItem.comment = w.getComment().latin1();
707 currItem.url = w.getUrl().latin1(); 718 currItem.url = w.getUrl().latin1();
708 currItem.launcher = w.getLauncher().latin1(); 719 currItem.launcher = w.getLauncher().latin1();
709 if (!doc->editEntry(curCategory, w.getCategory(), 720 if (!doc->editEntry(curCategory, w.getCategory(),
710 curEntryIndex, &currItem)) { 721 curEntryIndex, &currItem)) {
711 KMessageBox::error(this, 722 KMessageBox::error(this,
712 i18n("Couldn't edit the entry.\n" 723 i18n("Couldn't edit the entry.\n"
713 "Maybe you changed the category and " 724 "Maybe you changed the category and "
714 "this entry is already present in the new " 725 "this entry is already present in the new "
715 "category?"), 726 "category?"),
716 i18n("couldn't edit entry.")); 727 i18n("couldn't edit entry."));
717 doc->timer()->putLock(DocTimer::id_autoLockTimer); 728 doc->timer()->putLock(DocTimer::id_autoLockTimer);
718 return; 729 return;
719 } 730 }
720 } 731 }
721 doc->timer()->putLock(DocTimer::id_autoLockTimer); 732 doc->timer()->putLock(DocTimer::id_autoLockTimer);
722} 733}
723 734
724void PwM::deletePwd_slot() 735void PwM::deletePwd_slot()
725{ 736{
726 PWM_ASSERT(curDoc()); 737 PWM_ASSERT(curDoc());
727 if (curDoc()->isDocEmpty()) 738 if (curDoc()->isDocEmpty())
728 return; 739 return;
729 if (curDoc()->isDeepLocked()) 740 if (curDoc()->isDeepLocked())
730 return; 741 return;
731 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 742 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
732 unsigned int curEntryIndex = 0; 743 unsigned int curEntryIndex = 0;
733 if (!(view->getCurEntryIndex(&curEntryIndex))) { 744 if (!(view->getCurEntryIndex(&curEntryIndex))) {
734 printDebug("couldn't get index"); 745 printDebug("couldn't get index");
735 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 746 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
736 return; 747 return;
737 } 748 }
738 749
739 PwMDataItem currItem; 750 PwMDataItem currItem;
740 QString curCategory = view->getCurrentCategory(); 751 QString curCategory = view->getCurrentCategory();
741 if (!curDoc()->getEntry(curCategory, curEntryIndex, &currItem)) { 752 if (!curDoc()->getEntry(curCategory, curEntryIndex, &currItem)) {
742 printDebug("couldn't get entry"); 753 printDebug("couldn't get entry");
743 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 754 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
744 return; 755 return;
745 } 756 }
746 if (KMessageBox:: 757 if (KMessageBox::
747 questionYesNo(this, 758 questionYesNo(this,
748 i18n 759 i18n
749 ("Do you really want to delete\nthe selected entry") + 760 ("Do you really want to delete\nthe selected entry") +
750 " \n\"" + QString(currItem.desc.c_str()) 761 " \n\"" + QString(currItem.desc.c_str())
751 + "\" ?", i18n("delete?")) 762 + "\" ?", i18n("delete?"))
752 == KMessageBox::Yes) { 763 == KMessageBox::Yes) {
753 764
754 curDoc()->delEntry(curCategory, curEntryIndex); 765 curDoc()->delEntry(curCategory, curEntryIndex);
755 } 766 }
756 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 767 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
757} 768}
@@ -1162,204 +1173,192 @@ exit_fail:
1162 return false; 1173 return false;
1163} 1174}
1164 1175
1165void PwM::print_slot() 1176void PwM::print_slot()
1166{ 1177{
1167 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 1178 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
1168#ifndef PWM_EMBEDDED 1179#ifndef PWM_EMBEDDED
1169 PwMPrint p(curDoc(), this); 1180 PwMPrint p(curDoc(), this);
1170 p.printNow(); 1181 p.printNow();
1171#else 1182#else
1172 qDebug("PwM::print_slot , PRINTING IS NOT IMPLEMENTED"); 1183 qDebug("PwM::print_slot , PRINTING IS NOT IMPLEMENTED");
1173#endif 1184#endif
1174 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1185 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1175} 1186}
1176 1187
1177void PwM::genNewCard_slot() 1188void PwM::genNewCard_slot()
1178{ 1189{
1179#ifdef CONFIG_KEYCARD 1190#ifdef CONFIG_KEYCARD
1180 init->keycard()->genNewCard(); 1191 init->keycard()->genNewCard();
1181#endif 1192#endif
1182} 1193}
1183 1194
1184void PwM::eraseCard_slot() 1195void PwM::eraseCard_slot()
1185{ 1196{
1186#ifdef CONFIG_KEYCARD 1197#ifdef CONFIG_KEYCARD
1187 init->keycard()->eraseCard(); 1198 init->keycard()->eraseCard();
1188#endif 1199#endif
1189} 1200}
1190 1201
1191void PwM::readCardId_slot() 1202void PwM::readCardId_slot()
1192{ 1203{
1193#ifdef CONFIG_KEYCARD 1204#ifdef CONFIG_KEYCARD
1194 init->keycard()->displayKey(); 1205 init->keycard()->displayKey();
1195#endif 1206#endif
1196} 1207}
1197 1208
1198void PwM::makeCardBackup_slot() 1209void PwM::makeCardBackup_slot()
1199{ 1210{
1200#ifdef CONFIG_KEYCARD 1211#ifdef CONFIG_KEYCARD
1201 init->keycard()->makeBackupImage(); 1212 init->keycard()->makeBackupImage();
1202#endif 1213#endif
1203} 1214}
1204 1215
1205void PwM::replayCardBackup_slot() 1216void PwM::replayCardBackup_slot()
1206{ 1217{
1207#ifdef CONFIG_KEYCARD 1218#ifdef CONFIG_KEYCARD
1208 init->keycard()->replayBackupImage(); 1219 init->keycard()->replayBackupImage();
1209#endif 1220#endif
1210} 1221}
1211 1222
1212void PwM::execLauncher_slot() 1223void PwM::execLauncher_slot()
1213{ 1224{
1214 PWM_ASSERT(curDoc()); 1225 PWM_ASSERT(curDoc());
1215 if (curDoc()->isDeepLocked()) 1226 if (curDoc()->isDeepLocked())
1216 return; 1227 return;
1217 unsigned int curEntryIndex; 1228 unsigned int curEntryIndex;
1218 if (!view->getCurEntryIndex(&curEntryIndex)) 1229 if (!view->getCurEntryIndex(&curEntryIndex))
1219 return; 1230 return;
1220 bool ret = curDoc()->execLauncher(view->getCurrentCategory(), 1231 bool ret = curDoc()->execLauncher(view->getCurrentCategory(),
1221 curEntryIndex); 1232 curEntryIndex);
1222 if (ret) 1233 if (ret)
1223 showStatMsg(i18n("Executed the \"Launcher\".")); 1234 showStatMsg(i18n("Executed the \"Launcher\"."));
1224 else 1235 else
1225 showStatMsg(i18n("ERROR: Couldn't execute the \"Launcher\"!")); 1236 showStatMsg(i18n("ERROR: Couldn't execute the \"Launcher\"!"));
1226} 1237}
1227 1238
1228void PwM::goToURL_slot() 1239void PwM::goToURL_slot()
1229{ 1240{
1230 PWM_ASSERT(curDoc()); 1241 PWM_ASSERT(curDoc());
1231 if (curDoc()->isDeepLocked()) 1242 if (curDoc()->isDeepLocked())
1232 return; 1243 return;
1233 unsigned int curEntryIndex; 1244 unsigned int curEntryIndex;
1234 if (!view->getCurEntryIndex(&curEntryIndex)) 1245 if (!view->getCurEntryIndex(&curEntryIndex))
1235 return; 1246 return;
1236 bool ret = curDoc()->goToURL(view->getCurrentCategory(), 1247 bool ret = curDoc()->goToURL(view->getCurrentCategory(),
1237 curEntryIndex); 1248 curEntryIndex);
1238 if (ret) 1249 if (ret)
1239 showStatMsg(i18n("started browser with current URL.")); 1250 showStatMsg(i18n("started browser with current URL."));
1240 else 1251 else
1241 showStatMsg(i18n("ERROR: Couldn't start browser! Maybe invalid URL?")); 1252 showStatMsg(i18n("ERROR: Couldn't start browser! Maybe invalid URL?"));
1242} 1253}
1243 1254
1244void PwM::copyToClipboard(const QString &s) 1255void PwM::copyToClipboard(const QString &s)
1245{ 1256{
1246 QClipboard *cb = QApplication::clipboard(); 1257 QClipboard *cb = QApplication::clipboard();
1247#ifndef PWM_EMBEDDED 1258#ifndef PWM_EMBEDDED
1248 if (cb->supportsSelection()) 1259 if (cb->supportsSelection())
1249 cb->setText(s, QClipboard::Selection); 1260 cb->setText(s, QClipboard::Selection);
1250 cb->setText(s, QClipboard::Clipboard); 1261 cb->setText(s, QClipboard::Clipboard);
1251#else 1262#else
1252 cb->setText(s); 1263 cb->setText(s);
1253 1264
1254#endif 1265#endif
1255 1266
1256} 1267}
1257 1268
1258void PwM::showStatMsg(const QString &msg) 1269void PwM::showStatMsg(const QString &msg)
1259{ 1270{
1260#ifndef PWM_EMBEDDED 1271#ifndef PWM_EMBEDDED
1261 KStatusBar *statBar = statusBar(); 1272 KStatusBar *statBar = statusBar();
1262 statBar->message(msg, STATUSBAR_MSG_TIMEOUT * 1000); 1273 statBar->message(msg, STATUSBAR_MSG_TIMEOUT * 1000);
1263#else 1274#else
1264 qDebug("Statusbar : %s",msg.latin1()); 1275 qDebug("Statusbar : %s",msg.latin1());
1265#endif 1276#endif
1266} 1277}
1267 1278
1268void PwM::focusInEvent(QFocusEvent *e) 1279void PwM::focusInEvent(QFocusEvent *e)
1269{ 1280{
1270 if (e->gotFocus()) { 1281 if (e->gotFocus()) {
1271 emit gotFocus(this); 1282 emit gotFocus(this);
1272 } else if (e->lostFocus()) { 1283 } else if (e->lostFocus()) {
1273 emit lostFocus(this); 1284 emit lostFocus(this);
1274 } 1285 }
1275} 1286}
1276 1287
1277 1288
1278#ifdef PWM_EMBEDDED 1289#ifdef PWM_EMBEDDED
1279 1290
1280void PwM::showLicense_slot() 1291void PwM::showLicense_slot()
1281{ 1292{
1282 KApplication::showLicence(); 1293 KApplication::showLicence();
1283} 1294}
1284 1295
1285void PwM::faq_slot() 1296void PwM::faq_slot()
1286{ 1297{
1287 KApplication::showFile( "PWM/Pi FAQ", "kdepim/pwmanager/pwmanagerFAQ.txt" ); 1298 KApplication::showFile( "PWM/Pi FAQ", "kdepim/pwmanager/pwmanagerFAQ.txt" );
1288} 1299}
1289 1300
1301void PwM::syncHowTo_slot()
1302{
1303 qDebug("PwM::syncHowTo_slot");
1304 KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" );
1305}
1306
1307
1290void PwM::createAboutData_slot() 1308void PwM::createAboutData_slot()
1291{ 1309{
1292 QString version; 1310 QString version;
1293#include <../version> 1311#include <../version>
1294 QMessageBox::about( this, "About PwManager/Pi", 1312 QMessageBox::about( this, "About PwManager/Pi",
1295 "PwManager/Platform-independent\n" 1313 "PwManager/Platform-independent\n"
1296 "(PWM/Pi) " +version + " - " + 1314 "(PWM/Pi) " +version + " - " +
1297#ifdef DESKTOP_VERSION 1315#ifdef DESKTOP_VERSION
1298 "Desktop Edition\n" 1316 "Desktop Edition\n"
1299#else 1317#else
1300 "PDA-Edition\n" 1318 "PDA-Edition\n"
1301 "for: Zaurus 5500 / 7x0 / 8x0\n" 1319 "for: Zaurus 5500 / 7x0 / 8x0\n"
1302#endif 1320#endif
1303 1321
1304 "(c) 2004 Ulf Schenk\n" 1322 "(c) 2004 Ulf Schenk\n"
1305 "(c) 2004 Lutz Rogowski\n" 1323 "(c) 2004 Lutz Rogowski\n"
1306 "(c) 1997-2004, The KDE PIM Team\n" 1324 "(c) 1997-2004, The KDE PIM Team\n"
1307 1325
1308 "(c) Michael Buesch - main programming\nand current maintainer\nmbuesch@freenet.de\n" 1326 "(c) Michael Buesch - main programming\nand current maintainer\nmbuesch@freenet.de\n"
1309 "Matt Scifo - mscifo@o1.com\n" 1327 "Matt Scifo - mscifo@o1.com\n"
1310 "Elias Probst - elias.probst@gmx.de\n" 1328 "Elias Probst - elias.probst@gmx.de\n"
1311 "George Staikos - staikos@kde.org\n" 1329 "George Staikos - staikos@kde.org\n"
1312 "Matthew Palmer - mjp16@uow.edu.au\n" 1330 "Matthew Palmer - mjp16@uow.edu.au\n"
1313 "Olivier Sessink - gpasman@nl.linux.org\n" 1331 "Olivier Sessink - gpasman@nl.linux.org\n"
1314 "The libgcrypt developers -\nBlowfish and SHA1 algorithms\nftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/\n" 1332 "The libgcrypt developers -\nBlowfish and SHA1 algorithms\nftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/\n"
1315 "Troy Engel - tengel@sonic.net\n" 1333 "Troy Engel - tengel@sonic.net\n"
1316 "Wickey - wickey@gmx.at\n" 1334 "Wickey - wickey@gmx.at\n"
1317 "Ian MacGregor - original documentation author.\n" 1335 "Ian MacGregor - original documentation author.\n"
1318 ); 1336 );
1319} 1337}
1320 1338
1321 1339
1322//this are the overwritten callbackmethods from the syncinterface 1340//this are the overwritten callbackmethods from the syncinterface
1323bool PwM::sync(KSyncManager* manager, QString filename, int mode) 1341bool PwM::sync(KSyncManager* manager, QString filename, int mode)
1324{ 1342{
1325 PWM_ASSERT(curDoc()); 1343 PWM_ASSERT(curDoc());
1326 1344
1327 bool ret = curDoc()->sync(manager, filename, mode); 1345 bool ret = curDoc()->sync(manager, filename, mode);
1328 1346
1347 qDebug("PwM::sync save now: ret=%i", ret);
1348
1329 if (ret == true) { 1349 if (ret == true) {
1330 //US BUG: what can we call here to update the view of the current doc? 1350 //US BUG: what can we call here to update the view of the current doc?
1331 //mViewManager->refreshView(); 1351 //mViewManager->refreshView();
1352
1353 //US curDoc()->sync sets the dirtyFlag in case the sync was successfull.
1354 save();
1332 } 1355 }
1333 1356
1334 return ret; 1357 return ret;
1335} 1358}
1336
1337//called by the syncmanager to indicate that the work has to be marked as dirty.
1338void PwM::sync_setModified()
1339{
1340 PWM_ASSERT(curDoc());
1341 curDoc()->sync_setModified();
1342}
1343
1344//called by the syncmanager to ask if the dirty flag is set.
1345bool PwM::sync_isModified()
1346{
1347 PWM_ASSERT(curDoc());
1348 return curDoc()->sync_isModified();
1349}
1350
1351//called by the syncmanager to indicate that the work has to be saved.
1352void PwM::sync_save()
1353{
1354 PWM_ASSERT(curDoc());
1355 return curDoc()->sync_save();
1356}
1357
1358
1359
1360#endif 1359#endif
1361 1360
1362 1361
1363#ifndef PWM_EMBEDDED 1362#ifndef PWM_EMBEDDED
1364#include "pwm.moc" 1363#include "pwm.moc"
1365#endif 1364#endif
diff --git a/pwmanager/pwmanager/pwm.h b/pwmanager/pwmanager/pwm.h
index 7c6bf0d..6ed9d34 100644
--- a/pwmanager/pwmanager/pwm.h
+++ b/pwmanager/pwmanager/pwm.h
@@ -52,246 +52,240 @@ class KSyncManager;
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 void addPwd_slot(); 137 void addPwd_slot();
138 void addPwd_slot(QString *pw, PwMDoc *_doc); 138 void addPwd_slot(QString *pw, PwMDoc *_doc);
139 /** manage/edit triggered */ 139 /** manage/edit triggered */
140 //US ENH : changed code to run with older MOC 140 //US ENH : changed code to run with older MOC
141 void editPwd_slot(); 141 void editPwd_slot();
142 void editPwd_slot(const QString *category); 142 void editPwd_slot(const QString *category);
143 void editPwd_slot(const QString *category = 0, const int *index = 0, 143 void editPwd_slot(const QString *category = 0, const int *index = 0,
144 PwMDoc *_doc = 0); 144 PwMDoc *_doc = 0);
145 /** manage/delete triggered */ 145 /** manage/delete triggered */
146 void deletePwd_slot(); 146 void deletePwd_slot();
147 /** execute the "Launcher" entry */ 147 /** execute the "Launcher" entry */
148 void execLauncher_slot(); 148 void execLauncher_slot();
149 /** open browser with URL entry */ 149 /** open browser with URL entry */
150 void goToURL_slot(); 150 void goToURL_slot();
151 /** manage/changeMasterPwd triggered */ 151 /** manage/changeMasterPwd triggered */
152 void changeMasterPwd_slot(); 152 void changeMasterPwd_slot();
153 /** lock current document */ 153 /** lock current document */
154 void lockWnd_slot(); 154 void lockWnd_slot();
155 /** deeplock current document */ 155 /** deeplock current document */
156 void deepLockWnd_slot(); 156 void deepLockWnd_slot();
157 /** window/unlock triggered */ 157 /** window/unlock triggered */
158 void unlockWnd_slot(); 158 void unlockWnd_slot();
159 /** find item */ 159 /** find item */
160 void find_slot(); 160 void find_slot();
161 /** configure clicked */ 161 /** configure clicked */
162 void config_slot(); 162 void config_slot();
163 /** (de)activate the "change master pw" button in the menu-bar */ 163 /** (de)activate the "change master pw" button in the menu-bar */
164 void activateMpButton(bool activate = true); 164 void activateMpButton(bool activate = true);
165 /** generate a new chipcard */ 165 /** generate a new chipcard */
166 void genNewCard_slot(); 166 void genNewCard_slot();
167 /** completely erase the current card */ 167 /** completely erase the current card */
168 void eraseCard_slot(); 168 void eraseCard_slot();
169 /** returns the ID number of the current card */ 169 /** returns the ID number of the current card */
170 void readCardId_slot(); 170 void readCardId_slot();
171 /** make backup image of the current card */ 171 /** make backup image of the current card */
172 void makeCardBackup_slot(); 172 void makeCardBackup_slot();
173 /** write backup image to current card */ 173 /** write backup image to current card */
174 void replayCardBackup_slot(); 174 void replayCardBackup_slot();
175 175
176#ifdef PWM_EMBEDDED 176#ifdef PWM_EMBEDDED
177 void showLicense_slot(); 177 void showLicense_slot();
178 void faq_slot(); 178 void faq_slot();
179 void createAboutData_slot(); 179 void createAboutData_slot();
180 void syncHowTo_slot();
180#endif 181#endif
181 182
182protected: 183protected:
183 /** is this window virgin? */ 184 /** is this window virgin? */
184 bool isVirgin() 185 bool isVirgin()
185 { return virgin; } 186 { return virgin; }
186 /** add/remove virginity */ 187 /** add/remove virginity */
187 void setVirgin(bool v); 188 void setVirgin(bool v);
188 /** initialize the menubar */ 189 /** initialize the menubar */
189 void initMenubar(); 190 void initMenubar();
190 /** initialize the toolbar */ 191 /** initialize the toolbar */
191 void initToolbar(); 192 void initToolbar();
192 /** initialize the window-metrics */ 193 /** initialize the window-metrics */
193 void initMetrics(); 194 void initMetrics();
194 /** close-event */ 195 /** close-event */
195 void closeEvent(QCloseEvent *e); 196 void closeEvent(QCloseEvent *e);
196 /** creates a new PwM-ListView and returns it */ 197 /** creates a new PwM-ListView and returns it */
197 PwMView * makeNewListView(PwMDoc *doc); 198 PwMView * makeNewListView(PwMDoc *doc);
198 /** Window hide-event */ 199 /** Window hide-event */
199 void hideEvent(QHideEvent *); 200 void hideEvent(QHideEvent *);
200 /** is this window minimized? */ 201 /** is this window minimized? */
201 bool isMinimized() 202 bool isMinimized()
202 { 203 {
203#ifndef PWM_EMBEDDED 204#ifndef PWM_EMBEDDED
204 #if KDE_VERSION >= KDE_MAKE_VERSION(3, 2, 0) 205 #if KDE_VERSION >= KDE_MAKE_VERSION(3, 2, 0)
205 return KWin::windowInfo(winId()).isMinimized(); 206 return KWin::windowInfo(winId()).isMinimized();
206 #else // KDE_VERSION 207 #else // KDE_VERSION
207 return KWin::info(winId()).isIconified(); 208 return KWin::info(winId()).isIconified();
208 #endif // KDE_VERSION 209 #endif // KDE_VERSION
209#else 210#else
210 return false; 211 return false;
211#endif 212#endif
212 } 213 }
213 /** window got the focus */ 214 /** window got the focus */
214 void focusInEvent(QFocusEvent *e); 215 void focusInEvent(QFocusEvent *e);
215 /** update the caption string */ 216 /** update the caption string */
216 void updateCaption(); 217 void updateCaption();
217#ifdef CONFIG_KWALLETIF 218#ifdef CONFIG_KWALLETIF
218 /** check if kwalletemu is enabled and ask the user what to do */ 219 /** check if kwalletemu is enabled and ask the user what to do */
219 bool checkAndAskForKWalletEmu(); 220 bool checkAndAskForKWalletEmu();
220#endif // CONFIG_KWALLETIF 221#endif // CONFIG_KWALLETIF
221 222
222protected slots: 223protected slots:
223 /** doc got closed */ 224 /** doc got closed */
224 void docClosed(PwMDoc *doc); 225 void docClosed(PwMDoc *doc);
225 226
226signals: 227signals:
227 /** window got closed (by user or someone else) */ 228 /** window got closed (by user or someone else) */
228 void closed(PwM *wnd); 229 void closed(PwM *wnd);
229 /** window got the focus (was brought to foreground) */ 230 /** window got the focus (was brought to foreground) */
230 void gotFocus(PwM *wnd); 231 void gotFocus(PwM *wnd);
231 /** window lost the focus */ 232 /** window lost the focus */
232 void lostFocus(PwM *wnd); 233 void lostFocus(PwM *wnd);
233 234
234protected: 235protected:
235 /** pointer to the view active in this KMainWindow */ 236 /** pointer to the view active in this KMainWindow */
236 PwMView *view; 237 PwMView *view;
237 /** pointer to the init class */ 238 /** pointer to the init class */
238 PwMInit *init; 239 PwMInit *init;
239 /** has this window already lost its virginity? 240 /** has this window already lost its virginity?
240 * Means is there an open working document 241 * Means is there an open working document
241 */ 242 */
242 bool virgin; 243 bool virgin;
243 /** "file" popup-menu */ 244 /** "file" popup-menu */
244 KPopupMenu *filePopup; 245 KPopupMenu *filePopup;
245 246
246 /** "manage" popup-menu */ 247 /** "manage" popup-menu */
247 KPopupMenu *managePopup; 248 KPopupMenu *managePopup;
248#ifdef CONFIG_KEYCARD 249#ifdef CONFIG_KEYCARD
249 /** "chipcard" popup-menu */ 250 /** "chipcard" popup-menu */
250 KPopupMenu *chipcardPopup; 251 KPopupMenu *chipcardPopup;
251#endif // CONFIG_KEYCARD 252#endif // CONFIG_KEYCARD
252 /** "view" popup-menu */ 253 /** "view" popup-menu */
253 KPopupMenu *viewPopup; 254 KPopupMenu *viewPopup;
254 /** "options" popup-menu */ 255 /** "options" popup-menu */
255 KPopupMenu *optionsPopup; 256 KPopupMenu *optionsPopup;
256 /** "help" popup-menu */ 257 /** "help" popup-menu */
257 KPopupMenu *helpPopup; 258 KPopupMenu *helpPopup;
258 /** "export" popup-menu */ 259 /** "export" popup-menu */
259 KPopupMenu *exportPopup; 260 KPopupMenu *exportPopup;
260 /** "import" popup-menu */ 261 /** "import" popup-menu */
261 KPopupMenu *importPopup; 262 KPopupMenu *importPopup;
262 /** force quit this window? */ 263 /** force quit this window? */
263 bool forceQuit; 264 bool forceQuit;
264 /** force minimize this window to the tray */ 265 /** force minimize this window to the tray */
265 bool forceMinimizeToTray; 266 bool forceMinimizeToTray;
266 267
267 268
268 269
269 270
270 private: 271 private:
271#ifdef PWM_EMBEDDED 272#ifdef PWM_EMBEDDED
272 //this are the overwritten callbackmethods from the syncinterface 273 //this are the overwritten callbackmethods from the syncinterface
273 virtual bool sync(KSyncManager* manager, QString filename, int mode); 274 virtual bool sync(KSyncManager* manager, QString filename, int mode);
274 275
275 //called by the syncmanager to indicate that the work has to marked as dirty.
276 virtual void sync_setModified();
277 //called by the syncmanager to ask if the dirty flag is set.
278 virtual bool sync_isModified();
279 //called by the syncmanager to indicate that the work has to be saved.
280 virtual void sync_save();
281
282 // LR ******************************* 276 // LR *******************************
283 // sync stuff! 277 // sync stuff!
284 QPopupMenu *syncPopup; 278 QPopupMenu *syncPopup;
285 KSyncManager* syncManager; 279 KSyncManager* syncManager;
286#endif 280#endif
287 281
288 282
289 283
290 284
291 285
292 286
293 287
294 288
295}; 289};
296 290
297#endif 291#endif
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp
index 0ac5517..2a7b11d 100644
--- a/pwmanager/pwmanager/pwmdoc.cpp
+++ b/pwmanager/pwmanager/pwmdoc.cpp
@@ -362,375 +362,378 @@ PwMerror PwMDoc::saveDoc(char compress, const QString *file)
362 } else { 362 } else {
363 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 363 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
364 } 364 }
365 } 365 }
366 366
367 int _cryptAlgo = conf()->confGlobCryptAlgo(); 367 int _cryptAlgo = conf()->confGlobCryptAlgo();
368 int _hashAlgo = conf()->confGlobHashAlgo(); 368 int _hashAlgo = conf()->confGlobHashAlgo();
369 369
370 // sanity check for the selected algorithms 370 // sanity check for the selected algorithms
371 if (_cryptAlgo < PWM_CRYPT_BLOWFISH || 371 if (_cryptAlgo < PWM_CRYPT_BLOWFISH ||
372 _cryptAlgo > PWM_CRYPT_TWOFISH128) { 372 _cryptAlgo > PWM_CRYPT_TWOFISH128) {
373 printWarn("Invalid Crypto-Algorithm selected! " 373 printWarn("Invalid Crypto-Algorithm selected! "
374 "Config-file seems to be corrupt. " 374 "Config-file seems to be corrupt. "
375 "Falling back to Blowfish."); 375 "Falling back to Blowfish.");
376 _cryptAlgo = PWM_CRYPT_BLOWFISH; 376 _cryptAlgo = PWM_CRYPT_BLOWFISH;
377 } 377 }
378 if (_hashAlgo < PWM_HASH_SHA1 || 378 if (_hashAlgo < PWM_HASH_SHA1 ||
379 _hashAlgo > PWM_HASH_TIGER) { 379 _hashAlgo > PWM_HASH_TIGER) {
380 printWarn("Invalid Hash-Algorithm selected! " 380 printWarn("Invalid Hash-Algorithm selected! "
381 "Config-file seems to be corrupt. " 381 "Config-file seems to be corrupt. "
382 "Falling back to SHA1."); 382 "Falling back to SHA1.");
383 _hashAlgo = PWM_HASH_SHA1; 383 _hashAlgo = PWM_HASH_SHA1;
384 } 384 }
385 char cryptAlgo = static_cast<char>(_cryptAlgo); 385 char cryptAlgo = static_cast<char>(_cryptAlgo);
386 char hashAlgo = static_cast<char>(_hashAlgo); 386 char hashAlgo = static_cast<char>(_hashAlgo);
387 387
388 if (conf()->confGlobMakeFileBackup()) { 388 if (conf()->confGlobMakeFileBackup()) {
389 if (!backupFile(filename)) 389 if (!backupFile(filename))
390 return e_fileBackup; 390 return e_fileBackup;
391 } 391 }
392 QString tmpFileMoved(QString::null); 392 QString tmpFileMoved(QString::null);
393 if (QFile::exists(filename)) { 393 if (QFile::exists(filename)) {
394 /* Move the existing file to some tmp file. 394 /* Move the existing file to some tmp file.
395 * When saving file succeeds, delete tmp file. Otherwise 395 * When saving file succeeds, delete tmp file. Otherwise
396 * move tmp file back. See below. 396 * move tmp file back. See below.
397 */ 397 */
398 Randomizer *rnd = Randomizer::obj(); 398 Randomizer *rnd = Randomizer::obj();
399 char rnd_buf[5]; 399 char rnd_buf[5];
400 sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF, 400 sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF,
401 rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF); 401 rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF);
402 tmpFileMoved = filename + "." + rnd_buf + ".mv"; 402 tmpFileMoved = filename + "." + rnd_buf + ".mv";
403 if (!copyFile(filename, tmpFileMoved)) 403 if (!copyFile(filename, tmpFileMoved))
404 return e_openFile; 404 return e_openFile;
405 if (!QFile::remove(filename)) { 405 if (!QFile::remove(filename)) {
406 printWarn(string("removing orig file ") 406 printWarn(string("removing orig file ")
407 + filename.latin1() 407 + filename.latin1()
408 + " failed!"); 408 + " failed!");
409 } 409 }
410 } 410 }
411 QFile f(filename); 411 QFile f(filename);
412 string serialized; 412 string serialized;
413 if (!f.open(IO_ReadWrite)) { 413 if (!f.open(IO_ReadWrite)) {
414 ret = e_openFile; 414 ret = e_openFile;
415 goto out_moveback; 415 goto out_moveback;
416 } 416 }
417 e = writeFileHeader(hashAlgo, hashAlgo, 417 e = writeFileHeader(hashAlgo, hashAlgo,
418 cryptAlgo, compress, 418 cryptAlgo, compress,
419 &currentPw, &f); 419 &currentPw, &f);
420 if (e == e_hashNotImpl) { 420 if (e == e_hashNotImpl) {
421 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed: e_hashNotImpl"); 421 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed: e_hashNotImpl");
422 f.close(); 422 f.close();
423 ret = e_hashNotImpl; 423 ret = e_hashNotImpl;
424 goto out_moveback; 424 goto out_moveback;
425 } else if (e != e_success) { 425 } else if (e != e_success) {
426 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed"); 426 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed");
427 f.close(); 427 f.close();
428 ret = e_writeHeader; 428 ret = e_writeHeader;
429 goto out_moveback; 429 goto out_moveback;
430 } 430 }
431 if (!serializeDta(&serialized)) { 431 if (!serializeDta(&serialized)) {
432 printDebug("PwMDoc::saveDoc(): serializeDta() failed"); 432 printDebug("PwMDoc::saveDoc(): serializeDta() failed");
433 f.close(); 433 f.close();
434 ret = e_serializeDta; 434 ret = e_serializeDta;
435 goto out_moveback; 435 goto out_moveback;
436 } 436 }
437 e = writeDataHash(hashAlgo, &serialized, &f); 437 e = writeDataHash(hashAlgo, &serialized, &f);
438 if (e == e_hashNotImpl) { 438 if (e == e_hashNotImpl) {
439 printDebug("PwMDoc::saveDoc(): writeDataHash() failed: e_hashNotImpl"); 439 printDebug("PwMDoc::saveDoc(): writeDataHash() failed: e_hashNotImpl");
440 f.close(); 440 f.close();
441 ret = e_hashNotImpl; 441 ret = e_hashNotImpl;
442 goto out_moveback; 442 goto out_moveback;
443 } else if (e != e_success) { 443 } else if (e != e_success) {
444 printDebug("PwMDoc::saveDoc(): writeDataHash() failed"); 444 printDebug("PwMDoc::saveDoc(): writeDataHash() failed");
445 f.close(); 445 f.close();
446 ret = e_writeHeader; 446 ret = e_writeHeader;
447 goto out_moveback; 447 goto out_moveback;
448 } 448 }
449 if (!compressDta(&serialized, compress)) { 449 if (!compressDta(&serialized, compress)) {
450 printDebug("PwMDoc::saveDoc(): compressDta() failed"); 450 printDebug("PwMDoc::saveDoc(): compressDta() failed");
451 f.close(); 451 f.close();
452 ret = e_enc; 452 ret = e_enc;
453 goto out_moveback; 453 goto out_moveback;
454 } 454 }
455 e = encrypt(&serialized, &currentPw, &f, cryptAlgo); 455 e = encrypt(&serialized, &currentPw, &f, cryptAlgo);
456 if (e == e_weakPw) { 456 if (e == e_weakPw) {
457 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw"); 457 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw");
458 f.close(); 458 f.close();
459 ret = e_weakPw; 459 ret = e_weakPw;
460 goto out_moveback; 460 goto out_moveback;
461 } else if (e == e_cryptNotImpl) { 461 } else if (e == e_cryptNotImpl) {
462 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl"); 462 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl");
463 f.close(); 463 f.close();
464 ret = e_cryptNotImpl; 464 ret = e_cryptNotImpl;
465 goto out_moveback; 465 goto out_moveback;
466 } else if (e != e_success) { 466 } else if (e != e_success) {
467 printDebug("PwMDoc::saveDoc(): encrypt() failed"); 467 printDebug("PwMDoc::saveDoc(): encrypt() failed");
468 f.close(); 468 f.close();
469 ret = e_enc; 469 ret = e_enc;
470 goto out_moveback; 470 goto out_moveback;
471 } 471 }
472 unsetDocStatFlag(DOC_STAT_DISK_DIRTY); 472 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
473 f.close(); 473 f.close();
474 if (chmod(filename.latin1(), 474 if (chmod(filename.latin1(),
475 conf()->confGlobFilePermissions())) { 475 conf()->confGlobFilePermissions())) {
476 printWarn(string("chmod failed: ") + strerror(errno)); 476 printWarn(string("chmod failed: ") + strerror(errno));
477 } 477 }
478 openDocList.edit(this, getTitle().latin1()); 478 openDocList.edit(this, getTitle().latin1());
479 if (wasDeepLocked) 479 if (wasDeepLocked)
480 deepLock(true); 480 deepLock(true);
481 if (tmpFileMoved != QString::null) { 481 if (tmpFileMoved != QString::null) {
482 // now remove the moved file. 482 // now remove the moved file.
483 if (!QFile::remove(tmpFileMoved)) { 483 if (!QFile::remove(tmpFileMoved)) {
484 printWarn(string("removing file ") 484 printWarn(string("removing file ")
485 + tmpFileMoved.latin1() 485 + tmpFileMoved.latin1()
486 + " failed!"); 486 + " failed!");
487 } 487 }
488 } 488 }
489 ret = e_success; 489 ret = e_success;
490 printDebug(string("writing file { compress: ") 490 printDebug(string("writing file { name: ")
491 + filename.latin1() + " compress: "
491 + tostr(static_cast<int>(compress)) + " cryptAlgo: " 492 + tostr(static_cast<int>(compress)) + " cryptAlgo: "
492 + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: " 493 + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: "
493 + tostr(static_cast<int>(hashAlgo)) 494 + tostr(static_cast<int>(hashAlgo))
494 + " }"); 495 + " }");
495 goto out; 496 goto out;
496out_moveback: 497out_moveback:
497 if (tmpFileMoved != QString::null) { 498 if (tmpFileMoved != QString::null) {
498 if (copyFile(tmpFileMoved, filename)) { 499 if (copyFile(tmpFileMoved, filename)) {
499 if (!QFile::remove(tmpFileMoved)) { 500 if (!QFile::remove(tmpFileMoved)) {
500 printWarn(string("removing tmp file ") 501 printWarn(string("removing tmp file ")
501 + filename.latin1() 502 + filename.latin1()
502 + " failed!"); 503 + " failed!");
503 } 504 }
504 } else { 505 } else {
505 printWarn(string("couldn't copy file ") 506 printWarn(string("couldn't copy file ")
506 + tmpFileMoved.latin1() 507 + tmpFileMoved.latin1()
507 + " back to " 508 + " back to "
508 + filename.latin1()); 509 + filename.latin1());
509 } 510 }
510 } 511 }
511out: 512out:
512 return ret; 513 return ret;
513} 514}
514 515
515PwMerror PwMDoc::openDoc(const QString *file, int openLocked) 516PwMerror PwMDoc::openDoc(const QString *file, int openLocked)
516{ 517{
517 PWM_ASSERT(file); 518 PWM_ASSERT(file);
518 PWM_ASSERT(openLocked == 0 || openLocked == 1 || openLocked == 2); 519 PWM_ASSERT(openLocked == 0 || openLocked == 1 || openLocked == 2);
519 string decrypted, dataHash; 520 string decrypted, dataHash;
520 PwMerror ret; 521 PwMerror ret;
521 char cryptAlgo, dataHashType, compress; 522 char cryptAlgo, dataHashType, compress;
522 unsigned int headerLen; 523 unsigned int headerLen;
523 524
524 if (*file == "") 525 if (*file == "")
525 return e_readFile; 526 return e_readFile;
526 filename = *file; 527 filename = *file;
527 /* check if this file is already open. 528 /* check if this file is already open.
528 * This does not catch symlinks! 529 * This does not catch symlinks!
529 */ 530 */
530 if (!isDeepLocked()) { 531 if (!isDeepLocked()) {
531 if (getOpenDocList()->find(filename.latin1())) 532 if (getOpenDocList()->find(filename.latin1()))
532 return e_alreadyOpen; 533 return e_alreadyOpen;
533 } 534 }
534 QFile f(filename); 535 QFile f(filename);
535 536
536 if (openLocked == 2) { 537 if (openLocked == 2) {
537 // open deep-locked 538 // open deep-locked
538 if (!QFile::exists(filename)) 539 if (!QFile::exists(filename))
539 return e_openFile; 540 return e_openFile;
540 if (deepLock(true, false) != e_success) 541 if (deepLock(true, false) != e_success)
541 return e_openFile; 542 return e_openFile;
542 goto out_success; 543 goto out_success;
543 } 544 }
544 545
545 if (!f.open(IO_ReadOnly)) 546 if (!f.open(IO_ReadOnly))
546 return e_openFile; 547 return e_openFile;
547 548
548 ret = checkHeader(&cryptAlgo, &currentPw, &compress, &headerLen, 549 ret = checkHeader(&cryptAlgo, &currentPw, &compress, &headerLen,
549 &dataHashType, &dataHash, &f); 550 &dataHashType, &dataHash, &f);
550 if (ret != e_success) { 551 if (ret != e_success) {
551 printDebug("PwMDoc::openDoc(): checkHeader() failed"); 552 printDebug("PwMDoc::openDoc(): checkHeader() failed");
552 f.close(); 553 f.close();
553 if (ret == e_wrongPw) { 554 if (ret == e_wrongPw) {
554 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 555 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
555 return ret; 556 return ret;
556 } else if (ret == e_noPw || 557 } else if (ret == e_noPw ||
557 ret == e_fileVer || 558 ret == e_fileVer ||
558 ret == e_fileFormat || 559 ret == e_fileFormat ||
559 ret == e_hashNotImpl) { 560 ret == e_hashNotImpl) {
560 return ret; 561 return ret;
561 } else 562 } else
562 return e_readFile; 563 return e_readFile;
563 } 564 }
564 ret = decrypt(&decrypted, headerLen, &currentPw, cryptAlgo, &f); 565 ret = decrypt(&decrypted, headerLen, &currentPw, cryptAlgo, &f);
565 if (ret == e_cryptNotImpl) { 566 if (ret == e_cryptNotImpl) {
566 printDebug("PwMDoc::openDoc(): decrypt() failed: e_cryptNotImpl"); 567 printDebug("PwMDoc::openDoc(): decrypt() failed: e_cryptNotImpl");
567 f.close(); 568 f.close();
568 return e_cryptNotImpl; 569 return e_cryptNotImpl;
569 } else if (ret != e_success) { 570 } else if (ret != e_success) {
570 printDebug("PwMDoc::openDoc(): decrypt() failed"); 571 printDebug("PwMDoc::openDoc(): decrypt() failed");
571 f.close(); 572 f.close();
572 return e_readFile; 573 return e_readFile;
573 } 574 }
574 if (!decompressDta(&decrypted, compress)) { 575 if (!decompressDta(&decrypted, compress)) {
575 printDebug("PwMDoc::openDoc(): decompressDta() failed"); 576 printDebug("PwMDoc::openDoc(): decompressDta() failed");
576 f.close(); 577 f.close();
577 return e_fileCorrupt; 578 return e_fileCorrupt;
578 } 579 }
579 ret = checkDataHash(dataHashType, &dataHash, &decrypted); 580 ret = checkDataHash(dataHashType, &dataHash, &decrypted);
580 if (ret == e_hashNotImpl) { 581 if (ret == e_hashNotImpl) {
581 printDebug("PwMDoc::openDoc(): checkDataHash() failed: e_hashNotImpl"); 582 printDebug("PwMDoc::openDoc(): checkDataHash() failed: e_hashNotImpl");
582 f.close(); 583 f.close();
583 return e_hashNotImpl; 584 return e_hashNotImpl;
584 } else if (ret != e_success) { 585 } else if (ret != e_success) {
585 printDebug("PwMDoc::openDoc(): checkDataHash() failed"); 586 printDebug("PwMDoc::openDoc(): checkDataHash() failed");
586 f.close(); 587 f.close();
587 return e_fileCorrupt; 588 return e_fileCorrupt;
588 } 589 }
589 if (!deSerializeDta(&decrypted, openLocked == 1)) { 590 if (!deSerializeDta(&decrypted, openLocked == 1)) {
590 printDebug("PwMDoc::openDoc(): deSerializeDta() failed"); 591 printDebug("PwMDoc::openDoc(): deSerializeDta() failed");
591 f.close(); 592 f.close();
592 return e_readFile; 593 return e_readFile;
593 } 594 }
594 f.close(); 595 f.close();
595 timer()->start(DocTimer::id_mpwTimer); 596 timer()->start(DocTimer::id_mpwTimer);
596 timer()->start(DocTimer::id_autoLockTimer); 597 timer()->start(DocTimer::id_autoLockTimer);
597out_success: 598out_success:
598 openDocList.edit(this, getTitle().latin1()); 599 openDocList.edit(this, getTitle().latin1());
599 emit docOpened(this); 600 emit docOpened(this);
600 return e_success; 601 return e_success;
601} 602}
602 603
603PwMerror PwMDoc::writeFileHeader(char keyHash, char dataHash, char crypt, char compress, 604PwMerror PwMDoc::writeFileHeader(char keyHash, char dataHash, char crypt, char compress,
604 QString *pw, QFile *f) 605 QString *pw, QFile *f)
605{ 606{
606 PWM_ASSERT(pw); 607 PWM_ASSERT(pw);
607 PWM_ASSERT(f); 608 PWM_ASSERT(f);
608 PWM_ASSERT(listView); 609 //US ENH: or maybe a bug: checking here for listView does not make sense because we do not check anywhere else
610 //Wenn I sync, I open a doc without a view => listView is 0 => Assertion
611 //USPWM_ASSERT(listView);
609 if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) != 612 if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) !=
610 static_cast<Q_LONG>(strlen(FILE_ID_HEADER))) { 613 static_cast<Q_LONG>(strlen(FILE_ID_HEADER))) {
611 return e_writeFile; 614 return e_writeFile;
612 } 615 }
613 if (f->putch(PWM_FILE_VER) == -1 || 616 if (f->putch(PWM_FILE_VER) == -1 ||
614 f->putch(keyHash) == -1 || 617 f->putch(keyHash) == -1 ||
615 f->putch(dataHash) == -1 || 618 f->putch(dataHash) == -1 ||
616 f->putch(crypt) == -1 || 619 f->putch(crypt) == -1 ||
617 f->putch(compress) == -1 || 620 f->putch(compress) == -1 ||
618 f->putch((getDocStatFlag(DOC_STAT_USE_CHIPCARD)) ? 621 f->putch((getDocStatFlag(DOC_STAT_USE_CHIPCARD)) ?
619 (static_cast<char>(0x01)) : (static_cast<char>(0x00))) == -1) { 622 (static_cast<char>(0x01)) : (static_cast<char>(0x00))) == -1) {
620 return e_writeFile; 623 return e_writeFile;
621 } 624 }
622 625
623 // write bytes of NUL-data. These bytes are reserved for future-use. 626 // write bytes of NUL-data. These bytes are reserved for future-use.
624 const int bufSize = 64; 627 const int bufSize = 64;
625 char tmp_buf[bufSize]; 628 char tmp_buf[bufSize];
626 memset(tmp_buf, 0x00, bufSize); 629 memset(tmp_buf, 0x00, bufSize);
627 if (f->writeBlock(tmp_buf, bufSize) != bufSize) 630 if (f->writeBlock(tmp_buf, bufSize) != bufSize)
628 return e_writeFile; 631 return e_writeFile;
629 632
630 switch (keyHash) { 633 switch (keyHash) {
631 case PWM_HASH_SHA1: { 634 case PWM_HASH_SHA1: {
632 const int hashlen = SHA1_HASH_LEN_BYTE; 635 const int hashlen = SHA1_HASH_LEN_BYTE;
633 Sha1 hash; 636 Sha1 hash;
634 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length()); 637 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length());
635 string ret = hash.sha1_read(); 638 string ret = hash.sha1_read();
636 if (f->writeBlock(ret.c_str(), hashlen) != hashlen) 639 if (f->writeBlock(ret.c_str(), hashlen) != hashlen)
637 return e_writeFile; 640 return e_writeFile;
638 break; 641 break;
639 } 642 }
640 case PWM_HASH_SHA256: 643 case PWM_HASH_SHA256:
641 /*... fall through */ 644 /*... fall through */
642 case PWM_HASH_SHA384: 645 case PWM_HASH_SHA384:
643 case PWM_HASH_SHA512: 646 case PWM_HASH_SHA512:
644 case PWM_HASH_MD5: 647 case PWM_HASH_MD5:
645 case PWM_HASH_RMD160: 648 case PWM_HASH_RMD160:
646 case PWM_HASH_TIGER: 649 case PWM_HASH_TIGER:
647 { 650 {
648 if (!LibGCryptIf::available()) 651 if (!LibGCryptIf::available())
649 return e_hashNotImpl; 652 return e_hashNotImpl;
650 LibGCryptIf gc; 653 LibGCryptIf gc;
651 PwMerror err; 654 PwMerror err;
652 unsigned char *buf; 655 unsigned char *buf;
653 size_t hashLen; 656 size_t hashLen;
654 err = gc.hash(&buf, 657 err = gc.hash(&buf,
655 &hashLen, 658 &hashLen,
656 reinterpret_cast<const unsigned char *>(pw->latin1()), 659 reinterpret_cast<const unsigned char *>(pw->latin1()),
657 pw->length(), 660 pw->length(),
658 keyHash); 661 keyHash);
659 if (err != e_success) 662 if (err != e_success)
660 return e_hashNotImpl; 663 return e_hashNotImpl;
661 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen) 664 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen)
662 != static_cast<Q_LONG>(hashLen)) { 665 != static_cast<Q_LONG>(hashLen)) {
663 delete [] buf; 666 delete [] buf;
664 return e_hashNotImpl; 667 return e_hashNotImpl;
665 } 668 }
666 delete [] buf; 669 delete [] buf;
667 break; 670 break;
668 } 671 }
669 default: { 672 default: {
670 return e_hashNotImpl; 673 return e_hashNotImpl;
671 } } 674 } }
672 return e_success; 675 return e_success;
673} 676}
674 677
675PwMerror PwMDoc::checkHeader(char *cryptAlgo, QString *pw, char *compress, 678PwMerror PwMDoc::checkHeader(char *cryptAlgo, QString *pw, char *compress,
676 unsigned int *headerLength, char *dataHashType, 679 unsigned int *headerLength, char *dataHashType,
677 string *dataHash, QFile *f) 680 string *dataHash, QFile *f)
678{ 681{
679 PWM_ASSERT(cryptAlgo); 682 PWM_ASSERT(cryptAlgo);
680 PWM_ASSERT(pw); 683 PWM_ASSERT(pw);
681 PWM_ASSERT(headerLength); 684 PWM_ASSERT(headerLength);
682 PWM_ASSERT(dataHashType); 685 PWM_ASSERT(dataHashType);
683 PWM_ASSERT(dataHash); 686 PWM_ASSERT(dataHash);
684 PWM_ASSERT(f); 687 PWM_ASSERT(f);
685 int tmpRet; 688 int tmpRet;
686 // check "magic" header 689 // check "magic" header
687 const char magicHdr[] = FILE_ID_HEADER; 690 const char magicHdr[] = FILE_ID_HEADER;
688 const int hdrLen = array_size(magicHdr) - 1; 691 const int hdrLen = array_size(magicHdr) - 1;
689 char tmp[hdrLen]; 692 char tmp[hdrLen];
690 if (f->readBlock(tmp, hdrLen) != hdrLen) 693 if (f->readBlock(tmp, hdrLen) != hdrLen)
691 return e_readFile; 694 return e_readFile;
692 if (memcmp(tmp, magicHdr, hdrLen) != 0) 695 if (memcmp(tmp, magicHdr, hdrLen) != 0)
693 return e_fileFormat; 696 return e_fileFormat;
694 // read and check file ver 697 // read and check file ver
695 int fileV = f->getch(); 698 int fileV = f->getch();
696 if (fileV == -1) 699 if (fileV == -1)
697 return e_fileFormat; 700 return e_fileFormat;
698 if (fileV != PWM_FILE_VER) 701 if (fileV != PWM_FILE_VER)
699 return e_fileVer; 702 return e_fileVer;
700 // read hash hash type 703 // read hash hash type
701 int keyHash = f->getch(); 704 int keyHash = f->getch();
702 if (keyHash == -1) 705 if (keyHash == -1)
703 return e_fileFormat; 706 return e_fileFormat;
704 // read data hash type 707 // read data hash type
705 tmpRet = f->getch(); 708 tmpRet = f->getch();
706 if (tmpRet == -1) 709 if (tmpRet == -1)
707 return e_fileFormat; 710 return e_fileFormat;
708 *dataHashType = tmpRet; 711 *dataHashType = tmpRet;
709 // read crypt algo 712 // read crypt algo
710 tmpRet = f->getch(); 713 tmpRet = f->getch();
711 if (tmpRet == -1) 714 if (tmpRet == -1)
712 return e_fileFormat; 715 return e_fileFormat;
713 *cryptAlgo = tmpRet; 716 *cryptAlgo = tmpRet;
714 // get compression-algo 717 // get compression-algo
715 tmpRet = f->getch(); 718 tmpRet = f->getch();
716 if (tmpRet == -1) 719 if (tmpRet == -1)
717 return e_fileFormat; 720 return e_fileFormat;
718 *compress = tmpRet; 721 *compress = tmpRet;
719 // get the MPW-flag 722 // get the MPW-flag
720 int mpw_flag = f->getch(); 723 int mpw_flag = f->getch();
721 if (mpw_flag == -1) 724 if (mpw_flag == -1)
722 return e_fileFormat; 725 return e_fileFormat;
723 if (mpw_flag == 0x01) 726 if (mpw_flag == 0x01)
724 setDocStatFlag(DOC_STAT_USE_CHIPCARD); 727 setDocStatFlag(DOC_STAT_USE_CHIPCARD);
725 else 728 else
726 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 729 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
727 // skip the "RESERVED"-bytes 730 // skip the "RESERVED"-bytes
728 if (!(f->at(f->at() + 64))) 731 if (!(f->at(f->at() + 64)))
729 return e_fileFormat; 732 return e_fileFormat;
730 733
731 *pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 734 *pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
732 if (*pw == "") { 735 if (*pw == "") {
733 /* the user didn't give a master-password 736 /* the user didn't give a master-password
734 * or didn't insert a chipcard 737 * or didn't insert a chipcard
735 */ 738 */
736 return e_noPw; 739 return e_noPw;
@@ -2679,733 +2682,751 @@ bool PwMDoc::textExtractEntry_PwM(const char *in, ssize_t in_size, string *out)
2679 *out = ""; 2682 *out = "";
2680 out->append(in + i, in_size - i - 1); 2683 out->append(in + i, in_size - i - 1);
2681 return true; 2684 return true;
2682} 2685}
2683 2686
2684PwMerror PwMDoc::exportToGpasman(const QString *file) 2687PwMerror PwMDoc::exportToGpasman(const QString *file)
2685{ 2688{
2686 PWM_ASSERT(file); 2689 PWM_ASSERT(file);
2687 GpasmanFile gp; 2690 GpasmanFile gp;
2688 int ret; 2691 int ret;
2689 2692
2690 if (!unlockAll_tempoary()) 2693 if (!unlockAll_tempoary())
2691 return e_lock; 2694 return e_lock;
2692 2695
2693 QString gpmPassword; 2696 QString gpmPassword;
2694 while (1) { 2697 while (1) {
2695 gpmPassword = requestNewMpw(0); 2698 gpmPassword = requestNewMpw(0);
2696 if (gpmPassword == "") { 2699 if (gpmPassword == "") {
2697 unlockAll_tempoary(true); 2700 unlockAll_tempoary(true);
2698 return e_noPw; 2701 return e_noPw;
2699 } 2702 }
2700 if (gpmPassword.length() < 4) { 2703 if (gpmPassword.length() < 4) {
2701 gpmPwLenErrMsgBox(); 2704 gpmPwLenErrMsgBox();
2702 } else { 2705 } else {
2703 break; 2706 break;
2704 } 2707 }
2705 } 2708 }
2706 2709
2707 ret = gp.save_init(file->latin1(), gpmPassword.latin1()); 2710 ret = gp.save_init(file->latin1(), gpmPassword.latin1());
2708 if (ret != 1) { 2711 if (ret != 1) {
2709 unlockAll_tempoary(true); 2712 unlockAll_tempoary(true);
2710 return e_accessFile; 2713 return e_accessFile;
2711 } 2714 }
2712 2715
2713 char *entry[4]; 2716 char *entry[4];
2714 unsigned int numCat = numCategories(), i; 2717 unsigned int numCat = numCategories(), i;
2715 unsigned int numEntr, j; 2718 unsigned int numEntr, j;
2716 int descLen, nameLen, pwLen, commentLen; 2719 int descLen, nameLen, pwLen, commentLen;
2717 for (i = 0; i < numCat; ++i) { 2720 for (i = 0; i < numCat; ++i) {
2718 numEntr = numEntries(i); 2721 numEntr = numEntries(i);
2719 for (j = 0; j < numEntr; ++j) { 2722 for (j = 0; j < numEntr; ++j) {
2720 descLen = dti.dta[i].d[j].desc.length(); 2723 descLen = dti.dta[i].d[j].desc.length();
2721 nameLen = dti.dta[i].d[j].name.length(); 2724 nameLen = dti.dta[i].d[j].name.length();
2722 pwLen = dti.dta[i].d[j].pw.length(); 2725 pwLen = dti.dta[i].d[j].pw.length();
2723 commentLen = dti.dta[i].d[j].comment.length(); 2726 commentLen = dti.dta[i].d[j].comment.length();
2724 entry[0] = new char[descLen + 1]; 2727 entry[0] = new char[descLen + 1];
2725 entry[1] = new char[nameLen + 1]; 2728 entry[1] = new char[nameLen + 1];
2726 entry[2] = new char[pwLen + 1]; 2729 entry[2] = new char[pwLen + 1];
2727 entry[3] = new char[commentLen + 1]; 2730 entry[3] = new char[commentLen + 1];
2728 strcpy(entry[0], descLen == 0 ? " " : dti.dta[i].d[j].desc.c_str()); 2731 strcpy(entry[0], descLen == 0 ? " " : dti.dta[i].d[j].desc.c_str());
2729 strcpy(entry[1], nameLen == 0 ? " " : dti.dta[i].d[j].name.c_str()); 2732 strcpy(entry[1], nameLen == 0 ? " " : dti.dta[i].d[j].name.c_str());
2730 strcpy(entry[2], pwLen == 0 ? " " : dti.dta[i].d[j].pw.c_str()); 2733 strcpy(entry[2], pwLen == 0 ? " " : dti.dta[i].d[j].pw.c_str());
2731 strcpy(entry[3], commentLen == 0 ? " " : dti.dta[i].d[j].comment.c_str()); 2734 strcpy(entry[3], commentLen == 0 ? " " : dti.dta[i].d[j].comment.c_str());
2732 entry[0][descLen == 0 ? descLen + 1 : descLen] = '\0'; 2735 entry[0][descLen == 0 ? descLen + 1 : descLen] = '\0';
2733 entry[1][nameLen == 0 ? nameLen + 1 : nameLen] = '\0'; 2736 entry[1][nameLen == 0 ? nameLen + 1 : nameLen] = '\0';
2734 entry[2][pwLen == 0 ? pwLen + 1 : pwLen] = '\0'; 2737 entry[2][pwLen == 0 ? pwLen + 1 : pwLen] = '\0';
2735 entry[3][commentLen == 0 ? commentLen + 1 : commentLen] = '\0'; 2738 entry[3][commentLen == 0 ? commentLen + 1 : commentLen] = '\0';
2736 2739
2737 ret = gp.save_entry(entry); 2740 ret = gp.save_entry(entry);
2738 if (ret == -1){ 2741 if (ret == -1){
2739 delete [] entry[0]; 2742 delete [] entry[0];
2740 delete [] entry[1]; 2743 delete [] entry[1];
2741 delete [] entry[2]; 2744 delete [] entry[2];
2742 delete [] entry[3]; 2745 delete [] entry[3];
2743 gp.save_finalize(); 2746 gp.save_finalize();
2744 unlockAll_tempoary(true); 2747 unlockAll_tempoary(true);
2745 return e_writeFile; 2748 return e_writeFile;
2746 } 2749 }
2747 2750
2748 delete [] entry[0]; 2751 delete [] entry[0];
2749 delete [] entry[1]; 2752 delete [] entry[1];
2750 delete [] entry[2]; 2753 delete [] entry[2];
2751 delete [] entry[3]; 2754 delete [] entry[3];
2752 } 2755 }
2753 } 2756 }
2754 unlockAll_tempoary(true); 2757 unlockAll_tempoary(true);
2755 if (gp.save_finalize() == -1) 2758 if (gp.save_finalize() == -1)
2756 return e_writeFile; 2759 return e_writeFile;
2757 2760
2758 return e_success; 2761 return e_success;
2759} 2762}
2760 2763
2761PwMerror PwMDoc::importFromGpasman(const QString *file) 2764PwMerror PwMDoc::importFromGpasman(const QString *file)
2762{ 2765{
2763 PWM_ASSERT(file); 2766 PWM_ASSERT(file);
2764 QString pw = requestMpw(false); 2767 QString pw = requestMpw(false);
2765 if (pw == "") 2768 if (pw == "")
2766 return e_noPw; 2769 return e_noPw;
2767 GpasmanFile gp; 2770 GpasmanFile gp;
2768 int ret, i; 2771 int ret, i;
2769 PwMerror ret2; 2772 PwMerror ret2;
2770 char *entry[4]; 2773 char *entry[4];
2771 PwMDataItem tmpData; 2774 PwMDataItem tmpData;
2772 ret = gp.load_init(file->latin1(), pw.latin1()); 2775 ret = gp.load_init(file->latin1(), pw.latin1());
2773 if (ret != 1) 2776 if (ret != 1)
2774 return e_accessFile; 2777 return e_accessFile;
2775 2778
2776 do { 2779 do {
2777 ret = gp.load_entry(entry); 2780 ret = gp.load_entry(entry);
2778 if(ret != 1) 2781 if(ret != 1)
2779 break; 2782 break;
2780 tmpData.desc = entry[0]; 2783 tmpData.desc = entry[0];
2781 tmpData.name = entry[1]; 2784 tmpData.name = entry[1];
2782 tmpData.pw = entry[2]; 2785 tmpData.pw = entry[2];
2783 tmpData.comment = entry[3]; 2786 tmpData.comment = entry[3];
2784 tmpData.lockStat = true; 2787 tmpData.lockStat = true;
2785 tmpData.listViewPos = -1; 2788 tmpData.listViewPos = -1;
2786 ret2 = addEntry(DEFAULT_CATEGORY, &tmpData, true); 2789 ret2 = addEntry(DEFAULT_CATEGORY, &tmpData, true);
2787 for (i = 0; i < 4; ++i) 2790 for (i = 0; i < 4; ++i)
2788 free(entry[i]); 2791 free(entry[i]);
2789 if (ret2 == e_maxAllowedEntr) { 2792 if (ret2 == e_maxAllowedEntr) {
2790 gp.load_finalize(); 2793 gp.load_finalize();
2791 return e_maxAllowedEntr; 2794 return e_maxAllowedEntr;
2792 } 2795 }
2793 } while (1); 2796 } while (1);
2794 gp.load_finalize(); 2797 gp.load_finalize();
2795 if (isDocEmpty()) 2798 if (isDocEmpty())
2796 return e_wrongPw; // we assume this. 2799 return e_wrongPw; // we assume this.
2797 2800
2798 flagDirty(); 2801 flagDirty();
2799 return e_success; 2802 return e_success;
2800} 2803}
2801 2804
2802void PwMDoc::ensureLvp() 2805void PwMDoc::ensureLvp()
2803{ 2806{
2804 if (isDocEmpty()) 2807 if (isDocEmpty())
2805 return; 2808 return;
2806 2809
2810 //US ENH BUG: when using syncronizing, this way of sorting
2811 //is not sufficient, because there might be empty spaces
2812 // at the beginning. But this algorythm only can add elements
2813 //to the end.The result are crashes because of listoverflows
2814 //we need something to fill all gaps.
2807 vector< vector<PwMDataItem>::iterator > undefined; 2815 vector< vector<PwMDataItem>::iterator > undefined;
2816 vector< vector<PwMDataItem>::iterator > sorted;
2808 vector< vector<PwMDataItem>::iterator >::iterator undefBegin, 2817 vector< vector<PwMDataItem>::iterator >::iterator undefBegin,
2809 undefEnd, 2818 undefEnd,
2810 undefI; 2819 undefI;
2820 vector< vector<PwMDataItem>::iterator >::iterator sortedBegin,
2821 sortedEnd,
2822 sortedI;
2811 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(), 2823 vector<PwMCategoryItem>::iterator catBegin = dti.dta.begin(),
2812 catEnd = dti.dta.end(), 2824 catEnd = dti.dta.end(),
2813 catI = catBegin; 2825 catI = catBegin;
2814 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 2826 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
2815 int lvpTop, tmpLvp; 2827 int lvpTop, tmpLvp;
2816 2828
2817 while (catI != catEnd) { 2829 while (catI != catEnd) {
2818 lvpTop = -1; 2830 lvpTop = -1;
2819 undefined.clear(); 2831 undefined.clear();
2820 2832
2821 entrBegin = catI->d.begin(); 2833 entrBegin = catI->d.begin();
2822 entrEnd = catI->d.end(); 2834 entrEnd = catI->d.end();
2823 entrI = entrBegin; 2835 entrI = entrBegin;
2824 2836
2825 while (entrI != entrEnd) { 2837 while (entrI != entrEnd) {
2826 tmpLvp = entrI->listViewPos; 2838 tmpLvp = entrI->listViewPos;
2827 if (tmpLvp == -1) 2839 if (tmpLvp == -1)
2828 undefined.push_back(entrI); 2840 undefined.push_back(entrI);
2829 else if (tmpLvp > lvpTop) 2841 else
2830 lvpTop = tmpLvp; 2842 sorted[tmpLvp] = entrI;
2843 //US else if (tmpLvp > lvpTop)
2844 //US lvpTop = tmpLvp;
2831 ++entrI; 2845 ++entrI;
2832 } 2846 }
2847
2848 //now we have all undefied in the collection. Now insert the existing
2849 sortedBegin = sorted.begin();
2850 sortedEnd = sorted.end();
2851 sortedI = sortedBegin;
2852
2853 while (sortedI != sortedEnd) {
2854 tmpLvp = (*sortedI)->listViewPos;
2855 undefined[tmpLvp] = *sortedI;
2856 ++sortedI;
2857 }
2858
2833 undefBegin = undefined.begin(); 2859 undefBegin = undefined.begin();
2834 undefEnd = undefined.end(); 2860 undefEnd = undefined.end();
2835 undefI = undefBegin; 2861 undefI = undefBegin;
2836 while (undefI != undefEnd) { 2862 while (undefI != undefEnd) {
2837 (*undefI)->listViewPos = ++lvpTop; 2863 (*undefI)->listViewPos = ++lvpTop;
2838 ++undefI; 2864 ++undefI;
2839 } 2865 }
2840 ++catI; 2866 ++catI;
2841 } 2867 }
2842} 2868}
2843 2869
2844QString PwMDoc::getTitle() 2870QString PwMDoc::getTitle()
2845{ 2871{
2846 /* NOTE: We have to ensure, that the returned title 2872 /* NOTE: We have to ensure, that the returned title
2847 * is unique and not reused somewhere else while 2873 * is unique and not reused somewhere else while
2848 * this document is valid (open). 2874 * this document is valid (open).
2849 */ 2875 */
2850 QString title(getFilename()); 2876 QString title(getFilename());
2877
2878 //US ENH: The whole filename on PDAs is too long. So use only the last characters
2879 if (QApplication::desktop()->width() < 640)
2880 {
2881 if (title.length() > 30)
2882 title = "..." + title.right(30);
2883
2884 }
2885
2886
2851 if (title.isEmpty()) { 2887 if (title.isEmpty()) {
2852 if (unnamedNum == 0) { 2888 if (unnamedNum == 0) {
2853 unnamedNum = PwMDocList::getNewUnnamedNumber(); 2889 unnamedNum = PwMDocList::getNewUnnamedNumber();
2854 PWM_ASSERT(unnamedNum != 0); 2890 PWM_ASSERT(unnamedNum != 0);
2855 } 2891 }
2856 title = DEFAULT_TITLE; 2892 title = DEFAULT_TITLE;
2857 title += " "; 2893 title += " ";
2858 title += tostr(unnamedNum).c_str(); 2894 title += tostr(unnamedNum).c_str();
2859 } 2895 }
2860 return title; 2896 return title;
2861} 2897}
2862 2898
2863bool PwMDoc::tryDelete() 2899bool PwMDoc::tryDelete()
2864{ 2900{
2865 if (deleted) 2901 if (deleted)
2866 return true; 2902 return true;
2867 int ret; 2903 int ret;
2868 if (isDirty()) { 2904 if (isDirty()) {
2869 ret = dirtyAskSave(getTitle()); 2905 ret = dirtyAskSave(getTitle());
2870 if (ret == 0) { // save to disk 2906 if (ret == 0) { // save to disk
2871 if (!saveDocUi(this)) 2907 if (!saveDocUi(this))
2872 goto out_ignore; 2908 goto out_ignore;
2873 } else if (ret == 1) { // don't save and delete 2909 } else if (ret == 1) { // don't save and delete
2874 goto out_accept; 2910 goto out_accept;
2875 } else { // cancel operation 2911 } else { // cancel operation
2876 goto out_ignore; 2912 goto out_ignore;
2877 } 2913 }
2878 } 2914 }
2879out_accept: 2915out_accept:
2880 deleted = true; 2916 deleted = true;
2881 delete this; 2917 delete this;
2882 return true; 2918 return true;
2883out_ignore: 2919out_ignore:
2884 return false; 2920 return false;
2885} 2921}
2886 2922
2887 2923
2888 2924
2889#ifdef PWM_EMBEDDED 2925#ifdef PWM_EMBEDDED
2890//US ENH: this is the magic function that syncronizes the this doc with the remote doc 2926//US ENH: this is the magic function that syncronizes the this doc with the remote doc
2891//US it could have been defined as static, but I did not want to. 2927//US it could have been defined as static, but I did not want to.
2892PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* syncRemote, int mode ) 2928PwMerror PwMDoc::syncronize(KSyncManager* manager, PwMDoc* syncLocal , PwMDoc* syncRemote, int mode )
2893{ 2929{
2894 int addedPasswordsLocal = 0; 2930 int addedPasswordsLocal = 0;
2895 int addedPasswordsRemote = 0; 2931 int addedPasswordsRemote = 0;
2896 int deletedPasswordsRemote = 0; 2932 int deletedPasswordsRemote = 0;
2897 int deletedPasswordsLocal = 0; 2933 int deletedPasswordsLocal = 0;
2898 int changedLocal = 0; 2934 int changedLocal = 0;
2899 int changedRemote = 0; 2935 int changedRemote = 0;
2900 2936
2901 PwMSyncItem* syncItemLocal; 2937 PwMSyncItem* syncItemLocal;
2902 PwMSyncItem* syncItemRemote; 2938 PwMSyncItem* syncItemRemote;
2903 2939
2904 QString mCurrentSyncName = manager->getCurrentSyncName(); 2940 QString mCurrentSyncName = manager->getCurrentSyncName();
2905 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 2941 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
2906 2942
2907 bool fullDateRange = false; 2943 bool fullDateRange = false;
2908 int take; 2944 int take;
2909 // local->resetTempSyncStat(); 2945 // local->resetTempSyncStat();
2910 QDateTime mLastSync = QDateTime::currentDateTime(); 2946 QDateTime mLastSync = QDateTime::currentDateTime();
2911 QDateTime modifiedSync = mLastSync; 2947 QDateTime modifiedSync = mLastSync;
2912 2948
2913 unsigned int index; 2949 unsigned int index;
2914 //Step 1. Find syncinfo in Local file and create if not existent. 2950 //Step 1. Find syncinfo in Local file and create if not existent.
2915 bool found = syncLocal->findSyncData(mCurrentSyncDevice, &index); 2951 bool found = syncLocal->findSyncData(mCurrentSyncDevice, &index);
2916 if (found == false) 2952 if (found == false)
2917 { 2953 {
2918 PwMSyncItem newSyncItemLocal; 2954 PwMSyncItem newSyncItemLocal;
2919 newSyncItemLocal.syncName = mCurrentSyncDevice; 2955 newSyncItemLocal.syncName = mCurrentSyncDevice;
2920 newSyncItemLocal.lastSyncDate = mLastSync; 2956 newSyncItemLocal.lastSyncDate = mLastSync;
2921 syncLocal->addSyncDataEntry(&newSyncItemLocal, true); 2957 syncLocal->addSyncDataEntry(&newSyncItemLocal, true);
2922 found = syncLocal->findSyncData(mCurrentSyncDevice, &index); 2958 found = syncLocal->findSyncData(mCurrentSyncDevice, &index);
2923 if (found == false) { 2959 if (found == false) {
2924 qDebug("PwMDoc::syncronize : newly created local sync data could not be found"); 2960 qDebug("PwMDoc::syncronize : newly created local sync data could not be found");
2925 return e_syncError; 2961 return e_syncError;
2926 } 2962 }
2927 } 2963 }
2928 2964
2929 syncItemLocal = syncLocal->getSyncDataEntry(index); 2965 syncItemLocal = syncLocal->getSyncDataEntry(index);
2930 qDebug("Last Sync %s ", syncItemLocal->lastSyncDate.toString().latin1()); 2966 qDebug("Last Sync Local %s ", syncItemLocal->lastSyncDate.toString().latin1());
2931 2967
2932 //Step 2. Find syncinfo in remote file and create if not existent. 2968 //Step 2. Find syncinfo in remote file and create if not existent.
2933 found = syncRemote->findSyncData(mCurrentSyncName, &index); 2969 found = syncRemote->findSyncData(mCurrentSyncName, &index);
2934 if (found == false) 2970 if (found == false)
2935 { 2971 {
2936 qDebug("FULLDATE 1"); 2972 qDebug("FULLDATE 1");
2937 fullDateRange = true; 2973 fullDateRange = true;
2938 PwMSyncItem newSyncItemRemote; 2974 PwMSyncItem newSyncItemRemote;
2939 newSyncItemRemote.syncName = mCurrentSyncName; 2975 newSyncItemRemote.syncName = mCurrentSyncName;
2940 newSyncItemRemote.lastSyncDate = mLastSync; 2976 newSyncItemRemote.lastSyncDate = mLastSync;
2941 syncRemote->addSyncDataEntry(&newSyncItemRemote, true); 2977 syncRemote->addSyncDataEntry(&newSyncItemRemote, true);
2942 found = syncRemote->findSyncData(mCurrentSyncName, &index); 2978 found = syncRemote->findSyncData(mCurrentSyncName, &index);
2943 if (found == false) { 2979 if (found == false) {
2944 qDebug("PwMDoc::syncronize : newly created remote sync data could not be found"); 2980 qDebug("PwMDoc::syncronize : newly created remote sync data could not be found");
2945 return e_syncError; 2981 return e_syncError;
2946 } 2982 }
2947 } 2983 }
2948 2984
2949 syncItemRemote = syncRemote->getSyncDataEntry(index); 2985 syncItemRemote = syncRemote->getSyncDataEntry(index);
2986 qDebug("Last Sync Remote %s ", syncItemRemote->lastSyncDate.toString().latin1());
2950 //and remove the found entry here. We will reenter it later again. 2987 //and remove the found entry here. We will reenter it later again.
2951 //US syncRemote->delSyncDataEntry(index, true); 2988 //US syncRemote->delSyncDataEntry(index, true);
2952 2989
2953 2990
2954 if ( syncItemLocal->lastSyncDate == mLastSync ) { 2991 if ( syncItemLocal->lastSyncDate == mLastSync ) {
2955 qDebug("FULLDATE 2"); 2992 qDebug("FULLDATE 2");
2956 fullDateRange = true; 2993 fullDateRange = true;
2957 } 2994 }
2958 2995
2959 if ( ! fullDateRange ) { 2996 if ( ! fullDateRange ) {
2960 if ( syncItemLocal->lastSyncDate != syncItemRemote->lastSyncDate ) { 2997 if ( syncItemLocal->lastSyncDate != syncItemRemote->lastSyncDate ) {
2961 2998
2962 // qDebug("set fulldate to true %s %s" ,addresseeLSync->dtStart().toString().latin1(), addresseeRSync->dtStart().toString().latin1() ); 2999 // qDebug("set fulldate to true %s %s" ,syncItemLocal->lastSyncDate.toString().latin1(), syncItemRemote->lastSyncDate.toString().latin1() );
2963 //qDebug("%d %d %d %d ", addresseeLSync->dtStart().time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec()); 3000 // qDebug("%d %d %d %d ", syncItemLocal->lastSyncDate.time().second(), addresseeLSync->dtStart().time().msec() , addresseeRSync->dtStart().time().second(), addresseeRSync->dtStart().time().msec());
2964 fullDateRange = true; 3001 fullDateRange = true;
2965 qDebug("FULLDATE 3 %s %s", syncItemLocal->lastSyncDate.toString().latin1() , syncItemRemote->lastSyncDate.toString().latin1() ); 3002 qDebug("FULLDATE 3 %s %s", syncItemLocal->lastSyncDate.toString().latin1() , syncItemRemote->lastSyncDate.toString().latin1() );
2966 } 3003 }
2967 } 3004 }
2968 // fullDateRange = true; // debug only! 3005 // fullDateRange = true; // debug only!
2969 if ( fullDateRange ) 3006 if ( fullDateRange )
2970 mLastSync = QDateTime::currentDateTime().addDays( -100*365); 3007 mLastSync = QDateTime::currentDateTime().addDays( -100*365);
2971 else 3008 else
2972 mLastSync = syncItemLocal->lastSyncDate; 3009 mLastSync = syncItemLocal->lastSyncDate;
2973 3010
2974 3011
2975 qDebug("*************************** "); 3012 qDebug("*************************** ");
2976 // qDebug("mLastAddressbookSync %s ",mLastAddressbookSync.toString().latin1() ); 3013 qDebug("mLastSync %s ",mLastSync.toString().latin1() );
2977 QStringList er = syncRemote->getIDEntryList(); 3014 QStringList er = syncRemote->getIDEntryList();
2978 PwMDataItem* inRemote ;//= er.first(); 3015 PwMDataItem* inRemote ;//= er.first();
2979 PwMDataItem* inLocal; 3016 PwMDataItem* inLocal;
2980 unsigned int catLocal, indexLocal; 3017 unsigned int catLocal, indexLocal;
2981 unsigned int catRemote, indexRemote; 3018 unsigned int catRemote, indexRemote;
2982 3019
2983 QString uid; 3020 QString uid;
2984 manager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count()); 3021 manager->showProgressBar(0, i18n("Syncing - close to abort!"), er.count());
2985 3022
2986 int modulo = (er.count()/10)+1; 3023 int modulo = (er.count()/10)+1;
2987 unsigned int incCounter = 0; 3024 unsigned int incCounter = 0;
2988 while ( incCounter < er.count()) { 3025 while ( incCounter < er.count()) {
2989 if (manager->isProgressBarCanceled()) 3026 if (manager->isProgressBarCanceled())
2990 return e_syncError; 3027 return e_syncError;
2991 if ( incCounter % modulo == 0 ) 3028 if ( incCounter % modulo == 0 )
2992 manager->showProgressBar(incCounter); 3029 manager->showProgressBar(incCounter);
2993 3030
2994 uid = er[ incCounter ]; 3031 uid = er[ incCounter ];
2995 qDebug("sync uid %s from remote file", uid.latin1()); 3032 qDebug("sync uid %s from remote file", uid.latin1());
2996 3033
2997 qApp->processEvents(); 3034 qApp->processEvents();
2998 3035
2999 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); 3036 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal );
3000 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote ); 3037 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote );
3001 PWM_ASSERT(inRemote); 3038 PWM_ASSERT(inRemote);
3002 if ( inLocal != 0 ) { // maybe conflict - same uid in both files 3039 if ( inLocal != 0 ) { // maybe conflict - same uid in both files
3003 if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) { 3040 if ( (take = takePwMDataItem( inLocal, inRemote, mLastSync, mode, fullDateRange) ) ) {
3004 //qDebug("take %d %s ", take, inL.summary().latin1()); 3041 qDebug("take %d %s ", take, inLocal->desc.c_str());
3005 if ( take == 3 ) 3042 if ( take == 3 )
3006 return e_syncError; 3043 return e_syncError;
3007 if ( take == 1 ) {// take local 3044 if ( take == 1 ) {// take local
3008 //US syncRemote->removeAddressee( inRemote ); 3045 //US syncRemote->removeAddressee( inRemote );
3009 (*inRemote) = (*inLocal); 3046 (*inRemote) = (*inLocal);
3010 //US syncRemote->insertAddressee( inRemote , false); 3047 //US syncRemote->insertAddressee( inRemote , false);
3011 ++changedRemote; 3048 ++changedRemote;
3012 } else { // take == 2 take remote 3049 } else { // take == 2 take remote
3013 //US syncLocal->removeAddressee( inLocal ); 3050 //US syncLocal->removeAddressee( inLocal );
3014 (*inLocal) = (*inRemote); 3051 (*inLocal) = (*inRemote);
3015 //US syncLocal->insertAddressee( inLocal , false ); 3052 //US syncLocal->insertAddressee( inLocal , false );
3016 ++changedLocal; 3053 ++changedLocal;
3017 } 3054 }
3018 } 3055 }
3019 } else { // no conflict 3056 } else { // no conflict
3020 if ( inRemote->meta.update > mLastSync || mode == 5 ) { 3057 if ( inRemote->meta.update > mLastSync || mode == 5 ) {
3021 inRemote->meta.update = modifiedSync; 3058 inRemote->meta.update = modifiedSync;
3022 3059
3023 //first check if we have a matching category in the local file 3060 //first check if we have a matching category in the local file
3024 const string* remotecat = syncRemote->getCategory(catRemote); 3061 const string* remotecat = syncRemote->getCategory(catRemote);
3025 //US syncRemote->insertAddressee( inRemote, false ); 3062 //US syncRemote->insertAddressee( inRemote, false );
3026 //US syncLocal->insertAddressee( inRemote, false ); 3063 //US syncLocal->insertAddressee( inRemote, false );
3027 syncLocal->addEntry(remotecat->c_str(), inRemote, true, false); 3064 syncLocal->addEntry(remotecat->c_str(), inRemote, true, false);
3028 3065
3029 ++addedPasswordsLocal; 3066 ++addedPasswordsLocal;
3030 } else { 3067 } else {
3031 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR); 3068 // pending checkExternSyncAddressee(addresseeRSyncSharp, inR);
3032 syncRemote->delEntry(catRemote, indexRemote, true); 3069 syncRemote->delEntry(catRemote, indexRemote, true);
3033 //USsyncRemote->removeAddressee( inRemote ); 3070 //USsyncRemote->removeAddressee( inRemote );
3034 ++deletedPasswordsRemote; 3071 ++deletedPasswordsRemote;
3035 } 3072 }
3036 } 3073 }
3037 3074
3038 ++incCounter; 3075 ++incCounter;
3039 } 3076 }
3040 3077
3041 3078
3042 er.clear(); 3079 er.clear();
3043 QStringList el = syncLocal->getIDEntryList(); 3080 QStringList el = syncLocal->getIDEntryList();
3044 modulo = (el.count()/10)+1; 3081 modulo = (el.count()/10)+1;
3045 3082
3046 manager->showProgressBar(0, i18n("Add / remove addressees"), el.count()); 3083 manager->showProgressBar(0, i18n("Add / remove addressees"), el.count());
3047 incCounter = 0; 3084 incCounter = 0;
3048 while ( incCounter < el.count()) { 3085 while ( incCounter < el.count()) {
3049 qApp->processEvents(); 3086 qApp->processEvents();
3050 if (manager->isProgressBarCanceled()) 3087 if (manager->isProgressBarCanceled())
3051 return e_syncError; 3088 return e_syncError;
3052 if ( incCounter % modulo == 0 ) 3089 if ( incCounter % modulo == 0 )
3053 manager->showProgressBar(incCounter); 3090 manager->showProgressBar(incCounter);
3054 uid = el[ incCounter ]; 3091 uid = el[ incCounter ];
3092 qDebug("sync uid %s from local file", uid.latin1());
3055 3093
3056 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal ); 3094 inLocal = syncLocal->findEntryByID( uid, &catLocal, &indexLocal );
3057 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote ); 3095 inRemote = syncRemote->findEntryByID( uid, &catRemote, &indexRemote );
3058 PWM_ASSERT(inLocal); 3096 PWM_ASSERT(inLocal);
3059 3097
3060 if ( inRemote == 0 ) { 3098 if ( inRemote == 0 ) {
3061 if ( inLocal->meta.update < mLastSync && mode != 4 ) { 3099 if ( inLocal->meta.update < mLastSync && mode != 4 ) {
3062 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL); 3100 // pending checkExternSyncAddressee(addresseeLSyncSharp, inL);
3063 syncLocal->delEntry(catLocal, indexLocal, true); 3101 syncLocal->delEntry(catLocal, indexLocal, true);
3064 //USsyncLocal->removeAddressee( inLocal ); 3102 //USsyncLocal->removeAddressee( inLocal );
3065 ++deletedPasswordsLocal; 3103 ++deletedPasswordsLocal;
3066 } else { 3104 } else {
3067 if ( ! manager->mWriteBackExistingOnly ) { 3105 if ( ! manager->mWriteBackExistingOnly ) {
3068 ++addedPasswordsRemote; 3106 ++addedPasswordsRemote;
3069 inLocal->meta.update = modifiedSync; 3107 inLocal->meta.update = modifiedSync;
3070 3108
3071 //first check if we have a matching category in the remote file 3109 //first check if we have a matching category in the remote file
3072 const string* localcat = syncLocal->getCategory(catLocal); 3110 const string* localcat = syncLocal->getCategory(catLocal);
3073 3111
3074 //USsyncLocal->insertAddressee( inLocal, false ); 3112 //USsyncLocal->insertAddressee( inLocal, false );
3075 PwMDataItem newEntry; 3113 PwMDataItem newEntry;
3076 newEntry = *inLocal; 3114 newEntry = *inLocal;
3077 inRemote = &newEntry; 3115 inRemote = &newEntry;
3078 3116
3079 //USsyncRemote->insertAddressee( inRemote, false ); 3117 //USsyncRemote->insertAddressee( inRemote, false );
3080 syncRemote->addEntry(localcat->c_str(), inRemote, true, false); 3118 syncRemote->addEntry(localcat->c_str(), inRemote, true, false);
3081 3119
3082 } 3120 }
3083 } 3121 }
3084 3122
3085 } 3123 }
3086 ++incCounter; 3124 ++incCounter;
3087 } 3125 }
3088 el.clear(); 3126 el.clear();
3089 manager->hideProgressBar(); 3127 manager->hideProgressBar();
3090 3128
3091 // Now write the info back into the sync data space of the files 3129 // Now write the info back into the sync data space of the files
3092 3130
3093 mLastSync = QDateTime::currentDateTime().addSecs( 1 ); 3131 mLastSync = QDateTime::currentDateTime().addSecs( 1 );
3094 // get rid of micro seconds 3132 // get rid of micro seconds
3095 QTime t = mLastSync.time(); 3133 QTime t = mLastSync.time();
3096 mLastSync.setTime( QTime (t.hour (), t.minute (), t.second () ) ); 3134 mLastSync.setTime( QTime (t.hour (), t.minute (), t.second () ) );
3097 3135
3098 3136
3099 syncItemLocal->lastSyncDate = mLastSync; 3137 syncItemLocal->lastSyncDate = mLastSync;
3100 syncItemRemote->lastSyncDate = mLastSync; 3138 syncItemRemote->lastSyncDate = mLastSync;
3101 3139
3102 // addresseeRSync.setRole( i18n("!Remote from: ")+mCurrentSyncName ) ; 3140 // addresseeRSync.setRole( i18n("!Remote from: ")+mCurrentSyncName ) ;
3103 // addresseeLSync.setRole(i18n("!Local from: ") + mCurrentSyncName ); 3141 // addresseeLSync.setRole(i18n("!Local from: ") + mCurrentSyncName );
3104 3142
3105 //US syncRemote->addSyncDataEntry( syncItemRemote, false ); 3143 //US syncRemote->addSyncDataEntry( syncItemRemote, false );
3106 //US syncLocal->addSyncDataEntry( syncItemLocal, false ); 3144 //US syncLocal->addSyncDataEntry( syncItemLocal, false );
3107 QString mes; 3145 QString mes;
3108 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 ); 3146 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 );
3109 if ( manager->mShowSyncSummary ) { 3147 if ( manager->mShowSyncSummary ) {
3110 KMessageBox::information(0, mes, i18n("PWM/Pi Synchronization") ); 3148 KMessageBox::information(0, mes, i18n("PWM/Pi Synchronization") );
3111 } 3149 }
3112 qDebug( mes ); 3150 qDebug( mes );
3113 return e_success; 3151 return e_success;
3114} 3152}
3115 3153
3116 3154
3117int PwMDoc::takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime lastSync, int mode , bool full ) 3155int PwMDoc::takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime lastSync, int mode , bool full )
3118{ 3156{
3119 // 0 equal 3157 // 0 equal
3120 // 1 take local 3158 // 1 take local
3121 // 2 take remote 3159 // 2 take remote
3122 // 3 cancel 3160 // 3 cancel
3123 QDateTime localMod = local->meta.update; 3161 QDateTime localMod = local->meta.update;
3124 QDateTime remoteMod = remote->meta.update; 3162 QDateTime remoteMod = remote->meta.update;
3125 3163
3126 //US QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice(); 3164 //US QString mCurrentSyncDevice = syncManager->getCurrentSyncDevice();
3127 3165
3128 if ( localMod == remoteMod ) 3166 if ( localMod == remoteMod )
3129 return 0; 3167 return 0;
3130 3168
3131 qDebug(" %d %d conflict on %s %s ", mode, full, local->desc.c_str(), remote->desc.c_str() ); 3169 qDebug(" %d %d conflict on %s %s ", mode, full, local->desc.c_str(), remote->desc.c_str() );
3132 3170
3133 //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , localMod, remote->lastModified().toString().latin1(), remoteMod); 3171 //qDebug("%s %d %s %d", local->lastModified().toString().latin1() , localMod, remote->lastModified().toString().latin1(), remoteMod);
3134 //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() ); 3172 //qDebug("%d %d %d %d ", local->lastModified().time().second(), local->lastModified().time().msec(), remote->lastModified().time().second(), remote->lastModified().time().msec() );
3135 //full = true; //debug only 3173 full = true; //debug only
3136 if ( full ) { 3174 if ( full ) {
3137 bool equ = true;//US ( (*local) == (*remote) ); 3175 bool equ = ( (*local) == (*remote) );
3138 if ( equ ) { 3176 if ( equ ) {
3139 //qDebug("equal "); 3177 qDebug("equal ");
3140 if ( mode < SYNC_PREF_FORCE_LOCAL ) 3178 if ( mode < SYNC_PREF_FORCE_LOCAL )
3141 return 0; 3179 return 0;
3142 3180
3143 }//else //debug only 3181 }else //debug only
3144 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); 3182 qDebug("not equal %s %s ", local->desc.c_str(), remote->desc.c_str());
3145 } 3183 }
3146 3184
3147 int result; 3185 int result;
3148 bool localIsNew; 3186 bool localIsNew;
3149 //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() ); 3187 //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() );
3150 3188
3151 if ( full && mode < SYNC_PREF_NEWEST ) 3189 if ( full && mode < SYNC_PREF_NEWEST )
3152 mode = SYNC_PREF_ASK; 3190 mode = SYNC_PREF_ASK;
3153 3191
3154 switch( mode ) { 3192 switch( mode ) {
3155 case SYNC_PREF_LOCAL: 3193 case SYNC_PREF_LOCAL:
3156 if ( lastSync > remoteMod ) 3194 if ( lastSync > remoteMod )
3157 return 1; 3195 return 1;
3158 if ( lastSync > localMod ) 3196 if ( lastSync > localMod )
3159 return 2; 3197 return 2;
3160 return 1; 3198 return 1;
3161 break; 3199 break;
3162 case SYNC_PREF_REMOTE: 3200 case SYNC_PREF_REMOTE:
3163 if ( lastSync > remoteMod ) 3201 if ( lastSync > remoteMod )
3164 return 1; 3202 return 1;
3165 if ( lastSync > localMod ) 3203 if ( lastSync > localMod )
3166 return 2; 3204 return 2;
3167 return 2; 3205 return 2;
3168 break; 3206 break;
3169 case SYNC_PREF_NEWEST: 3207 case SYNC_PREF_NEWEST:
3170 if ( localMod > remoteMod ) 3208 if ( localMod > remoteMod )
3171 return 1; 3209 return 1;
3172 else 3210 else
3173 return 2; 3211 return 2;
3174 break; 3212 break;
3175 case SYNC_PREF_ASK: 3213 case SYNC_PREF_ASK:
3176 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); 3214 //qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() );
3177 if ( lastSync > remoteMod ) 3215 if ( lastSync > remoteMod )
3178 return 1; 3216 return 1;
3179 if ( lastSync > localMod ) 3217 if ( lastSync > localMod )
3180 return 2; 3218 return 2;
3181 localIsNew = localMod >= remoteMod; 3219 localIsNew = localMod >= remoteMod;
3182 //qDebug("conflict! ************************************** "); 3220 //qDebug("conflict! ************************************** ");
3183 { 3221 {
3184 PwMDataItemChooser acd ( *local,*remote, localIsNew , 0/*this*/ ); 3222 PwMDataItemChooser acd ( *local,*remote, localIsNew , 0/*this*/ );
3185 result = acd.executeD(localIsNew); 3223 result = acd.executeD(localIsNew);
3186 return result; 3224 return result;
3187 } 3225 }
3188 break; 3226 break;
3189 case SYNC_PREF_FORCE_LOCAL: 3227 case SYNC_PREF_FORCE_LOCAL:
3190 return 1; 3228 return 1;
3191 break; 3229 break;
3192 case SYNC_PREF_FORCE_REMOTE: 3230 case SYNC_PREF_FORCE_REMOTE:
3193 return 2; 3231 return 2;
3194 break; 3232 break;
3195 3233
3196 default: 3234 default:
3197 // SYNC_PREF_TAKE_BOTH not implemented 3235 // SYNC_PREF_TAKE_BOTH not implemented
3198 break; 3236 break;
3199 } 3237 }
3200 return 0; 3238 return 0;
3201} 3239}
3202 3240
3203 3241
3204 3242
3205 3243
3206//this are the overwritten callbackmethods from the syncinterface 3244//this are the overwritten callbackmethods from the syncinterface
3207bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode) 3245bool PwMDoc::sync(KSyncManager* manager, QString filename, int mode)
3208{ 3246{
3209 QString mCurrentSyncDevice = manager->getCurrentSyncDevice(); 3247 QString mCurrentSyncDevice = manager->getCurrentSyncDevice();
3210 3248
3211 //1) unlock local file first if necessary (ask for password) 3249 //1) unlock local file first if necessary (ask for password)
3212 if (this->isDeepLocked()) { 3250 if (this->isDeepLocked()) {
3213 PwMerror ret = this->deepLock(false); 3251 PwMerror ret = this->deepLock(false);
3214 if (ret != e_success) 3252 if (ret != e_success)
3215 return false; 3253 return false;
3216 } 3254 }
3217 3255
3218 //2) construct and open a new doc on the stack(automatic cleanup) for remote file. 3256 //2) construct and open a new doc on the stack(automatic cleanup of remote file).
3219 PwMDoc syncTarget(this, "synctarget"); 3257 PwMDoc syncTarget(this, "synctarget");
3220 PwMDoc* pSyncTarget = &syncTarget; 3258 PwMDoc* pSyncTarget = &syncTarget;
3221 3259
3222 3260
3223 PwMerror err = pSyncTarget->openDoc(&filename, 1 /*== open with all entries locked*/); 3261 PwMerror err = pSyncTarget->openDoc(&filename, 1 /*== open with all entries locked*/);
3224 3262
3225 if (err == e_alreadyOpen) { 3263 if (err == e_alreadyOpen) {
3226 PwMDocList::listItem li; 3264 PwMDocList::listItem li;
3227 if (getOpenDocList()->find(filename.latin1(), &li)) 3265 if (getOpenDocList()->find(filename.latin1(), &li))
3228 pSyncTarget = li.doc; 3266 pSyncTarget = li.doc;
3229 else { 3267 else {
3230 qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1()); 3268 qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1());
3231 return false; 3269 return false;
3232 } 3270 }
3233 } 3271 }
3234 else if (err != e_success) { 3272 else if (err != e_success) {
3235 qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1()); 3273 qDebug("PwmDoc::sync: sync failed. Error %i while opening file %s",err, filename.latin1());
3236 return false; 3274 return false;
3237 } 3275 }
3238 3276
3239 qDebug("PWM file loaded %s,sync mode %d",filename.latin1(), mode ); 3277 qDebug("PWM file loaded %s,sync mode %d",filename.latin1(), mode );
3240 3278
3241 3279
3242 //3) unlock remote file first if necessary (ask for password) 3280 //3) unlock remote file first if necessary (ask for password)
3243 if (pSyncTarget->isDeepLocked()) { 3281 if (pSyncTarget->isDeepLocked()) {
3244 PwMerror ret = pSyncTarget->deepLock(false); 3282 PwMerror ret = pSyncTarget->deepLock(false);
3245 if (ret != e_success) 3283 if (ret != e_success)
3246 return false; 3284 return false;
3247 } 3285 }
3248 3286
3249 3287
3250 err = syncronize(manager, this, pSyncTarget, mode ); 3288 err = syncronize(manager, this, pSyncTarget, mode );
3251 3289
3252 if (err == e_success) { 3290 if (err == e_success) {
3253 if ( manager->mWriteBackFile ){ 3291 if ( manager->mWriteBackFile ){
3254 qDebug("Saving remote PWManager file"); 3292 qDebug("Saving remote PWManager file");
3255 err = pSyncTarget->saveDoc(conf()->confGlobCompression()); 3293 err = pSyncTarget->saveDoc(conf()->confGlobCompression());
3256 if (err != e_success) { 3294 if (err != e_success) {
3257 qDebug("PwmDoc::sync: Sync failed. Error %i while storing file %s",err, filename.latin1()); 3295 qDebug("PwmDoc::sync: Sync failed. Error %i while storing file %s",err, filename.latin1());
3258 return false; 3296 return false;
3259 } 3297 }
3260 } 3298 }
3261 3299
3262 flagDirty(); 3300 flagDirty();
3263 return true; 3301 return true;
3264 } 3302 }
3265 else { 3303 else {
3266 return false; 3304 return false;
3267 } 3305 }
3268} 3306}
3269 3307
3270//called by the syncmanager to indicate that the work has to marked as dirty.
3271void PwMDoc::sync_setModified()
3272{
3273 flagDirty();
3274}
3275
3276//called by the syncmanager to ask if the dirty flag is set.
3277bool PwMDoc::sync_isModified()
3278{
3279 return isDirty();
3280}
3281
3282//called by the syncmanager to indicate that the work has to be saved.
3283void PwMDoc::sync_save()
3284{
3285 saveDoc(conf()->confGlobCompression());
3286}
3287#endif 3308#endif
3288 3309
3289 3310
3290bool PwMDoc::findSyncData(const QString &syncname, unsigned int *index) 3311bool PwMDoc::findSyncData(const QString &syncname, unsigned int *index)
3291{ 3312{
3292 vector<PwMSyncItem>::iterator i = dti.syncDta.begin(), 3313 vector<PwMSyncItem>::iterator i = dti.syncDta.begin(),
3293 end = dti.syncDta.end(); 3314 end = dti.syncDta.end();
3294 3315
3295 while (i != end) { 3316 while (i != end) {
3296 if ((*i).syncName == syncname.latin1()) { 3317 if ((*i).syncName == syncname.latin1()) {
3297 if (index) { 3318 if (index) {
3298 *index = i - dti.syncDta.begin(); 3319 *index = i - dti.syncDta.begin();
3299 } 3320 }
3300 return true; 3321 return true;
3301 } 3322 }
3302 ++i; 3323 ++i;
3303 } 3324 }
3304 return false; 3325 return false;
3305}; 3326};
3306 3327
3307/** add new syncdataentry */ 3328/** add new syncdataentry */
3308PwMerror PwMDoc::addSyncDataEntry(PwMSyncItem *d, bool dontFlagDirty) 3329PwMerror PwMDoc::addSyncDataEntry(PwMSyncItem *d, bool dontFlagDirty)
3309{ 3330{
3310 PWM_ASSERT(d); 3331 PWM_ASSERT(d);
3311 3332
3312 if (isDeepLocked()) { 3333 if (isDeepLocked()) {
3313 PwMerror ret; 3334 PwMerror ret;
3314 ret = deepLock(false); 3335 ret = deepLock(false);
3315 if (ret != e_success) 3336 if (ret != e_success)
3316 return e_lock; 3337 return e_lock;
3317 } 3338 }
3318 unsigned int index; 3339 unsigned int index;
3319 3340
3320 const QString tmp = d->syncName.c_str(); 3341 const QString tmp = d->syncName.c_str();
3321 bool exists = findSyncData(d->syncName.c_str(), &index); 3342 bool exists = findSyncData(d->syncName.c_str(), &index);
3322 3343
3323 if (exists == true) { 3344 if (exists == true) {
3324 // DOH! We found this entry. 3345 // DOH! We found this entry.
3325 return e_entryExists; 3346 return e_entryExists;
3326 } 3347 }
3327 3348
3328 dti.syncDta.push_back(*d); 3349 dti.syncDta.push_back(*d);
3329 3350
3330 if (!dontFlagDirty) 3351 if (!dontFlagDirty)
3331 flagDirty(); 3352 flagDirty();
3332 return e_success; 3353 return e_success;
3333} 3354}
3334 3355
3335 3356
3336 3357
3337/** delete syncdata entry */ 3358/** delete syncdata entry */
3338bool PwMDoc::delSyncDataEntry(unsigned int index, bool dontFlagDirty) 3359bool PwMDoc::delSyncDataEntry(unsigned int index, bool dontFlagDirty)
3339{ 3360{
3340 if (isDeepLocked()) 3361 if (isDeepLocked())
3341 return false; 3362 return false;
3342 if (index > dti.syncDta.size() - 1) 3363 if (index > dti.syncDta.size() - 1)
3343 return false; 3364 return false;
3344 3365
3345 // delete entry 3366 // delete entry
3346 dti.syncDta.erase(dti.syncDta.begin() + index); 3367 dti.syncDta.erase(dti.syncDta.begin() + index);
3347 3368
3348 if (!dontFlagDirty) 3369 if (!dontFlagDirty)
3349 flagDirty(); 3370 flagDirty();
3350 return true; 3371 return true;
3351} 3372}
3352 3373
3353 3374
3354PwMDataItem* PwMDoc::findEntryByID(const QString &uid, unsigned int *category, unsigned int *index) 3375PwMDataItem* PwMDoc::findEntryByID(const QString &uid, unsigned int *category, unsigned int *index)
3355{ 3376{
3356 vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(), 3377 vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(),
3357 catend = dti.dta.end(); 3378 catend = dti.dta.end();
3358 3379
3359 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 3380 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
3360 3381
3361 while (catcounter != catend) { 3382 while (catcounter != catend) {
3362 entrBegin = catcounter->d.begin(); 3383 entrBegin = catcounter->d.begin();
3363 entrEnd = catcounter->d.end(); 3384 entrEnd = catcounter->d.end();
3364 entrI = entrBegin; 3385 entrI = entrBegin;
3365 while (entrI != entrEnd) { 3386 while (entrI != entrEnd) {
3366 if ((*entrI).meta.uniqueid == uid.latin1()) { 3387 if ((*entrI).meta.uniqueid == uid.latin1()) {
3367 if (category) 3388 if (category)
3368 *category = catcounter - dti.dta.begin(); 3389 *category = catcounter - dti.dta.begin();
3369 if (index) 3390 if (index)
3370 *index = entrI - entrBegin; 3391 *index = entrI - entrBegin;
3371 3392
3372 return &(*entrI); 3393 return &(*entrI);
3373 } 3394 }
3374 ++entrI; 3395 ++entrI;
3375 } 3396 }
3376 ++catcounter; 3397 ++catcounter;
3377 } 3398 }
3378 3399
3379 return 0; 3400 return 0;
3380} 3401}
3381 3402
3382QStringList PwMDoc::getIDEntryList() 3403QStringList PwMDoc::getIDEntryList()
3383{ 3404{
3384 QStringList results; 3405 QStringList results;
3385 3406
3386 vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(), 3407 vector<PwMCategoryItem>::iterator catcounter = dti.dta.begin(),
3387 catend = dti.dta.end(); 3408 catend = dti.dta.end();
3388 3409
3389 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 3410 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
3390 3411
3391 while (catcounter != catend) { 3412 while (catcounter != catend) {
3392 entrBegin = catcounter->d.begin(); 3413 entrBegin = catcounter->d.begin();
3393 entrEnd = catcounter->d.end(); 3414 entrEnd = catcounter->d.end();
3394 entrI = entrBegin; 3415 entrI = entrBegin;
3395 while (entrI != entrEnd) { 3416 while (entrI != entrEnd) {
3396 results.append( (*entrI).meta.uniqueid.c_str() ); 3417 results.append( (*entrI).meta.uniqueid.c_str() );
3397 ++entrI; 3418 ++entrI;
3398 } 3419 }
3399 ++catcounter; 3420 ++catcounter;
3400 } 3421 }
3401 3422
3402 return results; 3423 return results;
3403} 3424}
3404 3425
3405 3426
3406 3427
3407 3428
3408 3429
3409#ifndef PWM_EMBEDDED 3430#ifndef PWM_EMBEDDED
3410#include "pwmdoc.moc" 3431#include "pwmdoc.moc"
3411#endif 3432#endif
diff --git a/pwmanager/pwmanager/pwmdoc.h b/pwmanager/pwmanager/pwmdoc.h
index 2e9547e..6a1dd30 100644
--- a/pwmanager/pwmanager/pwmdoc.h
+++ b/pwmanager/pwmanager/pwmdoc.h
@@ -5,355 +5,361 @@
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 2.0 of pwmanager 14 * This file is originaly based on version 2.0 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
18 **************************************************************************/ 18 **************************************************************************/
19 19
20#ifndef __PWMDOC_H 20#ifndef __PWMDOC_H
21#define __PWMDOC_H 21#define __PWMDOC_H
22 22
23 #define PWM_FILE_VER (static_cast<char>(0x05)) 23 #define PWM_FILE_VER (static_cast<char>(0x05))
24 24
25 #define PWM_HASH_SHA1 (static_cast<char>(0x01)) 25 #define PWM_HASH_SHA1 (static_cast<char>(0x01))
26 #define PWM_HASH_SHA256 (static_cast<char>(0x02)) 26 #define PWM_HASH_SHA256 (static_cast<char>(0x02))
27 #define PWM_HASH_SHA384 (static_cast<char>(0x03)) 27 #define PWM_HASH_SHA384 (static_cast<char>(0x03))
28 #define PWM_HASH_SHA512 (static_cast<char>(0x04)) 28 #define PWM_HASH_SHA512 (static_cast<char>(0x04))
29 #define PWM_HASH_MD5 (static_cast<char>(0x05)) 29 #define PWM_HASH_MD5 (static_cast<char>(0x05))
30 #define PWM_HASH_RMD160 (static_cast<char>(0x06)) 30 #define PWM_HASH_RMD160 (static_cast<char>(0x06))
31 #define PWM_HASH_TIGER (static_cast<char>(0x07)) 31 #define PWM_HASH_TIGER (static_cast<char>(0x07))
32 32
33 #define PWM_CRYPT_BLOWFISH(static_cast<char>(0x01)) 33 #define PWM_CRYPT_BLOWFISH(static_cast<char>(0x01))
34 #define PWM_CRYPT_AES128(static_cast<char>(0x02)) 34 #define PWM_CRYPT_AES128(static_cast<char>(0x02))
35 #define PWM_CRYPT_AES192(static_cast<char>(0x03)) 35 #define PWM_CRYPT_AES192(static_cast<char>(0x03))
36 #define PWM_CRYPT_AES256(static_cast<char>(0x04)) 36 #define PWM_CRYPT_AES256(static_cast<char>(0x04))
37 #define PWM_CRYPT_3DES (static_cast<char>(0x05)) 37 #define PWM_CRYPT_3DES (static_cast<char>(0x05))
38 #define PWM_CRYPT_TWOFISH(static_cast<char>(0x06)) 38 #define PWM_CRYPT_TWOFISH(static_cast<char>(0x06))
39 #define PWM_CRYPT_TWOFISH128(static_cast<char>(0x07)) 39 #define PWM_CRYPT_TWOFISH128(static_cast<char>(0x07))
40 40
41 #define PWM_COMPRESS_NONE(static_cast<char>(0x00)) 41 #define PWM_COMPRESS_NONE(static_cast<char>(0x00))
42 #define PWM_COMPRESS_GZIP(static_cast<char>(0x01)) 42 #define PWM_COMPRESS_GZIP(static_cast<char>(0x01))
43 #define PWM_COMPRESS_BZIP2(static_cast<char>(0x02)) 43 #define PWM_COMPRESS_BZIP2(static_cast<char>(0x02))
44 44
45 #define DEFAULT_MAX_ENTRIES(~(static_cast<unsigned int>(0))) 45 #define DEFAULT_MAX_ENTRIES(~(static_cast<unsigned int>(0)))
46 #define FILE_ID_HEADER "PWM_PASSWORD_FILE" 46 #define FILE_ID_HEADER "PWM_PASSWORD_FILE"
47 47
48 48
49#include "pwmexception.h" 49#include "pwmexception.h"
50#include "pwmdocui.h" 50#include "pwmdocui.h"
51 51
52#include <qobject.h> 52#include <qobject.h>
53#include <qtimer.h> 53#include <qtimer.h>
54#include <qdatetime.h> 54#include <qdatetime.h>
55 55
56#include <kprocess.h> 56#include <kprocess.h>
57 57
58#ifndef PWM_EMBEDDED 58#ifndef PWM_EMBEDDED
59#include "configuration.h" 59#include "configuration.h"
60#else 60#else
61#include <kapplication.h> 61#include <kapplication.h>
62#include <ksyncmanager.h> 62#include <ksyncmanager.h>
63#endif 63#endif
64 64
65#include <string> 65#include <string>
66#include <vector> 66#include <vector>
67#include <utility> 67#include <utility>
68 68
69using std::vector; 69using std::vector;
70using std::string; 70using std::string;
71using std::pair; 71using std::pair;
72 72
73/* used in findEntry() function */ 73/* used in findEntry() function */
74 #define SEARCH_IN_DESC (1) 74 #define SEARCH_IN_DESC (1)
75 #define SEARCH_IN_NAME (1 << 1) 75 #define SEARCH_IN_NAME (1 << 1)
76 #define SEARCH_IN_PW (1 << 2) 76 #define SEARCH_IN_PW (1 << 2)
77 #define SEARCH_IN_COMMENT(1 << 3) 77 #define SEARCH_IN_COMMENT(1 << 3)
78 #define SEARCH_IN_URL (1 << 4) 78 #define SEARCH_IN_URL (1 << 4)
79 #define SEARCH_IN_LAUNCHER(1 << 5) 79 #define SEARCH_IN_LAUNCHER(1 << 5)
80 #define SEARCH_IN_ALL (SEARCH_IN_DESC | SEARCH_IN_NAME| \ 80 #define SEARCH_IN_ALL (SEARCH_IN_DESC | SEARCH_IN_NAME| \
81 SEARCH_IN_PW | SEARCH_IN_COMMENT| \ 81 SEARCH_IN_PW | SEARCH_IN_COMMENT| \
82 SEARCH_IN_URL| SEARCH_IN_LAUNCHER) 82 SEARCH_IN_URL| SEARCH_IN_LAUNCHER)
83 83
84/** document deeplocked. Data is out for lunch to disk */ 84/** document deeplocked. Data is out for lunch to disk */
85 #define DOC_STAT_DEEPLOCKED (1) 85 #define DOC_STAT_DEEPLOCKED (1)
86/** encrypted document on disk is dirty. data has to go to disk. */ 86/** encrypted document on disk is dirty. data has to go to disk. */
87 #define DOC_STAT_DISK_DIRTY (1 << 1) 87 #define DOC_STAT_DISK_DIRTY (1 << 1)
88/** we are using a chipcard to encrypt the data */ 88/** we are using a chipcard to encrypt the data */
89 #define DOC_STAT_USE_CHIPCARD (1 << 2) 89 #define DOC_STAT_USE_CHIPCARD (1 << 2)
90/** use "currentPw" to unlock. (This flag is set/unset by a timer) */ 90/** use "currentPw" to unlock. (This flag is set/unset by a timer) */
91 #define DOC_STAT_UNLOCK_WITHOUT_PW(1 << 3) 91 #define DOC_STAT_UNLOCK_WITHOUT_PW(1 << 3)
92 92
93class PwMDoc; 93class PwMDoc;
94class PwMView; 94class PwMView;
95class QFile; 95class QFile;
96 96
97/* meta data for a PwMDataItem */ 97/* meta data for a PwMDataItem */
98struct PwMMetaData 98struct PwMMetaData
99{ 99{
100 PwMMetaData() 100 PwMMetaData()
101 : updateInt (0) 101 : updateInt (0)
102 { } 102 { }
103 /** creation date of the PwMDataItem to which 103 /** creation date of the PwMDataItem to which
104 * this meta data belongs. 104 * this meta data belongs.
105 */ 105 */
106 QDateTimecreate; 106 QDateTimecreate;
107 /** becomes valid on this date */ 107 /** becomes valid on this date */
108 QDateTimevalid; 108 QDateTimevalid;
109 /** expire date */ 109 /** expire date */
110 QDateTimeexpire; 110 QDateTimeexpire;
111 /** update date (last updated at this date) */ 111 /** update date (last updated at this date) */
112 QDateTimeupdate; 112 QDateTimeupdate;
113 /** update interval (in minutes). Time since the 113 /** update interval (in minutes). Time since the
114 * last update to remind the user to update the item. 114 * last update to remind the user to update the item.
115 * 0 disables. 115 * 0 disables.
116 */ 116 */
117 unsigned long updateInt; 117 unsigned long updateInt;
118 118
119 //US ENH: enhancements of the filestructure 119 //US ENH: enhancements of the filestructure
120 /* each entry gets a unique id assigned */ 120 /* each entry gets a unique id assigned */
121 string uniqueid; 121 string uniqueid;
122 122
123 123
124 void clear() 124 void clear()
125 { 125 {
126 create = QDateTime(); 126 create = QDateTime();
127 expire = QDateTime(); 127 expire = QDateTime();
128 update = QDateTime(); 128 update = QDateTime();
129 updateInt = 0; 129 updateInt = 0;
130 uniqueid = KApplication::randomString(8); 130 uniqueid = KApplication::randomString(8);
131 } 131 }
132 132
133 PwMMetaData& operator = (const PwMMetaData& x)
134 {
135 create = x.create;
136 expire = x.expire;
137 update = x.update;
138 updateInt = x.updateInt;
139 uniqueid = x.uniqueid;
140 return *this;
141 }
142
143 inline bool isValid() const 133 inline bool isValid() const
144 { 134 {
145 if (valid.isNull()) 135 if (valid.isNull())
146 return true; 136 return true;
147 return (valid < QDateTime::currentDateTime()); 137 return (valid < QDateTime::currentDateTime());
148 } 138 }
149 inline bool isExpired() const 139 inline bool isExpired() const
150 { 140 {
151 if (expire.isNull()) 141 if (expire.isNull())
152 return false; 142 return false;
153 return (expire < QDateTime::currentDateTime()); 143 return (expire < QDateTime::currentDateTime());
154 } 144 }
155 inline bool isUpdateIntOver() const 145 inline bool isUpdateIntOver() const
156 { 146 {
157 if (updateInt == 0 || 147 if (updateInt == 0 ||
158 update.isNull()) 148 update.isNull())
159 return false; 149 return false;
160 QDateTime d(update); 150 QDateTime d(update);
161 return (d.addSecs(updateInt * 60) < QDateTime::currentDateTime()); 151 return (d.addSecs(updateInt * 60) < QDateTime::currentDateTime());
162 } 152 }
163}; 153};
164 154
165struct PwMDataItem 155struct PwMDataItem
166{ 156{
167 PwMDataItem() 157 PwMDataItem()
168 : lockStat (true) 158 : lockStat (true)
169 , listViewPos (-1) 159 , listViewPos (-1)
170 , binary (false) 160 , binary (false)
171 , rev (0) 161 , rev (0)
172 { } 162 { }
173 163
174 /** password description */ 164 /** password description */
175 stringdesc; 165 stringdesc;
176 /** user-name */ 166 /** user-name */
177 stringname; 167 stringname;
178 /** the password itself */ 168 /** the password itself */
179 stringpw; 169 stringpw;
180 /** some comment */ 170 /** some comment */
181 stringcomment; 171 stringcomment;
182 /** an URL string */ 172 /** an URL string */
183 stringurl; 173 stringurl;
184 /** launcher. Can be executed as a system() command */ 174 /** launcher. Can be executed as a system() command */
185 stringlauncher; 175 stringlauncher;
186 /** locking status. If locked (true), pw is not emitted through getEntry() */ 176 /** locking status. If locked (true), pw is not emitted through getEntry() */
187 boollockStat; 177 boollockStat;
188 /** position of this item in main "list-view" 178 /** position of this item in main "list-view"
189 * If -1, the position is not yet specified and should be appended to the list 179 * If -1, the position is not yet specified and should be appended to the list
190 */ 180 */
191 intlistViewPos; 181 intlistViewPos;
192 /** does this entry contain binary data? */ 182 /** does this entry contain binary data? */
193 bool binary; 183 bool binary;
194 /** meta data for this data item. */ 184 /** meta data for this data item. */
195 PwMMetaData meta; 185 PwMMetaData meta;
196 /** data revision counter. This counter can be used 186 /** data revision counter. This counter can be used
197 * to easily, efficiently determine if this data item 187 * to easily, efficiently determine if this data item
198 * has changed since some time. 188 * has changed since some time.
199 * This counter is incremented on every update. 189 * This counter is incremented on every update.
200 */ 190 */
201 unsigned int rev; 191 unsigned int rev;
202 192
203 void clear(bool clearMeta = true) 193 void clear(bool clearMeta = true)
204 { 194 {
205 /* NOTE: Don't use .clear() here to be 195 /* NOTE: Don't use .clear() here to be
206 * backward compatible with gcc-2 (Debian Woody) 196 * backward compatible with gcc-2 (Debian Woody)
207 */ 197 */
208 desc = ""; 198 desc = "";
209 name = ""; 199 name = "";
210 pw = ""; 200 pw = "";
211 comment = ""; 201 comment = "";
212 url = ""; 202 url = "";
213 launcher = ""; 203 launcher = "";
214 lockStat = true; 204 lockStat = true;
215 listViewPos = -1; 205 listViewPos = -1;
216 binary = false; 206 binary = false;
217 if (clearMeta) 207 if (clearMeta)
218 meta.clear(); 208 meta.clear();
219 } 209 }
220 210 //US ENH: we need this operator to compare two items if we have no unique ids
211 //available. Generaly this happens before the first sync
212 bool PwMDataItem::operator==( const PwMDataItem &a ) const
213 {
214 qDebug("oper==%s", a.desc.c_str());
215 if ( desc != a.desc ) return false;
216 if ( name != a.name ) return false;
217 if ( pw != a.pw ) return false;
218 if ( comment != a.comment ) return false;
219 if ( url != a.url ) return false;
220 if ( launcher != a.launcher ) return false;
221 //all other field will not be checked.
222 return true;
223 }
224
225 //US ENH:this operator is used to copy an elements data during syncronization
226 //Attention: listViewPos will not be copied. So the position will stay the same.
221 PwMDataItem& operator = (const PwMDataItem& x) 227 PwMDataItem& operator = (const PwMDataItem& x)
222 { 228 {
223 qDebug("oper=%s", x.desc.c_str()); 229 // qDebug("oper=%s", x.desc.c_str());
224 desc = x.desc; 230 desc = x.desc;
225 name = x.name; 231 name = x.name;
226 pw = x.pw; 232 pw = x.pw;
227 comment = x.comment; 233 comment = x.comment;
228 url = x.url; 234 url = x.url;
229 launcher = x.launcher; 235 launcher = x.launcher;
230 lockStat = x.lockStat; 236 lockStat = x.lockStat;
231 listViewPos = x.listViewPos; 237 //Do not copy listViewPos!!! listViewPos = x.listViewPos;
232 binary = x.binary; 238 binary = x.binary;
233 meta = x.meta; 239 meta = x.meta;
234 rev = x.rev; 240 rev = x.rev;
235 return *this; 241 return *this;
236 } 242 }
237 243
238}; 244};
239 245
240struct PwMCategoryItem 246struct PwMCategoryItem
241{ 247{
242 /** all PwMDataItems (all passwords) within this category */ 248 /** all PwMDataItems (all passwords) within this category */
243 vector<PwMDataItem>d; 249 vector<PwMDataItem>d;
244 /** category name/description */ 250 /** category name/description */
245 string name; 251 string name;
246 252
247 void clear() 253 void clear()
248 { 254 {
249 d.clear(); 255 d.clear();
250 name = ""; 256 name = "";
251 } 257 }
252}; 258};
253 259
254struct PwMSyncItem 260struct PwMSyncItem
255{ 261{
256 string syncName; 262 string syncName;
257 QDateTime lastSyncDate; 263 QDateTime lastSyncDate;
258 264
259 void clear() 265 void clear()
260 { 266 {
261 lastSyncDate = QDateTime(); 267 lastSyncDate = QDateTime();
262 syncName = ""; 268 syncName = "";
263 } 269 }
264}; 270};
265 271
266struct PwMItem 272struct PwMItem
267{ 273{
268 vector<PwMCategoryItem> dta; 274 vector<PwMCategoryItem> dta;
269 vector<PwMSyncItem> syncDta; 275 vector<PwMSyncItem> syncDta;
270 276
271 void clear() 277 void clear()
272 { 278 {
273 dta.clear(); 279 dta.clear();
274 syncDta.clear(); 280 syncDta.clear();
275 } 281 }
276}; 282};
277 283
278 284
279/** "Function Object" for sort()ing PwMDataItem::listViewPos */ 285/** "Function Object" for sort()ing PwMDataItem::listViewPos */
280class dta_lvp_greater 286class dta_lvp_greater
281{ 287{
282public: 288public:
283 bool operator() (const pair<unsigned int, unsigned int> &d1, 289 bool operator() (const pair<unsigned int, unsigned int> &d1,
284 const pair<unsigned int, unsigned int> &d2) 290 const pair<unsigned int, unsigned int> &d2)
285 { 291 {
286 return d1.second > d2.second; 292 return d1.second > d2.second;
287 } 293 }
288}; 294};
289 295
290/** list of PwMDoc documents and it's IDs */ 296/** list of PwMDoc documents and it's IDs */
291class PwMDocList 297class PwMDocList
292{ 298{
293public: 299public:
294 struct listItem 300 struct listItem
295 { 301 {
296 /** document filename (known as ID, here) */ 302 /** document filename (known as ID, here) */
297 string docId; 303 string docId;
298 /** pointer to the document class */ 304 /** pointer to the document class */
299 PwMDoc *doc; 305 PwMDoc *doc;
300 }; 306 };
301 307
302 PwMDocList() {} 308 PwMDocList() {}
303 309
304 /** add a new item to the list */ 310 /** add a new item to the list */
305 void add(PwMDoc *doc, const string &id); 311 void add(PwMDoc *doc, const string &id);
306 /** changes the contents of an existing item */ 312 /** changes the contents of an existing item */
307 void edit(PwMDoc *doc, const string &newId); 313 void edit(PwMDoc *doc, const string &newId);
308 /** remove the given item */ 314 /** remove the given item */
309 void del(PwMDoc *doc); 315 void del(PwMDoc *doc);
310 /** get the item at index */ 316 /** get the item at index */
311 listItem getAt(int index) 317 listItem getAt(int index)
312 { return docList[index]; } 318 { return docList[index]; }
313 /** find an entry with this id */ 319 /** find an entry with this id */
314 bool find(const string &id, listItem *ret = 0); 320 bool find(const string &id, listItem *ret = 0);
315 /** returns a copy of the list */ 321 /** returns a copy of the list */
316 const vector<listItem>* getList() const 322 const vector<listItem>* getList() const
317 { return &docList; } 323 { return &docList; }
318 324
319 325
320 /** returns a new unique number to extend the name of 326 /** returns a new unique number to extend the name of
321 * an unnamed document. 327 * an unnamed document.
322 */ 328 */
323 static unsigned int getNewUnnamedNumber() 329 static unsigned int getNewUnnamedNumber()
324 { return unnamedDocCnt++; } 330 { return unnamedDocCnt++; }
325 331
326protected: 332protected:
327 /* Hm, I think we shouldn't really use a "list" here, should we? 333 /* Hm, I think we shouldn't really use a "list" here, should we?
328 * So I decided to actually use a vector. 334 * So I decided to actually use a vector.
329 */ 335 */
330 vector<listItem> docList; 336 vector<listItem> docList;
331 /** This value is used to get a new number for yet unnamed 337 /** This value is used to get a new number for yet unnamed
332 * documents. It is incremented on every request. So it's 338 * documents. It is incremented on every request. So it's
333 * theoretically possible to overflow it, but... :) 339 * theoretically possible to overflow it, but... :)
334 */ 340 */
335 static unsigned int unnamedDocCnt; 341 static unsigned int unnamedDocCnt;
336}; 342};
337 343
338/** implements timers for the document */ 344/** implements timers for the document */
339class DocTimer : public QObject 345class DocTimer : public QObject
340{ 346{
341 Q_OBJECT 347 Q_OBJECT
342public: 348public:
343 enum TimerIDs 349 enum TimerIDs
344 { 350 {
345 id_mpwTimer, 351 id_mpwTimer,
346 id_autoLockTimer, 352 id_autoLockTimer,
347 id_metaCheckTimer 353 id_metaCheckTimer
348 }; 354 };
349 355
350public: 356public:
351 DocTimer(PwMDoc *_doc); 357 DocTimer(PwMDoc *_doc);
352 ~DocTimer(); 358 ~DocTimer();
353 359
354 /** start the timer */ 360 /** start the timer */
355 void start(TimerIDs timer); 361 void start(TimerIDs timer);
356 /** stop the timer */ 362 /** stop the timer */
357 void stop(TimerIDs timer); 363 void stop(TimerIDs timer);
358 /** get the lock for a timer. 364 /** get the lock for a timer.
359 * This lock is a recursive lock. When a lock is 365 * This lock is a recursive lock. When a lock is
@@ -649,158 +655,151 @@ signals:
649 void dataChanged(PwMDoc *document); 655 void dataChanged(PwMDoc *document);
650 /** the document class is going to close. This signal may be 656 /** the document class is going to close. This signal may be
651 * used to nofify all views, that the user closed the document, 657 * used to nofify all views, that the user closed the document,
652 * so the views can go down, too. 658 * so the views can go down, too.
653 */ 659 */
654 void docClosed(PwMDoc *document); 660 void docClosed(PwMDoc *document);
655 /** somebody just opened the document */ 661 /** somebody just opened the document */
656 void docOpened(PwMDoc *document); 662 void docOpened(PwMDoc *document);
657 /** this document object just got created */ 663 /** this document object just got created */
658 void docCreated(PwMDoc *document); 664 void docCreated(PwMDoc *document);
659 665
660public: 666public:
661 /** emit the dataChanged signal after checking for a lock */ 667 /** emit the dataChanged signal after checking for a lock */
662 void emitDataChanged(PwMDoc *document) 668 void emitDataChanged(PwMDoc *document)
663 { 669 {
664 if (!dataChangedLock) 670 if (!dataChangedLock)
665 emit dataChanged(document); 671 emit dataChanged(document);
666 } 672 }
667 673
668protected: 674protected:
669 /** current file for this doc */ 675 /** current file for this doc */
670 QString filename; 676 QString filename;
671//US ENH: we need a place where we keep the syncentries. So I invented 677//US ENH: we need a place where we keep the syncentries. So I invented
672// struct PwMItem, that has a vector of PwMCategoryItem and vector of PwMSyncItem 678// struct PwMItem, that has a vector of PwMCategoryItem and vector of PwMSyncItem
673 /** holds all data */ 679 /** holds all data */
674 PwMItem dti; 680 PwMItem dti;
675 /** maximum number of entries */ 681 /** maximum number of entries */
676 unsigned int maxEntries; 682 unsigned int maxEntries;
677 /** currently used password to encrypt data */ 683 /** currently used password to encrypt data */
678 QString currentPw; 684 QString currentPw;
679 /** current global document status flags */ 685 /** current global document status flags */
680 unsigned int curDocStat; 686 unsigned int curDocStat;
681 /** browser process for goToURL() */ 687 /** browser process for goToURL() */
682 KProcess browserProc; 688 KProcess browserProc;
683 /** pointer to the list-view, using this document. 689 /** pointer to the list-view, using this document.
684 * As there can only be one list-view per doc, we 690 * As there can only be one list-view per doc, we
685 * don't need a list here. 691 * don't need a list here.
686 */ 692 */
687 PwMView *listView; 693 PwMView *listView;
688 /** unnamedNum is used to store the "unnamed counter" 694 /** unnamedNum is used to store the "unnamed counter"
689 * for this document, while it's unnamed. If it's 0, 695 * for this document, while it's unnamed. If it's 0,
690 * we have to get a new unique one. 696 * we have to get a new unique one.
691 */ 697 */
692 unsigned int unnamedNum; 698 unsigned int unnamedNum;
693 /** is this doc going to be deleted (executing in destructor context) */ 699 /** is this doc going to be deleted (executing in destructor context) */
694 bool deleted; 700 bool deleted;
695 /** document timer */ 701 /** document timer */
696 DocTimer *_timer; 702 DocTimer *_timer;
697 /** lock counter for the "dataChanged" signal */ 703 /** lock counter for the "dataChanged" signal */
698 unsigned int dataChangedLock; 704 unsigned int dataChangedLock;
699 705
700 /** list of all open documents */ 706 /** list of all open documents */
701 static PwMDocList openDocList; 707 static PwMDocList openDocList;
702 708
703protected: 709protected:
704 /** serialize "dta" and return it in "d". */ 710 /** serialize "dta" and return it in "d". */
705 bool serializeDta(string *d); 711 bool serializeDta(string *d);
706 /** de-serialize "d" and overwrite "dta" */ 712 /** de-serialize "d" and overwrite "dta" */
707 bool deSerializeDta(const string *d, bool entriesLocked); 713 bool deSerializeDta(const string *d, bool entriesLocked);
708 /** write header to file */ 714 /** write header to file */
709 PwMerror writeFileHeader(char keyHash, char dataHash, char crypt, char compress, 715 PwMerror writeFileHeader(char keyHash, char dataHash, char crypt, char compress,
710 QString *pw, QFile *f); 716 QString *pw, QFile *f);
711 /** write data-hash to file */ 717 /** write data-hash to file */
712 PwMerror writeDataHash(char dataHash, string *d, QFile *f); 718 PwMerror writeDataHash(char dataHash, string *d, QFile *f);
713 /** check header. Read header info and verify key-hash and filever. 719 /** check header. Read header info and verify key-hash and filever.
714 * returns length of header in "headerLength" */ 720 * returns length of header in "headerLength" */
715 PwMerror checkHeader(char *cryptAlgo, QString *pw, char *compress, 721 PwMerror checkHeader(char *cryptAlgo, QString *pw, char *compress,
716 unsigned int *headerLength, char *dataHashType, 722 unsigned int *headerLength, char *dataHashType,
717 string *dataHash, QFile *f); 723 string *dataHash, QFile *f);
718 /** check the data-hash */ 724 /** check the data-hash */
719 PwMerror checkDataHash(char dataHashType, const string *dataHash, const string *dataStream); 725 PwMerror checkDataHash(char dataHashType, const string *dataHash, const string *dataStream);
720 /** encrypt data "d" and write to "filename" */ 726 /** encrypt data "d" and write to "filename" */
721 PwMerror encrypt(string *d, const QString *pw, QFile *f, char algo); 727 PwMerror encrypt(string *d, const QString *pw, QFile *f, char algo);
722 /** read data from file beginning at "pos", decrypt and return it */ 728 /** read data from file beginning at "pos", decrypt and return it */
723 PwMerror decrypt(string *d, unsigned int pos, const QString *pw, char algo, QFile *f); 729 PwMerror decrypt(string *d, unsigned int pos, const QString *pw, char algo, QFile *f);
724 /** compress the data */ 730 /** compress the data */
725 bool compressDta(string *d, char algo); 731 bool compressDta(string *d, char algo);
726 /** uncompress the data */ 732 /** uncompress the data */
727 bool decompressDta(string *d, char algo); 733 bool decompressDta(string *d, char algo);
728 /** internal import function for a text-file generated by PwM. 734 /** internal import function for a text-file generated by PwM.
729 * If this is not a valid PwM-exported file, it returns e_fileFormat */ 735 * If this is not a valid PwM-exported file, it returns e_fileFormat */
730 PwMerror importText_PwM(const QString *file); 736 PwMerror importText_PwM(const QString *file);
731 /** PwM-text-import helper function to extract the name/pw/comment out 737 /** PwM-text-import helper function to extract the name/pw/comment out
732 * of one entry-line */ 738 * of one entry-line */
733 bool textExtractEntry_PwM(const char *in, ssize_t in_size, string *out); 739 bool textExtractEntry_PwM(const char *in, ssize_t in_size, string *out);
734 /** compare two strings */ 740 /** compare two strings */
735 bool compareString(const string &s1, const string &s2, bool caseSensitive, 741 bool compareString(const string &s1, const string &s2, bool caseSensitive,
736 bool exactWordMatch); 742 bool exactWordMatch);
737 /** clears all document-data */ 743 /** clears all document-data */
738 void clearDoc(); 744 void clearDoc();
739 /** delete all empty categories */ 745 /** delete all empty categories */
740 void delAllEmptyCat(bool dontFlagDirty); 746 void delAllEmptyCat(bool dontFlagDirty);
741 /** set a document status flag */ 747 /** set a document status flag */
742 void setDocStatFlag(unsigned int statFlag) 748 void setDocStatFlag(unsigned int statFlag)
743 { curDocStat |= statFlag; } 749 { curDocStat |= statFlag; }
744 /** unset a document status flag */ 750 /** unset a document status flag */
745 void unsetDocStatFlag(unsigned int statFlag) 751 void unsetDocStatFlag(unsigned int statFlag)
746 { curDocStat &= ~statFlag; } 752 { curDocStat &= ~statFlag; }
747 /** get a document status flag */ 753 /** get a document status flag */
748 bool getDocStatFlag(unsigned int statFlag) const 754 bool getDocStatFlag(unsigned int statFlag) const
749 { return (curDocStat & statFlag); } 755 { return (curDocStat & statFlag); }
750 /** set the "currentPassword" */ 756 /** set the "currentPassword" */
751 void setCurrentPw(const QString &pw) 757 void setCurrentPw(const QString &pw)
752 { 758 {
753 currentPw = pw; 759 currentPw = pw;
754 setDocStatFlag(DOC_STAT_DISK_DIRTY); 760 setDocStatFlag(DOC_STAT_DISK_DIRTY);
755 } 761 }
756 /** make a backup-copy of the given file */ 762 /** make a backup-copy of the given file */
757 bool backupFile(const QString &filePath); 763 bool backupFile(const QString &filePath);
758 /** copy a file from src to dst */ 764 /** copy a file from src to dst */
759 bool copyFile(const QString &src, const QString &dst); 765 bool copyFile(const QString &src, const QString &dst);
760 766
761 767
762 public: 768 public:
763#ifdef PWM_EMBEDDED 769#ifdef PWM_EMBEDDED
764 //US ENH: this is the magic function that syncronizes the local doc with the remote doc. 770 //US ENH: this is the magic function that syncronizes the local doc with the remote doc.
765 PwMerror syncronize(KSyncManager* manager, PwMDoc* syncLocal, PwMDoc* syncRemote, int mode ); 771 PwMerror syncronize(KSyncManager* manager, PwMDoc* syncLocal, PwMDoc* syncRemote, int mode );
766 772
767 //takePwMDataItem returns the following values 773 //takePwMDataItem returns the following values
768 // 0 equal 774 // 0 equal
769 // 1 take local 775 // 1 take local
770 // 2 take remote 776 // 2 take remote
771 // 3 cancel 777 // 3 cancel
772 int takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime lastSync, int mode , bool full ); 778 int takePwMDataItem( PwMDataItem* local, PwMDataItem* remote, QDateTime lastSync, int mode , bool full );
773 779
774 //the following methods are the overwritten callbackmethods from the syncinterface 780 //the following methods are the overwritten callbackmethods from the syncinterface
775 virtual bool sync(KSyncManager* manager, QString filename, int mode); 781 virtual bool sync(KSyncManager* manager, QString filename, int mode);
776 782
777 //called by the syncmanager to indicate that the work has to be marked as dirty.
778 virtual void sync_setModified();
779 //called by the syncmanager to ask if the dirty flag is set.
780 virtual bool sync_isModified();
781 //called by the syncmanager to indicate that the work has to be saved.
782 virtual void sync_save();
783
784#endif 783#endif
785 private: 784 private:
786 //US ENH: helpermethods to access the sync data for a certain syncname. 785 //US ENH: helpermethods to access the sync data for a certain syncname.
787 // It returns the syncdatas index 786 // It returns the syncdatas index
788 bool findSyncData(const QString &syncname, unsigned int *index); 787 bool findSyncData(const QString &syncname, unsigned int *index);
789 788
790 /** add new syncdataentry */ 789 /** add new syncdataentry */
791 PwMerror addSyncDataEntry(PwMSyncItem *d, bool dontFlagDirty = false); 790 PwMerror addSyncDataEntry(PwMSyncItem *d, bool dontFlagDirty = false);
792 791
793 /** returns a pointer to the syncdata */ 792 /** returns a pointer to the syncdata */
794 PwMSyncItem* getSyncDataEntry(unsigned int index) 793 PwMSyncItem* getSyncDataEntry(unsigned int index)
795 { return &(dti.syncDta[index]); } 794 { return &(dti.syncDta[index]); }
796 795
797 /** delete entry */ 796 /** delete entry */
798 bool delSyncDataEntry(unsigned int index, bool dontFlagDirty = false); 797 bool delSyncDataEntry(unsigned int index, bool dontFlagDirty = false);
799 798
800 PwMDataItem* findEntryByID(const QString &uid, unsigned int *category, unsigned int *index); 799 PwMDataItem* findEntryByID(const QString &uid, unsigned int *category, unsigned int *index);
801 800
802 QStringList getIDEntryList(); 801 QStringList getIDEntryList();
803 802
804}; 803};
805 804
806#endif 805#endif
diff --git a/pwmanager/pwmanager/pwmview.cpp b/pwmanager/pwmanager/pwmview.cpp
index e23ce25..e53124f 100644
--- a/pwmanager/pwmanager/pwmview.cpp
+++ b/pwmanager/pwmanager/pwmview.cpp
@@ -331,194 +331,274 @@ void PwMView::reorgLp()
331 continue; 331 continue;
332 } 332 }
333 /* We assert that it's a binary entry, now. 333 /* We assert that it's a binary entry, now.
334 * No chance to efficiently verify it here. 334 * No chance to efficiently verify it here.
335 */ 335 */
336 } 336 }
337 doc->setListViewPos(curCat, foundPos[0], cnt - i - 1); 337 doc->setListViewPos(curCat, foundPos[0], cnt - i - 1);
338 } 338 }
339} 339}
340 340
341void PwMView::selAt(int index) 341void PwMView::selAt(int index)
342{ 342{
343 QListViewItem *item = lv->itemAtIndex(index); 343 QListViewItem *item = lv->itemAtIndex(index);
344 if (!item) 344 if (!item)
345 return; 345 return;
346 lv->setCurrentItem(item); 346 lv->setCurrentItem(item);
347 lv->ensureItemVisible(item); 347 lv->ensureItemVisible(item);
348} 348}
349 349
350void PwMView::renCatButton_slot() 350void PwMView::renCatButton_slot()
351{ 351{
352 if (doc->isDeepLocked()) 352 if (doc->isDeepLocked())
353 return; 353 return;
354 RenCatWnd wnd(this); 354 RenCatWnd wnd(this);
355 if (wnd.exec() == 1) { 355 if (wnd.exec() == 1) {
356 QString newName(wnd.getNewName()); 356 QString newName(wnd.getNewName());
357 if (newName == "") 357 if (newName == "")
358 return; 358 return;
359 document()->renameCategory(getCurrentCategory(), 359 document()->renameCategory(getCurrentCategory(),
360 newName); 360 newName);
361 } 361 }
362} 362}
363 363
364void PwMView::delCatButton_slot() 364void PwMView::delCatButton_slot()
365{ 365{
366 if (doc->isDeepLocked()) 366 if (doc->isDeepLocked())
367 return; 367 return;
368 if (numCategories() <= 1) { 368 if (numCategories() <= 1) {
369 mainClass->showStatMsg(i18n("Can't remove the last category.")); 369 mainClass->showStatMsg(i18n("Can't remove the last category."));
370 return; 370 return;
371 } 371 }
372 if (KMessageBox::questionYesNo(this, 372 if (KMessageBox::questionYesNo(this,
373 i18n("Do you really want to\n" 373 i18n("Do you really want to\n"
374 "delete the selected\n" 374 "delete the selected\n"
375 "category? All password-\n" 375 "category? All password-\n"
376 "entries will be lost in\n" 376 "entries will be lost in\n"
377 "this category!\n"), 377 "this category!\n"),
378 i18n("Delete category?")) 378 i18n("Delete category?"))
379 == KMessageBox::No) { 379 == KMessageBox::No) {
380 return; 380 return;
381 } 381 }
382 document()->delCategory(getCurrentCategory()); 382 document()->delCategory(getCurrentCategory());
383} 383}
384 384
385void PwMView::copyPwToClip() 385void PwMView::copyPwToClip()
386{ 386{
387 if (doc->isDeepLocked()) 387 if (doc->isDeepLocked())
388 return; 388 return;
389 unsigned int curIndex = 0; 389 unsigned int curIndex = 0;
390 if (!getCurEntryIndex(&curIndex)) 390 if (!getCurEntryIndex(&curIndex))
391 return; 391 return;
392 PwMDataItem d; 392 PwMDataItem d;
393 document()->getDataChangedLock(); 393 document()->getDataChangedLock();
394 document()->getEntry(getCurrentCategory(), curIndex, &d, true); 394 document()->getEntry(getCurrentCategory(), curIndex, &d, true);
395 document()->putDataChangedLock(); 395 document()->putDataChangedLock();
396 PwM::copyToClipboard(d.pw.c_str()); 396 PwM::copyToClipboard(d.pw.c_str());
397} 397}
398 398
399void PwMView::copyNameToClip() 399void PwMView::copyNameToClip()
400{ 400{
401 if (doc->isDeepLocked()) 401 if (doc->isDeepLocked())
402 return; 402 return;
403 unsigned int curIndex = 0; 403 unsigned int curIndex = 0;
404 if (!getCurEntryIndex(&curIndex)) 404 if (!getCurEntryIndex(&curIndex))
405 return; 405 return;
406 PwMDataItem d; 406 PwMDataItem d;
407 document()->getEntry(getCurrentCategory(), curIndex, &d); 407 document()->getEntry(getCurrentCategory(), curIndex, &d);
408 PwM::copyToClipboard(d.name.c_str()); 408 PwM::copyToClipboard(d.name.c_str());
409} 409}
410 410
411void PwMView::copyDescToClip() 411void PwMView::copyDescToClip()
412{ 412{
413 if (doc->isDeepLocked()) 413 if (doc->isDeepLocked())
414 return; 414 return;
415 unsigned int curIndex = 0; 415 unsigned int curIndex = 0;
416 if (!getCurEntryIndex(&curIndex)) 416 if (!getCurEntryIndex(&curIndex))
417 return; 417 return;
418 PwMDataItem d; 418 PwMDataItem d;
419 document()->getEntry(getCurrentCategory(), curIndex, &d); 419 document()->getEntry(getCurrentCategory(), curIndex, &d);
420 PwM::copyToClipboard(d.desc.c_str()); 420 PwM::copyToClipboard(d.desc.c_str());
421} 421}
422 422
423void PwMView::copyUrlToClip() 423void PwMView::copyUrlToClip()
424{ 424{
425 if (doc->isDeepLocked()) 425 if (doc->isDeepLocked())
426 return; 426 return;
427 unsigned int curIndex = 0; 427 unsigned int curIndex = 0;
428 if (!getCurEntryIndex(&curIndex)) 428 if (!getCurEntryIndex(&curIndex))
429 return; 429 return;
430 PwMDataItem d; 430 PwMDataItem d;
431 document()->getEntry(getCurrentCategory(), curIndex, &d); 431 document()->getEntry(getCurrentCategory(), curIndex, &d);
432 PwM::copyToClipboard(d.url.c_str()); 432 PwM::copyToClipboard(d.url.c_str());
433} 433}
434 434
435void PwMView::copyLauncherToClip() 435void PwMView::copyLauncherToClip()
436{ 436{
437 if (doc->isDeepLocked()) 437 if (doc->isDeepLocked())
438 return; 438 return;
439 unsigned int curIndex = 0; 439 unsigned int curIndex = 0;
440 if (!getCurEntryIndex(&curIndex)) 440 if (!getCurEntryIndex(&curIndex))
441 return; 441 return;
442 PwMDataItem d; 442 PwMDataItem d;
443 document()->getEntry(getCurrentCategory(), curIndex, &d); 443 document()->getEntry(getCurrentCategory(), curIndex, &d);
444 PwM::copyToClipboard(d.launcher.c_str()); 444 PwM::copyToClipboard(d.launcher.c_str());
445} 445}
446 446
447void PwMView::copyCommentToClip() 447void PwMView::copyCommentToClip()
448{ 448{
449 if (doc->isDeepLocked()) 449 if (doc->isDeepLocked())
450 return; 450 return;
451 unsigned int curIndex = 0; 451 unsigned int curIndex = 0;
452 if (!getCurEntryIndex(&curIndex)) 452 if (!getCurEntryIndex(&curIndex))
453 return; 453 return;
454 PwMDataItem d; 454 PwMDataItem d;
455 document()->getEntry(getCurrentCategory(), curIndex, &d); 455 document()->getEntry(getCurrentCategory(), curIndex, &d);
456 PwM::copyToClipboard(d.comment.c_str()); 456 PwM::copyToClipboard(d.comment.c_str());
457} 457}
458 458
459/************************************************************************
460 *
461 *
462 *
463 ************************************************************************/
464
465
466PwMDataItemView::PwMDataItemView( QWidget *parent, const char *name )
467 : QTextBrowser( parent, name )
468
469
470{
471//US setWrapPolicy( QTextEdit::AtWordBoundary );
472 setLinkUnderline( false );
473 // setVScrollBarMode( QScrollView::AlwaysOff );
474 //setHScrollBarMode( QScrollView::AlwaysOff );
475
476//US QStyleSheet *sheet = styleSheet();
477//US QStyleSheetItem *link = sheet->item( "a" );
478//US link->setColor( KGlobalSettings::linkColor() );
479
480}
481
482void PwMDataItemView::setPwMDataItem( const PwMDataItem& a )
483
484{
485 mItem = a;
486 // clear view
487 setText( QString::null );
488
489
490 QString dynamicPart;
491 QString format = "<tr><td align=\"right\"><b>%1</b></td>"
492 "<td align=\"left\">%2</td></tr>";
493
494 dynamicPart += format
495 .arg( i18n("Description") )
496 .arg( mItem.desc.c_str() );
459 497
498 dynamicPart += format
499 .arg( i18n("Name") )
500 .arg( mItem.name.c_str() );
501
502 dynamicPart += format
503 .arg( i18n("Password") )
504 .arg( mItem.pw.c_str() );
505
506 QString comment(mItem.pw.c_str());
507 dynamicPart += format
508 .arg( i18n("Comment") )
509 .arg( comment.replace( QRegExp("\n"), "<br>" ) );
510
511 dynamicPart += format
512 .arg( i18n("URL") )
513 .arg( mItem.url.c_str() );
514
515 dynamicPart += format
516 .arg( i18n("Launcher") )
517 .arg( mItem.launcher.c_str() );
518
519 QString mText = "<table><td colspan=\"2\">&nbsp;</td>";
520
521 mText += dynamicPart;
522 mText += "</table>";
523
524 // at last display it...
525 setText( mText );
526
527}
528
529PwMDataItem PwMDataItemView::pwmdataitem() const
530{
531 return mItem;
532}
533
534/************************************************************************
535 *
536 *
537 *
538 ************************************************************************/
460 539
461 540
462PwMDataItemChooser::PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool takeloc, QWidget *parent, const char *name ) : KDialogBase(parent,name, 541PwMDataItemChooser::PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool takeloc, QWidget *parent, const char *name )
463 true ,i18n("Conflict! Please choose Entry!"),Ok|User1|Close,Close, false) 542 : KDialogBase(parent, name, true ,
543 i18n("Conflict! Please choose Entry!"),Ok|User1|Close,Close, false)
464{ 544{
465 findButton( Close )->setText( i18n("Cancel Sync")); 545 findButton( Close )->setText( i18n("Cancel Sync"));
466 findButton( Ok )->setText( i18n("Remote")); 546 findButton( Ok )->setText( i18n("Remote"));
467 findButton( User1 )->setText( i18n("Local")); 547 findButton( User1 )->setText( i18n("Local"));
468 QWidget* topframe = new QWidget( this ); 548 QWidget* topframe = new QWidget( this );
469 setMainWidget( topframe ); 549 setMainWidget( topframe );
470 QBoxLayout* bl; 550 QBoxLayout* bl;
471 if ( QApplication::desktop()->width() < 640 ) { 551 if ( QApplication::desktop()->width() < 640 ) {
472 bl = new QVBoxLayout( topframe ); 552 bl = new QVBoxLayout( topframe );
473 } else { 553 } else {
474 bl = new QHBoxLayout( topframe ); 554 bl = new QHBoxLayout( topframe );
475 } 555 }
476 QVBox* subframe = new QVBox( topframe ); 556 QVBox* subframe = new QVBox( topframe );
477 bl->addWidget(subframe ); 557 bl->addWidget(subframe );
478 QLabel* lab = new QLabel( i18n("Local Entry"), subframe ); 558 QLabel* lab = new QLabel( i18n("Local Entry"), subframe );
479 if ( takeloc ) 559 if ( takeloc )
480 lab->setBackgroundColor(Qt::green.light() ); 560 lab->setBackgroundColor(Qt::green.light() );
481 // AddresseeView * av = new AddresseeView( subframe ); 561 PwMDataItemView * av = new PwMDataItemView( subframe );
482 // av->setAddressee( loc ); 562 av->setPwMDataItem( loc );
483 subframe = new QVBox( topframe ); 563 subframe = new QVBox( topframe );
484 bl->addWidget(subframe ); 564 bl->addWidget(subframe );
485 lab = new QLabel( i18n("Remote Entry"), subframe ); 565 lab = new QLabel( i18n("Remote Entry"), subframe );
486 if ( !takeloc ) 566 if ( !takeloc )
487 lab->setBackgroundColor(Qt::green.light() ); 567 lab->setBackgroundColor(Qt::green.light() );
488 // av = new AddresseeView( subframe ); 568 av = new PwMDataItemView( subframe );
489 // av->setAddressee( rem ); 569 av->setPwMDataItem( rem );
490 QObject::connect(findButton( Ok ),SIGNAL(clicked()),this, SLOT(slot_remote())); 570 QObject::connect(findButton( Ok ),SIGNAL(clicked()),this, SLOT(slot_remote()));
491 QObject::connect(this,SIGNAL(user1Clicked()),this, SLOT(slot_local())); 571 QObject::connect(this,SIGNAL(user1Clicked()),this, SLOT(slot_local()));
492#ifndef DESKTOP_VERSION 572#ifndef DESKTOP_VERSION
493 showMaximized(); 573 showMaximized();
494#else 574#else
495 resize ( 640, 400 ); 575 resize ( 640, 400 );
496#endif 576#endif
497} 577}
498 578
499int PwMDataItemChooser::executeD( bool local ) 579int PwMDataItemChooser::executeD( bool local )
500{ 580{
501 mSyncResult = 3; 581 mSyncResult = 3;
502 if ( local ) 582 if ( local )
503 findButton( User1 )->setFocus(); 583 findButton( User1 )->setFocus();
504 else 584 else
505 findButton( Ok )->setFocus(); 585 findButton( Ok )->setFocus();
506 exec(); 586 exec();
507 return mSyncResult; 587 return mSyncResult;
508} 588}
509void PwMDataItemChooser::slot_remote() 589void PwMDataItemChooser::slot_remote()
510{ 590{
511 mSyncResult = 2; 591 mSyncResult = 2;
512 accept(); 592 accept();
513} 593}
514void PwMDataItemChooser::slot_local() 594void PwMDataItemChooser::slot_local()
515{ 595{
516 mSyncResult = 1; 596 mSyncResult = 1;
517 accept(); 597 accept();
518} 598}
519 599
520 600
521 601
522#ifndef PWM_EMBEDDED 602#ifndef PWM_EMBEDDED
523#include "pwmview.moc" 603#include "pwmview.moc"
524#endif 604#endif
diff --git a/pwmanager/pwmanager/pwmview.h b/pwmanager/pwmanager/pwmview.h
index 75cce51..e42b17a 100644
--- a/pwmanager/pwmanager/pwmview.h
+++ b/pwmanager/pwmanager/pwmview.h
@@ -1,172 +1,197 @@
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 PWMVIEW_H 20#ifndef PWMVIEW_H
21#define PWMVIEW_H 21#define PWMVIEW_H
22 22
23//US ENH: wouldn't it be a good idea if we could use this consts everywhere else. 23//US ENH: wouldn't it be a good idea if we could use this consts everywhere else.
24//US ENH: for examle in listviewpwm.cpp 24//US ENH: for examle in listviewpwm.cpp
25//US ENH: Because of that I transfer them into the headerfile. 25//US ENH: Because of that I transfer them into the headerfile.
26 #define COLUMN_DESC 0 26 #define COLUMN_DESC 0
27 #define COLUMN_NAME 1 27 #define COLUMN_NAME 1
28 #define COLUMN_PW 2 28 #define COLUMN_PW 2
29 #define COLUMN_URL 3 29 #define COLUMN_URL 3
30 #define COLUMN_LAUNCHER 4 30 #define COLUMN_LAUNCHER 4
31 31
32 32
33#include "listviewpwm.h" 33#include "listviewpwm.h"
34#include "pwmdoc.h" 34#include "pwmdoc.h"
35#include "pwmviewstyle.h" 35#include "pwmviewstyle.h"
36 36
37#include <kconfig.h> 37#include <kconfig.h>
38#include <klocale.h> 38#include <klocale.h>
39#include <kdialogbase.h> 39#include <kdialogbase.h>
40 40
41#include <qevent.h> 41#include <qevent.h>
42#include <qfont.h> 42#include <qfont.h>
43#include <qobject.h> 43#include <qobject.h>
44#include <qtextbrowser.h>
44 45
45#include <vector> 46#include <vector>
46#include <string> 47#include <string>
47 48
48using std::string; 49using std::string;
49using std::vector; 50using std::vector;
50 51
51class PwM; 52class PwM;
52class ConfFile; 53class ConfFile;
53class PwMStatusBar; 54class PwMStatusBar;
54 55
55 56
56/** View class for PwM */ 57/** View class for PwM */
57class PwMView : public PwMViewStyle 58class PwMView : public PwMViewStyle
58{ 59{
59 Q_OBJECT 60 Q_OBJECT
60 friend class PwMViewStyle; 61 friend class PwMViewStyle;
61public: 62public:
62 /** construtor */ 63 /** construtor */
63 PwMView(PwM *_mainClass, QWidget* parent, PwMDoc *_doc, 64 PwMView(PwM *_mainClass, QWidget* parent, PwMDoc *_doc,
64 const char *name = 0); 65 const char *name = 0);
65 /** destructor */ 66 /** destructor */
66 ~PwMView(); 67 ~PwMView();
67 68
68 /** returns pointer to the document */ 69 /** returns pointer to the document */
69 PwMDoc* document() 70 PwMDoc* document()
70 { return doc; } 71 { return doc; }
71 /** returns the index of the currently selected entry. 72 /** returns the index of the currently selected entry.
72 * (index as represented in PwMDoc !) 73 * (index as represented in PwMDoc !)
73 */ 74 */
74 bool getCurEntryIndex(unsigned int *index); 75 bool getCurEntryIndex(unsigned int *index);
75 /** returns the position of the given item in the document 76 /** returns the position of the given item in the document
76 * Note: This func only serches in the current category. 77 * Note: This func only serches in the current category.
77 */ 78 */
78 bool getDocEntryIndex(unsigned int *index, 79 bool getDocEntryIndex(unsigned int *index,
79 const QListViewItem *item); 80 const QListViewItem *item);
80 81
81public slots: 82public slots:
82 /** update the view (call if dirty) */ 83 /** update the view (call if dirty) */
83 void updateView() 84 void updateView()
84 { 85 {
85 updateCategories(); 86 updateCategories();
86 shiftToView(); 87 shiftToView();
87 } 88 }
88 /** (re)sort all items and (re)shift them to listView. */ 89 /** (re)sort all items and (re)shift them to listView. */
89 void shiftToView(); 90 void shiftToView();
90 /** handle clicking on an item */ 91 /** handle clicking on an item */
91 void handleToggle(QListViewItem *item); 92 void handleToggle(QListViewItem *item);
92 /** handle right-clicking on an item */ 93 /** handle right-clicking on an item */
93 void handleRightClick(QListViewItem *item, const QPoint &point, int); 94 void handleRightClick(QListViewItem *item, const QPoint &point, int);
94 /** selects the item at "index" */ 95 /** selects the item at "index" */
95 void selAt(int index); 96 void selAt(int index);
96 /** rename category button pressed */ 97 /** rename category button pressed */
97 void renCatButton_slot(); 98 void renCatButton_slot();
98 /** delete category button pressed */ 99 /** delete category button pressed */
99 void delCatButton_slot(); 100 void delCatButton_slot();
100 101
101protected: 102protected:
102 /** right-click context-menu */ 103 /** right-click context-menu */
103 QPopupMenu *ctxMenu; 104 QPopupMenu *ctxMenu;
104 105
105protected: 106protected:
106 /** update the categories from document */ 107 /** update the categories from document */
107 void updateCategories(); 108 void updateCategories();
108 /** widget resize event */ 109 /** widget resize event */
109 void resizeEvent(QResizeEvent *); 110 void resizeEvent(QResizeEvent *);
110 /** initialize context-menu */ 111 /** initialize context-menu */
111 void initCtxMenu(); 112 void initCtxMenu();
112 /** tempoarly disable auto-sorting and user-sorting */ 113 /** tempoarly disable auto-sorting and user-sorting */
113 void tmpDisableSort() 114 void tmpDisableSort()
114 { lv->setSorting(-1); } 115 { lv->setSorting(-1); }
115 /** re-enable tempoarly disabled sorting */ 116 /** re-enable tempoarly disabled sorting */
116 void tmpReEnableSort() 117 void tmpReEnableSort()
117 { 118 {
118 lv->setSorting(lv->columns() + 1, 119 lv->setSorting(lv->columns() + 1,
119 true/*lv->sortOrder() == Qt::Ascending*/); 120 true/*lv->sortOrder() == Qt::Ascending*/);
120 } 121 }
121 /** The user pressed and released a key. */ 122 /** The user pressed and released a key. */
122 void keyReleaseEvent(QKeyEvent *e); 123 void keyReleaseEvent(QKeyEvent *e);
123 124
124protected slots: 125protected slots:
125 /** changes the comment text-edit, because a new item has been selected */ 126 /** changes the comment text-edit, because a new item has been selected */
126 void refreshCommentTextEdit(QListViewItem *curItem); 127 void refreshCommentTextEdit(QListViewItem *curItem);
127 /** copy pw to clipboard */ 128 /** copy pw to clipboard */
128 void copyPwToClip(); 129 void copyPwToClip();
129 /** copy name to clipboard */ 130 /** copy name to clipboard */
130 void copyNameToClip(); 131 void copyNameToClip();
131 /** copy desc to clipboard */ 132 /** copy desc to clipboard */
132 void copyDescToClip(); 133 void copyDescToClip();
133 /** copy url to clipboard */ 134 /** copy url to clipboard */
134 void copyUrlToClip(); 135 void copyUrlToClip();
135 /** copy launcher to clipboard */ 136 /** copy launcher to clipboard */
136 void copyLauncherToClip(); 137 void copyLauncherToClip();
137 /** copy comment to clipboard */ 138 /** copy comment to clipboard */
138 void copyCommentToClip(); 139 void copyCommentToClip();
139 /** reorganize the "listViewPos" positions in the document 140 /** reorganize the "listViewPos" positions in the document
140 * (for the current category only!) 141 * (for the current category only!)
141 */ 142 */
142 void reorgLp(); 143 void reorgLp();
143 144
144private: 145private:
145 /** document */ 146 /** document */
146 PwMDoc *doc; 147 PwMDoc *doc;
147 /** pointer to the main class "PwM" */ 148 /** pointer to the main class "PwM" */
148 PwM *mainClass; 149 PwM *mainClass;
149}; 150};
150 151
151 152
153//US ENH basic widget to view an password entry. We need it for the sync stuff.
154//But might be oif interest for other functionalities as well.
155class PwMDataItemView : public QTextBrowser
156{
157 public:
158 PwMDataItemView( QWidget *parent = 0, const char *name = 0 );
159
160 /**
161 Sets the PwMDataItem object. It is displayed immediately.
162
163 @param a The PwMDataItem object.
164 */
165 void setPwMDataItem( const PwMDataItem& a );
166
167 /**
168 Returns the current PwMDataItem object.
169 */
170 PwMDataItem pwmdataitem() const;
171
172 private:
173 PwMDataItem mItem;
174};
175
176
152//US ENH we need this chooser when syncing results in a conflict 177//US ENH we need this chooser when syncing results in a conflict
153class PwMDataItemChooser : public KDialogBase 178class PwMDataItemChooser : public KDialogBase
154{ 179{
155 Q_OBJECT 180 Q_OBJECT
156 181
157 public: 182 public:
158 PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool takeloc, QWidget *parent = 0, const char *name = 0 ); 183 PwMDataItemChooser( PwMDataItem loc, PwMDataItem rem, bool takeloc, QWidget *parent = 0, const char *name = 0 );
159 184
160 int executeD( bool local ); 185 int executeD( bool local );
161 186
162 private: 187 private:
163 int mSyncResult; 188 int mSyncResult;
164 189
165 private slots: 190 private slots:
166 void slot_remote(); 191 void slot_remote();
167 void slot_local(); 192 void slot_local();
168 193
169}; 194};
170 195
171 196
172#endif 197#endif
diff --git a/pwmanager/pwmanager/serializer.cpp b/pwmanager/pwmanager/serializer.cpp
index 203f82c..5c6568f 100644
--- a/pwmanager/pwmanager/serializer.cpp
+++ b/pwmanager/pwmanager/serializer.cpp
@@ -1,158 +1,158 @@
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 2.0 of pwmanager 15 * This file is originaly based on version 2.0 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_DEBUG1
31/* use the old xml tags for writing (0/1) */ 31/* use the old xml tags for writing (0/1) */
32 #define USE_OLD_TAGS 0 32 #define USE_OLD_TAGS 0
33/* write a CDATA section (0/1) */ 33/* write a CDATA section (0/1) */
34 #define WRITE_CDATA_SEC 0 34 #define WRITE_CDATA_SEC 0
35 35
36 36
37 #define META_CREATE_DATE"c" 37 #define META_CREATE_DATE"c"
38 #define META_VALID_DATE "v" 38 #define META_VALID_DATE "v"
39 #define META_EXPIRE_DATE"e" 39 #define META_EXPIRE_DATE"e"
40 #define META_UPDATE_DATE"u" 40 #define META_UPDATE_DATE"u"
41 #define META_UPDATE_INT "i" 41 #define META_UPDATE_INT "i"
42//US ENH : uniqueid 42//US ENH : uniqueid
43#define META_UNIQUEID "n" 43#define META_UNIQUEID "n"
44#define SYNC_ROOT "s" 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}
@@ -179,578 +179,602 @@ bool Serializer::parseXml(const QCString &buffer)
179} 179}
180 180
181QCString Serializer::getXml() 181QCString Serializer::getXml()
182{ 182{
183 PWM_ASSERT(domDoc); 183 PWM_ASSERT(domDoc);
184 184
185#ifndef PWM_EMBEDDED 185#ifndef PWM_EMBEDDED
186#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0 186#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0
187 QCString tmp(domDoc->toCString(8)); 187 QCString tmp(domDoc->toCString(8));
188 printDebug("<BEGIN Serializer::getXml() dump>\n"); 188 printDebug("<BEGIN Serializer::getXml() dump>\n");
189 cout << tmp << endl; 189 cout << tmp << endl;
190 printDebug("<END Serializer::getXml() dump>"); 190 printDebug("<END Serializer::getXml() dump>");
191#endif // DEBUG 191#endif // DEBUG
192 192
193 QCString ret(domDoc->toCString(0)); 193 QCString ret(domDoc->toCString(0));
194 ret.replace('\n', ""); 194 ret.replace('\n', "");
195 return ret; 195 return ret;
196#else 196#else
197 197
198#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0 198#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0
199 QCString tmp(" " + domDoc->toCString()); 199 QCString tmp(" " + domDoc->toCString());
200 printDebug("<BEGIN Serializer::getXml() dump>\n"); 200 printDebug("<BEGIN Serializer::getXml() dump>\n");
201 qDebug(tmp); 201 qDebug(tmp);
202 cout << tmp << endl; 202 cout << tmp << endl;
203 printDebug("<END Serializer::getXml() dump>"); 203 printDebug("<END Serializer::getXml() dump>");
204#endif // DEBUG 204#endif // DEBUG
205 205
206 QCString ret(domDoc->toCString()); 206 QCString ret(domDoc->toCString());
207 ret.replace(QRegExp("\n"), ""); 207 ret.replace(QRegExp("\n"), "");
208 return ret; 208 return ret;
209 209
210#endif 210#endif
211} 211}
212 212
213bool Serializer::serialize(PwMItem &dta) 213bool Serializer::serialize(PwMItem &dta)
214{ 214{
215 PWM_ASSERT(domDoc); 215 PWM_ASSERT(domDoc);
216 QDomElement root(genNewRoot()); 216 QDomElement root(genNewRoot());
217 QDomElement catNode(domDoc->createElement(CAT_ROOT_WR)); 217 QDomElement catNode(domDoc->createElement(CAT_ROOT_WR));
218 QDomElement syncNode(domDoc->createElement(SYNC_ROOT)); 218 QDomElement syncNode(domDoc->createElement(SYNC_ROOT));
219 if (!addSyncData(&syncNode, dta.syncDta)) 219 if (!addSyncData(&syncNode, dta.syncDta))
220 return false; 220 return false;
221 root.appendChild(syncNode); 221 root.appendChild(syncNode);
222 if (!addCategories(&catNode, dta.dta)) 222 if (!addCategories(&catNode, dta.dta))
223 return false; 223 return false;
224 root.appendChild(catNode); 224 root.appendChild(catNode);
225 return true; 225 return true;
226} 226}
227 227
228bool Serializer::deSerialize(PwMItem *dta) 228bool Serializer::deSerialize(PwMItem *dta)
229{ 229{
230 PWM_ASSERT(domDoc); 230 PWM_ASSERT(domDoc);
231 PWM_ASSERT(dta); 231 PWM_ASSERT(dta);
232 QDomElement root(domDoc->documentElement()); 232 QDomElement root(domDoc->documentElement());
233 QDomNode n; 233 QDomNode n;
234 234
235 dta->clear(); 235 dta->clear();
236 for (n = root.firstChild(); !n.isNull(); n = n.nextSibling()) { 236 for (n = root.firstChild(); !n.isNull(); n = n.nextSibling()) {
237 // find <categories> ... </categories> 237 // find <categories> ... </categories>
238 // <c> ... </c> 238 // <c> ... </c>
239 if (n.nodeName() == CAT_ROOT_NEW || 239 if (n.nodeName() == CAT_ROOT_NEW ||
240 n.nodeName() == CAT_ROOT_OLD) { 240 n.nodeName() == CAT_ROOT_OLD) {
241 if (!readCategories(n, &(dta->dta))) { 241 if (!readCategories(n, &(dta->dta))) {
242 return false; 242 return false;
243 } 243 }
244 continue; 244 continue;
245 } 245 }
246 else if (n.nodeName() == SYNC_ROOT) { 246 else if (n.nodeName() == SYNC_ROOT) {
247 if (!readSyncData(n, &(dta->syncDta))) { 247 if (!readSyncData(n, &(dta->syncDta))) {
248 return false; 248 return false;
249 } 249 }
250 continue; 250 continue;
251 } 251 }
252 252
253 /* NOTE: We can stop processing here, as we 253 /* NOTE: We can stop processing here, as we
254 * don't have more nodes in root, yet. 254 * don't have more nodes in root, yet.
255 */ 255 */
256 return false; 256 return false;
257 257
258 } 258 }
259 return true; 259 return true;
260} 260}
261 261
262bool Serializer::readCategories(const QDomNode &n, 262bool Serializer::readCategories(const QDomNode &n,
263 vector<PwMCategoryItem> *dta) 263 vector<PwMCategoryItem> *dta)
264{ 264{
265 QDomNodeList nl(n.childNodes()); 265 QDomNodeList nl(n.childNodes());
266 QDomNode cur; 266 QDomNode cur;
267 QString name; 267 QString name;
268 unsigned int numCat = nl.count(), i; 268 unsigned int numCat = nl.count(), i;
269 PwMCategoryItem curCat; 269 PwMCategoryItem curCat;
270 vector<PwMDataItem> curEntr; 270 vector<PwMDataItem> curEntr;
271 271
272 if (!numCat) { 272 if (!numCat) {
273 printDebug("Serializer::readCategories(): empty"); 273 printDebug("Serializer::readCategories(): empty");
274 return false; 274 return false;
275 } 275 }
276 for (i = 0; i < numCat; ++i) { 276 for (i = 0; i < numCat; ++i) {
277 cur = nl.item(i); 277 cur = nl.item(i);
278 if (cur.nodeName().left(1) == CAT_PREFIX_NEW || 278 if (cur.nodeName().left(1) == CAT_PREFIX_NEW ||
279 cur.nodeName().left(4) == CAT_PREFIX_OLD) { 279 cur.nodeName().left(4) == CAT_PREFIX_OLD) {
280 name = cur.toElement().attribute(CAT_NAME_NEW); 280 name = cur.toElement().attribute(CAT_NAME_NEW);
281 if (name == QString::null) 281 if (name == QString::null)
282 name = cur.toElement().attribute(CAT_NAME_OLD); 282 name = cur.toElement().attribute(CAT_NAME_OLD);
283 PWM_ASSERT(name != QString::null); 283 PWM_ASSERT(name != QString::null);
284 PWM_ASSERT(name != ""); 284 PWM_ASSERT(name != "");
285 curCat.clear(); 285 curCat.clear();
286 curCat.name = name.latin1(); 286 curCat.name = name.latin1();
287 if (!readEntries(cur, &curEntr)) { 287 if (!readEntries(cur, &curEntr)) {
288 dta->clear(); 288 dta->clear();
289 return false; 289 return false;
290 } 290 }
291 curCat.d = curEntr; 291 curCat.d = curEntr;
292 dta->push_back(curCat); 292 dta->push_back(curCat);
293 } else { 293 } else {
294 printDebug("Serializer::readCategories(): uh? not a category?"); 294 printDebug("Serializer::readCategories(): uh? not a category?");
295 } 295 }
296 } 296 }
297 return true; 297 return true;
298} 298}
299 299
300bool Serializer::readEntries(const QDomNode &n, 300bool Serializer::readEntries(const QDomNode &n,
301 vector<PwMDataItem> *dta) 301 vector<PwMDataItem> *dta)
302{ 302{
303 QDomNodeList nl(n.childNodes()); 303 QDomNodeList nl(n.childNodes());
304 QDomNode cur; 304 QDomNode cur;
305 unsigned int numEntr = nl.count(), i; 305 unsigned int numEntr = nl.count(), i;
306 PwMDataItem curEntr; 306 PwMDataItem curEntr;
307 //US BUG: to initialize all values of curEntr with meaningfulldata,
308 // we call clear on it. Reason: Information in the file we will read might be incomplete.
309 // e.g. the metadata is missing.
310 curEntr.clear(true);
307 311
308 dta->clear(); 312 dta->clear();
309 for (i = 0; i < numEntr; ++i) { 313 for (i = 0; i < numEntr; ++i) {
310 cur = nl.item(i); 314 cur = nl.item(i);
311 if (cur.nodeName().left(1) == ENTRY_PREFIX_NEW || 315 if (cur.nodeName().left(1) == ENTRY_PREFIX_NEW ||
312 cur.nodeName().left(6) == ENTRY_PREFIX_OLD) { 316 cur.nodeName().left(6) == ENTRY_PREFIX_OLD) {
313 if (!extractEntry(cur, &curEntr)) { 317 if (!extractEntry(cur, &curEntr)) {
314 return false; 318 return false;
315 } 319 }
316 dta->push_back(curEntr); 320 dta->push_back(curEntr);
317 } else { 321 } else {
318 printDebug("Serializer::readEntries(): hm? not an entry?"); 322 printDebug("Serializer::readEntries(): hm? not an entry?");
319 } 323 }
320 } 324 }
321 return true; 325 return true;
322} 326}
323 327
324bool Serializer::extractEntry(const QDomNode &n, 328bool Serializer::extractEntry(const QDomNode &n,
325 PwMDataItem *dta) 329 PwMDataItem *dta)
326{ 330{
327 QDomNodeList nl(n.childNodes()); 331 QDomNodeList nl(n.childNodes());
328 QDomNode cur, cdata; 332 QDomNode cur, cdata;
329 unsigned int cnt = nl.count(), i; 333 unsigned int cnt = nl.count(), i;
330 QString name, text; 334 QString name, text;
331 335
332 if (!cnt) { 336 if (!cnt) {
333 printDebug("Serializer::extractEntry(): empty"); 337 printDebug("Serializer::extractEntry(): empty");
334 return false; 338 return false;
335 } 339 }
336 dta->clear(); 340 dta->clear();
337 for (i = 0; i < cnt; ++i) { 341 for (i = 0; i < cnt; ++i) {
338 cur = nl.item(i); 342 cur = nl.item(i);
339 name = cur.nodeName(); 343 name = cur.nodeName();
340 cdata = cur.firstChild(); 344 cdata = cur.firstChild();
341 if (unlikely(cdata.isCDATASection())) { 345 if (unlikely(cdata.isCDATASection())) {
342 text = cdata.toCDATASection().data(); 346 text = cdata.toCDATASection().data();
343 } else if (likely(cur.isElement())) { 347 } else if (likely(cur.isElement())) {
344 text = cur.toElement().text(); 348 text = cur.toElement().text();
345 } else { 349 } else {
346 printDebug("Serializer::extractEntry(): neither CDATA nor element."); 350 printDebug("Serializer::extractEntry(): neither CDATA nor element.");
347 return false; 351 return false;
348 } 352 }
349 if (text == " ") 353 if (text == " ")
350 text = ""; // for backward compatibility. 354 text = ""; // for backward compatibility.
351 if (name == ENTRY_DESC_NEW || 355 if (name == ENTRY_DESC_NEW ||
352 name == ENTRY_DESC_OLD) { 356 name == ENTRY_DESC_OLD) {
353 dta->desc = unescapeEntryData(text).latin1(); 357 dta->desc = unescapeEntryData(text).latin1();
354 } else if (name == ENTRY_NAME_NEW || 358 } else if (name == ENTRY_NAME_NEW ||
355 name == ENTRY_NAME_OLD) { 359 name == ENTRY_NAME_OLD) {
356 dta->name = unescapeEntryData(text).latin1(); 360 dta->name = unescapeEntryData(text).latin1();
357 } else if (name == ENTRY_PW_NEW || 361 } else if (name == ENTRY_PW_NEW ||
358 name == ENTRY_PW_OLD) { 362 name == ENTRY_PW_OLD) {
359 dta->pw = unescapeEntryData(text).latin1(); 363 dta->pw = unescapeEntryData(text).latin1();
360 } else if (name == ENTRY_COMMENT_NEW || 364 } else if (name == ENTRY_COMMENT_NEW ||
361 name == ENTRY_COMMENT_OLD) { 365 name == ENTRY_COMMENT_OLD) {
362 dta->comment = unescapeEntryData(text).latin1(); 366 dta->comment = unescapeEntryData(text).latin1();
363 } else if (name == ENTRY_URL_NEW || 367 } else if (name == ENTRY_URL_NEW ||
364 name == ENTRY_URL_OLD) { 368 name == ENTRY_URL_OLD) {
365 dta->url = unescapeEntryData(text).latin1(); 369 dta->url = unescapeEntryData(text).latin1();
366 } else if (name == ENTRY_LAUNCHER_NEW || 370 } else if (name == ENTRY_LAUNCHER_NEW ||
367 name == ENTRY_LAUNCHER_OLD) { 371 name == ENTRY_LAUNCHER_OLD) {
368 dta->launcher = unescapeEntryData(text).latin1(); 372 dta->launcher = unescapeEntryData(text).latin1();
369 } else if (name == ENTRY_LVP_NEW || 373 } else if (name == ENTRY_LVP_NEW ||
370 name == ENTRY_LVP_OLD) { 374 name == ENTRY_LVP_OLD) {
371 dta->listViewPos = strtol(text.latin1(), 0, 10); 375 dta->listViewPos = strtol(text.latin1(), 0, 10);
372 } else if (name == ENTRY_BIN_NEW) { 376 } else if (name == ENTRY_BIN_NEW) {
373 // ENTRY_BIN_NEW == ENTRY_BIN_OLD 377 // ENTRY_BIN_NEW == ENTRY_BIN_OLD
374 if (text == "0") { 378 if (text == "0") {
375 dta->binary = false; 379 dta->binary = false;
376 } else { 380 } else {
377 dta->binary = true; 381 dta->binary = true;
378 } 382 }
379 } else if (name == ENTRY_META_NEW) { 383 } else if (name == ENTRY_META_NEW) {
380 // ENTRY_META_NEW == ENTRY_META_OLD 384 // ENTRY_META_NEW == ENTRY_META_OLD
381 if (!extractMeta(cur, &dta->meta)) 385 if (!extractMeta(cur, &dta->meta))
382 return false; 386 return false;
383 } else { 387 } else {
384 printDebug(string("Serializer::extractEntry(): invalid: ") 388 printDebug(string("Serializer::extractEntry(): invalid: ")
385 + name.latin1()); 389 + name.latin1());
386 } 390 }
387 } 391 }
388 dta->lockStat = defaultLockStat; 392 dta->lockStat = defaultLockStat;
389 return true; 393 return true;
390} 394}
391 395
392bool Serializer::extractMeta(const QDomNode &n, 396bool Serializer::extractMeta(const QDomNode &n,
393 PwMMetaData *dta) 397 PwMMetaData *dta)
394{ 398{
395 QDomNode cur(n.firstChild()); 399 QDomNode cur(n.firstChild());
396 QString name, val; 400 QString name, val;
397 while (!cur.isNull()) { 401 while (!cur.isNull()) {
398 name = cur.nodeName(); 402 name = cur.nodeName();
399 val = cur.toElement().text(); 403 val = cur.toElement().text();
400 if (val == "") { 404 if (val == "") {
401 cur = cur.nextSibling(); 405 cur = cur.nextSibling();
402 continue; 406 continue;
403 } 407 }
408
409 //US BUG: The transformation of an empty date into an ISO date and back is different on different systems/compilers.
410 //because of that it is possible that here some values are not set, which means they are null.
411 //US ENH: at the same moment we need backwardcompatibility. So older versions might have stored invalid dates.
412
413 QDateTime dtval; //dtval should be invalid by definition.
414
415 if ((name == META_CREATE_DATE) ||
416 (name == META_VALID_DATE) ||
417 (name == META_EXPIRE_DATE) ||
418 (name == META_UPDATE_DATE))
419 {
420 //qDebug("Serializer::extractMeta:: val:%s, empty:%i, length:%i",val.utf8(), val.isEmpty(), val.length());
421
404#ifndef PWM_EMBEDDED 422#ifndef PWM_EMBEDDED
405 if (name == META_CREATE_DATE) { 423 dtval = QDateTime::fromString(val, Qt::ISODate);
406 dta->create = QDateTime::fromString(val, Qt::ISODate);
407 } else if (name == META_VALID_DATE) {
408 dta->valid = QDateTime::fromString(val, Qt::ISODate);
409 } else if (name == META_EXPIRE_DATE) {
410 dta->expire = QDateTime::fromString(val, Qt::ISODate);
411 } else if (name == META_UPDATE_DATE) {
412 dta->update = QDateTime::fromString(val, Qt::ISODate);
413 } else if (name == META_UPDATE_INT) {
414 dta->updateInt = strtoul(val.latin1(), 0, 10);
415 } else if (name == META_UNIQUEID) {
416 dta->uniqueid = unescapeEntryData(val).latin1();
417 } else {
418 printDebug(string("extractMeta(): invalid: ")
419 + name.latin1());
420 }
421#else 424#else
425 bool ok;
426 dtval = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok);
427
428 if (ok == false)
429 qDebug("Serializer::extractMeta invalid date or time !!!!!!!!!!!!!");
430#endif
422 431
432 //if the parsed data is wrong, dtval should be invalid at this time.
423 433
424 bool ok = true; 434 }
425 435
426 if (name == META_CREATE_DATE) { 436 if (name == META_CREATE_DATE) {
427 dta->create = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); 437 dta->create = dtval;
428 } else if (name == META_VALID_DATE) { 438 } else if (name == META_VALID_DATE) {
429 dta->valid = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); 439 dta->valid = dtval;
430 } else if (name == META_EXPIRE_DATE) { 440 } else if (name == META_EXPIRE_DATE) {
431 dta->expire = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); 441 dta->expire = dtval;
432 } else if (name == META_UPDATE_DATE) { 442 } else if (name == META_UPDATE_DATE) {
433 dta->update = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); 443 dta->update = dtval;
434 } else if (name == META_UPDATE_INT) { 444 } else if (name == META_UPDATE_INT) {
435 dta->updateInt = strtoul(val.latin1(), 0, 10); 445 dta->updateInt = strtoul(val.latin1(), 0, 10);
436 } else if (name == META_UNIQUEID) { 446 } else if (name == META_UNIQUEID) {
437 dta->uniqueid = unescapeEntryData(val).latin1(); 447 dta->uniqueid = unescapeEntryData(val).latin1();
438 } else { 448 } else {
439 printDebug(string("extractMeta(): invalid: ") 449 printDebug(string("extractMeta(): invalid: ")
440 + name.latin1()); 450 + name.latin1());
441 } 451 }
442 452
443 if (ok == false)
444 qDebug("Serializer::extractMeta invalid date or time !!!!!!!!!!!!!");
445
446
447#endif
448 cur = cur.nextSibling(); 453 cur = cur.nextSibling();
449 } 454 }
450 return true; 455 return true;
451} 456}
452 457
453bool Serializer::checkValid() 458bool Serializer::checkValid()
454{ 459{
455 PWM_ASSERT(domDoc); 460 PWM_ASSERT(domDoc);
456 QDomElement root(domDoc->documentElement()); 461 QDomElement root(domDoc->documentElement());
457 if (root.nodeName() != ROOT_MAGIC_NEW && 462 if (root.nodeName() != ROOT_MAGIC_NEW &&
458 root.nodeName() != ROOT_MAGIC_OLD) { 463 root.nodeName() != ROOT_MAGIC_OLD) {
459 printDebug("Serializer: wrong magic"); 464 printDebug("Serializer: wrong magic");
460 return false; 465 return false;
461 } 466 }
462 if (root.attribute(VER_STR_NEW) != COMPAT_VER_NEW && 467 if (root.attribute(VER_STR_NEW) != COMPAT_VER_NEW &&
463 root.attribute(VER_STR_OLD) != COMPAT_VER_OLD) { 468 root.attribute(VER_STR_OLD) != COMPAT_VER_OLD) {
464 printDebug("Serializer: wrong version"); 469 printDebug("Serializer: wrong version");
465 return false; 470 return false;
466 } 471 }
467 return true; 472 return true;
468} 473}
469 474
470QDomElement Serializer::genNewRoot() 475QDomElement Serializer::genNewRoot()
471{ 476{
472 PWM_ASSERT(domDoc); 477 PWM_ASSERT(domDoc);
473 QDomElement root(domDoc->createElement(ROOT_MAGIC_WR)); 478 QDomElement root(domDoc->createElement(ROOT_MAGIC_WR));
474 root.setAttribute(VER_STR_WR, COMPAT_VER_WR); 479 root.setAttribute(VER_STR_WR, COMPAT_VER_WR);
475 domDoc->appendChild(root); 480 domDoc->appendChild(root);
476 return root; 481 return root;
477} 482}
478 483
479bool Serializer::addCategories(QDomElement *e, 484bool Serializer::addCategories(QDomElement *e,
480 const vector<PwMCategoryItem> &dta) 485 const vector<PwMCategoryItem> &dta)
481{ 486{
482 unsigned int numCat = dta.size(), i; 487 unsigned int numCat = dta.size(), i;
483 QString curId, curName; 488 QString curId, curName;
484 QDomElement curCat; 489 QDomElement curCat;
485 490
486 for (i = 0; i < numCat; ++i) { 491 for (i = 0; i < numCat; ++i) {
487 curId = CAT_PREFIX_WR; 492 curId = CAT_PREFIX_WR;
488 curId += tostr(i).c_str(); 493 curId += tostr(i).c_str();
489 curName = dta[i].name.c_str(); 494 curName = dta[i].name.c_str();
490 curCat = domDoc->createElement(curId); 495 curCat = domDoc->createElement(curId);
491 curCat.setAttribute(CAT_NAME_WR, curName); 496 curCat.setAttribute(CAT_NAME_WR, curName);
492 if (!addEntries(&curCat, dta[i].d)) { 497 if (!addEntries(&curCat, dta[i].d)) {
493 return false; 498 return false;
494 } 499 }
495 e->appendChild(curCat); 500 e->appendChild(curCat);
496 } 501 }
497 return true; 502 return true;
498} 503}
499 504
500bool Serializer::addEntries(QDomElement *e, 505bool Serializer::addEntries(QDomElement *e,
501 const vector<PwMDataItem> &dta) 506 const vector<PwMDataItem> &dta)
502{ 507{
503 unsigned int numEntr = dta.size(), i; 508 unsigned int numEntr = dta.size(), i;
504 QString curId; 509 QString curId;
505 QDomElement curEntr; 510 QDomElement curEntr;
506 511
507 for (i = 0; i < numEntr; ++i) { 512 for (i = 0; i < numEntr; ++i) {
508 curId = ENTRY_PREFIX_WR; 513 curId = ENTRY_PREFIX_WR;
509 curId += tostr(i).c_str(); 514 curId += tostr(i).c_str();
510 curEntr = domDoc->createElement(curId); 515 curEntr = domDoc->createElement(curId);
511 if (!writeEntry(&curEntr, dta[i])) { 516 if (!writeEntry(&curEntr, dta[i])) {
512 return false; 517 return false;
513 } 518 }
514 e->appendChild(curEntr); 519 e->appendChild(curEntr);
515 } 520 }
516 return true; 521 return true;
517} 522}
518 523
519bool Serializer::writeEntry(QDomElement *e, 524bool Serializer::writeEntry(QDomElement *e,
520 const PwMDataItem &_dta) 525 const PwMDataItem &_dta)
521{ 526{
522#if WRITE_CDATA_SEC != 0 527#if WRITE_CDATA_SEC != 0
523 # define new_text(x)domDoc->createCDATASection(x) 528 # define new_text(x)domDoc->createCDATASection(x)
524 QDomCDATASection curText; 529 QDomCDATASection curText;
525#else 530#else
526 # define new_text(x)domDoc->createTextNode(x) 531 # define new_text(x)domDoc->createTextNode(x)
527 QDomText curText; 532 QDomText curText;
528#endif 533#endif
529 534
530 QDomText plainText; 535 QDomText plainText;
531 QDomElement tag; 536 QDomElement tag;
532 537
533 // begin -- This is for compatibility with the old serializer 538 // begin -- This is for compatibility with the old serializer
534 PwMDataItem dta = _dta; 539 PwMDataItem dta = _dta;
535 if (!dta.desc.size()) 540 if (!dta.desc.size())
536 dta.desc = " "; 541 dta.desc = " ";
537 if (!dta.name.size()) 542 if (!dta.name.size())
538 dta.name = " "; 543 dta.name = " ";
539 if (!dta.pw.size()) 544 if (!dta.pw.size())
540 dta.pw = " "; 545 dta.pw = " ";
541 if (!dta.comment.size()) 546 if (!dta.comment.size())
542 dta.comment = " "; 547 dta.comment = " ";
543 if (!dta.url.size()) 548 if (!dta.url.size())
544 dta.url = " "; 549 dta.url = " ";
545 if (!dta.launcher.size()) 550 if (!dta.launcher.size())
546 dta.launcher = " "; 551 dta.launcher = " ";
547 // end -- This is for compatibility with the old serializer 552 // end -- This is for compatibility with the old serializer
548 553
549 tag = domDoc->createElement(ENTRY_DESC_WR); 554 tag = domDoc->createElement(ENTRY_DESC_WR);
550 curText = new_text(escapeEntryData(dta.desc.c_str())); 555 curText = new_text(escapeEntryData(dta.desc.c_str()));
551 tag.appendChild(curText); 556 tag.appendChild(curText);
552 e->appendChild(tag); 557 e->appendChild(tag);
553 558
554 tag = domDoc->createElement(ENTRY_NAME_WR); 559 tag = domDoc->createElement(ENTRY_NAME_WR);
555 curText = new_text(escapeEntryData(dta.name.c_str())); 560 curText = new_text(escapeEntryData(dta.name.c_str()));
556 tag.appendChild(curText); 561 tag.appendChild(curText);
557 e->appendChild(tag); 562 e->appendChild(tag);
558 563
559 tag = domDoc->createElement(ENTRY_PW_WR); 564 tag = domDoc->createElement(ENTRY_PW_WR);
560 curText = new_text(escapeEntryData(dta.pw.c_str())); 565 curText = new_text(escapeEntryData(dta.pw.c_str()));
561 tag.appendChild(curText); 566 tag.appendChild(curText);
562 e->appendChild(tag); 567 e->appendChild(tag);
563 568
564 tag = domDoc->createElement(ENTRY_COMMENT_WR); 569 tag = domDoc->createElement(ENTRY_COMMENT_WR);
565 curText = new_text(escapeEntryData(dta.comment.c_str())); 570 curText = new_text(escapeEntryData(dta.comment.c_str()));
566 tag.appendChild(curText); 571 tag.appendChild(curText);
567 e->appendChild(tag); 572 e->appendChild(tag);
568 573
569 tag = domDoc->createElement(ENTRY_URL_WR); 574 tag = domDoc->createElement(ENTRY_URL_WR);
570 curText = new_text(escapeEntryData(dta.url.c_str())); 575 curText = new_text(escapeEntryData(dta.url.c_str()));
571 tag.appendChild(curText); 576 tag.appendChild(curText);
572 e->appendChild(tag); 577 e->appendChild(tag);
573 578
574 tag = domDoc->createElement(ENTRY_LAUNCHER_WR); 579 tag = domDoc->createElement(ENTRY_LAUNCHER_WR);
575 curText = new_text(escapeEntryData(dta.launcher.c_str())); 580 curText = new_text(escapeEntryData(dta.launcher.c_str()));
576 tag.appendChild(curText); 581 tag.appendChild(curText);
577 e->appendChild(tag); 582 e->appendChild(tag);
578 583
579 tag = domDoc->createElement(ENTRY_LVP_WR); 584 tag = domDoc->createElement(ENTRY_LVP_WR);
580 plainText = domDoc->createTextNode(tostr(dta.listViewPos).c_str()); 585 plainText = domDoc->createTextNode(tostr(dta.listViewPos).c_str());
581 tag.appendChild(plainText); 586 tag.appendChild(plainText);
582 e->appendChild(tag); 587 e->appendChild(tag);
583 588
584 tag = domDoc->createElement(ENTRY_BIN_WR); 589 tag = domDoc->createElement(ENTRY_BIN_WR);
585 if (dta.binary) 590 if (dta.binary)
586 plainText = domDoc->createTextNode("1"); 591 plainText = domDoc->createTextNode("1");
587 else 592 else
588 plainText = domDoc->createTextNode("0"); 593 plainText = domDoc->createTextNode("0");
589 tag.appendChild(plainText); 594 tag.appendChild(plainText);
590 e->appendChild(tag); 595 e->appendChild(tag);
591 596
592 tag = domDoc->createElement(ENTRY_META_WR); 597 tag = domDoc->createElement(ENTRY_META_WR);
593 if (!writeMeta(&tag, dta.meta)) 598 if (!writeMeta(&tag, dta.meta))
594 return false; 599 return false;
595 e->appendChild(tag); 600 e->appendChild(tag);
596 601
597#undef new_text 602#undef new_text
598 return true; 603 return true;
599} 604}
600 605
601bool Serializer::writeMeta(QDomElement *e, 606bool Serializer::writeMeta(QDomElement *e,
602 const PwMMetaData &dta) 607 const PwMMetaData &dta)
603{ 608{
604 QDomText text; 609 QDomText text;
605 QDomElement tag; 610 QDomElement tag;
606 611
607 tag = domDoc->createElement(META_CREATE_DATE); 612 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers.
613 //So do not transform an empty value at all.
614 if (dta.create.isValid())
615 {
616 tag = domDoc->createElement(META_CREATE_DATE);
608#ifndef PWM_EMBEDDED 617#ifndef PWM_EMBEDDED
609 text = domDoc->createTextNode(dta.create.toString(Qt::ISODate)); 618 text = domDoc->createTextNode(dta.create.toString(Qt::ISODate));
610#else 619#else
611 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.create, KLocale::ISODate)); 620 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.create, KLocale::ISODate));
612#endif 621#endif
613 tag.appendChild(text); 622 tag.appendChild(text);
614 e->appendChild(tag); 623 e->appendChild(tag);
624 }
615 625
616 tag = domDoc->createElement(META_VALID_DATE); 626 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers.
627 //So do not transform an empty value at all.
628 if (dta.valid.isValid())
629 {
630 tag = domDoc->createElement(META_VALID_DATE);
617#ifndef PWM_EMBEDDED 631#ifndef PWM_EMBEDDED
618 text = domDoc->createTextNode(dta.valid.toString(Qt::ISODate)); 632 text = domDoc->createTextNode(dta.valid.toString(Qt::ISODate));
619#else 633#else
620 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.valid, KLocale::ISODate)); 634 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.valid, KLocale::ISODate));
621#endif 635#endif
622 tag.appendChild(text); 636 tag.appendChild(text);
623 e->appendChild(tag); 637 e->appendChild(tag);
638 }
624 639
625 tag = domDoc->createElement(META_EXPIRE_DATE); 640 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers.
641 //So do not transform an empty value at all.
642 if (dta.expire.isValid())
643 {
644 tag = domDoc->createElement(META_EXPIRE_DATE);
626#ifndef PWM_EMBEDDED 645#ifndef PWM_EMBEDDED
627 text = domDoc->createTextNode(dta.expire.toString(Qt::ISODate)); 646 text = domDoc->createTextNode(dta.expire.toString(Qt::ISODate));
628#else 647#else
629 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.expire, KLocale::ISODate)); 648 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.expire, KLocale::ISODate));
630#endif 649#endif
631 tag.appendChild(text); 650 tag.appendChild(text);
632 e->appendChild(tag); 651 e->appendChild(tag);
652 }
633 653
634 tag = domDoc->createElement(META_UPDATE_DATE); 654 //US BUG!!!: The transformation of an empty date into an ISO date is different on different systems/compilers.
655 //So do not transform an empty value at all.
656 if (dta.update.isValid())
657 {
658 tag = domDoc->createElement(META_UPDATE_DATE);
635#ifndef PWM_EMBEDDED 659#ifndef PWM_EMBEDDED
636 text = domDoc->createTextNode(dta.update.toString(Qt::ISODate)); 660 text = domDoc->createTextNode(dta.update.toString(Qt::ISODate));
637#else 661#else
638 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.update, KLocale::ISODate)); 662 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.update, KLocale::ISODate));
639#endif 663#endif
640 tag.appendChild(text); 664 tag.appendChild(text);
641 e->appendChild(tag); 665 e->appendChild(tag);
666 }
642 667
643 tag = domDoc->createElement(META_UPDATE_INT); 668 tag = domDoc->createElement(META_UPDATE_INT);
644 text = domDoc->createTextNode(tostr(dta.updateInt).c_str()); 669 text = domDoc->createTextNode(tostr(dta.updateInt).c_str());
645 tag.appendChild(text); 670 tag.appendChild(text);
646 e->appendChild(tag); 671 e->appendChild(tag);
647 672
648 tag = domDoc->createElement(META_UNIQUEID); 673 tag = domDoc->createElement(META_UNIQUEID);
649 text = domDoc->createTextNode(escapeEntryData(dta.uniqueid.c_str())); 674 text = domDoc->createTextNode(escapeEntryData(dta.uniqueid.c_str()));
650 tag.appendChild(text); 675 tag.appendChild(text);
651 e->appendChild(tag); 676 e->appendChild(tag);
652 677
653#undef new_text 678#undef new_text
654 return true; 679 return true;
655} 680}
656 681
657QString Serializer::escapeEntryData(QString dta) 682QString Serializer::escapeEntryData(QString dta)
658{ 683{
659#ifndef PWM_EMBEDDED 684#ifndef PWM_EMBEDDED
660 dta.replace('\n', "$>--endl--<$"); 685 dta.replace('\n', "$>--endl--<$");
661 dta.replace("]]>", "||>"); 686 dta.replace("]]>", "||>");
662#else 687#else
663 dta.replace(QRegExp("\n"), "$>--endl--<$"); 688 dta.replace(QRegExp("\n"), "$>--endl--<$");
664 dta.replace(QRegExp("]]>"), "||>"); 689 dta.replace(QRegExp("]]>"), "||>");
665#endif 690#endif
666 return dta; 691 return dta;
667} 692}
668 693
669QString Serializer::unescapeEntryData(QString dta) 694QString Serializer::unescapeEntryData(QString dta)
670{ 695{
671#ifndef PWM_EMBEDDED 696#ifndef PWM_EMBEDDED
672 dta.replace("$>--endl--<$", "\n"); 697 dta.replace("$>--endl--<$", "\n");
673 dta.replace("||>", "]]>"); 698 dta.replace("||>", "]]>");
674#else 699#else
675 dta.replace(QRegExp("$>--endl--<$"), "\n"); 700 dta.replace(QRegExp("\\$>--endl--<\\$"), "\n");
676 dta.replace(QRegExp("||>"), "]]>"); 701 dta.replace(QRegExp("||>"), "]]>");
677#endif 702#endif
678 return dta; 703 return dta;
679} 704}
680 705
681 706
682//US ENH: the following methods are getting used to write/read sync entries 707//US ENH: the following methods are getting used to write/read sync entries
683/** read the syncentries in the node "n" */ 708/** read the syncentries in the node "n" */
684bool Serializer::readSyncData(const QDomNode &n, vector<PwMSyncItem> *dta) 709bool Serializer::readSyncData(const QDomNode &n, vector<PwMSyncItem> *dta)
685{ 710{
686 QDomNodeList nl(n.childNodes()); 711 QDomNodeList nl(n.childNodes());
687 QDomNode cur; 712 QDomNode cur;
688 713
689 QString devicename, val; 714 QString devicename, val;
690 unsigned int numSync = nl.count(), i; 715 unsigned int numSync = nl.count(), i;
691 PwMSyncItem curSync; 716 PwMSyncItem curSync;
692 bool ok = true; 717 bool ok = true;
693 718
694 if (!numSync) { 719 if (!numSync) {
695 //no sync entries is a possible result 720 //no sync entries is a possible result
696 printDebug("Serializer::readSyncData(): empty"); 721 printDebug("Serializer::readSyncData(): empty");
697 return true; 722 return true;
698 } 723 }
699 for (i = 0; i < numSync; ++i) { 724 for (i = 0; i < numSync; ++i) {
700 cur = nl.item(i); 725 cur = nl.item(i);
701 if (cur.nodeName().left(1) == SYNC_TARGET_PREFIX) { 726 if (cur.nodeName().left(1) == SYNC_TARGET_PREFIX) {
702 devicename = cur.toElement().attribute(SYNC_TARGET_NAME); 727 devicename = cur.toElement().attribute(SYNC_TARGET_NAME);
703 val = cur.toElement().text(); 728 val = cur.toElement().text();
704 729
705 if ((val == "") || (devicename == QString::null)) { 730 if ((val == "") || (devicename == QString::null)) {
706 printDebug("Serializer::readSyncData(): empty synctarget name or syncdate"); 731 printDebug("Serializer::readSyncData(): empty synctarget name or syncdate");
707 continue; 732 continue;
708 } 733 }
709 734
710 curSync.syncName = devicename; 735 curSync.syncName = devicename;
711#ifndef PWM_EMBEDDED 736#ifndef PWM_EMBEDDED
712 curSync.lastSyncDate = QDateTime::fromString(val, Qt::ISODate); 737 curSync.lastSyncDate = QDateTime::fromString(val, Qt::ISODate);
713#else 738#else
714 curSync.lastSyncDate = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok); 739 curSync.lastSyncDate = KGlobal::locale()->readDateTime(val, KLocale::ISODate, &ok);
715 if (ok == false) 740 if (ok == false)
716 qDebug("Serializer::readSyncData(): could not parse syncdate:%s",val.latin1()); 741 qDebug("Serializer::readSyncData(): could not parse syncdate:%s",val.latin1());
717 742
718#endif 743#endif
719 dta->push_back(curSync); 744 dta->push_back(curSync);
720 } 745 }
721 } 746 }
722 return true; 747 return true;
723 748
724} 749}
725 750
726 751
727 752
728bool Serializer::addSyncData(QDomElement *e, 753bool Serializer::addSyncData(QDomElement *e,
729 const vector<PwMSyncItem> &dta) 754 const vector<PwMSyncItem> &dta)
730{ 755{
731 unsigned int numSync = dta.size(), i; 756 unsigned int numSync = dta.size(), i;
732 QString curId, curDeviceName; 757 QString curId, curDeviceName;
733 QDomElement curSync, curSyncDate; 758 QDomElement curSync;
734 QDomText text; 759 QDomText text;
735 760
736 for (i = 0; i < numSync; ++i) { 761 for (i = 0; i < numSync; ++i) {
737 curId = SYNC_TARGET_PREFIX; 762 curId = SYNC_TARGET_PREFIX;
738 curId += tostr(i).c_str(); 763 curId += tostr(i).c_str();
739 curDeviceName = dta[i].syncName.c_str(); 764 curDeviceName = dta[i].syncName.c_str();
740 curSync = domDoc->createElement(curId); 765 curSync = domDoc->createElement(curId);
741 curSync.setAttribute(SYNC_TARGET_NAME, curDeviceName); 766 curSync.setAttribute(SYNC_TARGET_NAME, curDeviceName);
742 767
743#ifndef PWM_EMBEDDED 768#ifndef PWM_EMBEDDED
744 text = domDoc->createTextNode(dta[i].lastSyncDate.toString(Qt::ISODate)); 769 text = domDoc->createTextNode(dta[i].lastSyncDate.toString(Qt::ISODate));
745#else 770#else
746 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta[i].lastSyncDate, KLocale::ISODate)); 771 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta[i].lastSyncDate, KLocale::ISODate));
747#endif 772#endif
748 curSyncDate.appendChild(text); 773 curSync.appendChild(text);
749 curSync.appendChild(curSyncDate);
750 774
751 e->appendChild(curSync); 775 e->appendChild(curSync);
752 776
753 } 777 }
754 return true; 778 return true;
755} 779}
756 780