Diffstat (limited to 'noncore/apps/zsafe/zsafe.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/zsafe/zsafe.cpp | 3492 |
1 files changed, 3492 insertions, 0 deletions
diff --git a/noncore/apps/zsafe/zsafe.cpp b/noncore/apps/zsafe/zsafe.cpp new file mode 100644 index 0000000..bd03031 --- a/dev/null +++ b/noncore/apps/zsafe/zsafe.cpp | |||
@@ -0,0 +1,3492 @@ | |||
1 | /**************************************************************************** | ||
2 | ** | ||
3 | ** Created: Sat Apr 6 17:57:45 2002 | ||
4 | ** | ||
5 | ** Author: Carsten Schneider <CarstenSchneider@t-online.de> | ||
6 | ** | ||
7 | ** $Id$ | ||
8 | ** | ||
9 | ** Homepage: http://home.t-online.de/home/CarstenSchneider/zsafe/index.html | ||
10 | ** | ||
11 | ** Compile Flags: | ||
12 | ** Zaurus arm : none | ||
13 | ** Linux Desktop : -DDESKTOP | ||
14 | ** Windows Desktop: -DDESKTOP -DWIN32 | ||
15 | ** | ||
16 | ****************************************************************************/ | ||
17 | #include "zsafe.h" | ||
18 | #include "newdialog.h" | ||
19 | #include "searchdialog.h" | ||
20 | #include "categorydialog.h" | ||
21 | #include "passworddialog.h" | ||
22 | #include "infoform.h" | ||
23 | #include "zlistview.h" | ||
24 | #include "shadedlistitem.h" | ||
25 | |||
26 | #ifndef DESKTOP | ||
27 | #include "scqtfileedit.h" | ||
28 | #endif | ||
29 | |||
30 | #include <qclipboard.h> | ||
31 | |||
32 | #include <stdio.h> | ||
33 | |||
34 | #include <sys/types.h> | ||
35 | #include <sys/stat.h> | ||
36 | #include <fcntl.h> | ||
37 | #include <stdlib.h> | ||
38 | #ifndef WIN32 | ||
39 | #include <unistd.h> | ||
40 | #endif | ||
41 | #include <string.h> | ||
42 | #include <errno.h> | ||
43 | |||
44 | #include <qmenubar.h> | ||
45 | #include <qpopupmenu.h> | ||
46 | |||
47 | #ifdef DESKTOP | ||
48 | #include <qfiledialog.h> | ||
49 | #ifndef WIN32 | ||
50 | #include <qsettings.h> | ||
51 | #else | ||
52 | #include "qsettings.h" | ||
53 | #endif | ||
54 | #include <qapplication.h> | ||
55 | #else | ||
56 | #include <qfile.h> | ||
57 | #include <qpe/fileselector.h> | ||
58 | #include <qpe/global.h> | ||
59 | #include <qpe/qpeapplication.h> | ||
60 | #include <qpe/resource.h> | ||
61 | #include <qpe/config.h> | ||
62 | #endif | ||
63 | |||
64 | #include <qtimer.h> | ||
65 | #include <qlayout.h> | ||
66 | #include <qmessagebox.h> | ||
67 | #include <qfile.h> | ||
68 | #include <qtextstream.h> | ||
69 | #include <qheader.h> | ||
70 | #include <qlistview.h> | ||
71 | #include <qtoolbutton.h> | ||
72 | #include <qlayout.h> | ||
73 | #include <qvariant.h> | ||
74 | #include <qtooltip.h> | ||
75 | #include <qwhatsthis.h> | ||
76 | #include <qimage.h> | ||
77 | #include <qpixmap.h> | ||
78 | #include <qlineedit.h> | ||
79 | #include <qmultilineedit.h> | ||
80 | #include <qregexp.h> | ||
81 | #include <qdir.h> | ||
82 | #include <qtextbrowser.h> | ||
83 | #include <qlabel.h> | ||
84 | #include <qcombobox.h> | ||
85 | |||
86 | #include "krc2.h" | ||
87 | |||
88 | #include "wait.h" | ||
89 | |||
90 | extern int DeskW, DeskH; | ||
91 | #ifdef DESKTOP | ||
92 | extern QApplication *appl; | ||
93 | #else | ||
94 | extern QPEApplication *appl; | ||
95 | #endif | ||
96 | |||
97 | |||
98 | #ifdef DESKTOP | ||
99 | #ifndef WIN32 | ||
100 | const QString APP_KEY="/.zsafe/"; | ||
101 | #else | ||
102 | const QString APP_KEY=""; | ||
103 | #endif | ||
104 | #else | ||
105 | const QString APP_KEY=""; | ||
106 | #endif | ||
107 | |||
108 | // include xmp images | ||
109 | #include "pics/zsafe/copy.xpm" | ||
110 | #include "pics/zsafe/cut.xpm" | ||
111 | #include "pics/zsafe/edit.xpm" | ||
112 | #include "pics/zsafe/editdelete.xpm" | ||
113 | #include "pics/zsafe/find.xpm" | ||
114 | #include "pics/zsafe/folder_open.xpm" | ||
115 | #include "pics/zsafe/help_icon.xpm" | ||
116 | #include "pics/zsafe/new.xpm" | ||
117 | #include "pics/zsafe/paste.xpm" | ||
118 | #include "pics/zsafe/quit_icon.xpm" | ||
119 | #include "pics/zsafe/save.xpm" | ||
120 | #include "pics/zsafe/trash.xpm" | ||
121 | #include "pics/zsafe/expand.xpm" | ||
122 | #include "pics/zsafe/export.xpm" | ||
123 | #include "pics/zsafe/import.xpm" | ||
124 | #include "pics/zsafe/zsafe.xpm" | ||
125 | |||
126 | static const char* const bank_cards_data[] = { | ||
127 | "14 14 16 1", | ||
128 | ". c None", | ||
129 | "# c #000000", | ||
130 | "b c #0000de", | ||
131 | "a c #0000e6", | ||
132 | "j c #41de83", | ||
133 | "k c #4acecd", | ||
134 | "h c #4aced5", | ||
135 | "g c #5a40cd", | ||
136 | "d c #5a44d5", | ||
137 | "l c #9440d5", | ||
138 | "m c #b4ce4a", | ||
139 | "n c #cd4883", | ||
140 | "e c #d5ae10", | ||
141 | "f c #de3ce6", | ||
142 | "i c #e640e6", | ||
143 | "c c #ffffff", | ||
144 | "..............", | ||
145 | ".###########..", | ||
146 | ".#ababababa#..", | ||
147 | ".#babbbabbb#..", | ||
148 | ".#ccccccccc#..", | ||
149 | ".#cdcefcghc#..", | ||
150 | ".#ccccccccc#..", | ||
151 | ".#cicjkclic#..", | ||
152 | ".#ccccccccc#..", | ||
153 | ".#cmchlcnec#..", | ||
154 | ".#ccccccccc#..", | ||
155 | ".###########..", | ||
156 | "..............", | ||
157 | ".............."}; | ||
158 | |||
159 | |||
160 | static const char* const passwords_data[] = { | ||
161 | "16 16 20 1", | ||
162 | ". c None", | ||
163 | "# c #000000", | ||
164 | "r c #000083", | ||
165 | "p c #0000c5", | ||
166 | "q c #0000ff", | ||
167 | "n c #008100", | ||
168 | "l c #00c200", | ||
169 | "m c #00ff00", | ||
170 | "j c #838100", | ||
171 | "a c #c55900", | ||
172 | "h c #c5c200", | ||
173 | "o c #c5c2ff", | ||
174 | "k c #c5ffc5", | ||
175 | "f c #ff0000", | ||
176 | "d c #ff8100", | ||
177 | "b c #ffaa5a", | ||
178 | "e c #ffc2c5", | ||
179 | "c c #ffdeac", | ||
180 | "i c #ffff00", | ||
181 | "g c #ffffc5", | ||
182 | "............###.", | ||
183 | "...........#abb#", | ||
184 | "..........#cbab#", | ||
185 | ".........#cbdd#.", | ||
186 | "######..#cbdd#..", | ||
187 | "#eeff#..#add#...", | ||
188 | "#eeff#######....", | ||
189 | "#ccdbdd#........", | ||
190 | "#dddbdd###......", | ||
191 | "#gghihhjj#......", | ||
192 | "#hhhihhjj###....", | ||
193 | "#kklmllnnnn#....", | ||
194 | "#lllmllnnnn#....", | ||
195 | "#oopqpprprr#....", | ||
196 | "#oopqpprprr#....", | ||
197 | "############...."}; | ||
198 | |||
199 | static const char* const software_data[] = { | ||
200 | "16 16 5 1", | ||
201 | ". c None", | ||
202 | "# c #000000", | ||
203 | "b c #838183", | ||
204 | "c c #c5ffff", | ||
205 | "a c #ffffff", | ||
206 | "................", | ||
207 | ".##############.", | ||
208 | "#aaaaaaaaaaaaaa#", | ||
209 | "#abbbbbbbbbbbbb#", | ||
210 | "#ab##########ab#", | ||
211 | "#ab#c########ab#", | ||
212 | "#ab#c#c######ab#", | ||
213 | "#ab##########ab#", | ||
214 | "#ab##########ab#", | ||
215 | "#ab##########ab#", | ||
216 | "#ab##########ab#", | ||
217 | "#ab##########ab#", | ||
218 | "#aaaaaaaaaaaaab#", | ||
219 | "#bbbbbbbbbbbbbb#", | ||
220 | ".##############.", | ||
221 | "................"}; | ||
222 | |||
223 | static const char* const general_data[] = { | ||
224 | "14 14 98 2", | ||
225 | "Qt c None", | ||
226 | ".k c #000000", | ||
227 | "#x c #080808", | ||
228 | "#F c #101008", | ||
229 | "#q c #101010", | ||
230 | "#i c #101410", | ||
231 | "## c #101810", | ||
232 | ".m c #181818", | ||
233 | ".3 c #181c18", | ||
234 | ".I c #182018", | ||
235 | ".T c #202420", | ||
236 | "#D c #202820", | ||
237 | "#y c #292c29", | ||
238 | ".c c #293029", | ||
239 | ".d c #313031", | ||
240 | "#E c #313429", | ||
241 | "#r c #313831", | ||
242 | ".j c #393c31", | ||
243 | "#j c #394039", | ||
244 | "#C c #414841", | ||
245 | ".w c #4a554a", | ||
246 | ".a c #4a594a", | ||
247 | ".# c #525052", | ||
248 | ".l c #52594a", | ||
249 | "#f c #525952", | ||
250 | "#v c #525d52", | ||
251 | ".O c #5a4c4a", | ||
252 | ".9 c #5a595a", | ||
253 | ".A c #5a5d52", | ||
254 | ".B c #624c52", | ||
255 | ".0 c #625552", | ||
256 | "#o c #626562", | ||
257 | ".R c #626962", | ||
258 | "#. c #626d5a", | ||
259 | "#p c #626d62", | ||
260 | ".2 c #627162", | ||
261 | "#h c #6a6d62", | ||
262 | "#z c #6a7562", | ||
263 | "#w c #6a756a", | ||
264 | ".C c #73656a", | ||
265 | ".P c #73696a", | ||
266 | "#a c #737d6a", | ||
267 | ".U c #738573", | ||
268 | ".E c #7b817b", | ||
269 | "#B c #7b857b", | ||
270 | "#s c #7b897b", | ||
271 | "#n c #7b917b", | ||
272 | ".b c #838d83", | ||
273 | ".7 c #839583", | ||
274 | ".n c #8b7d7b", | ||
275 | "#g c #8b8583", | ||
276 | ".g c #8b858b", | ||
277 | ".r c #8b898b", | ||
278 | ".s c #8b8d8b", | ||
279 | ".i c #8b9183", | ||
280 | ".8 c #8b918b", | ||
281 | "#A c #8b9d8b", | ||
282 | ".S c #8ba183", | ||
283 | ".Z c #94918b", | ||
284 | ".N c #949994", | ||
285 | ".F c #949d94", | ||
286 | ".x c #94a18b", | ||
287 | ".v c #94a194", | ||
288 | ".Y c #94aa94", | ||
289 | ".h c #9c999c", | ||
290 | ".Q c #9ca19c", | ||
291 | "#u c #9ca59c", | ||
292 | ".H c #9caa9c", | ||
293 | "#e c #9cb29c", | ||
294 | "#m c #a4b29c", | ||
295 | "#t c #a4b2a4", | ||
296 | ".M c #a4b69c", | ||
297 | "#l c #a4b6a4", | ||
298 | ".z c #a4baa4", | ||
299 | ".f c #aca5ac", | ||
300 | ".q c #acaaac", | ||
301 | "#d c #acbeac", | ||
302 | ".6 c #acc2ac", | ||
303 | ".o c #b4b2b4", | ||
304 | ".t c #b4beb4", | ||
305 | "#k c #b4c2ac", | ||
306 | ".5 c #b4cab4", | ||
307 | ".D c #bdb6bd", | ||
308 | ".G c #bdc6b4", | ||
309 | "#c c #bdceb4", | ||
310 | ".X c #bdd2bd", | ||
311 | ".4 c #bdd6bd", | ||
312 | ".1 c #c5bec5", | ||
313 | ".e c #c5c2c5", | ||
314 | ".u c #c5cac5", | ||
315 | "#b c #c5d6c5", | ||
316 | ".J c #c5dec5", | ||
317 | ".p c #cdcacd", | ||
318 | ".W c #cddecd", | ||
319 | ".L c #cde2cd", | ||
320 | ".K c #d5eacd", | ||
321 | ".V c #d5ead5", | ||
322 | ".y c #d5eed5", | ||
323 | "QtQtQtQtQtQtQtQtQtQtQtQtQtQt", | ||
324 | "QtQtQt.#.a.b.cQtQtQtQtQtQtQt", | ||
325 | "QtQt.d.e.f.g.h.i.c.j.dQt.kQt", | ||
326 | ".a.l.m.n.o.p.q.r.s.t.u.v.wQt", | ||
327 | ".x.y.z.A.B.C.D.p.q.E.F.G.H.I", | ||
328 | ".I.J.K.L.M.N.O.P.o.p.Q.R.S.T", | ||
329 | "Qt.U.V.L.W.X.Y.Z.0.P.1.s.2.3", | ||
330 | "Qt.3.X.W.4.X.5.6.7.8.9.s#.##", | ||
331 | "QtQt#a.X#b#c.5.6#d#e#f#g#h#i", | ||
332 | "QtQtQt#j.7#k.6#d#l#m#n#o#p#q", | ||
333 | "QtQtQtQt.k#r#s#m#t.H#u#v#w#x", | ||
334 | "QtQtQtQtQtQt.k#y#z.v#A#B#C#x", | ||
335 | "QtQtQtQtQtQtQtQt.k#D.w#s#E.k", | ||
336 | "QtQtQtQtQtQtQtQtQtQtQt#x#FQt"}; | ||
337 | |||
338 | // exit ZSafe and clear the clipboard for security reasons | ||
339 | void ZSafe::exitZs (int ec) | ||
340 | { | ||
341 | QClipboard *cb = QApplication::clipboard(); | ||
342 | cb->clear(); | ||
343 | |||
344 | exit (ec); | ||
345 | } | ||
346 | |||
347 | |||
348 | // save the configuration into the file | ||
349 | void ZSafe::saveConf () | ||
350 | { | ||
351 | if (conf) | ||
352 | { | ||
353 | delete conf; | ||
354 | |||
355 | #ifdef DESKTOP | ||
356 | #ifndef WIN32 | ||
357 | conf = new QSettings (); | ||
358 | conf->insertSearchPath (QSettings::Unix, QDir::homeDirPath()); | ||
359 | #else | ||
360 | conf = new QSettings (cfgFile); | ||
361 | conf->insertSearchPath (QSettings::Unix, cfgFile); | ||
362 | #endif | ||
363 | #else | ||
364 | conf = new Config (cfgFile, Config::File); | ||
365 | conf->setGroup ("zsafe"); | ||
366 | #endif | ||
367 | } | ||
368 | } | ||
369 | |||
370 | |||
371 | /* | ||
372 | * Constructs a ZSafe which is a child of 'parent', with the | ||
373 | * name 'name' and widget flags set to 'f' | ||
374 | * | ||
375 | * The dialog will by default be modeless, unless you set 'modal' to | ||
376 | * TRUE to construct a modal dialog. | ||
377 | */ | ||
378 | ZSafe::ZSafe( QWidget* parent, const char* name, bool modal, WFlags fl ) | ||
379 | : QDialog( parent, name, modal, fl ) | ||
380 | { | ||
381 | IsCut = false; | ||
382 | IsCopy = false; | ||
383 | modified = false; | ||
384 | |||
385 | // set the config file | ||
386 | cfgFile=QDir::homeDirPath(); | ||
387 | cfgFile += "/.zsafe.cfg"; | ||
388 | // set the icon path | ||
389 | QString qpedir ((const char *)getenv("QPEDIR")); | ||
390 | #ifdef DESKTOP | ||
391 | iconPath = QDir::homeDirPath() + "/pics/"; | ||
392 | #else | ||
393 | if (qpedir.isEmpty()) | ||
394 | iconPath = "/home/QtPalmtop/pics/"; | ||
395 | else | ||
396 | iconPath = qpedir + "/pics/"; | ||
397 | #endif | ||
398 | |||
399 | // create a zsafe configuration object | ||
400 | #ifdef DESKTOP | ||
401 | #ifndef WIN32 | ||
402 | conf = new QSettings (); | ||
403 | conf->insertSearchPath (QSettings::Unix, QDir::homeDirPath()); | ||
404 | #else | ||
405 | conf = new QSettings (cfgFile); | ||
406 | conf->insertSearchPath (QSettings::Unix, cfgFile); | ||
407 | #endif | ||
408 | #else | ||
409 | conf = new Config (cfgFile, Config::File); | ||
410 | conf->setGroup ("zsafePrefs"); | ||
411 | #endif | ||
412 | #ifdef DESKTOP | ||
413 | // #ifndef WIN32 | ||
414 | expandTree = conf->readBoolEntry(APP_KEY+"expandTree", false); | ||
415 | // #endif | ||
416 | #else | ||
417 | expandTree = conf->readNumEntry(APP_KEY+"expandTree", 0); | ||
418 | #endif | ||
419 | #ifndef DESKTOP | ||
420 | conf->setGroup ("zsafe"); | ||
421 | #endif | ||
422 | |||
423 | QPixmap copy_img((const char**) copy_xpm); | ||
424 | QPixmap cut_img((const char**) cut_xpm); | ||
425 | QPixmap edit_img((const char**) edit_xpm); | ||
426 | QPixmap editdelete_img((const char**) editdelete_xpm); | ||
427 | QPixmap find_img((const char**) find_xpm); | ||
428 | QPixmap folder_open_img((const char**) folder_open_xpm); | ||
429 | QPixmap help_icon_img((const char**) help_icon_xpm); | ||
430 | QPixmap new_img((const char**) new_xpm); | ||
431 | QPixmap paste_img((const char**) paste_xpm); | ||
432 | QPixmap quit_icon_img((const char**) quit_icon_xpm); | ||
433 | QPixmap save_img((const char**) save_xpm); | ||
434 | QPixmap trash_img((const char**) trash_xpm); | ||
435 | QPixmap expand_img((const char**) expand_xpm); | ||
436 | QPixmap export_img((const char**) export_xpm); | ||
437 | QPixmap import_img((const char**) import_xpm); | ||
438 | |||
439 | QPixmap bank_cards( ( const char** ) bank_cards_data ); | ||
440 | QPixmap passwords( ( const char** ) passwords_data ); | ||
441 | QPixmap software( ( const char** ) software_data ); | ||
442 | QPixmap general( ( const char** ) general_data ); | ||
443 | if ( !name ) | ||
444 | setName( "ZSafe" ); | ||
445 | |||
446 | #ifdef DESKTOP | ||
447 | #ifdef WIN32 | ||
448 | setGeometry(100, 150, DeskW, DeskH-30 ); | ||
449 | #else | ||
450 | resize( DeskW, DeskH-30 ); | ||
451 | #endif | ||
452 | // setMinimumSize( QSize( DeskW, DeskH-30 ) ); | ||
453 | // setMaximumSize( QSize( DeskW, DeskH-30 ) ); | ||
454 | #else | ||
455 | resize( DeskW, DeskH-30 ); | ||
456 | // setMinimumSize( QSize( DeskW, DeskH-30 ) ); | ||
457 | // setMaximumSize( QSize( 440, 290 ) ); | ||
458 | // setMaximumSize( QSize( DeskW+400, DeskH+200 ) ); | ||
459 | #endif | ||
460 | // setCaption( tr( "ZSafe" ) ); | ||
461 | |||
462 | filename = conf->readEntry(APP_KEY+"document"); | ||
463 | if (filename.isEmpty() || filename.isNull()) | ||
464 | { | ||
465 | |||
466 | // check if the directory application exists, if not | ||
467 | // create it | ||
468 | // #ifndef WIN32 | ||
469 | // QString d1("Documents/application"); | ||
470 | // #else | ||
471 | QString d1(QDir::homeDirPath() + "/Documents/application"); | ||
472 | // #endif | ||
473 | QDir pd1(d1); | ||
474 | if (!pd1.exists()) | ||
475 | { | ||
476 | QDir pd1("Documents"); | ||
477 | if (!pd1.mkdir("application", FALSE)) | ||
478 | { | ||
479 | QMessageBox::critical( 0, tr("ZSafe"), | ||
480 | tr("Can't create directory\n%1\n\nZSafe will now exit.").arg(d1)); | ||
481 | exitZs (1); | ||
482 | } | ||
483 | } | ||
484 | // #ifndef WIN32 | ||
485 | // QString d2("Documents/application/zsafe"); | ||
486 | // #else | ||
487 | QString d2(QDir::homeDirPath() + "/Documents/application/zsafe"); | ||
488 | // #endif | ||
489 | QDir pd2(d2); | ||
490 | if (!pd2.exists()) | ||
491 | { | ||
492 | QDir pd2("Documents/application"); | ||
493 | if (!pd2.mkdir("zsafe", FALSE)) | ||
494 | { | ||
495 | QMessageBox::critical( 0, tr("ZSafe"), | ||
496 | tr("Can't create directory\n%1\n\nZSafe will now exit.").arg(d2)); | ||
497 | exitZs (1); | ||
498 | } | ||
499 | } | ||
500 | |||
501 | |||
502 | // set the default filename | ||
503 | filename=d2 + "/passwords.zsf"; | ||
504 | |||
505 | // save the current filename to the config file | ||
506 | conf->writeEntry(APP_KEY+"document", filename); | ||
507 | saveConf(); | ||
508 | } | ||
509 | |||
510 | //if (filename == "INVALIDPWD") | ||
511 | //filename = ""; | ||
512 | |||
513 | QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); | ||
514 | #ifdef WIN32 | ||
515 | this->setCaption("Qt ZSafe: " + ti); | ||
516 | #else | ||
517 | this->setCaption("ZSafe: " + ti); | ||
518 | #endif | ||
519 | |||
520 | selectedItem = NULL; | ||
521 | lastSearchedCategory = NULL; | ||
522 | lastSearchedItem = NULL; | ||
523 | lastSearchedName = ""; | ||
524 | lastSearchedUsername = ""; | ||
525 | lastSearchedComment = ""; | ||
526 | |||
527 | infoForm = new InfoForm(); | ||
528 | categoryDialog = NULL; | ||
529 | |||
530 | // add a menu bar | ||
531 | QMenuBar *menu = new QMenuBar( this ); | ||
532 | |||
533 | // add file menu | ||
534 | // QPopupMenu *file = new QPopupMenu( this ); | ||
535 | file = new QPopupMenu( this ); | ||
536 | |||
537 | // #ifdef DESKTOP | ||
538 | file->insertItem( new_img, tr("&New document"), this, SLOT(newDocument()) ); | ||
539 | file->insertItem( folder_open_img, tr("&Open document"), this, SLOT(loadDocument()) ); | ||
540 | file->insertItem( save_img, tr("&Save document as .."), this, SLOT(saveDocumentAs()) ); | ||
541 | file->insertSeparator(); | ||
542 | // #endif | ||
543 | |||
544 | file->insertItem( save_img, tr("&Save document"), this, SLOT(saveDocumentWithoutPwd()) ); | ||
545 | file->insertItem( save_img, tr("S&ave document with new Password"), this, | ||
546 | SLOT(saveDocumentWithPwd()) ); | ||
547 | file->insertSeparator(); | ||
548 | file->insertItem( export_img, tr("&Export text file"), this, SLOT(writeAllEntries()) ); | ||
549 | file->insertItem( import_img, tr("&Import text file"), this, SLOT(readAllEntries()) ); | ||
550 | file->insertItem( trash_img, tr("&Remove text file"), this, SLOT(removeAsciiFile()) ); | ||
551 | file->insertSeparator(); | ||
552 | file->insertItem( expand_img, tr("&Open entries expanded"), this, | ||
553 | SLOT(setExpandFlag()), 0, 'o'); | ||
554 | file->setItemChecked('o', expandTree); | ||
555 | file->insertSeparator(); | ||
556 | file->insertItem( quit_icon_img, tr("E&xit"), this, SLOT(quitMe()) ); | ||
557 | menu->insertItem( tr("&File"), file ); | ||
558 | |||
559 | QPopupMenu *cat = new QPopupMenu( this ); | ||
560 | cat->insertItem( new_img, tr("&New"), this, SLOT(addCategory()) ); | ||
561 | cat->insertItem( edit_img, tr("&Edit"), this, SLOT(editCategory()) ); | ||
562 | cat->insertItem( trash_img, tr("&Delete"), this, SLOT(delCategory()) ); | ||
563 | menu->insertItem( tr("&Category"), cat ); | ||
564 | |||
565 | QPopupMenu *it = new QPopupMenu( this ); | ||
566 | it->insertItem( cut_img, tr("&Cut"), this, SLOT(cutItem()) ); | ||
567 | it->insertItem( copy_img, tr("C&opy"), this, SLOT(copyItem()) ); | ||
568 | it->insertItem( paste_img, tr("&Paste"), this, SLOT(pasteItem()) ); | ||
569 | it->insertSeparator(); | ||
570 | it->insertItem( new_img, tr("&New"), this, SLOT(newPwd()) ); | ||
571 | it->insertItem( edit_img, tr("&Edit"), this, SLOT(editPwd()) ); | ||
572 | it->insertItem( trash_img, tr("&Delete"), this, SLOT(deletePwd()) ); | ||
573 | it->insertItem( find_img, tr("&Search"), this, SLOT(findPwd()) ); | ||
574 | menu->insertItem( tr("&Entry"), it ); | ||
575 | |||
576 | QPopupMenu *help = new QPopupMenu( this ); | ||
577 | help->insertItem( help_icon_img, tr("&About"), this, SLOT(about()) ); | ||
578 | menu->insertItem( tr("&Help"), help ); | ||
579 | |||
580 | // toolbar icons | ||
581 | |||
582 | New = new QToolButton( menu, "New" ); | ||
583 | New->setGeometry( QRect( DeskW-84, 2, 20, 20 ) ); | ||
584 | New->setMouseTracking( TRUE ); | ||
585 | New->setText( tr( "" ) ); | ||
586 | New->setPixmap( new_img ); | ||
587 | QToolTip::add( New, tr( "New entry" ) ); | ||
588 | |||
589 | Edit = new QToolButton( menu, "Edit" ); | ||
590 | Edit->setGeometry( QRect( DeskW-64, 2, 20, 20 ) ); | ||
591 | Edit->setText( tr( "" ) ); | ||
592 | Edit->setPixmap( edit_img ); | ||
593 | QToolTip::add( Edit, tr( "Edit category or entry" ) ); | ||
594 | |||
595 | Delete = new QToolButton( menu, "Delete" ); | ||
596 | Delete->setGeometry( QRect( DeskW-44, 2, 20, 20 ) ); | ||
597 | Delete->setText( tr( "" ) ); | ||
598 | Delete->setPixmap( trash_img ); | ||
599 | QToolTip::add( Delete, tr( "Delete category or entry" ) ); | ||
600 | |||
601 | Find = new QToolButton( menu, "Find" ); | ||
602 | Find->setGeometry( QRect( DeskW-24, 2, 20, 20 ) ); | ||
603 | Find->setText( tr( "" ) ); | ||
604 | Find->setPixmap( find_img ); | ||
605 | QToolTip::add( Find, tr( "Find entry" ) ); | ||
606 | |||
607 | /* | ||
608 | QBoxLayout * h = new QHBoxLayout( this ); | ||
609 | h->addWidget (menu); | ||
610 | h->addWidget (New); | ||
611 | h->addWidget (Edit); | ||
612 | h->addWidget (Delete); | ||
613 | h->addWidget (Find); | ||
614 | */ | ||
615 | |||
616 | ListView = new ZListView( this, "ListView" ); | ||
617 | ListView->addColumn( tr( "Name" ) ); | ||
618 | ListView->addColumn( tr( "Field 2" ) ); | ||
619 | ListView->addColumn( tr( "Field 3" ) ); | ||
620 | ListView->addColumn( tr( "Comment" ) ); | ||
621 | ListView->addColumn( tr( "Field 4" ) ); | ||
622 | ListView->addColumn( tr( "Field 5" ) ); | ||
623 | ListView->setAllColumnsShowFocus(TRUE); | ||
624 | |||
625 | #ifdef DESKTOP | ||
626 | ListView->setResizePolicy(QScrollView::AutoOneFit); | ||
627 | // ListView->setGeometry( QRect( 0, 22, this->width(), this->height() - 30 ) ); | ||
628 | #else | ||
629 | ListView->setResizePolicy(QScrollView::AutoOneFit); | ||
630 | // ListView->setGeometry( QRect( 0, 22, | ||
631 | // this->width(), this->height() - 30 ) ); | ||
632 | // ListView->setMaximumSize( QSize( 440, 290 ) ); | ||
633 | #endif | ||
634 | ListView->setVScrollBarMode( QListView::Auto ); | ||
635 | |||
636 | QBoxLayout * l = new QVBoxLayout( this ); | ||
637 | l->addWidget (menu); | ||
638 | l->addWidget (ListView); | ||
639 | |||
640 | #ifndef DESKTOP | ||
641 | // start a timer (100 ms) to load the default document | ||
642 | docuTimer.start( 100, true ); | ||
643 | connect( &docuTimer, SIGNAL(timeout()), SLOT( slotLoadDocu() ) ); | ||
644 | raiseFlag = true; | ||
645 | connect( &raiseTimer, SIGNAL(timeout()), SLOT( slotRaiseTimer() ) ); | ||
646 | #else | ||
647 | // open the default document | ||
648 | openDocument(filename); | ||
649 | #endif | ||
650 | |||
651 | // signals and slots connections for QTollButton | ||
652 | connect( New, SIGNAL( clicked() ), this, SLOT( newPwd() ) ); | ||
653 | connect( Edit, SIGNAL( clicked() ), this, SLOT( editPwd() ) ); | ||
654 | connect( Delete, SIGNAL( clicked() ), this, SLOT( deletePwd() ) ); | ||
655 | connect( Find, SIGNAL( clicked() ), this, SLOT( findPwd() ) ); | ||
656 | // signals and slots connections for QListView | ||
657 | connect( ListView, SIGNAL( selectionChanged( QListViewItem* ) ), | ||
658 | this, SLOT( listViewSelected( QListViewItem* ) ) ); | ||
659 | connect( ListView, SIGNAL( doubleClicked( QListViewItem* ) ), | ||
660 | this, SLOT( showInfo( QListViewItem* ) ) ); | ||
661 | connect( ListView, SIGNAL( returnPressed( QListViewItem* ) ), | ||
662 | this, SLOT( showInfo( QListViewItem* ) ) ); | ||
663 | |||
664 | } | ||
665 | |||
666 | const QColor *ZSafe::evenRowColor = &Qt::white; | ||
667 | // const QColor *ZSafe::oddRowColor = &Qt::lightGray; | ||
668 | const QColor *ZSafe::oddRowColor = new QColor(216,240,255); | ||
669 | |||
670 | /* | ||
671 | * Destroys the object and frees any allocated resources | ||
672 | */ | ||
673 | ZSafe::~ZSafe() | ||
674 | { | ||
675 | // no need to delete child widgets, Qt does it all for us | ||
676 | quitMe(); | ||
677 | } | ||
678 | |||
679 | // load the default document | ||
680 | void ZSafe::slotLoadDocu() | ||
681 | { | ||
682 | openDocument (filename); | ||
683 | } | ||
684 | |||
685 | void ZSafe::deletePwd() | ||
686 | { | ||
687 | |||
688 | if (!selectedItem) | ||
689 | return; | ||
690 | if (!isCategory(selectedItem)) | ||
691 | { | ||
692 | switch( QMessageBox::information( this, tr("ZSafe"), | ||
693 | tr("Do you want to delete?"), | ||
694 | tr("&Delete"), tr("D&on't Delete"), | ||
695 | 0 // Enter == button 0 | ||
696 | ) ) { // Escape == button 2 | ||
697 | case 0: // Delete clicked, Alt-S or Enter pressed. | ||
698 | // Delete | ||
699 | modified = true; | ||
700 | selectedItem->parent()->takeItem(selectedItem); | ||
701 | selectedItem = NULL; | ||
702 | break; | ||
703 | case 1: // Don't delete | ||
704 | break; | ||
705 | } | ||
706 | } | ||
707 | else | ||
708 | { | ||
709 | delCategory(); | ||
710 | } | ||
711 | } | ||
712 | |||
713 | void ZSafe::editPwd() | ||
714 | { | ||
715 | if (!selectedItem) | ||
716 | return; | ||
717 | if (!isCategory(selectedItem)) | ||
718 | { | ||
719 | // open the 'New Entry' dialog | ||
720 | NewDialog *dialog = new NewDialog(this, tr("Edit Entry"), TRUE); | ||
721 | #ifdef WIN32 | ||
722 | dialog->setCaption ("Qt " + tr("Edit Entry")); | ||
723 | dialog->setGeometry(200, 250, 220, 310 ); | ||
724 | #endif | ||
725 | |||
726 | // set the labels | ||
727 | dialog->Name->setText(getFieldLabel (selectedItem, "1", tr("Name"))); | ||
728 | dialog->Username->setText(getFieldLabel (selectedItem, "2", tr("Username"))); | ||
729 | dialog->Password->setText(getFieldLabel (selectedItem, "3", tr("Password"))); | ||
730 | dialog->Comment->setText(getFieldLabel (selectedItem, "4", tr("Comment"))); | ||
731 | dialog->Field5Label->setText(getFieldLabel (selectedItem,"5", tr("Field 4"))); | ||
732 | dialog->Field6Label->setText(getFieldLabel (selectedItem,"6", tr("Field 5"))); | ||
733 | |||
734 | // set the fields | ||
735 | dialog->NameField->setText(selectedItem->text (0)); | ||
736 | dialog->UsernameField->setText(selectedItem->text (1)); | ||
737 | dialog->PasswordField->setText(selectedItem->text (2)); | ||
738 | QString comment = selectedItem->text (3); | ||
739 | comment.replace (QRegExp("<br>"), "\n"); | ||
740 | dialog->Field5->setText(selectedItem->text (4)); | ||
741 | dialog->Field6->setText(selectedItem->text (5)); | ||
742 | dialog->CommentField->insertLine(comment); | ||
743 | dialog->CommentField->setCursorPosition(0,0); | ||
744 | #ifdef DESKTOP | ||
745 | #ifndef WIN32 | ||
746 | dialog->show(); | ||
747 | #endif | ||
748 | #else | ||
749 | dialog->showMaximized(); | ||
750 | #endif | ||
751 | DialogCode result = (DialogCode) dialog->exec(); | ||
752 | |||
753 | #ifdef DESKTOP | ||
754 | result = Accepted; | ||
755 | #endif | ||
756 | if (result == Accepted) | ||
757 | { | ||
758 | modified = true; | ||
759 | // edit the selected item | ||
760 | QString name = dialog->NameField->text(); | ||
761 | selectedItem->setText (0, tr (name)); | ||
762 | QString user = dialog->UsernameField->text(); | ||
763 | selectedItem->setText (1, tr (user)); | ||
764 | QString pwd = dialog->PasswordField->text(); | ||
765 | selectedItem->setText (2, tr (pwd)); | ||
766 | QString comment = dialog->CommentField->text(); | ||
767 | comment.replace (QRegExp("\n"), "<br>"); | ||
768 | selectedItem->setText (3, tr (comment)); | ||
769 | QString f5 = dialog->Field5->text(); | ||
770 | selectedItem->setText (4, tr (f5)); | ||
771 | QString f6 = dialog->Field6->text(); | ||
772 | selectedItem->setText (5, tr (f6)); | ||
773 | } | ||
774 | |||
775 | delete dialog; | ||
776 | } | ||
777 | else | ||
778 | { | ||
779 | editCategory(); | ||
780 | } | ||
781 | } | ||
782 | |||
783 | void ZSafe::newPwd() | ||
784 | { | ||
785 | if (!selectedItem) | ||
786 | return; | ||
787 | |||
788 | if (!isCategory(selectedItem)) | ||
789 | selectedItem = selectedItem->parent(); | ||
790 | |||
791 | if (isCategory(selectedItem)) | ||
792 | { | ||
793 | QString cat = selectedItem->text(0); | ||
794 | |||
795 | // open the 'New Entry' dialog | ||
796 | NewDialog *dialog = new NewDialog(this, tr("New Entry"), TRUE); | ||
797 | #ifdef WIN32 | ||
798 | dialog->setCaption ("Qt " + tr("New Entry")); | ||
799 | dialog->setGeometry(200, 250, 220, 310 ); | ||
800 | #endif | ||
801 | // set the labels | ||
802 | dialog->Name->setText(getFieldLabel (selectedItem, "1", tr("Name"))); | ||
803 | dialog->Username->setText(getFieldLabel (selectedItem, "2", tr("Username"))); | ||
804 | dialog->Password->setText(getFieldLabel (selectedItem, "3", tr("Password"))); | ||
805 | dialog->Comment->setText(getFieldLabel (selectedItem, "4", tr("Comment"))); | ||
806 | dialog->Field5Label->setText(getFieldLabel (selectedItem,"5", tr("Field 4"))); | ||
807 | dialog->Field6Label->setText(getFieldLabel (selectedItem,"6", tr("Field 5"))); | ||
808 | retype: | ||
809 | #ifdef DESKTOP | ||
810 | #ifndef WIN32 | ||
811 | dialog->show(); | ||
812 | #endif | ||
813 | #else | ||
814 | dialog->showMaximized(); | ||
815 | #endif | ||
816 | DialogCode result = (DialogCode) dialog->exec(); | ||
817 | #ifdef DESKTOP | ||
818 | result = Accepted; | ||
819 | #endif | ||
820 | |||
821 | if (result == Accepted) | ||
822 | { | ||
823 | |||
824 | QString name = dialog->NameField->text(); | ||
825 | if (cat == name) | ||
826 | { | ||
827 | QMessageBox::critical( 0, tr("ZSafe"), | ||
828 | tr("Entry name must be different\nfrom the category name.") ); | ||
829 | goto retype; // it's not a good programming style :-) | ||
830 | } | ||
831 | |||
832 | modified = true; | ||
833 | // add the new item | ||
834 | QListViewItem *i = new ShadedListItem (0, selectedItem); | ||
835 | i->setOpen (TRUE); | ||
836 | |||
837 | i->setText (0, tr (name)); | ||
838 | QString user = dialog->UsernameField->text(); | ||
839 | i->setText (1, tr (user)); | ||
840 | QString pwd = dialog->PasswordField->text(); | ||
841 | i->setText (2, tr (pwd)); | ||
842 | QString comment = dialog->CommentField->text(); | ||
843 | comment.replace (QRegExp("\n"), "<br>"); | ||
844 | i->setText (3, tr (comment)); | ||
845 | QString f5 = dialog->Field5->text(); | ||
846 | i->setText (4, tr (f5)); | ||
847 | QString f6 = dialog->Field6->text(); | ||
848 | i->setText (5, tr (f6)); | ||
849 | } | ||
850 | |||
851 | delete dialog; | ||
852 | } | ||
853 | } | ||
854 | |||
855 | void ZSafe::findPwd() | ||
856 | { | ||
857 | |||
858 | // open the 'Search' dialog | ||
859 | SearchDialog *dialog = new SearchDialog(this, tr("Search"), TRUE); | ||
860 | #ifdef WIN32 | ||
861 | dialog->setCaption ("Qt " + tr("Search")); | ||
862 | #endif | ||
863 | |||
864 | #ifdef DESKTOP | ||
865 | #endif | ||
866 | if (lastSearchedName) | ||
867 | dialog->NameField->setText(lastSearchedName); | ||
868 | else | ||
869 | dialog->NameField->setText(""); | ||
870 | if (lastSearchedUsername) | ||
871 | dialog->UsernameField->setText(lastSearchedUsername); | ||
872 | else | ||
873 | dialog->UsernameField->setText(""); | ||
874 | if (lastSearchedComment) | ||
875 | dialog->CommentField->setText(lastSearchedComment); | ||
876 | else | ||
877 | dialog->CommentField->setText(""); | ||
878 | DialogCode result = (DialogCode) dialog->exec(); | ||
879 | #ifdef DESKTOP | ||
880 | result = Accepted; | ||
881 | #endif | ||
882 | |||
883 | QString name; | ||
884 | QString username; | ||
885 | QString comment; | ||
886 | if (result == Accepted) | ||
887 | { | ||
888 | name = dialog->NameField->text(); | ||
889 | username = dialog->UsernameField->text(); | ||
890 | comment = dialog->CommentField->text(); | ||
891 | qWarning (name); | ||
892 | } | ||
893 | else | ||
894 | { | ||
895 | delete dialog; | ||
896 | return; | ||
897 | } | ||
898 | |||
899 | if (!name.isEmpty() && name != lastSearchedName || | ||
900 | lastSearchedName.isEmpty() && !name.isEmpty()) | ||
901 | { | ||
902 | // set search at the beginning if a new name is given | ||
903 | lastSearchedCategory = NULL; | ||
904 | lastSearchedItem = NULL; | ||
905 | } | ||
906 | lastSearchedName = name; | ||
907 | if (!username.isEmpty() && username != lastSearchedUsername || | ||
908 | lastSearchedUsername.isEmpty() && !username.isEmpty()) | ||
909 | { | ||
910 | // set search at the beginning if a new name is given | ||
911 | lastSearchedCategory = NULL; | ||
912 | lastSearchedItem = NULL; | ||
913 | } | ||
914 | lastSearchedUsername = username; | ||
915 | if (!comment.isEmpty() && comment != lastSearchedComment || | ||
916 | lastSearchedComment.isEmpty() && !comment.isEmpty()) | ||
917 | { | ||
918 | // set search at the beginning if a new name is given | ||
919 | lastSearchedCategory = NULL; | ||
920 | lastSearchedItem = NULL; | ||
921 | } | ||
922 | lastSearchedComment = comment; | ||
923 | |||
924 | ListView->clearSelection(); | ||
925 | |||
926 | bool found=FALSE; | ||
927 | // step through all categories | ||
928 | QListViewItem *i; | ||
929 | if (lastSearchedCategory) | ||
930 | i = lastSearchedCategory; | ||
931 | else | ||
932 | i = ListView->firstChild(); | ||
933 | for (; | ||
934 | i != NULL; | ||
935 | i = i->nextSibling()) | ||
936 | { | ||
937 | qWarning (i->text(0)); | ||
938 | i->setSelected(FALSE); | ||
939 | |||
940 | // step through all subitems | ||
941 | QListViewItem *si; | ||
942 | if (lastSearchedItem) | ||
943 | si = lastSearchedItem; | ||
944 | else | ||
945 | si = i->firstChild(); | ||
946 | // for (si = i->firstChild(); | ||
947 | for (; | ||
948 | si != NULL; | ||
949 | si = si->nextSibling()) | ||
950 | { | ||
951 | qWarning (si->text(0)); | ||
952 | if (si->isSelected()) | ||
953 | si->setSelected(FALSE); | ||
954 | // ListView->repaintItem(si); | ||
955 | |||
956 | bool n=TRUE; | ||
957 | bool u=TRUE; | ||
958 | bool c=TRUE; | ||
959 | if (!name.isEmpty()) | ||
960 | n = (si->text(0)).contains (name, FALSE); | ||
961 | if (!username.isEmpty()) | ||
962 | u = (si->text(1)).contains (username, FALSE); | ||
963 | if (!comment.isEmpty()) | ||
964 | c = (si->text(3)).contains (comment, FALSE); | ||
965 | |||
966 | if ((n && u && c ) && !found) | ||
967 | { | ||
968 | qWarning ("Found"); | ||
969 | selectedItem = si; | ||
970 | si->setSelected(TRUE); | ||
971 | ListView->setCurrentItem(si); | ||
972 | ListView->ensureItemVisible(si); | ||
973 | ListView->triggerUpdate(); | ||
974 | |||
975 | lastSearchedCategory = i; | ||
976 | // set to the next item | ||
977 | lastSearchedItem = si->nextSibling(); | ||
978 | if (!lastSearchedItem) | ||
979 | { | ||
980 | // no next item within category -> set next category | ||
981 | lastSearchedCategory = i->nextSibling(); | ||
982 | if (!lastSearchedCategory) | ||
983 | lastSearchedItem = NULL; // END | ||
984 | } | ||
985 | |||
986 | found = TRUE; | ||
987 | delete dialog; | ||
988 | update(); | ||
989 | return; | ||
990 | } | ||
991 | } | ||
992 | lastSearchedCategory = i->nextSibling(); | ||
993 | lastSearchedItem = NULL; | ||
994 | } | ||
995 | lastSearchedCategory = NULL; | ||
996 | lastSearchedItem = NULL; | ||
997 | delete dialog; | ||
998 | update(); | ||
999 | QMessageBox::information( this, tr("ZSafe"), | ||
1000 | tr("Entry not found"), tr("&OK"), 0); | ||
1001 | |||
1002 | } | ||
1003 | |||
1004 | QString ZSafe::getFieldLabel (QListViewItem *_item, QString field, QString def) | ||
1005 | { | ||
1006 | QString category; | ||
1007 | if (_item) | ||
1008 | { | ||
1009 | if (isCategory(_item)) | ||
1010 | { | ||
1011 | category = _item->text(0); | ||
1012 | } | ||
1013 | else | ||
1014 | { | ||
1015 | QListViewItem *cat = _item->parent(); | ||
1016 | category = cat->text(0); | ||
1017 | } | ||
1018 | } | ||
1019 | else | ||
1020 | { | ||
1021 | return def; | ||
1022 | } | ||
1023 | |||
1024 | QString app_key = APP_KEY; | ||
1025 | #ifndef DESKTOP | ||
1026 | #ifndef WIN32 | ||
1027 | conf->setGroup ("fieldDefs"); | ||
1028 | #endif | ||
1029 | #else | ||
1030 | #ifndef WIN32 | ||
1031 | app_key += "/fieldDefs/"; | ||
1032 | #endif | ||
1033 | #endif | ||
1034 | // #ifndef WIN32 | ||
1035 | QString label = conf->readEntry(app_key+category+"-field"+field,def); | ||
1036 | // #else | ||
1037 | // QString label(def); | ||
1038 | // #endif | ||
1039 | |||
1040 | #ifndef DESKTOP | ||
1041 | conf->setGroup ("zsafe"); | ||
1042 | #endif | ||
1043 | return label; | ||
1044 | } | ||
1045 | |||
1046 | QString ZSafe::getFieldLabel (QString category, QString field, QString def) | ||
1047 | { | ||
1048 | QString app_key = APP_KEY; | ||
1049 | #ifndef DESKTOP | ||
1050 | conf->setGroup ("fieldDefs"); | ||
1051 | #else | ||
1052 | #ifndef WIN32 | ||
1053 | app_key += "/fieldDefs/"; | ||
1054 | #endif | ||
1055 | #endif | ||
1056 | // #ifndef WIN32 | ||
1057 | QString label = conf->readEntry(app_key+category+"-field"+field, | ||
1058 | def); | ||
1059 | // #else | ||
1060 | // QString label(def); | ||
1061 | // #endif | ||
1062 | #ifndef DESKTOP | ||
1063 | conf->setGroup ("zsafe"); | ||
1064 | #endif | ||
1065 | return label; | ||
1066 | } | ||
1067 | |||
1068 | void ZSafe::showInfo( QListViewItem *_item) | ||
1069 | { | ||
1070 | if (!_item) | ||
1071 | return; | ||
1072 | if (selectedItem != NULL) | ||
1073 | selectedItem->setSelected(FALSE); | ||
1074 | |||
1075 | selectedItem = _item; | ||
1076 | selectedItem->setSelected(TRUE); | ||
1077 | |||
1078 | if (!isCategory(_item)) | ||
1079 | { | ||
1080 | /* | ||
1081 | QString label=selectedItem->text(0); | ||
1082 | label+="\n"; | ||
1083 | label+=selectedItem->text(1); | ||
1084 | label+="\n"; | ||
1085 | label+=selectedItem->text(2); | ||
1086 | label+="\n"; | ||
1087 | label+=selectedItem->text(3); | ||
1088 | */ | ||
1089 | |||
1090 | QString text; | ||
1091 | QString entry; | ||
1092 | |||
1093 | text = "<html><body><div align=""center""><u><b>"; | ||
1094 | text += selectedItem->text(0); | ||
1095 | text += "</b></u><br></div><br>"; | ||
1096 | |||
1097 | entry = selectedItem->text(1); | ||
1098 | if (!entry.isEmpty() && entry.compare(" ")) | ||
1099 | { | ||
1100 | text += "<u><b>"; | ||
1101 | text += getFieldLabel (selectedItem, "2", tr("Username")); | ||
1102 | text += ":<br></b></u><blockquote>"; | ||
1103 | text += entry; | ||
1104 | text += "</blockquote>"; | ||
1105 | // text += "<br>"; | ||
1106 | } | ||
1107 | |||
1108 | entry = selectedItem->text(2); | ||
1109 | if (!entry.isEmpty() && entry.compare(" ")) | ||
1110 | { | ||
1111 | text += "<u><b>"; | ||
1112 | text += getFieldLabel (selectedItem, "3", tr("Password")); | ||
1113 | text += ":<br> </b></u><blockquote>"; | ||
1114 | text += entry; | ||
1115 | text += "</blockquote>"; | ||
1116 | // text += "<br>"; | ||
1117 | } | ||
1118 | |||
1119 | entry = selectedItem->text(4); | ||
1120 | if (!entry.isEmpty() && entry.compare(" ")) | ||
1121 | { | ||
1122 | text += "<u><b>"; | ||
1123 | text += getFieldLabel (selectedItem, "5", tr("Field 4")); | ||
1124 | text += ":<br> </b></u><blockquote>"; | ||
1125 | text += entry; | ||
1126 | text += "</blockquote>"; | ||
1127 | // text += "<br>"; | ||
1128 | } | ||
1129 | |||
1130 | entry = selectedItem->text(5); | ||
1131 | if (!entry.isEmpty() && entry.compare(" ")) | ||
1132 | { | ||
1133 | text += "<u><b>"; | ||
1134 | text += getFieldLabel (selectedItem, "6", tr("Field 5")); | ||
1135 | text += ":<br> </b></u><blockquote>"; | ||
1136 | text += entry; | ||
1137 | text += "</blockquote>"; | ||
1138 | // text += "<br>"; | ||
1139 | } | ||
1140 | |||
1141 | entry = selectedItem->text(3); | ||
1142 | if (!entry.isEmpty() && entry.compare(" ")) | ||
1143 | { | ||
1144 | text += "<u><b>"; | ||
1145 | text += getFieldLabel (selectedItem, "4", tr("Comment")); | ||
1146 | text += ":<br> </b></u>"; | ||
1147 | QString comment = selectedItem->text(3); | ||
1148 | comment.replace (QRegExp("\n"), "<br>"); | ||
1149 | text += comment; | ||
1150 | // text += "<br>"; | ||
1151 | } | ||
1152 | |||
1153 | text += "</body></html>"; | ||
1154 | |||
1155 | infoForm->InfoText->setText(text); | ||
1156 | infoForm->hide(); | ||
1157 | #ifdef DESKTOP | ||
1158 | infoForm->show(); | ||
1159 | #else | ||
1160 | infoForm->showMaximized(); | ||
1161 | #endif | ||
1162 | |||
1163 | } | ||
1164 | } | ||
1165 | |||
1166 | void ZSafe::listViewSelected( QListViewItem *_item) | ||
1167 | { | ||
1168 | if (!_item) | ||
1169 | return; | ||
1170 | if (selectedItem != NULL) | ||
1171 | selectedItem->setSelected(FALSE); | ||
1172 | |||
1173 | selectedItem = _item; | ||
1174 | |||
1175 | #ifndef DESKTOP | ||
1176 | // set the column text dependent on the selected item | ||
1177 | ListView->setColumnText(0, getFieldLabel (selectedItem, "1", tr("Name"))); | ||
1178 | ListView->setColumnText(1, getFieldLabel (selectedItem, "2", tr("Field 2"))); | ||
1179 | ListView->setColumnText(2, getFieldLabel (selectedItem, "3", tr("Field 3"))); | ||
1180 | ListView->setColumnText(3, getFieldLabel (selectedItem, "4", tr("Comment"))); | ||
1181 | ListView->setColumnText(4, getFieldLabel (selectedItem, "5", tr("Field 4"))); | ||
1182 | ListView->setColumnText(5, getFieldLabel (selectedItem, "6", tr("Field 5"))); | ||
1183 | #endif | ||
1184 | #ifdef WIN32 | ||
1185 | // set the column text dependent on the selected item | ||
1186 | ListView->setColumnText(0, getFieldLabel (selectedItem, "1", tr("Name"))); | ||
1187 | ListView->setColumnText(1, getFieldLabel (selectedItem, "2", tr("Field 2"))); | ||
1188 | ListView->setColumnText(2, getFieldLabel (selectedItem, "3", tr("Field 3"))); | ||
1189 | ListView->setColumnText(3, getFieldLabel (selectedItem, "4", tr("Comment"))); | ||
1190 | ListView->setColumnText(4, getFieldLabel (selectedItem, "5", tr("Field 4"))); | ||
1191 | ListView->setColumnText(5, getFieldLabel (selectedItem, "6", tr("Field 5"))); | ||
1192 | #endif | ||
1193 | |||
1194 | } | ||
1195 | |||
1196 | bool ZSafe::isCategory(QListViewItem *_item) | ||
1197 | { | ||
1198 | QString categoryName = _item->text (0); | ||
1199 | if (categories.find ((const char *)categoryName)) | ||
1200 | return TRUE; | ||
1201 | else | ||
1202 | return FALSE; | ||
1203 | } | ||
1204 | |||
1205 | void ZSafe::removeAsciiFile() | ||
1206 | { | ||
1207 | // QString fn = filename + ".txt"; | ||
1208 | // open the file dialog | ||
1209 | #ifndef DESKTOP | ||
1210 | QString fn = ScQtFileEdit::getOpenFileName(this, | ||
1211 | tr ("Remove text file"), | ||
1212 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
1213 | "*.txt"); | ||
1214 | #else | ||
1215 | QString fn = QFileDialog::getOpenFileName( | ||
1216 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
1217 | "ZSafe (*.txt)", | ||
1218 | this, | ||
1219 | "ZSafe File Dialog" | ||
1220 | "Choose a text file" ); | ||
1221 | #endif | ||
1222 | |||
1223 | if (fn && fn.length() > 0 ) | ||
1224 | { | ||
1225 | QFile f( fn ); | ||
1226 | if ( !f.remove() ) | ||
1227 | { | ||
1228 | qWarning( QString("Could not remove file %1").arg(fn), | ||
1229 | 2000 ); | ||
1230 | QMessageBox::critical( 0, tr("ZSafe"), | ||
1231 | tr("Could not remove text file.") ); | ||
1232 | return; | ||
1233 | } | ||
1234 | } | ||
1235 | } | ||
1236 | |||
1237 | void ZSafe::writeAllEntries() | ||
1238 | { | ||
1239 | if (filename.isEmpty()) | ||
1240 | { | ||
1241 | QMessageBox::critical( 0, tr("ZSafe"), | ||
1242 | tr("No document defined.\nYou have to create a new document")); | ||
1243 | return; | ||
1244 | } | ||
1245 | |||
1246 | // open the file dialog | ||
1247 | #ifndef DESKTOP | ||
1248 | QString fn = ScQtFileEdit::getSaveAsFileName(this, | ||
1249 | tr ("Export text file"), | ||
1250 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
1251 | "*.txt"); | ||
1252 | #else | ||
1253 | QString fn = QFileDialog::getSaveFileName( | ||
1254 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
1255 | "ZSafe (*.txt)", | ||
1256 | this, | ||
1257 | "ZSafe File Dialog" | ||
1258 | "Choose a text file" ); | ||
1259 | #endif | ||
1260 | |||
1261 | // open the new document | ||
1262 | if (fn && fn.length() > 0 ) | ||
1263 | { | ||
1264 | QFile f( fn ); | ||
1265 | if ( !f.open( IO_WriteOnly ) ) { | ||
1266 | qWarning( QString("Could not write to file %1").arg(fn), | ||
1267 | 2000 ); | ||
1268 | QMessageBox::critical( 0, "ZSafe", | ||
1269 | QString("Could not export to text file.") ); | ||
1270 | return; | ||
1271 | } | ||
1272 | QTextStream t( &f ); | ||
1273 | |||
1274 | QListViewItem *i; | ||
1275 | // step through all categories | ||
1276 | for (i = ListView->firstChild(); | ||
1277 | i != NULL; | ||
1278 | i = i->nextSibling()) | ||
1279 | { | ||
1280 | // step through all subitems | ||
1281 | QListViewItem *si; | ||
1282 | for (si = i->firstChild(); | ||
1283 | si != NULL; | ||
1284 | si = si->nextSibling()) | ||
1285 | { | ||
1286 | QString oneEntry; | ||
1287 | oneEntry += "\""; | ||
1288 | oneEntry += i->text(0); | ||
1289 | oneEntry += "\";"; | ||
1290 | oneEntry += "\""; | ||
1291 | oneEntry += si->text(0); | ||
1292 | oneEntry += "\";"; | ||
1293 | oneEntry += "\""; | ||
1294 | oneEntry += si->text(1); | ||
1295 | oneEntry += "\";"; | ||
1296 | oneEntry += "\""; | ||
1297 | oneEntry += si->text(2); | ||
1298 | oneEntry += "\";"; | ||
1299 | oneEntry += "\""; | ||
1300 | QString comment = si->text(3); | ||
1301 | comment.replace (QRegExp("\n"), "<br>"); | ||
1302 | oneEntry += comment; | ||
1303 | oneEntry += "\";"; | ||
1304 | oneEntry += "\""; | ||
1305 | oneEntry += si->text(4); | ||
1306 | oneEntry += "\";"; | ||
1307 | oneEntry += "\""; | ||
1308 | oneEntry += si->text(5); | ||
1309 | oneEntry += "\""; | ||
1310 | // qWarning (oneEntry); | ||
1311 | t << oneEntry << endl; | ||
1312 | |||
1313 | // qWarning (si->text(0)); | ||
1314 | } | ||
1315 | } | ||
1316 | f.close(); | ||
1317 | } | ||
1318 | } | ||
1319 | |||
1320 | void ZSafe::readAllEntries() | ||
1321 | { | ||
1322 | if (filename.isEmpty()) | ||
1323 | { | ||
1324 | QMessageBox::critical( 0, tr("ZSafe"), | ||
1325 | tr("No document defined.\nYou have to create a new document")); | ||
1326 | return; | ||
1327 | } | ||
1328 | |||
1329 | // open the file dialog | ||
1330 | #ifndef DESKTOP | ||
1331 | QString fn = ScQtFileEdit::getOpenFileName(this, | ||
1332 | tr ("Import text file"), | ||
1333 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
1334 | "*.txt"); | ||
1335 | #else | ||
1336 | QString fn = QFileDialog::getOpenFileName( | ||
1337 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
1338 | "ZSafe (*.txt)", | ||
1339 | this, | ||
1340 | "ZSafe File Dialog" | ||
1341 | "Choose a text file" ); | ||
1342 | #endif | ||
1343 | |||
1344 | if (fn && fn.length() > 0 ) | ||
1345 | { | ||
1346 | QFile f( fn ); | ||
1347 | if ( !f.open( IO_ReadOnly ) ) | ||
1348 | { | ||
1349 | qWarning( QString("Could not read file %1").arg(fn), | ||
1350 | 2000 ); | ||
1351 | QMessageBox::critical( 0, "ZSafe", | ||
1352 | QString("Could not import text file.") ); | ||
1353 | return; | ||
1354 | } | ||
1355 | |||
1356 | modified = true; | ||
1357 | |||
1358 | // clear the password list | ||
1359 | selectedItem = NULL; | ||
1360 | QListViewItem *i; | ||
1361 | // step through all categories | ||
1362 | for (i = ListView->firstChild(); | ||
1363 | i != NULL; | ||
1364 | i = i->nextSibling()) | ||
1365 | { | ||
1366 | // step through all subitems | ||
1367 | QListViewItem *si; | ||
1368 | for (si = i->firstChild(); | ||
1369 | si != NULL; ) | ||
1370 | // si = si->nextSibling()) | ||
1371 | { | ||
1372 | QListViewItem *_si = si; | ||
1373 | si = si->nextSibling(); | ||
1374 | i->takeItem(_si); // remove from view list | ||
1375 | if (_si) delete _si; | ||
1376 | } | ||
1377 | } | ||
1378 | |||
1379 | qWarning ("ReadAllEntries(): "); | ||
1380 | |||
1381 | QTextStream t(&f); | ||
1382 | while ( !t.eof() ) | ||
1383 | { | ||
1384 | QString s = t.readLine(); | ||
1385 | s.replace (QRegExp("\";\""), "\"|\""); | ||
1386 | // char buffer[1024]; | ||
1387 | #ifndef WIN32 | ||
1388 | char buffer[s.length()+1]; | ||
1389 | #else | ||
1390 | char buffer[4048]; | ||
1391 | #endif | ||
1392 | strcpy (buffer, s); | ||
1393 | |||
1394 | QString name; | ||
1395 | QString user; | ||
1396 | QString password; | ||
1397 | QString comment; | ||
1398 | QString field5=""; | ||
1399 | QString field6=""; | ||
1400 | |||
1401 | // separete the entries | ||
1402 | char *i = strtok (buffer, "|"); | ||
1403 | QString category(&i[1]); | ||
1404 | category.truncate(category.length() -1); | ||
1405 | |||
1406 | int idx=0; | ||
1407 | while ((i = strtok (NULL, "|")) != NULL) | ||
1408 | { | ||
1409 | switch (idx) | ||
1410 | { | ||
1411 | case 0: | ||
1412 | name = &i[1]; | ||
1413 | name.truncate(name.length() -1); | ||
1414 | // name | ||
1415 | break; | ||
1416 | case 1: | ||
1417 | // user | ||
1418 | user = &i[1]; | ||
1419 | user.truncate(user.length() -1); | ||
1420 | break; | ||
1421 | case 2: | ||
1422 | // password | ||
1423 | password = &i[1]; | ||
1424 | password.truncate(password.length() -1); | ||
1425 | break; | ||
1426 | case 3: | ||
1427 | // comment | ||
1428 | comment = &i[1]; | ||
1429 | comment.truncate(comment.length() -1); | ||
1430 | break; | ||
1431 | case 4: | ||
1432 | // field5 | ||
1433 | field5 = &i[1]; | ||
1434 | field5.truncate(field5.length() -1); | ||
1435 | break; | ||
1436 | case 5: | ||
1437 | // field6 | ||
1438 | field6 = &i[1]; | ||
1439 | field6.truncate(field6.length() -1); | ||
1440 | break; | ||
1441 | } | ||
1442 | idx++; | ||
1443 | } | ||
1444 | |||
1445 | Category *cat= categories.find (category); | ||
1446 | if (cat) | ||
1447 | { | ||
1448 | // use the existend item | ||
1449 | QListViewItem *catItem = cat->getListItem(); | ||
1450 | if (catItem) | ||
1451 | { | ||
1452 | QListViewItem * item = new ShadedListItem( 0, catItem ); | ||
1453 | item->setText( 0, tr( name ) ); | ||
1454 | item->setText( 1, tr( user ) ); | ||
1455 | item->setText( 2, tr( password ) ); | ||
1456 | item->setText( 3, tr( comment ) ); | ||
1457 | item->setText( 4, tr( field5 ) ); | ||
1458 | item->setText( 5, tr( field6 ) ); | ||
1459 | catItem->setOpen( TRUE ); | ||
1460 | } | ||
1461 | } | ||
1462 | else | ||
1463 | { | ||
1464 | QListViewItem *catI = new ShadedListItem( 1, ListView ); | ||
1465 | // create and insert a new item | ||
1466 | QListViewItem * item = new ShadedListItem( 0, catI ); | ||
1467 | item->setText( 0, tr( name ) ); | ||
1468 | item->setText( 1, tr( user ) ); | ||
1469 | item->setText( 2, tr( password ) ); | ||
1470 | item->setText( 3, tr( comment ) ); | ||
1471 | item->setText( 4, tr( field5 ) ); | ||
1472 | item->setText( 5, tr( field6 ) ); | ||
1473 | catI->setOpen( TRUE ); | ||
1474 | |||
1475 | Category *c1 = new Category(); | ||
1476 | c1->setCategoryName(category); | ||
1477 | |||
1478 | QString icon; | ||
1479 | QString fullIconPath; | ||
1480 | QPixmap *pix; | ||
1481 | // #ifndef WIN32 | ||
1482 | icon = conf->readEntry(APP_KEY+category); | ||
1483 | // #endif | ||
1484 | bool isIconAv = false; | ||
1485 | if (!icon.isEmpty() && !icon.isNull()) | ||
1486 | { | ||
1487 | // build the full path | ||
1488 | fullIconPath = iconPath + icon; | ||
1489 | pix = new QPixmap (fullIconPath); | ||
1490 | if (pix) | ||
1491 | { | ||
1492 | QImage img = pix->convertToImage(); | ||
1493 | pix->convertFromImage(img.smoothScale(14,14)); | ||
1494 | c1->setIconName (icon); | ||
1495 | c1->setIcon (*pix); | ||
1496 | isIconAv = true; | ||
1497 | } | ||
1498 | } | ||
1499 | if (!isIconAv) | ||
1500 | { | ||
1501 | c1->setIcon (*getPredefinedIcon(category)); | ||
1502 | } | ||
1503 | c1->setListItem (catI); | ||
1504 | c1->initListItem(); | ||
1505 | categories.insert (c1->getCategoryName(), c1); | ||
1506 | } | ||
1507 | |||
1508 | } | ||
1509 | f.close(); | ||
1510 | |||
1511 | } | ||
1512 | else | ||
1513 | { | ||
1514 | } | ||
1515 | |||
1516 | } | ||
1517 | |||
1518 | #ifdef UNUSED | ||
1519 | void ZSafe::writeAllEntries() | ||
1520 | { | ||
1521 | // open the file for writing | ||
1522 | QString fn = filename + ".txt"; | ||
1523 | QFile f( fn ); | ||
1524 | if ( !f.open( IO_WriteOnly ) ) { | ||
1525 | qWarning( QString("Could not write to file %1").arg(fn), | ||
1526 | 2000 ); | ||
1527 | QMessageBox::critical( 0, tr("ZSafe"), | ||
1528 | tr("Could not export to text file.") ); | ||
1529 | return; | ||
1530 | } | ||
1531 | QTextStream t( &f ); | ||
1532 | |||
1533 | QListViewItem *i; | ||
1534 | // step through all categories | ||
1535 | for (i = ListView->firstChild(); | ||
1536 | i != NULL; | ||
1537 | i = i->nextSibling()) | ||
1538 | { | ||
1539 | // step through all subitems | ||
1540 | QListViewItem *si; | ||
1541 | for (si = i->firstChild(); | ||
1542 | si != NULL; | ||
1543 | si = si->nextSibling()) | ||
1544 | { | ||
1545 | QString oneEntry; | ||
1546 | oneEntry += "\""; | ||
1547 | oneEntry += i->text(0); | ||
1548 | oneEntry += "\";"; | ||
1549 | oneEntry += "\""; | ||
1550 | oneEntry += si->text(0); | ||
1551 | oneEntry += "\";"; | ||
1552 | oneEntry += "\""; | ||
1553 | oneEntry += si->text(1); | ||
1554 | oneEntry += "\";"; | ||
1555 | oneEntry += "\""; | ||
1556 | oneEntry += si->text(2); | ||
1557 | oneEntry += "\";"; | ||
1558 | oneEntry += "\""; | ||
1559 | // oneEntry += si->text(3); | ||
1560 | QString comment = si->text(3); | ||
1561 | comment.replace (QRegExp("\n"), "<br>"); | ||
1562 | oneEntry += comment; | ||
1563 | oneEntry += "\""; | ||
1564 | // qWarning (oneEntry); | ||
1565 | t << oneEntry << endl; | ||
1566 | |||
1567 | // qWarning (si->text(0)); | ||
1568 | } | ||
1569 | } | ||
1570 | f.close(); | ||
1571 | } | ||
1572 | |||
1573 | void ZSafe::readAllEntries() | ||
1574 | { | ||
1575 | QString fn = filename + ".txt"; | ||
1576 | QFile f( fn ); | ||
1577 | if ( !f.open( IO_ReadOnly ) ) | ||
1578 | { | ||
1579 | qWarning( QString("Could not read file %1").arg(fn), | ||
1580 | 2000 ); | ||
1581 | QMessageBox::critical( 0, tr("ZSafe"), | ||
1582 | tr("Could not import text file.") ); | ||
1583 | return; | ||
1584 | } | ||
1585 | |||
1586 | modified = true; | ||
1587 | |||
1588 | // clear the password list | ||
1589 | selectedItem = NULL; | ||
1590 | QListViewItem *i; | ||
1591 | // step through all categories | ||
1592 | for (i = ListView->firstChild(); | ||
1593 | i != NULL; | ||
1594 | i = i->nextSibling()) | ||
1595 | { | ||
1596 | // step through all subitems | ||
1597 | QListViewItem *si; | ||
1598 | for (si = i->firstChild(); | ||
1599 | si != NULL; ) | ||
1600 | // si = si->nextSibling()) | ||
1601 | { | ||
1602 | QListViewItem *_si = si; | ||
1603 | si = si->nextSibling(); | ||
1604 | i->takeItem(_si); // remove from view list | ||
1605 | if (_si) delete _si; | ||
1606 | } | ||
1607 | } | ||
1608 | |||
1609 | qWarning ("ReadAllEntries(): "); | ||
1610 | |||
1611 | QTextStream t(&f); | ||
1612 | while ( !t.eof() ) | ||
1613 | { | ||
1614 | QString s = t.readLine(); | ||
1615 | s.replace (QRegExp("\";\""), "\"|\""); | ||
1616 | // char buffer[1024]; | ||
1617 | int len=s.length()+1; | ||
1618 | #ifdef WIN32 | ||
1619 | char buffer[512]; | ||
1620 | #else | ||
1621 | char buffer[len]; | ||
1622 | #endif | ||
1623 | strcpy (buffer, s); | ||
1624 | |||
1625 | QString name; | ||
1626 | QString user; | ||
1627 | QString password; | ||
1628 | QString comment; | ||
1629 | |||
1630 | // separete the entries | ||
1631 | char *i = strtok (buffer, "|"); | ||
1632 | QString category(&i[1]); | ||
1633 | category.truncate(category.length() -1); | ||
1634 | |||
1635 | int idx=0; | ||
1636 | while (i = strtok (NULL, "|")) | ||
1637 | { | ||
1638 | switch (idx) | ||
1639 | { | ||
1640 | case 0: | ||
1641 | name = &i[1]; | ||
1642 | name.truncate(name.length() -1); | ||
1643 | // name | ||
1644 | break; | ||
1645 | case 1: | ||
1646 | // user | ||
1647 | user = &i[1]; | ||
1648 | user.truncate(user.length() -1); | ||
1649 | break; | ||
1650 | case 2: | ||
1651 | // password | ||
1652 | password = &i[1]; | ||
1653 | password.truncate(password.length() -1); | ||
1654 | break; | ||
1655 | case 3: | ||
1656 | // comment | ||
1657 | comment = &i[1]; | ||
1658 | comment.truncate(comment.length() -1); | ||
1659 | break; | ||
1660 | } | ||
1661 | idx++; | ||
1662 | } | ||
1663 | |||
1664 | Category *cat= categories.find (category); | ||
1665 | if (cat) | ||
1666 | { | ||
1667 | // use the existend item | ||
1668 | QListViewItem *catItem = cat->getListItem(); | ||
1669 | if (catItem) | ||
1670 | { | ||
1671 | QListViewItem * item = new ShadedListItem( 0, catItem ); | ||
1672 | item->setText( 0, tr( name ) ); | ||
1673 | item->setText( 1, tr( user ) ); | ||
1674 | item->setText( 2, tr( password ) ); | ||
1675 | item->setText( 3, tr( comment ) ); | ||
1676 | catItem->setOpen( TRUE ); | ||
1677 | } | ||
1678 | } | ||
1679 | else | ||
1680 | { | ||
1681 | QListViewItem *catI = new ShadedListItem( 1, ListView ); | ||
1682 | // create and insert a new item | ||
1683 | QListViewItem * item = new ShadedListItem( 0, catI ); | ||
1684 | item->setText( 0, tr( name ) ); | ||
1685 | item->setText( 1, tr( user ) ); | ||
1686 | item->setText( 2, tr( password ) ); | ||
1687 | item->setText( 3, tr( comment ) ); | ||
1688 | catI->setOpen( TRUE ); | ||
1689 | |||
1690 | Category *c1 = new Category(); | ||
1691 | c1->setCategoryName(category); | ||
1692 | |||
1693 | QString icon; | ||
1694 | QString fullIconPath; | ||
1695 | QPixmap *pix; | ||
1696 | // #ifndef WIN32 | ||
1697 | icon = conf->readEntry(APP_KEY+category); | ||
1698 | // #endif | ||
1699 | bool isIconAv = false; | ||
1700 | if (!icon.isEmpty() && !icon.isNull()) | ||
1701 | { | ||
1702 | // build the full path | ||
1703 | fullIconPath = iconPath + icon; | ||
1704 | pix = new QPixmap (fullIconPath); | ||
1705 | if (pix) | ||
1706 | { | ||
1707 | QImage img = pix->convertToImage(); | ||
1708 | pix->convertFromImage(img.smoothScale(14,14)); | ||
1709 | c1->setIconName (icon); | ||
1710 | c1->setIcon (*pix); | ||
1711 | isIconAv = true; | ||
1712 | } | ||
1713 | } | ||
1714 | if (!isIconAv) | ||
1715 | { | ||
1716 | c1->setIcon (*getPredefinedIcon(category)); | ||
1717 | } | ||
1718 | c1->setListItem (catI); | ||
1719 | c1->initListItem(); | ||
1720 | categories.insert (c1->getCategoryName(), c1); | ||
1721 | } | ||
1722 | |||
1723 | } | ||
1724 | f.close(); | ||
1725 | |||
1726 | } | ||
1727 | #endif // UNUSED | ||
1728 | |||
1729 | void ZSafe::resume(int) | ||
1730 | { | ||
1731 | qWarning ("Resume"); | ||
1732 | // hide the main window | ||
1733 | |||
1734 | infoForm->hide(); | ||
1735 | // open zsafe again | ||
1736 | m_password = ""; | ||
1737 | selectedItem = NULL; | ||
1738 | |||
1739 | // clear the password list | ||
1740 | QListViewItem *i; | ||
1741 | // step through all categories | ||
1742 | for (i = ListView->firstChild(); | ||
1743 | i != NULL; | ||
1744 | i = i->nextSibling()) | ||
1745 | { | ||
1746 | // step through all subitems | ||
1747 | QListViewItem *si; | ||
1748 | for (si = i->firstChild(); | ||
1749 | si != NULL; ) | ||
1750 | { | ||
1751 | QListViewItem *_si = si; | ||
1752 | si = si->nextSibling(); | ||
1753 | i->takeItem(_si); // remove from view list | ||
1754 | if (_si) delete _si; | ||
1755 | } | ||
1756 | } | ||
1757 | |||
1758 | // ask for password and read again | ||
1759 | openDocument(filename); | ||
1760 | } | ||
1761 | |||
1762 | //--------------------------------------------- | ||
1763 | |||
1764 | |||
1765 | bool ZSafe::openDocument(const char* _filename, const char* ) | ||
1766 | { | ||
1767 | int retval; | ||
1768 | char* entry[FIELD_SIZE]; | ||
1769 | // #ifndef WIN32 | ||
1770 | int validationFlag = conf->readNumEntry(APP_KEY+"valzsafe", 1); | ||
1771 | // #else | ||
1772 | // int validationFlag = 1; | ||
1773 | // #endif | ||
1774 | |||
1775 | int pwdOk = 0; | ||
1776 | int numberOfTries = 3; | ||
1777 | for (int i=0; i < numberOfTries; i++) | ||
1778 | { | ||
1779 | QFile f(_filename); | ||
1780 | if (f.exists()) | ||
1781 | { | ||
1782 | // ask with a dialog for the password | ||
1783 | if (m_password.isEmpty()) | ||
1784 | getDocPassword(tr("Enter Password")); | ||
1785 | if (m_password.isEmpty() && validationFlag == 0) | ||
1786 | { | ||
1787 | qWarning ("Wrong password"); | ||
1788 | QMessageBox::critical( 0, tr("ZSafe"), | ||
1789 | tr("Wrong password.\n\nZSafe will now exit.") ); | ||
1790 | exitZs (1); | ||
1791 | } | ||
1792 | |||
1793 | retval = loadInit(_filename, m_password); | ||
1794 | if (retval != PWERR_GOOD) | ||
1795 | { | ||
1796 | qWarning ("Error loading Document"); | ||
1797 | return false; | ||
1798 | } | ||
1799 | } | ||
1800 | else | ||
1801 | { | ||
1802 | #ifdef WIN32 | ||
1803 | this->setCaption("Qt ZSafe"); | ||
1804 | #else | ||
1805 | this->setCaption("ZSafe"); | ||
1806 | #endif | ||
1807 | filename = ""; | ||
1808 | return false; | ||
1809 | } | ||
1810 | |||
1811 | |||
1812 | // load the validation entry | ||
1813 | if (validationFlag == 0) | ||
1814 | { | ||
1815 | pwdOk = 1; | ||
1816 | break; | ||
1817 | } | ||
1818 | |||
1819 | retval = loadEntry(entry); | ||
1820 | if (retval == 1 && | ||
1821 | !strcmp (entry[0], "ZSAFECATEGORY") && | ||
1822 | !strcmp (entry[1], "name") && | ||
1823 | !strcmp (entry[2], "username") && | ||
1824 | !strcmp (entry[3], "password") && | ||
1825 | !strcmp (entry[4], "comment") ) | ||
1826 | { | ||
1827 | for (int count = 0; count < FIELD_SIZE; count++) free(entry[count]); | ||
1828 | pwdOk = 1; | ||
1829 | break; | ||
1830 | } | ||
1831 | else | ||
1832 | // for (int count = 0; count < FIELD_SIZE; count++) free(entry[count]); | ||
1833 | fclose (fd); | ||
1834 | m_password = ""; | ||
1835 | |||
1836 | if (i < numberOfTries - 1) | ||
1837 | { | ||
1838 | switch( QMessageBox::warning( this, tr("ZSafe"), | ||
1839 | tr("Wrong password.\nEnter again?"), | ||
1840 | tr("&Yes"), tr("&No."), | ||
1841 | 0 | ||
1842 | ) ) | ||
1843 | { | ||
1844 | case 1: // No | ||
1845 | exitZs (1); | ||
1846 | break; | ||
1847 | case 0: // Yes | ||
1848 | continue; | ||
1849 | } | ||
1850 | } | ||
1851 | } | ||
1852 | if (pwdOk == 0) | ||
1853 | { | ||
1854 | // unset the document entry | ||
1855 | conf->writeEntry(APP_KEY+"document", "INVALIDPWD"); | ||
1856 | if (conf) | ||
1857 | delete conf; | ||
1858 | |||
1859 | exitZs (1); | ||
1860 | } | ||
1861 | |||
1862 | |||
1863 | retval = loadEntry(entry); | ||
1864 | |||
1865 | int numberOfEntries=0; | ||
1866 | while (retval == 1) { | ||
1867 | |||
1868 | QString category(entry[0]); | ||
1869 | QString name(entry[1]); | ||
1870 | QString user(entry[2]); | ||
1871 | QString password(entry[3]); | ||
1872 | QString comment(entry[4]); | ||
1873 | QString field5(entry[5]); | ||
1874 | QString field6(entry[6]); | ||
1875 | // add the subitems to the categories | ||
1876 | |||
1877 | Category *cat= categories.find (category); | ||
1878 | if (cat) | ||
1879 | { | ||
1880 | // use the existend item | ||
1881 | QListViewItem *catItem = cat->getListItem(); | ||
1882 | if (catItem) | ||
1883 | { | ||
1884 | QListViewItem * item = new ShadedListItem( 0, catItem ); | ||
1885 | item->setText( 0, tr( name ) ); | ||
1886 | item->setText( 1, tr( user ) ); | ||
1887 | item->setText( 2, tr( password ) ); | ||
1888 | item->setText( 3, tr( comment ) ); | ||
1889 | item->setText( 4, tr( field5 ) ); | ||
1890 | item->setText( 5, tr( field6 ) ); | ||
1891 | if (expandTree) | ||
1892 | catItem->setOpen( TRUE ); | ||
1893 | numberOfEntries++; | ||
1894 | } | ||
1895 | } | ||
1896 | else | ||
1897 | { | ||
1898 | QListViewItem *catI = new ShadedListItem( 1, ListView ); | ||
1899 | // create and insert a new item | ||
1900 | QListViewItem * item = new ShadedListItem( 0, catI ); | ||
1901 | item->setText( 0, tr( name ) ); | ||
1902 | item->setText( 1, tr( user ) ); | ||
1903 | item->setText( 2, tr( password ) ); | ||
1904 | item->setText( 3, tr( comment ) ); | ||
1905 | item->setText( 4, tr( field5 ) ); | ||
1906 | item->setText( 5, tr( field6 ) ); | ||
1907 | if (expandTree) | ||
1908 | catI->setOpen( TRUE ); | ||
1909 | |||
1910 | Category *c1 = new Category(); | ||
1911 | c1->setCategoryName(category); | ||
1912 | |||
1913 | QString icon; | ||
1914 | QString fullIconPath; | ||
1915 | QPixmap *pix; | ||
1916 | // #ifndef WIN32 | ||
1917 | icon = conf->readEntry(APP_KEY+category); | ||
1918 | // #endif | ||
1919 | bool isIconAv = false; | ||
1920 | if (!icon.isEmpty() && !icon.isNull()) | ||
1921 | { | ||
1922 | // build the full path | ||
1923 | fullIconPath = iconPath + icon; | ||
1924 | pix = new QPixmap (fullIconPath); | ||
1925 | if (pix) | ||
1926 | { | ||
1927 | QImage img = pix->convertToImage(); | ||
1928 | pix->convertFromImage(img.smoothScale(14,14)); | ||
1929 | c1->setIconName (icon); | ||
1930 | c1->setIcon (*pix); | ||
1931 | isIconAv = true; | ||
1932 | } | ||
1933 | } | ||
1934 | if (!isIconAv) | ||
1935 | { | ||
1936 | c1->setIcon (*getPredefinedIcon(category)); | ||
1937 | } | ||
1938 | |||
1939 | c1->setListItem (catI); | ||
1940 | c1->initListItem(); | ||
1941 | categories.insert (c1->getCategoryName(), c1); | ||
1942 | numberOfEntries++; | ||
1943 | } | ||
1944 | |||
1945 | for (int count = 0; count < FIELD_SIZE; count++) { | ||
1946 | free(entry[count]); | ||
1947 | } | ||
1948 | retval = loadEntry(entry); | ||
1949 | if (retval == 2) { | ||
1950 | // m_parent->slotStatusHelpMsg("Last entry loaded"); | ||
1951 | } | ||
1952 | } // end while | ||
1953 | |||
1954 | if (numberOfEntries == 0) | ||
1955 | { | ||
1956 | |||
1957 | switch( QMessageBox::warning( this, tr("ZSafe"), | ||
1958 | tr("Empty document or\nwrong password.\nContinue?"), | ||
1959 | tr("&No"), tr("&Yes."), | ||
1960 | 0 | ||
1961 | ) ) { | ||
1962 | case 0: // No | ||
1963 | retval = loadFinalize(); | ||
1964 | exitZs (1); | ||
1965 | break; | ||
1966 | case 1: // Yes | ||
1967 | break; | ||
1968 | } | ||
1969 | } | ||
1970 | |||
1971 | retval = loadFinalize(); | ||
1972 | |||
1973 | return true; | ||
1974 | } | ||
1975 | |||
1976 | int ZSafe::loadInit(const char* _filename, const char *password) | ||
1977 | { | ||
1978 | unsigned int j = 0; | ||
1979 | unsigned int keylength=0; | ||
1980 | int count=0, count2=0, count3=0; | ||
1981 | unsigned char charbuf[8]; | ||
1982 | unsigned short ciphertext[4]; | ||
1983 | char key[128]; | ||
1984 | Krc2* krc2 = new Krc2(); | ||
1985 | |||
1986 | fd = fopen (_filename, "rb"); | ||
1987 | |||
1988 | QFileInfo f (_filename); | ||
1989 | load_buffer_length = f.size(); | ||
1990 | load_buffer_length = ((load_buffer_length / 1024)+1) * 1024 * 2; | ||
1991 | |||
1992 | if (fd == NULL) | ||
1993 | return PWERR_OPEN; | ||
1994 | |||
1995 | buffer = (char *)malloc(load_buffer_length); | ||
1996 | for (j = 0; password[j] != '\0'; j++) { | ||
1997 | key[j] = password[j]; | ||
1998 | } | ||
1999 | keylength = j; | ||
2000 | krc2->rc2_expandkey (key, keylength, 128); | ||
2001 | |||
2002 | #ifndef WIN32 | ||
2003 | size = read(fileno (fd), (unsigned char *) (charbuf + count), 8); | ||
2004 | #else | ||
2005 | printf ("LoadInit() read1"); | ||
2006 | size = fread ((unsigned char *) (charbuf + count), sizeof(unsigned char), 8, fd); | ||
2007 | #endif | ||
2008 | |||
2009 | if (size < 8) | ||
2010 | return PWERR_DATA; | ||
2011 | |||
2012 | for (count = 0; count < 4; count++) { | ||
2013 | count2 = count << 1; | ||
2014 | iv[count] = charbuf[count2] << 8; | ||
2015 | iv[count] += charbuf[count2 + 1]; | ||
2016 | } | ||
2017 | |||
2018 | size = 0; | ||
2019 | bufferIndex = 0; | ||
2020 | #ifndef WIN32 | ||
2021 | while ((count = read (fileno (fd), (unsigned char *) charbuf, 8)) > 0) { | ||
2022 | while (count < 8) { | ||
2023 | count2 = read (fileno (fd), (unsigned char *) (charbuf + count), 8); | ||
2024 | #else | ||
2025 | printf ("LoadInit() read2"); | ||
2026 | while ((count = fread ((unsigned char *) (charbuf), sizeof(unsigned char), 8, fd)) > 0) { | ||
2027 | while (count < 8) { | ||
2028 | count2 = fread ((unsigned char *) (charbuf + count), sizeof(unsigned char), 8, fd); | ||
2029 | #endif | ||
2030 | if (count2 == 0) { | ||
2031 | return PWERR_DATA; | ||
2032 | } | ||
2033 | count += count2; | ||
2034 | } /* while (count < 8) */ | ||
2035 | |||
2036 | size += 8; | ||
2037 | for (count2 = 0; count2 < 8; count2 += 2) { | ||
2038 | count3 = count2 >> 1; | ||
2039 | ciphertext[count3] = charbuf[count2] << 8; | ||
2040 | ciphertext[count3] += charbuf[count2 + 1]; | ||
2041 | |||
2042 | plaintext[count3] = ciphertext[count3] ^ iv[count3]; | ||
2043 | iv[count3] = plaintext[count3]; | ||
2044 | } /* for (count2) */ | ||
2045 | |||
2046 | krc2->rc2_decrypt (plaintext); | ||
2047 | memcpy ((unsigned char *) (buffer + bufferIndex), plaintext, 8); | ||
2048 | bufferIndex += 8; | ||
2049 | buffer[bufferIndex + 1] = '\0'; | ||
2050 | } /* while ((count = read (fileno (fd), (unsigned char *) charbuf, 8)) > 0) */ | ||
2051 | size -= buffer[size - 1]; | ||
2052 | lastcount = 0; | ||
2053 | |||
2054 | /* This will point to the starting index */ | ||
2055 | bufferIndex = 0; | ||
2056 | return PWERR_GOOD; | ||
2057 | } | ||
2058 | |||
2059 | int ZSafe::loadEntry(char *entry[FIELD_SIZE]) | ||
2060 | { | ||
2061 | /* Strip off PKCS 5 padding | ||
2062 | * Should check to make sure it's good here | ||
2063 | */ | ||
2064 | int count, count1=0; | ||
2065 | |||
2066 | for (count = lastcount; count < size; count++) { | ||
2067 | if ((unsigned char) (buffer[count]) == 255) { | ||
2068 | if (buffer[bufferIndex] == '\0') { | ||
2069 | bufferIndex++; | ||
2070 | } | ||
2071 | entry[count1] = (char *) malloc (count - bufferIndex + 1); | ||
2072 | memcpy (entry[count1], (unsigned char *) (buffer + bufferIndex), count - bufferIndex); | ||
2073 | entry[count1][count - bufferIndex] = '\0'; | ||
2074 | count++; | ||
2075 | bufferIndex = count; | ||
2076 | count1++; | ||
2077 | if (count1 == FIELD_SIZE) { | ||
2078 | lastcount = count; | ||
2079 | return 1; | ||
2080 | } | ||
2081 | } /* if ((unsigned char) (buffer[count]) == 255) */ | ||
2082 | } /* for (count = 0; count < size; count++) */ | ||
2083 | |||
2084 | return 2; | ||
2085 | } | ||
2086 | |||
2087 | int ZSafe::loadFinalize(void) | ||
2088 | { | ||
2089 | fclose (fd); | ||
2090 | if (buffer) free(buffer); | ||
2091 | return PWERR_GOOD; | ||
2092 | } | ||
2093 | |||
2094 | bool ZSafe::saveDocument(const char* _filename, | ||
2095 | bool withPwd, | ||
2096 | const char* ) | ||
2097 | { | ||
2098 | if (filename.isEmpty()) | ||
2099 | { | ||
2100 | QMessageBox::critical( 0, tr("ZSafe"), | ||
2101 | tr("No document defined.\nYou have to create a new document")); | ||
2102 | return false; | ||
2103 | } | ||
2104 | |||
2105 | // if (m_password.isEmpty()) | ||
2106 | // withPwd = true; // the document must be saved with a valid password | ||
2107 | if (withPwd) | ||
2108 | { | ||
2109 | bool pwdOk = FALSE; | ||
2110 | while (!pwdOk) | ||
2111 | { | ||
2112 | getDocPassword(tr("Enter Password")); | ||
2113 | if (m_password.isEmpty()) | ||
2114 | { | ||
2115 | |||
2116 | QMessageBox::critical( 0, tr("ZSafe"), | ||
2117 | tr("Password is empty.\nPlease enter again.")); | ||
2118 | continue; | ||
2119 | } | ||
2120 | |||
2121 | QString firstPasswd = m_password; | ||
2122 | |||
2123 | getDocPassword(tr("Reenter Password")); | ||
2124 | if (m_password.isEmpty()) | ||
2125 | { | ||
2126 | QMessageBox::critical( 0, tr("ZSafe"), | ||
2127 | tr("Password is empty.\nPlease enter again.")); | ||
2128 | continue; | ||
2129 | } | ||
2130 | if (firstPasswd != m_password) | ||
2131 | { | ||
2132 | |||
2133 | QMessageBox::critical( 0, tr("ZSafe"), | ||
2134 | tr("Passwords must be identical.\nPlease enter again.")); | ||
2135 | continue; | ||
2136 | } | ||
2137 | pwdOk = TRUE; | ||
2138 | modified = false; | ||
2139 | } | ||
2140 | } | ||
2141 | else if (modified) | ||
2142 | { | ||
2143 | QString fns(_filename); | ||
2144 | fns = fns.right (fns.length() - fns.findRev ('/') - 1); | ||
2145 | switch( QMessageBox::information( this, tr("ZSafe"), | ||
2146 | tr("Do you want to save ") + fns + tr("\nbefore continuing?"), | ||
2147 | tr("&Save"), | ||
2148 | tr("&Don't Save"), | ||
2149 | 0 // Enter == button 0 | ||
2150 | ) ) | ||
2151 | { // Escape == button 2 | ||
2152 | case 0: // Save clicked, Alt-S or Enter pressed. | ||
2153 | modified = false; | ||
2154 | break; | ||
2155 | case 1: // Don't Save clicked or Alt-D pressed | ||
2156 | modified = false; | ||
2157 | return true; | ||
2158 | } | ||
2159 | } | ||
2160 | modified = false; | ||
2161 | |||
2162 | if (m_password.isEmpty()) | ||
2163 | return false; | ||
2164 | |||
2165 | int retval = saveInit(_filename, m_password); | ||
2166 | // int retval = saveInit(_filename, "test"); | ||
2167 | if (retval != PWERR_GOOD) { | ||
2168 | return false; | ||
2169 | } | ||
2170 | |||
2171 | char* entry[FIELD_SIZE]; | ||
2172 | |||
2173 | // save the validation entry | ||
2174 | { | ||
2175 | int i=0; | ||
2176 | entry[i] = (char*)malloc(strlen("ZSAFECATEGORY")+1); | ||
2177 | strcpy(entry[i++], "ZSAFECATEGORY"); | ||
2178 | entry[i] = (char*)malloc(strlen("name")+1); | ||
2179 | strcpy(entry[i++], "name"); | ||
2180 | entry[i] = (char*)malloc(strlen("username")+1); | ||
2181 | strcpy(entry[i++], "username"); | ||
2182 | entry[i] = (char*)malloc(strlen("password")+1); | ||
2183 | strcpy(entry[i++], "password"); | ||
2184 | entry[i] = (char*)malloc(strlen("comment")+1); | ||
2185 | strcpy(entry[i++], "comment"); | ||
2186 | |||
2187 | entry[i] = (char*)malloc(strlen("field5")+1); | ||
2188 | strcpy(entry[i++], "field5"); | ||
2189 | entry[i] = (char*)malloc(strlen("field6")+1); | ||
2190 | strcpy(entry[i++], "field6"); | ||
2191 | |||
2192 | retval = saveEntry(entry); | ||
2193 | for (int z=0; z<i; z++) free(entry[z]); | ||
2194 | if (retval == PWERR_DATA) { | ||
2195 | qWarning("1: Error writing file, contents not saved"); | ||
2196 | saveFinalize(); | ||
2197 | return false; | ||
2198 | } | ||
2199 | // #ifndef WIN32 | ||
2200 | conf->writeEntry(APP_KEY+"valzsafe", 1); | ||
2201 | // #endif | ||
2202 | saveConf(); | ||
2203 | } | ||
2204 | |||
2205 | QListViewItem *i; | ||
2206 | // step through all categories | ||
2207 | for (i = ListView->firstChild(); | ||
2208 | i != NULL; | ||
2209 | i = i->nextSibling()) | ||
2210 | { | ||
2211 | // step through all subitems | ||
2212 | QListViewItem *si; | ||
2213 | for (si = i->firstChild(); | ||
2214 | si != NULL; | ||
2215 | si = si->nextSibling()) | ||
2216 | { | ||
2217 | int j=0; | ||
2218 | entry[j] = (char*)malloc(strlen(i->text(0))+1); | ||
2219 | strcpy(entry[j++], i->text(0)); | ||
2220 | entry[j] = (char*)malloc(strlen(si->text(0))+1); | ||
2221 | strcpy(entry[j++], si->text(0)); | ||
2222 | entry[j] = (char*)malloc(strlen(si->text(1))+1); | ||
2223 | strcpy(entry[j++], si->text(1)); | ||
2224 | entry[j] = (char*)malloc(strlen(si->text(2))+1); | ||
2225 | strcpy(entry[j++], si->text(2)); | ||
2226 | entry[j] = (char*)malloc(strlen(si->text(3))+1); | ||
2227 | strcpy(entry[j++], si->text(3)); | ||
2228 | |||
2229 | entry[j] = (char*)malloc(strlen(si->text(4))+1); | ||
2230 | strcpy(entry[j++], si->text(4)); | ||
2231 | entry[j] = (char*)malloc(strlen(si->text(5))+1); | ||
2232 | strcpy(entry[j++], si->text(5)); | ||
2233 | |||
2234 | retval = saveEntry(entry); | ||
2235 | for (int z=0; z<j; z++) | ||
2236 | { | ||
2237 | free(entry[z]); | ||
2238 | } | ||
2239 | if (retval == PWERR_DATA) { | ||
2240 | qWarning("1: Error writing file, contents not saved"); | ||
2241 | saveFinalize(); | ||
2242 | return false; | ||
2243 | } | ||
2244 | |||
2245 | } | ||
2246 | } | ||
2247 | |||
2248 | if (saveFinalize() == PWERR_DATA) { | ||
2249 | qWarning("2: Error writing file, contents not saved"); | ||
2250 | return false; | ||
2251 | } else { | ||
2252 | #ifndef DESKTOP | ||
2253 | Global::statusMessage (tr("Password file saved.")); | ||
2254 | #endif | ||
2255 | modified = false; | ||
2256 | return true; | ||
2257 | } | ||
2258 | } | ||
2259 | |||
2260 | PasswordForm *newPwdDialog; | ||
2261 | bool newPwdDialogResult = false; | ||
2262 | void ZSafe::setPasswordDialogDone() | ||
2263 | { | ||
2264 | newPwdDialogResult = true; | ||
2265 | newPwdDialog->close(); | ||
2266 | } | ||
2267 | |||
2268 | void ZSafe::getDocPassword(QString title) | ||
2269 | { | ||
2270 | qWarning ("getDocPassword"); | ||
2271 | // open the 'Password' dialog | ||
2272 | PasswordForm *dialog = new PasswordForm(this, title, TRUE); | ||
2273 | newPwdDialog = dialog; | ||
2274 | newPwdDialogResult = false; | ||
2275 | |||
2276 | connect( dialog->PasswordField, SIGNAL( returnPressed() ), | ||
2277 | this, SLOT( setPasswordDialogDone() ) ); | ||
2278 | |||
2279 | // CS: !!! | ||
2280 | // int pos = filename.findRev ('/'); | ||
2281 | QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); | ||
2282 | #ifdef WIN32 | ||
2283 | dialog->setCaption("Qt " + ti); | ||
2284 | #else | ||
2285 | dialog->setCaption(ti); | ||
2286 | #endif | ||
2287 | // dialog->setCaption(title); | ||
2288 | |||
2289 | dialog->PasswordField->setFocus(); | ||
2290 | DialogCode result = (DialogCode) dialog->exec(); | ||
2291 | #ifdef DESKTOP | ||
2292 | result = Accepted; | ||
2293 | #endif | ||
2294 | |||
2295 | QString password; | ||
2296 | if (result == Accepted || newPwdDialogResult) | ||
2297 | { | ||
2298 | m_password = dialog->PasswordField->text(); | ||
2299 | } | ||
2300 | else | ||
2301 | { | ||
2302 | exitZs (1); | ||
2303 | } | ||
2304 | } | ||
2305 | |||
2306 | int ZSafe::saveInit(const char *_filename, const char *password) | ||
2307 | { | ||
2308 | char key[128]; | ||
2309 | unsigned int j = 0; | ||
2310 | unsigned int keylength; | ||
2311 | // int val; | ||
2312 | int count2; | ||
2313 | Krc2* krc2 = new Krc2(); | ||
2314 | |||
2315 | /* first we should check the permissions of the filename */ | ||
2316 | /* | ||
2317 | if (QFile::exists(_filename)) { | ||
2318 | val = checkFile(_filename); | ||
2319 | if (val != PWERR_GOOD) | ||
2320 | return val; | ||
2321 | } else | ||
2322 | { | ||
2323 | val = creat (_filename, (S_IRUSR | S_IWUSR)); | ||
2324 | if (val == -1) | ||
2325 | return PWERR_OPEN; | ||
2326 | else | ||
2327 | close(val); | ||
2328 | } | ||
2329 | */ | ||
2330 | QFileInfo f (_filename); | ||
2331 | save_buffer_length = f.size(); | ||
2332 | save_buffer_length = ((save_buffer_length / 1024)+1) * 1024; | ||
2333 | |||
2334 | fd = fopen (_filename, "wb"); | ||
2335 | if (fd == NULL) | ||
2336 | return PWERR_OPEN; | ||
2337 | |||
2338 | buffer = (char*)malloc(save_buffer_length); | ||
2339 | |||
2340 | /* make the key ready */ | ||
2341 | for (j = 0; password[j] != '\0'; j++) { | ||
2342 | key[j] = password[j]; | ||
2343 | } | ||
2344 | keylength = j; | ||
2345 | krc2->rc2_expandkey (key, keylength, 128); | ||
2346 | |||
2347 | /* First, we make the IV */ | ||
2348 | for (count2 = 0; count2 < 4; count2++) { | ||
2349 | iv[count2] = rand (); | ||
2350 | putc ((unsigned char) (iv[count2] >> 8), fd); | ||
2351 | putc ((unsigned char) (iv[count2] & 0xff), fd); | ||
2352 | } | ||
2353 | |||
2354 | bufferIndex = 0; | ||
2355 | return PWERR_GOOD; | ||
2356 | } | ||
2357 | |||
2358 | |||
2359 | int ZSafe::saveEntry(char *entry[FIELD_SIZE]) | ||
2360 | { | ||
2361 | char *text1; | ||
2362 | int count2, count3; | ||
2363 | unsigned short ciphertext[4]; | ||
2364 | Krc2* krc2 = new Krc2(); | ||
2365 | |||
2366 | buffer = (char*)memset(buffer, '\0', save_buffer_length); | ||
2367 | |||
2368 | for (count2 = 0; count2 < FIELD_SIZE; count2++) { | ||
2369 | text1 = entry[count2]; | ||
2370 | if (strlen (text1) == 0) { | ||
2371 | strncat(buffer, " ", strlen(" ")); | ||
2372 | } else { | ||
2373 | strncat(buffer, text1, strlen(text1)); | ||
2374 | } | ||
2375 | /* Use 255 as the marker. \n is too tough to test for */ | ||
2376 | buffer[strlen (buffer)] = 255; | ||
2377 | } /*for (count2 = 0; count2 < 5; count2++)*/ | ||
2378 | count2 = 0; | ||
2379 | /* I'm using CBC mode and encrypting the data straight from top down. | ||
2380 | * At the bottom, encrypted, I will append an MD5 hash of the file, eventually. | ||
2381 | * PKCS 5 padding (explained at the code section | ||
2382 | */ | ||
2383 | while (count2 < (int)strlen (buffer)) { | ||
2384 | #ifndef WORDS_BIGENDIAN | ||
2385 | plaintext[bufferIndex] = buffer[count2 + 1] << 8; | ||
2386 | plaintext[bufferIndex] += buffer[count2] & 0xff; | ||
2387 | #endif | ||
2388 | #ifdef WORDS_BIGENDIAN | ||
2389 | plaintext[bufferIndex] = buffer[count2] << 8; | ||
2390 | plaintext[bufferIndex] += buffer[count2 + 1] & 0xff; | ||
2391 | #endif | ||
2392 | bufferIndex++; | ||
2393 | if (bufferIndex == 4) { | ||
2394 | krc2->rc2_encrypt (plaintext); | ||
2395 | |||
2396 | for (count3 = 0; count3 < 4; count3++) { | ||
2397 | ciphertext[count3] = iv[count3] ^ plaintext[count3]; | ||
2398 | |||
2399 | /* Now store the ciphertext as the iv */ | ||
2400 | iv[count3] = plaintext[count3]; | ||
2401 | |||
2402 | /* reset the buffer index */ | ||
2403 | bufferIndex = 0; | ||
2404 | if (putc ((unsigned char) (ciphertext[count3] >> 8), fd) == EOF) return PWERR_DATA; | ||
2405 | if (putc ((unsigned char) (ciphertext[count3] & 0xff), fd) == EOF) return PWERR_DATA; | ||
2406 | } /*for (count3 = 0; count3 < 5; count3++)*/ | ||
2407 | } /*if (bufferIndex == 5)*/ | ||
2408 | /* increment a short, not a byte */ | ||
2409 | count2 += 2; | ||
2410 | } /*while (count2 < strlen (buffer))*/ | ||
2411 | int ret = PWERR_GOOD; | ||
2412 | return ret; | ||
2413 | } | ||
2414 | |||
2415 | int ZSafe::saveFinalize(void) | ||
2416 | { | ||
2417 | int count1, retval = PWERR_GOOD; | ||
2418 | unsigned short ciphertext[4]; | ||
2419 | Krc2* krc2 = new Krc2(); | ||
2420 | |||
2421 | /* Tack on the PKCS 5 padding | ||
2422 | * How it works is we fill up the last n bytes with the value n | ||
2423 | * | ||
2424 | * So, if we have, say, 13 bytes, 8 of which are used, we have 5 left | ||
2425 | * over, leaving us 3 short, so we fill it in with 3's. | ||
2426 | * | ||
2427 | * If we come out even, we fill it with 8 8s | ||
2428 | * | ||
2429 | * um, except that in this instance we are using 4 shorts instead of 8 bytes. | ||
2430 | * so, half everything | ||
2431 | */ | ||
2432 | for (count1 = bufferIndex; count1 < 4; count1++) { | ||
2433 | plaintext[count1] = (4 - bufferIndex); | ||
2434 | } | ||
2435 | krc2->rc2_encrypt (plaintext); | ||
2436 | for (count1 = 0; count1 < 4; count1++) { | ||
2437 | ciphertext[count1] = iv[count1] ^ plaintext[count1]; | ||
2438 | if (putc ((unsigned char) (ciphertext[count1] >> 8), fd) == EOF) retval = PWERR_DATA; | ||
2439 | if (putc ((unsigned char) (ciphertext[count1] & 0xff), fd) == EOF) retval = PWERR_DATA; | ||
2440 | } | ||
2441 | |||
2442 | fclose (fd); | ||
2443 | free(buffer); | ||
2444 | return retval; | ||
2445 | } | ||
2446 | |||
2447 | void ZSafe::quitMe () | ||
2448 | { | ||
2449 | qWarning ("QUIT..."); | ||
2450 | |||
2451 | if (modified) | ||
2452 | { | ||
2453 | switch( QMessageBox::information( this, tr("ZSafe"), | ||
2454 | tr("Do you want to save\nbefore exiting?"), | ||
2455 | tr("&Save"), | ||
2456 | tr("S&ave with\nnew\npassword"), | ||
2457 | tr("&Don't Save"), | ||
2458 | 0 // Enter == button 0 | ||
2459 | ) ) | ||
2460 | { // Escape == button 2 | ||
2461 | case 0: // Save clicked, Alt-S or Enter pressed. | ||
2462 | // save | ||
2463 | modified = false; | ||
2464 | saveDocument(filename, FALSE); | ||
2465 | exitZs (1); | ||
2466 | break; | ||
2467 | case 1: // | ||
2468 | // Save with new password | ||
2469 | modified = false; | ||
2470 | saveDocument(filename, TRUE); | ||
2471 | exitZs (1); | ||
2472 | break; | ||
2473 | case 2: // Don't Save clicked or Alt-D pressed | ||
2474 | // don't save but exitZs | ||
2475 | exitZs (1); | ||
2476 | break; | ||
2477 | } | ||
2478 | } | ||
2479 | exitZs (1); | ||
2480 | |||
2481 | } | ||
2482 | |||
2483 | void ZSafe::categoryFieldActivated( const QString& category) | ||
2484 | { | ||
2485 | if (categoryDialog) | ||
2486 | setCategoryDialogFields(categoryDialog, category); | ||
2487 | } | ||
2488 | |||
2489 | void ZSafe::addCategory() | ||
2490 | { | ||
2491 | if (filename.isEmpty()) | ||
2492 | { | ||
2493 | QMessageBox::critical( 0, tr("ZSafe"), | ||
2494 | tr("No document defined.\nYou have to create a new document")); | ||
2495 | return; | ||
2496 | } | ||
2497 | else | ||
2498 | { | ||
2499 | // open the 'Category' dialog | ||
2500 | bool initIcons = false; | ||
2501 | // open the 'Category' dialog | ||
2502 | CategoryDialog *dialog; | ||
2503 | if (categoryDialog) | ||
2504 | { | ||
2505 | dialog = categoryDialog; | ||
2506 | } | ||
2507 | else | ||
2508 | { | ||
2509 | categoryDialog = new CategoryDialog(this, tr("Category"), TRUE); | ||
2510 | #ifdef WIN32 | ||
2511 | categoryDialog->setCaption ("Qt " + tr("Category")); | ||
2512 | #endif | ||
2513 | dialog = categoryDialog; | ||
2514 | connect( dialog->CategoryField, | ||
2515 | SIGNAL( activated ( const QString &)), | ||
2516 | this, SLOT( categoryFieldActivated( const QString & ) ) ); | ||
2517 | initIcons = true; | ||
2518 | } | ||
2519 | |||
2520 | #ifdef DESKTOP | ||
2521 | #ifndef WIN32 | ||
2522 | QStringList list = conf->entryList( APP_KEY+"/fieldDefs" ); | ||
2523 | #else | ||
2524 | // read all categories from the config file and store | ||
2525 | // into a list | ||
2526 | QFile f (cfgFile); | ||
2527 | QStringList list; | ||
2528 | if ( f.open(IO_ReadOnly) ) { // file opened successfully | ||
2529 | QTextStream t( &f ); // use a text stream | ||
2530 | QString s; | ||
2531 | int n = 1; | ||
2532 | while ( !t.eof() ) { // until end of file... | ||
2533 | s = t.readLine(); // line of text excluding '\n' | ||
2534 | list.append(s); | ||
2535 | } | ||
2536 | f.close(); | ||
2537 | } | ||
2538 | #endif | ||
2539 | #else | ||
2540 | // read all categories from the config file and store | ||
2541 | // into a list | ||
2542 | QFile f (cfgFile); | ||
2543 | QStringList list; | ||
2544 | if ( f.open(IO_ReadOnly) ) { // file opened successfully | ||
2545 | QTextStream t( &f ); // use a text stream | ||
2546 | QString s; | ||
2547 | while ( !t.eof() ) { // until end of file... | ||
2548 | s = t.readLine(); // line of text excluding '\n' | ||
2549 | list.append(s); | ||
2550 | } | ||
2551 | f.close(); | ||
2552 | } | ||
2553 | #endif | ||
2554 | QStringList::Iterator it = list.begin(); | ||
2555 | QString categ; | ||
2556 | dialog->CategoryField->clear(); // remove all items | ||
2557 | while( it != list.end() ) | ||
2558 | { | ||
2559 | QString *cat = new QString (*it); | ||
2560 | if (cat->contains("-field1", FALSE)) | ||
2561 | { | ||
2562 | #ifdef DESKTOP | ||
2563 | #ifndef WIN32 | ||
2564 | categ = cat->section ("-field1", 0, 0); | ||
2565 | #else | ||
2566 | int pos = cat->find ("-field1"); | ||
2567 | categ = cat->left (pos); | ||
2568 | #endif | ||
2569 | #else | ||
2570 | int pos = cat->find ("-field1"); | ||
2571 | cat->truncate(pos); | ||
2572 | categ = *cat; | ||
2573 | #endif | ||
2574 | if (!categ.isEmpty()) | ||
2575 | { | ||
2576 | dialog->CategoryField->insertItem (categ, -1); | ||
2577 | } | ||
2578 | } | ||
2579 | ++it; | ||
2580 | } | ||
2581 | |||
2582 | |||
2583 | setCategoryDialogFields(dialog); | ||
2584 | |||
2585 | // CategoryDialog *dialog = new CategoryDialog(this, "Category", TRUE); | ||
2586 | |||
2587 | if (initIcons) | ||
2588 | { | ||
2589 | Wait waitDialog(this, tr("Wait dialog")); | ||
2590 | waitDialog.waitLabel->setText(tr("Gathering icons...")); | ||
2591 | waitDialog.show(); | ||
2592 | qApp->processEvents(); | ||
2593 | |||
2594 | #ifdef DESKTOP | ||
2595 | QDir d(iconPath); | ||
2596 | #else | ||
2597 | QDir d(QPEApplication::qpeDir() + "/pics/"); | ||
2598 | #endif | ||
2599 | d.setFilter( QDir::Files); | ||
2600 | |||
2601 | const QFileInfoList *list = d.entryInfoList(); | ||
2602 | QFileInfoListIterator it( *list ); // create list iterator | ||
2603 | QFileInfo *fi; // pointer for traversing | ||
2604 | |||
2605 | dialog->IconField->insertItem("predefined"); | ||
2606 | while ( (fi=it.current()) ) { // for each file... | ||
2607 | QString fileName = fi->fileName(); | ||
2608 | if(fileName.right(4) == ".png"){ | ||
2609 | fileName = fileName.mid(0,fileName.length()-4); | ||
2610 | #ifdef DESKTOP | ||
2611 | QPixmap imageOfFile; | ||
2612 | imageOfFile.load(iconPath + fi->fileName()); | ||
2613 | #else | ||
2614 | QPixmap imageOfFile(Resource::loadPixmap(fileName)); | ||
2615 | #endif | ||
2616 | QImage foo = imageOfFile.convertToImage(); | ||
2617 | foo = foo.smoothScale(16,16); | ||
2618 | imageOfFile.convertFromImage(foo); | ||
2619 | dialog->IconField->insertItem(imageOfFile,fileName); | ||
2620 | } | ||
2621 | ++it; | ||
2622 | } | ||
2623 | waitDialog.hide(); | ||
2624 | } | ||
2625 | |||
2626 | #ifndef WIN32 | ||
2627 | dialog->show(); | ||
2628 | #endif | ||
2629 | #ifndef DESKTOP | ||
2630 | // dialog->move (20, 100); | ||
2631 | #endif | ||
2632 | DialogCode result = (DialogCode) dialog->exec(); | ||
2633 | #ifdef DESKTOP | ||
2634 | result = Accepted; | ||
2635 | #endif | ||
2636 | |||
2637 | QString category; | ||
2638 | QString icon; | ||
2639 | QString fullIconPath; | ||
2640 | QPixmap *pix; | ||
2641 | if (result == Accepted) | ||
2642 | { | ||
2643 | modified = true; | ||
2644 | category = dialog->CategoryField->currentText(); | ||
2645 | icon = dialog->IconField->currentText()+".png"; | ||
2646 | |||
2647 | qWarning (category); | ||
2648 | |||
2649 | QListViewItem *li = new ShadedListItem( 1, ListView ); | ||
2650 | Category *c1 = new Category(); | ||
2651 | c1->setCategoryName(category); | ||
2652 | |||
2653 | // if (!icon.isEmpty() && !icon.isNull()) | ||
2654 | if (icon != "predefined.png") | ||
2655 | { | ||
2656 | // build the full path | ||
2657 | fullIconPath = iconPath + icon; | ||
2658 | pix = new QPixmap (fullIconPath); | ||
2659 | // pix->resize(14, 14); | ||
2660 | if (pix) | ||
2661 | { | ||
2662 | // save the full pixmap name into the config file | ||
2663 | // #ifndef WIN32 | ||
2664 | conf->writeEntry(APP_KEY+category, icon); | ||
2665 | // #endif | ||
2666 | saveConf(); | ||
2667 | QImage img = pix->convertToImage(); | ||
2668 | pix->convertFromImage(img.smoothScale(14,14)); | ||
2669 | c1->setIcon (*pix); | ||
2670 | c1->setIconName(icon); | ||
2671 | } | ||
2672 | else | ||
2673 | { | ||
2674 | QPixmap folder( ( const char** ) general_data ); | ||
2675 | c1->setIcon (folder); | ||
2676 | } | ||
2677 | } | ||
2678 | else | ||
2679 | { | ||
2680 | c1->setIcon (*getPredefinedIcon(category)); | ||
2681 | } | ||
2682 | |||
2683 | c1->setListItem (li); | ||
2684 | c1->initListItem(); | ||
2685 | categories.insert (c1->getCategoryName(), c1); | ||
2686 | |||
2687 | saveCategoryDialogFields(dialog); | ||
2688 | } | ||
2689 | else | ||
2690 | { | ||
2691 | // delete dialog; | ||
2692 | dialog->hide(); | ||
2693 | return; | ||
2694 | } | ||
2695 | |||
2696 | } | ||
2697 | |||
2698 | } | ||
2699 | |||
2700 | void ZSafe::delCategory() | ||
2701 | { | ||
2702 | if (!selectedItem) | ||
2703 | return; | ||
2704 | if (isCategory(selectedItem)) | ||
2705 | { | ||
2706 | switch( QMessageBox::information( this, tr("ZSafe"), | ||
2707 | tr("Do you want to delete?"), | ||
2708 | tr("&Delete"), tr("D&on't Delete"), | ||
2709 | 0 // Enter == button 0 | ||
2710 | ) ) { // Escape == button 2 | ||
2711 | case 0: // Delete clicked, Alt-S or Enter pressed. | ||
2712 | // Delete from the category list | ||
2713 | modified = true; | ||
2714 | categories.remove (selectedItem->text(0)); | ||
2715 | // #ifndef WIN32 | ||
2716 | conf->removeEntry (selectedItem->text(0)); | ||
2717 | // #endif | ||
2718 | saveConf(); | ||
2719 | |||
2720 | // Delete the selected item and all subitems | ||
2721 | // step through all subitems | ||
2722 | QListViewItem *si; | ||
2723 | for (si = selectedItem->firstChild(); | ||
2724 | si != NULL; ) | ||
2725 | { | ||
2726 | QListViewItem *_si = si; | ||
2727 | si = si->nextSibling(); | ||
2728 | selectedItem->takeItem(_si); // remove from view list | ||
2729 | if (_si) delete _si; | ||
2730 | } | ||
2731 | ListView->takeItem(selectedItem); | ||
2732 | delete selectedItem; | ||
2733 | |||
2734 | selectedItem = NULL; | ||
2735 | break; | ||
2736 | case 1: // Don't delete | ||
2737 | break; | ||
2738 | } | ||
2739 | |||
2740 | } | ||
2741 | } | ||
2742 | |||
2743 | void ZSafe::setCategoryDialogFields(CategoryDialog *dialog) | ||
2744 | { | ||
2745 | dialog->Field1->setText(getFieldLabel (selectedItem, "1", tr("Name"))); | ||
2746 | dialog->Field2->setText(getFieldLabel (selectedItem, "2", tr("Username"))); | ||
2747 | dialog->Field3->setText(getFieldLabel (selectedItem, "3", tr("Password"))); | ||
2748 | dialog->Field4->setText(getFieldLabel (selectedItem, "4", tr("Comment"))); | ||
2749 | dialog->Field5->setText(getFieldLabel (selectedItem, "5", tr("Field 4"))); | ||
2750 | dialog->Field6->setText(getFieldLabel (selectedItem, "6", tr("Field 5"))); | ||
2751 | } | ||
2752 | |||
2753 | void ZSafe::setCategoryDialogFields(CategoryDialog *dialog, QString category) | ||
2754 | { | ||
2755 | dialog->Field1->setText(getFieldLabel (category, "1", tr("Name"))); | ||
2756 | dialog->Field2->setText(getFieldLabel (category, "2", tr("Username"))); | ||
2757 | dialog->Field3->setText(getFieldLabel (category, "3", tr("Password"))); | ||
2758 | dialog->Field4->setText(getFieldLabel (category, "4", tr("Comment"))); | ||
2759 | dialog->Field5->setText(getFieldLabel (category, "5", tr("Field 4"))); | ||
2760 | dialog->Field6->setText(getFieldLabel (category, "6", tr("Field 5"))); | ||
2761 | } | ||
2762 | |||
2763 | void ZSafe::saveCategoryDialogFields(CategoryDialog *dialog) | ||
2764 | { | ||
2765 | QString app_key = APP_KEY; | ||
2766 | #ifndef DESKTOP | ||
2767 | conf->setGroup ("fieldDefs"); | ||
2768 | #else | ||
2769 | #ifndef WIN32 | ||
2770 | app_key += "/fieldDefs/"; | ||
2771 | #endif | ||
2772 | #endif | ||
2773 | QString category = dialog->CategoryField->currentText(); | ||
2774 | // #ifndef WIN32 | ||
2775 | conf->writeEntry(app_key+category+"-field1", dialog->Field1->text()); | ||
2776 | conf->writeEntry(app_key+category+"-field2", dialog->Field2->text()); | ||
2777 | conf->writeEntry(app_key+category+"-field3", dialog->Field3->text()); | ||
2778 | conf->writeEntry(app_key+category+"-field4", dialog->Field4->text()); | ||
2779 | conf->writeEntry(app_key+category+"-field5", dialog->Field5->text()); | ||
2780 | conf->writeEntry(app_key+category+"-field6", dialog->Field6->text()); | ||
2781 | // #endif | ||
2782 | saveConf(); | ||
2783 | #ifndef DESKTOP | ||
2784 | conf->setGroup ("zsafe"); | ||
2785 | #endif | ||
2786 | } | ||
2787 | |||
2788 | void ZSafe::editCategory() | ||
2789 | { | ||
2790 | if (!selectedItem) | ||
2791 | return; | ||
2792 | if (isCategory(selectedItem)) | ||
2793 | { | ||
2794 | QString category = selectedItem->text(0); | ||
2795 | bool initIcons = false; | ||
2796 | // open the 'Category' dialog | ||
2797 | CategoryDialog *dialog; | ||
2798 | if (categoryDialog) | ||
2799 | { | ||
2800 | dialog = categoryDialog; | ||
2801 | } | ||
2802 | else | ||
2803 | { | ||
2804 | categoryDialog = new CategoryDialog(this, tr("Category"), TRUE); | ||
2805 | #ifdef WIN32 | ||
2806 | categoryDialog->setCaption ("Qt " + tr("Category")); | ||
2807 | #endif | ||
2808 | dialog = categoryDialog; | ||
2809 | connect( dialog->CategoryField, | ||
2810 | SIGNAL( activated ( const QString &)), | ||
2811 | this, SLOT( categoryFieldActivated( const QString & ) ) ); | ||
2812 | initIcons = true; | ||
2813 | } | ||
2814 | setCategoryDialogFields(dialog); | ||
2815 | |||
2816 | #ifdef DESKTOP | ||
2817 | #ifndef WIN32 | ||
2818 | QStringList list = conf->entryList( APP_KEY+"/fieldDefs" ); | ||
2819 | #else | ||
2820 | // read all categories from the config file and store | ||
2821 | // into a list | ||
2822 | QFile f (cfgFile); | ||
2823 | QStringList list; | ||
2824 | if ( f.open(IO_ReadOnly) ) { // file opened successfully | ||
2825 | QTextStream t( &f ); // use a text stream | ||
2826 | QString s; | ||
2827 | int n = 1; | ||
2828 | while ( !t.eof() ) { // until end of file... | ||
2829 | s = t.readLine(); // line of text excluding '\n' | ||
2830 | list.append(s); | ||
2831 | } | ||
2832 | f.close(); | ||
2833 | } | ||
2834 | #endif | ||
2835 | #else | ||
2836 | // read all categories from the config file and store | ||
2837 | // into a list | ||
2838 | QFile f (cfgFile); | ||
2839 | QStringList list; | ||
2840 | if ( f.open(IO_ReadOnly) ) { // file opened successfully | ||
2841 | QTextStream t( &f ); // use a text stream | ||
2842 | QString s; | ||
2843 | while ( !t.eof() ) { // until end of file... | ||
2844 | s = t.readLine(); // line of text excluding '\n' | ||
2845 | list.append(s); | ||
2846 | } | ||
2847 | f.close(); | ||
2848 | } | ||
2849 | #endif | ||
2850 | QStringList::Iterator it = list.begin(); | ||
2851 | QString categ; | ||
2852 | dialog->CategoryField->clear(); // remove all items | ||
2853 | int i=0; | ||
2854 | bool foundCategory = false; | ||
2855 | while( it != list.end() ) | ||
2856 | { | ||
2857 | QString *cat = new QString (*it); | ||
2858 | if (cat->contains("-field1", FALSE)) | ||
2859 | { | ||
2860 | #ifdef DESKTOP | ||
2861 | #ifndef WIN32 | ||
2862 | categ = cat->section ("-field1", 0, 0); | ||
2863 | #else | ||
2864 | int pos = cat->find ("-field1"); | ||
2865 | categ = cat->left (pos); | ||
2866 | #endif | ||
2867 | #else | ||
2868 | int pos = cat->find ("-field1"); | ||
2869 | cat->truncate(pos); | ||
2870 | categ = *cat; | ||
2871 | #endif | ||
2872 | if (!categ.isEmpty()) | ||
2873 | { | ||
2874 | dialog->CategoryField->insertItem (categ, i); | ||
2875 | if (category.compare(categ) == 0) | ||
2876 | { | ||
2877 | dialog->CategoryField->setCurrentItem(i); | ||
2878 | foundCategory = true; | ||
2879 | } | ||
2880 | i++; | ||
2881 | } | ||
2882 | } | ||
2883 | ++it; | ||
2884 | } | ||
2885 | if (!foundCategory) | ||
2886 | { | ||
2887 | dialog->CategoryField->insertItem (category, i); | ||
2888 | dialog->CategoryField->setCurrentItem(i); | ||
2889 | } | ||
2890 | |||
2891 | QString icon; | ||
2892 | Category *cat= categories.find (selectedItem->text(0)); | ||
2893 | if (cat) | ||
2894 | { | ||
2895 | icon = cat->getIconName(); | ||
2896 | } | ||
2897 | |||
2898 | if (initIcons) | ||
2899 | { | ||
2900 | |||
2901 | Wait waitDialog(this, tr("Wait dialog")); | ||
2902 | waitDialog.waitLabel->setText(tr("Gathering icons...")); | ||
2903 | waitDialog.show(); | ||
2904 | qApp->processEvents(); | ||
2905 | |||
2906 | #ifdef DESKTOP | ||
2907 | QDir d(iconPath); | ||
2908 | #else | ||
2909 | QDir d(QPEApplication::qpeDir() + "/pics/"); | ||
2910 | #endif | ||
2911 | d.setFilter( QDir::Files); | ||
2912 | |||
2913 | const QFileInfoList *list = d.entryInfoList(); | ||
2914 | int i=0; | ||
2915 | QFileInfoListIterator it( *list ); // create list iterator | ||
2916 | QFileInfo *fi; // pointer for traversing | ||
2917 | if (icon.isEmpty() || icon.isNull()) | ||
2918 | { | ||
2919 | dialog->IconField->setCurrentItem(0); | ||
2920 | } | ||
2921 | |||
2922 | dialog->IconField->insertItem("predefined"); | ||
2923 | while ( (fi=it.current()) ) { // for each file... | ||
2924 | QString fileName = fi->fileName(); | ||
2925 | if(fileName.right(4) == ".png") | ||
2926 | { | ||
2927 | fileName = fileName.mid(0,fileName.length()-4); | ||
2928 | #ifdef DESKTOP | ||
2929 | QPixmap imageOfFile; | ||
2930 | imageOfFile.load(iconPath + fi->fileName()); | ||
2931 | #else | ||
2932 | QPixmap imageOfFile(Resource::loadPixmap(fileName)); | ||
2933 | #endif | ||
2934 | QImage foo = imageOfFile.convertToImage(); | ||
2935 | foo = foo.smoothScale(16,16); | ||
2936 | imageOfFile.convertFromImage(foo); | ||
2937 | dialog->IconField->insertItem(imageOfFile,fileName); | ||
2938 | if(fileName+".png"==icon) | ||
2939 | dialog->IconField->setCurrentItem(i+1); | ||
2940 | ++i; | ||
2941 | } | ||
2942 | ++it; | ||
2943 | } | ||
2944 | waitDialog.hide(); | ||
2945 | } | ||
2946 | else | ||
2947 | { | ||
2948 | #ifdef DESKTOP | ||
2949 | // QDir d(QDir::homeDirPath() + "/pics/"); | ||
2950 | QDir d(iconPath); | ||
2951 | #else | ||
2952 | QDir d(QPEApplication::qpeDir() + "/pics/"); | ||
2953 | #endif | ||
2954 | d.setFilter( QDir::Files); | ||
2955 | |||
2956 | const QFileInfoList *list = d.entryInfoList(); | ||
2957 | int i=0; | ||
2958 | QFileInfoListIterator it( *list ); // create list iterator | ||
2959 | QFileInfo *fi; // pointer for traversing | ||
2960 | if (icon.isEmpty() || icon.isNull()) | ||
2961 | { | ||
2962 | dialog->IconField->setCurrentItem(0); | ||
2963 | } | ||
2964 | else | ||
2965 | { | ||
2966 | |||
2967 | while ( (fi=it.current()) ) | ||
2968 | { // for each file... | ||
2969 | QString fileName = fi->fileName(); | ||
2970 | if(fileName.right(4) == ".png") | ||
2971 | { | ||
2972 | fileName = fileName.mid(0,fileName.length()-4); | ||
2973 | |||
2974 | |||
2975 | if(fileName+".png"==icon) | ||
2976 | { | ||
2977 | dialog->IconField->setCurrentItem(i+1); | ||
2978 | break; | ||
2979 | } | ||
2980 | ++i; | ||
2981 | } | ||
2982 | ++it; | ||
2983 | } | ||
2984 | } | ||
2985 | } | ||
2986 | |||
2987 | // dialog->show(); | ||
2988 | #ifndef DESKTOP | ||
2989 | // dialog->move (20, 100); | ||
2990 | #endif | ||
2991 | DialogCode result = (DialogCode) dialog->exec(); | ||
2992 | #ifdef DESKTOP | ||
2993 | result = Accepted; | ||
2994 | #endif | ||
2995 | |||
2996 | QString fullIconPath; | ||
2997 | QPixmap *pix; | ||
2998 | if (result == Accepted) | ||
2999 | { | ||
3000 | modified = true; | ||
3001 | if (category != dialog->CategoryField->currentText()) | ||
3002 | { | ||
3003 | categories.remove (category); | ||
3004 | // #ifndef WIN32 | ||
3005 | conf->removeEntry(category); | ||
3006 | // #endif | ||
3007 | saveConf(); | ||
3008 | } | ||
3009 | |||
3010 | category = dialog->CategoryField->currentText(); | ||
3011 | icon = dialog->IconField->currentText()+".png"; | ||
3012 | |||
3013 | if (cat) | ||
3014 | { | ||
3015 | qWarning("Category found"); | ||
3016 | |||
3017 | // if (!icon.isEmpty() && !icon.isNull()) | ||
3018 | if (icon != "predefined.png") | ||
3019 | { | ||
3020 | // build the full path | ||
3021 | fullIconPath = iconPath + icon; | ||
3022 | pix = new QPixmap (fullIconPath); | ||
3023 | if (pix) | ||
3024 | { | ||
3025 | // save the full pixmap name into the config file | ||
3026 | // #ifndef WIN32 | ||
3027 | conf->writeEntry(APP_KEY+category, icon); | ||
3028 | // #endif | ||
3029 | saveConf(); | ||
3030 | QImage img = pix->convertToImage(); | ||
3031 | pix->convertFromImage(img.smoothScale(14,14)); | ||
3032 | cat->setIconName (icon); | ||
3033 | cat->setIcon (*pix); | ||
3034 | } | ||
3035 | } | ||
3036 | else | ||
3037 | { | ||
3038 | // #ifndef WIN32 | ||
3039 | conf->removeEntry (category); | ||
3040 | // #endif | ||
3041 | saveConf(); | ||
3042 | cat->setIcon (*getPredefinedIcon(category)); | ||
3043 | } | ||
3044 | |||
3045 | // change the category name of the selected category | ||
3046 | QListViewItem *catItem = cat->getListItem(); | ||
3047 | if (catItem) | ||
3048 | { | ||
3049 | qWarning (category); | ||
3050 | catItem->setText( 0, tr( category ) ); | ||
3051 | cat->setCategoryName (tr(category)); | ||
3052 | cat->initListItem(); | ||
3053 | categories.insert (category, cat); | ||
3054 | } | ||
3055 | } | ||
3056 | saveCategoryDialogFields(dialog); | ||
3057 | } | ||
3058 | else | ||
3059 | { | ||
3060 | // delete dialog; | ||
3061 | dialog->hide(); | ||
3062 | return; | ||
3063 | } | ||
3064 | |||
3065 | } | ||
3066 | } | ||
3067 | |||
3068 | void ZSafe::cutItem() | ||
3069 | { | ||
3070 | if (!selectedItem) | ||
3071 | return; | ||
3072 | if (!isCategory(selectedItem)) | ||
3073 | { | ||
3074 | IsCut = true; | ||
3075 | copiedItem = selectedItem; | ||
3076 | } | ||
3077 | } | ||
3078 | |||
3079 | void ZSafe::copyItem() | ||
3080 | { | ||
3081 | if (!selectedItem) | ||
3082 | return; | ||
3083 | if (!isCategory(selectedItem)) | ||
3084 | { | ||
3085 | IsCopy = true; | ||
3086 | copiedItem = selectedItem; | ||
3087 | } | ||
3088 | } | ||
3089 | |||
3090 | // paste item into category | ||
3091 | void ZSafe::pasteItem() | ||
3092 | { | ||
3093 | if (!selectedItem) | ||
3094 | return; | ||
3095 | if (isCategory(selectedItem)) | ||
3096 | { | ||
3097 | modified = true; | ||
3098 | if (IsCut) | ||
3099 | { | ||
3100 | if (copiedItem) | ||
3101 | { | ||
3102 | // add the new item | ||
3103 | QListViewItem *i = new ShadedListItem (0, selectedItem); | ||
3104 | // i->setOpen (TRUE); | ||
3105 | i->setText (0, copiedItem->text(0)); | ||
3106 | i->setText (1, copiedItem->text(1)); | ||
3107 | i->setText (2, copiedItem->text(2)); | ||
3108 | i->setText (3, copiedItem->text(3)); | ||
3109 | i->setText (4, copiedItem->text(4)); | ||
3110 | i->setText (5, copiedItem->text(5)); | ||
3111 | selectedItem->setOpen( TRUE ); | ||
3112 | |||
3113 | // remove the cutted item | ||
3114 | copiedItem->parent()->takeItem(copiedItem); | ||
3115 | selectedItem = NULL; | ||
3116 | } | ||
3117 | } | ||
3118 | else if (IsCopy) | ||
3119 | { | ||
3120 | if (copiedItem) | ||
3121 | { | ||
3122 | // add the new item | ||
3123 | QListViewItem *i = new ShadedListItem (0, selectedItem); | ||
3124 | // i->setOpen (TRUE); | ||
3125 | i->setText (0, copiedItem->text(0)); | ||
3126 | i->setText (1, copiedItem->text(1)); | ||
3127 | i->setText (2, copiedItem->text(2)); | ||
3128 | i->setText (3, copiedItem->text(3)); | ||
3129 | i->setText (4, copiedItem->text(4)); | ||
3130 | i->setText (5, copiedItem->text(5)); | ||
3131 | selectedItem->setOpen( TRUE ); | ||
3132 | } | ||
3133 | } | ||
3134 | } | ||
3135 | IsCut = false; | ||
3136 | IsCopy = false; | ||
3137 | } | ||
3138 | |||
3139 | void ZSafe::newDocument() | ||
3140 | { | ||
3141 | |||
3142 | // open the file dialog | ||
3143 | #ifndef DESKTOP | ||
3144 | QString newFile = ScQtFileEdit::getSaveAsFileName(this, | ||
3145 | tr ("Create new ZSafe document"), | ||
3146 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
3147 | "*.zsf"); | ||
3148 | #else | ||
3149 | QString newFile = QFileDialog::getSaveFileName( | ||
3150 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
3151 | "ZSafe (*.zsf)", | ||
3152 | this, | ||
3153 | "ZSafe File Dialog" | ||
3154 | "Choose a ZSafe file" ); | ||
3155 | #endif | ||
3156 | |||
3157 | // open the new document | ||
3158 | if (newFile && newFile.length() > 0 ) | ||
3159 | { | ||
3160 | // save the previous opened document | ||
3161 | if (!filename.isEmpty()) | ||
3162 | saveDocument(filename, FALSE); | ||
3163 | |||
3164 | modified = true; | ||
3165 | |||
3166 | // clear the password list | ||
3167 | QListViewItem *i; | ||
3168 | QListViewItem *c = NULL; | ||
3169 | // step through all categories | ||
3170 | for (i = ListView->firstChild(); | ||
3171 | i != NULL; | ||
3172 | i = i->nextSibling()) | ||
3173 | { | ||
3174 | if (c) delete c; // delete the previous category | ||
3175 | |||
3176 | c = i; | ||
3177 | // step through all subitems | ||
3178 | QListViewItem *si; | ||
3179 | for (si = i->firstChild(); | ||
3180 | si != NULL; ) | ||
3181 | { | ||
3182 | QListViewItem *_si = si; | ||
3183 | si = si->nextSibling(); | ||
3184 | i->takeItem(_si); // remove from view list | ||
3185 | if (_si) delete _si; | ||
3186 | } | ||
3187 | } | ||
3188 | if (c) delete c; // delete the previous category | ||
3189 | categories.clear(); | ||
3190 | |||
3191 | // m_password = ""; | ||
3192 | // selectedItem = NULL; | ||
3193 | |||
3194 | filename = newFile; | ||
3195 | |||
3196 | // save the current filename to the config file | ||
3197 | conf->writeEntry(APP_KEY+"document", filename); | ||
3198 | saveConf(); | ||
3199 | QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); | ||
3200 | #ifdef WIN32 | ||
3201 | this->setCaption("Qt ZSafe: " + ti); | ||
3202 | #else | ||
3203 | this->setCaption("ZSafe: " + ti); | ||
3204 | #endif | ||
3205 | |||
3206 | // openDocument(filename); | ||
3207 | |||
3208 | QMessageBox::information( this, tr("ZSafe"), | ||
3209 | tr("Now you have to enter\na password twice for your\nnewly created document."), tr("&OK"), 0); | ||
3210 | |||
3211 | saveDocumentWithPwd(); | ||
3212 | } | ||
3213 | } | ||
3214 | |||
3215 | void ZSafe::loadDocument() | ||
3216 | { | ||
3217 | |||
3218 | // open the file dialog | ||
3219 | #ifndef DESKTOP | ||
3220 | QString newFile = ScQtFileEdit::getOpenFileName(this, | ||
3221 | tr ("Open ZSafe document"), | ||
3222 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
3223 | "*.zsf"); | ||
3224 | #else | ||
3225 | QString newFile = QFileDialog::getOpenFileName( | ||
3226 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
3227 | "ZSafe (*.zsf)", | ||
3228 | this, | ||
3229 | "ZSafe File Dialog" | ||
3230 | "Choose a ZSafe file" ); | ||
3231 | #endif | ||
3232 | |||
3233 | // open the new document | ||
3234 | if (newFile && newFile.length() > 0 ) | ||
3235 | { | ||
3236 | // save the previous opened document | ||
3237 | if (!filename.isEmpty()) | ||
3238 | saveDocument(filename, FALSE); | ||
3239 | |||
3240 | // clear the password list | ||
3241 | QListViewItem *i; | ||
3242 | QListViewItem *c = NULL; | ||
3243 | // step through all categories | ||
3244 | for (i = ListView->firstChild(); | ||
3245 | i != NULL; | ||
3246 | i = i->nextSibling()) | ||
3247 | { | ||
3248 | if (c) delete c; // delete the previous category | ||
3249 | |||
3250 | c = i; | ||
3251 | // step through all subitems | ||
3252 | QListViewItem *si; | ||
3253 | for (si = i->firstChild(); | ||
3254 | si != NULL; ) | ||
3255 | { | ||
3256 | QListViewItem *_si = si; | ||
3257 | si = si->nextSibling(); | ||
3258 | i->takeItem(_si); // remove from view list | ||
3259 | if (_si) delete _si; | ||
3260 | } | ||
3261 | } | ||
3262 | if (c) delete c; // delete the previous category | ||
3263 | categories.clear(); | ||
3264 | m_password = ""; | ||
3265 | selectedItem = NULL; | ||
3266 | filename = newFile; | ||
3267 | |||
3268 | // save the current filename to the config file | ||
3269 | conf->writeEntry(APP_KEY+"document", filename); | ||
3270 | saveConf(); | ||
3271 | QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); | ||
3272 | #ifdef WIN32 | ||
3273 | this->setCaption("Qt ZSafe: " + ti); | ||
3274 | #else | ||
3275 | this->setCaption("ZSafe: " + ti); | ||
3276 | #endif | ||
3277 | |||
3278 | openDocument(filename); | ||
3279 | } | ||
3280 | } | ||
3281 | |||
3282 | void ZSafe::saveDocumentAs() | ||
3283 | { | ||
3284 | |||
3285 | #ifndef DESKTOP | ||
3286 | QString newFile = ScQtFileEdit::getSaveAsFileName(this, | ||
3287 | tr ("Save ZSafe document as.."), | ||
3288 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
3289 | "*.zsf"); | ||
3290 | #else | ||
3291 | // open the file dialog | ||
3292 | QString newFile = QFileDialog::getSaveFileName( | ||
3293 | QDir::homeDirPath() + "/Documents/application/zsafe", | ||
3294 | "ZSafe (*.zsf)", | ||
3295 | this, | ||
3296 | "ZSafe File Dialog" | ||
3297 | "Choose a ZSafe file" ); | ||
3298 | #endif | ||
3299 | |||
3300 | // open the new document | ||
3301 | if (newFile && newFile.length() > 0 ) | ||
3302 | { | ||
3303 | // save the previous opened document | ||
3304 | if (!filename.isEmpty()) | ||
3305 | saveDocument(filename, FALSE); | ||
3306 | |||
3307 | filename = newFile; | ||
3308 | |||
3309 | // save the current filename to the config file | ||
3310 | conf->writeEntry(APP_KEY+"document", filename); | ||
3311 | saveConf(); | ||
3312 | QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); | ||
3313 | #ifdef WIN32 | ||
3314 | this->setCaption("Qt ZSafe: " + ti); | ||
3315 | #else | ||
3316 | this->setCaption("ZSafe: " + ti); | ||
3317 | #endif | ||
3318 | |||
3319 | QMessageBox::information( this, tr("ZSafe"), | ||
3320 | tr("Now you have to enter\na password twice for your\nnewly created document."), tr("&OK"), 0); | ||
3321 | |||
3322 | saveDocumentWithPwd(); | ||
3323 | } | ||
3324 | } | ||
3325 | |||
3326 | void ZSafe::saveDocumentWithoutPwd() | ||
3327 | { | ||
3328 | saveDocument(filename, FALSE); | ||
3329 | } | ||
3330 | |||
3331 | void ZSafe::saveDocumentWithPwd() | ||
3332 | { | ||
3333 | saveDocument(filename, TRUE); | ||
3334 | } | ||
3335 | |||
3336 | void ZSafe::about() | ||
3337 | { | ||
3338 | QString info; | ||
3339 | info = "<html><body><div align=""center"">"; | ||
3340 | info += "<b>"; | ||
3341 | info += tr("Zaurus Password Manager<br>"); | ||
3342 | info += tr("ZSafe version 2.1.2<br>"); | ||
3343 | info += "</b>"; | ||
3344 | info += tr("by Carsten Schneider<br>"); | ||
3345 | info += "zcarsten@gmx.net<br>"; | ||
3346 | info += "http://z-soft.z-portal.info/zsafe"; | ||
3347 | info += "<br>"; | ||
3348 | info += tr("Translations by Robert Ernst<br>"); | ||
3349 | info += "robert.ernst@linux-solutions.at<br>"; | ||
3350 | info += "<br></div>"; | ||
3351 | info += "</body></html>"; | ||
3352 | |||
3353 | // QMessageBox::information( this, tr("ZSafe"), info, tr("&OK"), 0); | ||
3354 | |||
3355 | QMessageBox mb( this, tr("ZSafe")); | ||
3356 | mb.setText (info); | ||
3357 | mb.setButtonText (QMessageBox::Ok, tr ("&OK")); | ||
3358 | QPixmap zsafe_img((const char**) zsafe_xpm); | ||
3359 | mb.setIconPixmap (zsafe_img); | ||
3360 | mb.exec(); | ||
3361 | } | ||
3362 | |||
3363 | void ZSafe::setExpandFlag() | ||
3364 | { | ||
3365 | expandTree = !expandTree; | ||
3366 | file->setItemChecked('o', expandTree); | ||
3367 | #ifndef DESKTOP | ||
3368 | conf->setGroup ("zsafePrefs"); | ||
3369 | #endif | ||
3370 | // #ifndef WIN32 | ||
3371 | conf->writeEntry (APP_KEY+"expandTree", expandTree); | ||
3372 | // #endif | ||
3373 | saveConf(); | ||
3374 | |||
3375 | } | ||
3376 | |||
3377 | void ZSafe::paintEvent( QPaintEvent * ) | ||
3378 | { | ||
3379 | if (raiseFlag) | ||
3380 | { | ||
3381 | raiseFlag = false; | ||
3382 | raiseTimer.start (1, true); | ||
3383 | if (infoForm->isVisible()) | ||
3384 | infoForm->raise(); | ||
3385 | } | ||
3386 | } | ||
3387 | |||
3388 | void ZSafe::resizeEvent ( QResizeEvent * ) | ||
3389 | { | ||
3390 | // qWarning ("resizeEvent"); | ||
3391 | #ifndef DESKTOP | ||
3392 | DeskW = appl->desktop()->width(); | ||
3393 | DeskH = appl->desktop()->height(); | ||
3394 | #else | ||
3395 | DeskW = this->width(); | ||
3396 | DeskH = this->height(); | ||
3397 | #endif | ||
3398 | qWarning( QString("Width : %1").arg(DeskW), 2000 ); | ||
3399 | qWarning( QString("Height: %1").arg(DeskH), 2000 ); | ||
3400 | |||
3401 | New->setGeometry ( QRect( DeskW-84, 2, 20, 20 ) ); | ||
3402 | Edit->setGeometry ( QRect( DeskW-64, 2, 20, 20 ) ); | ||
3403 | Delete->setGeometry( QRect( DeskW-44, 2, 20, 20 ) ); | ||
3404 | Find->setGeometry ( QRect( DeskW-24, 2, 20, 20 ) ); | ||
3405 | } | ||
3406 | |||
3407 | void ZSafe::slotRaiseTimer() | ||
3408 | { | ||
3409 | if (infoForm->isVisible()) | ||
3410 | infoForm->raise(); | ||
3411 | raiseFlag = true; | ||
3412 | } | ||
3413 | |||
3414 | QPixmap * ZSafe::getPredefinedIcon(QString category) | ||
3415 | { | ||
3416 | QPixmap *pm; | ||
3417 | if (category == "Bank cards") | ||
3418 | pm = new QPixmap((const char**)bank_cards_data); | ||
3419 | else if (category == "Passwords") | ||
3420 | pm = new QPixmap((const char**)passwords_data); | ||
3421 | else if (category == "Software") | ||
3422 | pm = new QPixmap((const char**)software_data); | ||
3423 | else if (category == "General") | ||
3424 | pm = new QPixmap((const char**)general_data); | ||
3425 | else | ||
3426 | pm = new QPixmap((const char**)general_data); | ||
3427 | return pm; | ||
3428 | } | ||
3429 | |||
3430 | void ZSafe::setDocument(const QString& fileref) | ||
3431 | { | ||
3432 | #ifndef DESKTOP | ||
3433 | // stop the timer to prevent loading of the default document | ||
3434 | docuTimer.stop(); | ||
3435 | |||
3436 | DocLnk link(fileref); | ||
3437 | if ( link.isValid() ) | ||
3438 | { | ||
3439 | // if (filename != link.file()) | ||
3440 | // saveDocument(filename, FALSE); | ||
3441 | filename = link.file(); | ||
3442 | } | ||
3443 | else | ||
3444 | { | ||
3445 | // if (filename != fileref) | ||
3446 | // saveDocument(filename, FALSE); | ||
3447 | filename = fileref; | ||
3448 | } | ||
3449 | // save the current filename to the config file | ||
3450 | conf->writeEntry(APP_KEY+"document", filename); | ||
3451 | saveConf(); | ||
3452 | QString ti = filename.right (filename.length() - filename.findRev ('/') - 1); | ||
3453 | #ifdef WIN32 | ||
3454 | this->setCaption("Qt ZSafe: " + ti); | ||
3455 | #else | ||
3456 | this->setCaption("ZSafe: " + ti); | ||
3457 | #endif | ||
3458 | |||
3459 | // clear the password list | ||
3460 | QListViewItem *i; | ||
3461 | QListViewItem *c = NULL; | ||
3462 | // step through all categories | ||
3463 | for (i = ListView->firstChild(); | ||
3464 | i != NULL; | ||
3465 | i = i->nextSibling()) | ||
3466 | { | ||
3467 | if (c) delete c; // delete the previous category | ||
3468 | |||
3469 | c = i; | ||
3470 | // step through all subitems | ||
3471 | QListViewItem *si; | ||
3472 | for (si = i->firstChild(); | ||
3473 | si != NULL; ) | ||
3474 | { | ||
3475 | QListViewItem *_si = si; | ||
3476 | si = si->nextSibling(); | ||
3477 | i->takeItem(_si); // remove from view list | ||
3478 | if (_si) delete _si; | ||
3479 | } | ||
3480 | } | ||
3481 | if (c) delete c; // delete the previous category | ||
3482 | categories.clear(); | ||
3483 | |||
3484 | m_password = ""; | ||
3485 | selectedItem = NULL; | ||
3486 | |||
3487 | openDocument(filename); | ||
3488 | #endif | ||
3489 | } | ||
3490 | |||
3491 | |||
3492 | |||