summaryrefslogtreecommitdiffabout
authorulf69 <ulf69>2004-09-21 19:44:23 (UTC)
committer ulf69 <ulf69>2004-09-21 19:44:23 (UTC)
commita6a6544fc57542752fecc3763e0d35e6a38040ac (patch) (unidiff)
tree3324285a4aaee1db873e0c83d0c8e911cbe1aefb
parent6a40d65ddd6657e34c69d839da458810a8d8ff98 (diff)
downloadkdepimpi-a6a6544fc57542752fecc3763e0d35e6a38040ac.zip
kdepimpi-a6a6544fc57542752fecc3763e0d35e6a38040ac.tar.gz
kdepimpi-a6a6544fc57542752fecc3763e0d35e6a38040ac.tar.bz2
*** empty log message ***
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--pwmanager/pwmanager/configwnd.cpp11
-rw-r--r--pwmanager/pwmanager/pwm.cpp35
-rw-r--r--pwmanager/pwmanager/pwmanagerE.pro27
-rw-r--r--pwmanager/pwmanager/pwmdoc.cpp2
-rw-r--r--pwmanager/pwmanager/pwmdoc.h2
-rw-r--r--pwmanager/pwmanager/pwmdocui.cpp1
-rw-r--r--pwmanager/pwmanager/pwminit.cpp19
-rw-r--r--pwmanager/pwmanager/pwmtray.cpp4
-rw-r--r--pwmanager/pwmanager/pwmview.cpp4
-rw-r--r--pwmanager/pwmanager/serializer.cpp1
10 files changed, 83 insertions, 23 deletions
diff --git a/pwmanager/pwmanager/configwnd.cpp b/pwmanager/pwmanager/configwnd.cpp
index 230ca1b..108c40f 100644
--- a/pwmanager/pwmanager/configwnd.cpp
+++ b/pwmanager/pwmanager/configwnd.cpp
@@ -1,264 +1,265 @@
1/**************************************************************************** 1/****************************************************************************
2** Form implementation generated from reading ui file 'configwnd.ui' 2** Form implementation generated from reading ui file 'configwnd.ui'
3** 3**
4** Created: Tue Sep 14 15:20:58 2004 4** Created: Tue Sep 14 15:20:58 2004
5** by: The User Interface Compiler ($Id$) 5** by: The User Interface Compiler ($Id$)
6** 6**
7** WARNING! All changes made in this file will be lost! 7** WARNING! All changes made in this file will be lost!
8****************************************************************************/ 8****************************************************************************/
9 9
10#include "configwnd.h" 10#include "configwnd.h"
11 11
12#include <qvariant.h> 12#include <qvariant.h>
13#include <qpushbutton.h> 13#include <qpushbutton.h>
14#include <qtabwidget.h> 14#include <qtabwidget.h>
15#include <qwidget.h> 15#include <qwidget.h>
16#include <qcombobox.h> 16#include <qcombobox.h>
17#include <qlabel.h> 17#include <qlabel.h>
18#include <qlineedit.h> 18#include <qlineedit.h>
19#include <qcheckbox.h> 19#include <qcheckbox.h>
20#include <qspinbox.h> 20#include <qspinbox.h>
21#include <qlayout.h> 21#include <qlayout.h>
22#include <qtooltip.h> 22#include <qtooltip.h>
23#include <qwhatsthis.h> 23#include <qwhatsthis.h>
24 24
25/* 25/*
26 * Constructs a configWnd as a child of 'parent', with the 26 * Constructs a configWnd as a child of 'parent', with the
27 * name 'name' and widget flags set to 'f'. 27 * name 'name' and widget flags set to 'f'.
28 * 28 *
29 * The dialog will by default be modeless, unless you set 'modal' to 29 * The dialog will by default be modeless, unless you set 'modal' to
30 * TRUE to construct a modal dialog. 30 * TRUE to construct a modal dialog.
31 */ 31 */
32configWnd::configWnd( QWidget* parent, const char* name, bool modal, WFlags fl ) 32configWnd::configWnd( QWidget* parent, const char* name, bool modal, WFlags fl )
33 : QDialog( parent, name, modal, fl ) 33 : QDialog( parent, name, modal, fl )
34{ 34{
35 if ( !name ) 35 if ( !name )
36 setName( "configWnd" ); 36 setName( "configWnd" );
37 37
38 okButton = new QPushButton( this, "okButton" ); 38 okButton = new QPushButton( this, "okButton" );
39 okButton->setGeometry( QRect( 10, 280, 107, 27 ) ); 39 okButton->setGeometry( QRect( 10, 280, 107, 27 ) );
40 40
41 cancelButton = new QPushButton( this, "cancelButton" ); 41 cancelButton = new QPushButton( this, "cancelButton" );
42 cancelButton->setGeometry( QRect( 370, 280, 107, 27 ) ); 42 cancelButton->setGeometry( QRect( 370, 280, 107, 27 ) );
43 43
44 tabWidget2 = new QTabWidget( this, "tabWidget2" ); 44 tabWidget2 = new QTabWidget( this, "tabWidget2" );
45 tabWidget2->setGeometry( QRect( 10, 10, 470, 260 ) ); 45 tabWidget2->setGeometry( QRect( 10, 10, 470, 260 ) );
46 46
47 //////////////////////////////
47 tab = new QWidget( tabWidget2, "tab" ); 48 tab = new QWidget( tabWidget2, "tab" );
48 49
49 windowStyleComboBox = new QComboBox( FALSE, tab, "windowStyleComboBox" ); 50 windowStyleComboBox = new QComboBox( FALSE, tab, "windowStyleComboBox" );
50 windowStyleComboBox->setGeometry( QRect( 220, 180, 210, 28 ) ); 51 windowStyleComboBox->setGeometry( QRect( 220, 180, 210, 28 ) );
51 52
52 textLabel1_5 = new QLabel( tab, "textLabel1_5" ); 53 textLabel1_5 = new QLabel( tab, "textLabel1_5" );
53 textLabel1_5->setGeometry( QRect( 30, 180, 180, 20 ) ); 54 textLabel1_5->setGeometry( QRect( 30, 180, 180, 20 ) );
54 textLabel1_5->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); 55 textLabel1_5->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
55 56
56 textLabel1_4 = new QLabel( tab, "textLabel1_4" ); 57 textLabel1_4 = new QLabel( tab, "textLabel1_4" );
57 textLabel1_4->setGeometry( QRect( 30, 40, 400, 20 ) ); 58 textLabel1_4->setGeometry( QRect( 30, 40, 400, 20 ) );
58 59
59 selEntrFontButton = new QPushButton( tab, "selEntrFontButton" ); 60 selEntrFontButton = new QPushButton( tab, "selEntrFontButton" );
60 selEntrFontButton->setGeometry( QRect( 30, 90, 160, 27 ) ); 61 selEntrFontButton->setGeometry( QRect( 30, 90, 160, 27 ) );
61 62
62 currEntrFont = new QLabel( tab, "currEntrFont" ); 63 currEntrFont = new QLabel( tab, "currEntrFont" );
63 currEntrFont->setGeometry( QRect( 30, 70, 230, 20 ) ); 64 currEntrFont->setGeometry( QRect( 30, 70, 230, 20 ) );
64 tabWidget2->insertTab( tab, QString("") ); 65 tabWidget2->insertTab( tab, QString("") );
65 66 //////////////////////////////////////
66 TabPage = new QWidget( tabWidget2, "TabPage" ); 67 TabPage = new QWidget( tabWidget2, "TabPage" );
67 68
68 compressionComboBox = new QComboBox( FALSE, TabPage, "compressionComboBox" ); 69 compressionComboBox = new QComboBox( FALSE, TabPage, "compressionComboBox" );
69 compressionComboBox->setGeometry( QRect( 290, 50, 150, 28 ) ); 70 compressionComboBox->setGeometry( QRect( 290, 50, 150, 28 ) );
70 71
71 textLabel1_6 = new QLabel( TabPage, "textLabel1_6" ); 72 textLabel1_6 = new QLabel( TabPage, "textLabel1_6" );
72 textLabel1_6->setGeometry( QRect( 10, 50, 270, 20 ) ); 73 textLabel1_6->setGeometry( QRect( 10, 50, 270, 20 ) );
73 textLabel1_6->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); 74 textLabel1_6->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
74 75
75 textLabel1_8 = new QLabel( TabPage, "textLabel1_8" ); 76 textLabel1_8 = new QLabel( TabPage, "textLabel1_8" );
76 textLabel1_8->setGeometry( QRect( 10, 90, 270, 20 ) ); 77 textLabel1_8->setGeometry( QRect( 10, 90, 270, 20 ) );
77 textLabel1_8->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); 78 textLabel1_8->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
78 79
79 permissionLineEdit = new QLineEdit( TabPage, "permissionLineEdit" ); 80 permissionLineEdit = new QLineEdit( TabPage, "permissionLineEdit" );
80 permissionLineEdit->setGeometry( QRect( 290, 90, 142, 27 ) ); 81 permissionLineEdit->setGeometry( QRect( 290, 90, 142, 27 ) );
81 permissionLineEdit->setMaxLength( 3 ); 82 permissionLineEdit->setMaxLength( 3 );
82 83
83 fileBackupCheckBox = new QCheckBox( TabPage, "fileBackupCheckBox" ); 84 fileBackupCheckBox = new QCheckBox( TabPage, "fileBackupCheckBox" );
84 fileBackupCheckBox->setGeometry( QRect( 80, 140, 360, 23 ) ); 85 fileBackupCheckBox->setGeometry( QRect( 80, 140, 360, 23 ) );
85 tabWidget2->insertTab( TabPage, QString("") ); 86 tabWidget2->insertTab( TabPage, QString("") );
86 87 //////////////////////////////////////
87 tab_2 = new QWidget( tabWidget2, "tab_2" ); 88 tab_2 = new QWidget( tabWidget2, "tab_2" );
88 89
89 pwTimeoutSpinBox = new QSpinBox( tab_2, "pwTimeoutSpinBox" ); 90 pwTimeoutSpinBox = new QSpinBox( tab_2, "pwTimeoutSpinBox" );
90 pwTimeoutSpinBox->setGeometry( QRect( 390, 50, 55, 23 ) ); 91 pwTimeoutSpinBox->setGeometry( QRect( 390, 50, 55, 23 ) );
91 92
92 textLabel1 = new QLabel( tab_2, "textLabel1" ); 93 textLabel1 = new QLabel( tab_2, "textLabel1" );
93 textLabel1->setGeometry( QRect( 10, 20, 370, 80 ) ); 94 textLabel1->setGeometry( QRect( 10, 20, 370, 80 ) );
94 textLabel1->setAlignment( int( QLabel::WordBreak | QLabel::AlignVCenter ) ); 95 textLabel1->setAlignment( int( QLabel::WordBreak | QLabel::AlignVCenter ) );
95 96
96 textLabel1_7 = new QLabel( tab_2, "textLabel1_7" ); 97 textLabel1_7 = new QLabel( tab_2, "textLabel1_7" );
97 textLabel1_7->setGeometry( QRect( 10, 110, 370, 80 ) ); 98 textLabel1_7->setGeometry( QRect( 10, 110, 370, 80 ) );
98 textLabel1_7->setAlignment( int( QLabel::WordBreak | QLabel::AlignVCenter ) ); 99 textLabel1_7->setAlignment( int( QLabel::WordBreak | QLabel::AlignVCenter ) );
99 100
100 lockTimeoutSpinBox = new QSpinBox( tab_2, "lockTimeoutSpinBox" ); 101 lockTimeoutSpinBox = new QSpinBox( tab_2, "lockTimeoutSpinBox" );
101 lockTimeoutSpinBox->setGeometry( QRect( 390, 140, 55, 23 ) ); 102 lockTimeoutSpinBox->setGeometry( QRect( 390, 140, 55, 23 ) );
102 103
103 autoDeepLockCheckBox = new QCheckBox( tab_2, "autoDeepLockCheckBox" ); 104 autoDeepLockCheckBox = new QCheckBox( tab_2, "autoDeepLockCheckBox" );
104 autoDeepLockCheckBox->setGeometry( QRect( 60, 180, 380, 25 ) ); 105 autoDeepLockCheckBox->setGeometry( QRect( 60, 180, 380, 25 ) );
105 tabWidget2->insertTab( tab_2, QString("") ); 106 tabWidget2->insertTab( tab_2, QString("") );
106 107 ///////////////////////////////////////////
107 tab_3 = new QWidget( tabWidget2, "tab_3" ); 108 tab_3 = new QWidget( tabWidget2, "tab_3" );
108 109
109 textLabel1_3 = new QLabel( tab_3, "textLabel1_3" ); 110 textLabel1_3 = new QLabel( tab_3, "textLabel1_3" );
110 textLabel1_3->setGeometry( QRect( 30, 30, 400, 20 ) ); 111 textLabel1_3->setGeometry( QRect( 30, 30, 400, 20 ) );
111 112
112 autoStartLineEdit = new QLineEdit( tab_3, "autoStartLineEdit" ); 113 autoStartLineEdit = new QLineEdit( tab_3, "autoStartLineEdit" );
113 autoStartLineEdit->setGeometry( QRect( 30, 50, 360, 20 ) ); 114 autoStartLineEdit->setGeometry( QRect( 30, 50, 360, 20 ) );
114 115
115 browseAutoStButton = new QPushButton( tab_3, "browseAutoStButton" ); 116 browseAutoStButton = new QPushButton( tab_3, "browseAutoStButton" );
116 browseAutoStButton->setGeometry( QRect( 400, 50, 30, 20 ) ); 117 browseAutoStButton->setGeometry( QRect( 400, 50, 30, 20 ) );
117 118
118 autostartDeeplockedCheckBox = new QCheckBox( tab_3, "autostartDeeplockedCheckBox" ); 119 autostartDeeplockedCheckBox = new QCheckBox( tab_3, "autostartDeeplockedCheckBox" );
119 autostartDeeplockedCheckBox->setGeometry( QRect( 40, 80, 390, 25 ) ); 120 autostartDeeplockedCheckBox->setGeometry( QRect( 40, 80, 390, 25 ) );
120 tabWidget2->insertTab( tab_3, QString("") ); 121 tabWidget2->insertTab( tab_3, QString("") );
121 122 ////////////////////////////////////////////
122 tab_4 = new QWidget( tabWidget2, "tab_4" ); 123 tab_4 = new QWidget( tabWidget2, "tab_4" );
123 124
124 textLabel2 = new QLabel( tab_4, "textLabel2" ); 125 textLabel2 = new QLabel( tab_4, "textLabel2" );
125 textLabel2->setGeometry( QRect( 20, 40, 280, 20 ) ); 126 textLabel2->setGeometry( QRect( 20, 40, 280, 20 ) );
126 textLabel2->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); 127 textLabel2->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
127 128
128 browserLineEdit = new QLineEdit( tab_4, "browserLineEdit" ); 129 browserLineEdit = new QLineEdit( tab_4, "browserLineEdit" );
129 browserLineEdit->setGeometry( QRect( 310, 40, 130, 27 ) ); 130 browserLineEdit->setGeometry( QRect( 310, 40, 130, 27 ) );
130 131
131 xtermLineEdit = new QLineEdit( tab_4, "xtermLineEdit" ); 132 xtermLineEdit = new QLineEdit( tab_4, "xtermLineEdit" );
132 xtermLineEdit->setGeometry( QRect( 310, 100, 130, 27 ) ); 133 xtermLineEdit->setGeometry( QRect( 310, 100, 130, 27 ) );
133 134
134 textLabel3 = new QLabel( tab_4, "textLabel3" ); 135 textLabel3 = new QLabel( tab_4, "textLabel3" );
135 textLabel3->setGeometry( QRect( 20, 100, 280, 20 ) ); 136 textLabel3->setGeometry( QRect( 20, 100, 280, 20 ) );
136 textLabel3->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); 137 textLabel3->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
137 tabWidget2->insertTab( tab_4, QString("") ); 138 tabWidget2->insertTab( tab_4, QString("") );
138 139 ///////////////////////////////////////////////
139 tab_5 = new QWidget( tabWidget2, "tab_5" ); 140 tab_5 = new QWidget( tabWidget2, "tab_5" );
140 141
141 trayCheckBox = new QCheckBox( tab_5, "trayCheckBox" ); 142 trayCheckBox = new QCheckBox( tab_5, "trayCheckBox" );
142 trayCheckBox->setGeometry( QRect( 30, 30, 400, 20 ) ); 143 trayCheckBox->setGeometry( QRect( 30, 30, 400, 20 ) );
143 144
144 openUnlockedCheckBox = new QCheckBox( tab_5, "openUnlockedCheckBox" ); 145 openUnlockedCheckBox = new QCheckBox( tab_5, "openUnlockedCheckBox" );
145 openUnlockedCheckBox->setGeometry( QRect( 30, 80, 400, 20 ) ); 146 openUnlockedCheckBox->setGeometry( QRect( 30, 80, 400, 20 ) );
146 147
147 autoMinimizeCheckBox = new QCheckBox( tab_5, "autoMinimizeCheckBox" ); 148 autoMinimizeCheckBox = new QCheckBox( tab_5, "autoMinimizeCheckBox" );
148 autoMinimizeCheckBox->setEnabled( FALSE ); 149 autoMinimizeCheckBox->setEnabled( FALSE );
149 autoMinimizeCheckBox->setGeometry( QRect( 50, 50, 380, 25 ) ); 150 autoMinimizeCheckBox->setGeometry( QRect( 50, 50, 380, 25 ) );
150 151
151 minimizeLockComboBox = new QComboBox( FALSE, tab_5, "minimizeLockComboBox" ); 152 minimizeLockComboBox = new QComboBox( FALSE, tab_5, "minimizeLockComboBox" );
152 minimizeLockComboBox->setGeometry( QRect( 310, 170, 120, 27 ) ); 153 minimizeLockComboBox->setGeometry( QRect( 310, 170, 120, 27 ) );
153 154
154 textLabel1_9 = new QLabel( tab_5, "textLabel1_9" ); 155 textLabel1_9 = new QLabel( tab_5, "textLabel1_9" );
155 textLabel1_9->setGeometry( QRect( 30, 180, 270, 20 ) ); 156 textLabel1_9->setGeometry( QRect( 30, 180, 270, 20 ) );
156 textLabel1_9->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); 157 textLabel1_9->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) );
157 158
158 kwalletEmuCheckBox = new QCheckBox( tab_5, "kwalletEmuCheckBox" ); 159 kwalletEmuCheckBox = new QCheckBox( tab_5, "kwalletEmuCheckBox" );
159 kwalletEmuCheckBox->setGeometry( QRect( 30, 110, 400, 25 ) ); 160 kwalletEmuCheckBox->setGeometry( QRect( 30, 110, 400, 25 ) );
160 161
161 wndCloseCheckBox = new QCheckBox( tab_5, "wndCloseCheckBox" ); 162 wndCloseCheckBox = new QCheckBox( tab_5, "wndCloseCheckBox" );
162 wndCloseCheckBox->setGeometry( QRect( 30, 140, 430, 24 ) ); 163 wndCloseCheckBox->setGeometry( QRect( 30, 140, 430, 24 ) );
163 tabWidget2->insertTab( tab_5, QString("") ); 164 tabWidget2->insertTab( tab_5, QString("") );
164 languageChange(); 165 languageChange();
165 resize( QSize(490, 318).expandedTo(minimumSizeHint()) ); 166 resize( QSize(490, 318).expandedTo(minimumSizeHint()) );
166 clearWState( WState_Polished ); 167 clearWState( WState_Polished );
167 168
168 // signals and slots connections 169 // signals and slots connections
169 connect( okButton, SIGNAL( clicked() ), this, SLOT( okButton_slot() ) ); 170 connect( okButton, SIGNAL( clicked() ), this, SLOT( okButton_slot() ) );
170 connect( cancelButton, SIGNAL( clicked() ), this, SLOT( cancelButton_slot() ) ); 171 connect( cancelButton, SIGNAL( clicked() ), this, SLOT( cancelButton_slot() ) );
171 connect( browseAutoStButton, SIGNAL( clicked() ), this, SLOT( browseAutoStButton_slot() ) ); 172 connect( browseAutoStButton, SIGNAL( clicked() ), this, SLOT( browseAutoStButton_slot() ) );
172 connect( selEntrFontButton, SIGNAL( clicked() ), this, SLOT( selEntrFontButton_slot() ) ); 173 connect( selEntrFontButton, SIGNAL( clicked() ), this, SLOT( selEntrFontButton_slot() ) );
173 connect( trayCheckBox, SIGNAL( toggled(bool) ), autoMinimizeCheckBox, SLOT( setEnabled(bool) ) ); 174 connect( trayCheckBox, SIGNAL( toggled(bool) ), autoMinimizeCheckBox, SLOT( setEnabled(bool) ) );
174 175
175 // tab order 176 // tab order
176 setTabOrder( pwTimeoutSpinBox, trayCheckBox ); 177 setTabOrder( pwTimeoutSpinBox, trayCheckBox );
177 setTabOrder( trayCheckBox, okButton ); 178 setTabOrder( trayCheckBox, okButton );
178 setTabOrder( okButton, cancelButton ); 179 setTabOrder( okButton, cancelButton );
179} 180}
180 181
181/* 182/*
182 * Destroys the object and frees any allocated resources 183 * Destroys the object and frees any allocated resources
183 */ 184 */
184configWnd::~configWnd() 185configWnd::~configWnd()
185{ 186{
186 // no need to delete child widgets, Qt does it all for us 187 // no need to delete child widgets, Qt does it all for us
187} 188}
188 189
189/* 190/*
190 * Sets the strings of the subwidgets using the current 191 * Sets the strings of the subwidgets using the current
191 * language. 192 * language.
192 */ 193 */
193void configWnd::languageChange() 194void configWnd::languageChange()
194{ 195{
195 setCaption( tr( "PwManager Configuration" ) ); 196 setCaption( tr( "PwManager Configuration" ) );
196 okButton->setText( tr( "&OK" ) ); 197 okButton->setText( tr( "&OK" ) );
197 //US ENH okButton->setAccel( QKeySequence( tr( "Alt+O" ) ) ); 198 //US ENH okButton->setAccel( QKeySequence( tr( "Alt+O" ) ) );
198 cancelButton->setText( tr( "&Cancel" ) ); 199 cancelButton->setText( tr( "&Cancel" ) );
199 //US ENH cancelButton->setAccel( QKeySequence( tr( "Alt+C" ) ) ); 200 //US ENH cancelButton->setAccel( QKeySequence( tr( "Alt+C" ) ) );
200 windowStyleComboBox->clear(); 201 windowStyleComboBox->clear();
201 windowStyleComboBox->insertItem( tr( "Category on top" ) ); 202 windowStyleComboBox->insertItem( tr( "Category on top" ) );
202 windowStyleComboBox->insertItem( tr( "Category-list left" ) ); 203 windowStyleComboBox->insertItem( tr( "Category-list left" ) );
203 textLabel1_5->setText( tr( "Window-style:" ) ); 204 textLabel1_5->setText( tr( "Window-style:" ) );
204 textLabel1_4->setText( tr( "Font for the password entries:" ) ); 205 textLabel1_4->setText( tr( "Font for the password entries:" ) );
205 selEntrFontButton->setText( tr( "select Font" ) ); 206 selEntrFontButton->setText( tr( "select Font" ) );
206 currEntrFont->setText( QString::null ); 207 currEntrFont->setText( QString::null );
207 tabWidget2->changeTab( tab, tr( "Look && feel" ) ); 208 tabWidget2->changeTab( tab, tr( "Look && feel" ) );
208 compressionComboBox->clear(); 209 compressionComboBox->clear();
209 compressionComboBox->insertItem( tr( "none" ) ); 210 compressionComboBox->insertItem( tr( "none" ) );
210 compressionComboBox->insertItem( tr( "gzip" ) ); 211 compressionComboBox->insertItem( tr( "gzip" ) );
211 compressionComboBox->insertItem( tr( "bzip2" ) ); 212 compressionComboBox->insertItem( tr( "bzip2" ) );
212 textLabel1_6->setText( tr( "*.pwm file compression:" ) ); 213 textLabel1_6->setText( tr( "*.pwm file compression:" ) );
213 textLabel1_8->setText( tr( "permissions:" ) ); 214 textLabel1_8->setText( tr( "permissions:" ) );
214 fileBackupCheckBox->setText( tr( "Make file backup before saving" ) ); 215 fileBackupCheckBox->setText( tr( "Make file backup before saving" ) );
215 tabWidget2->changeTab( TabPage, tr( "File" ) ); 216 tabWidget2->changeTab( TabPage, tr( "File" ) );
216 textLabel1->setText( tr( "Password timeout (timeout to hold password in memory, so you don't have to re-enter it, if you already have entered it) [set to 0 to disable]:" ) ); 217 textLabel1->setText( tr( "Password timeout (timeout to hold password in memory, so you don't have to re-enter it, if you already have entered it) [set to 0 to disable]:" ) );
217 textLabel1_7->setText( tr( "Auto-lock timeout (auto lock document after this amount of seconds) [set to 0 to disable]:" ) ); 218 textLabel1_7->setText( tr( "Auto-lock timeout (auto lock document after this amount of seconds) [set to 0 to disable]:" ) );
218 autoDeepLockCheckBox->setText( tr( "deep-lock on autolock" ) ); 219 autoDeepLockCheckBox->setText( tr( "deep-lock on autolock" ) );
219 tabWidget2->changeTab( tab_2, tr( "Timeout" ) ); 220 tabWidget2->changeTab( tab_2, tr( "Timeout" ) );
220 textLabel1_3->setText( tr( "Open this file automatically on startup:" ) ); 221 textLabel1_3->setText( tr( "Open this file automatically on startup:" ) );
221 browseAutoStButton->setText( tr( "..." ) ); 222 browseAutoStButton->setText( tr( "..." ) );
222 autostartDeeplockedCheckBox->setText( tr( "open deeplocked" ) ); 223 autostartDeeplockedCheckBox->setText( tr( "open deeplocked" ) );
223 tabWidget2->changeTab( tab_3, tr( "Autostart" ) ); 224 tabWidget2->changeTab( tab_3, tr( "Autostart" ) );
224 textLabel2->setText( tr( "Favourite browser:" ) ); 225 textLabel2->setText( tr( "Favourite browser:" ) );
225 textLabel3->setText( tr( "Favourite X-terminal:" ) ); 226 textLabel3->setText( tr( "Favourite X-terminal:" ) );
226 tabWidget2->changeTab( tab_4, tr( "External apps" ) ); 227 tabWidget2->changeTab( tab_4, tr( "External apps" ) );
227 trayCheckBox->setText( tr( "Show icon in system-tray" ) ); 228 trayCheckBox->setText( tr( "Show icon in system-tray" ) );
228 openUnlockedCheckBox->setText( tr( "Open document with passwords unlocked" ) ); 229 openUnlockedCheckBox->setText( tr( "Open document with passwords unlocked" ) );
229 autoMinimizeCheckBox->setText( tr( "auto-minimize to tray on startup" ) ); 230 autoMinimizeCheckBox->setText( tr( "auto-minimize to tray on startup" ) );
230 minimizeLockComboBox->clear(); 231 minimizeLockComboBox->clear();
231 minimizeLockComboBox->insertItem( tr( "don't lock" ) ); 232 minimizeLockComboBox->insertItem( tr( "don't lock" ) );
232 minimizeLockComboBox->insertItem( tr( "normal lock" ) ); 233 minimizeLockComboBox->insertItem( tr( "normal lock" ) );
233 minimizeLockComboBox->insertItem( tr( "deep-lock" ) ); 234 minimizeLockComboBox->insertItem( tr( "deep-lock" ) );
234 textLabel1_9->setText( tr( "auto-lock on minimize:" ) ); 235 textLabel1_9->setText( tr( "auto-lock on minimize:" ) );
235 kwalletEmuCheckBox->setText( tr( "KWallet emulation" ) ); 236 kwalletEmuCheckBox->setText( tr( "KWallet emulation" ) );
236 wndCloseCheckBox->setText( tr( "Do not minimize windows into tray. (Close the window)" ) ); 237 wndCloseCheckBox->setText( tr( "Do not minimize windows into tray. (Close the window)" ) );
237 tabWidget2->changeTab( tab_5, tr( "Miscellaneous" ) ); 238 tabWidget2->changeTab( tab_5, tr( "Miscellaneous" ) );
238} 239}
239 240
240void configWnd::okButton_slot() 241void configWnd::okButton_slot()
241{ 242{
242 qWarning( "configWnd::okButton_slot(): Not implemented yet" ); 243 qWarning( "configWnd::okButton_slot(): Not implemented yet" );
243} 244}
244 245
245void configWnd::cancelButton_slot() 246void configWnd::cancelButton_slot()
246{ 247{
247 qWarning( "configWnd::cancelButton_slot(): Not implemented yet" ); 248 qWarning( "configWnd::cancelButton_slot(): Not implemented yet" );
248} 249}
249 250
250void configWnd::browseBgButton_slot() 251void configWnd::browseBgButton_slot()
251{ 252{
252 qWarning( "configWnd::browseBgButton_slot(): Not implemented yet" ); 253 qWarning( "configWnd::browseBgButton_slot(): Not implemented yet" );
253} 254}
254 255
255void configWnd::browseAutoStButton_slot() 256void configWnd::browseAutoStButton_slot()
256{ 257{
257 qWarning( "configWnd::browseAutoStButton_slot(): Not implemented yet" ); 258 qWarning( "configWnd::browseAutoStButton_slot(): Not implemented yet" );
258} 259}
259 260
260void configWnd::selEntrFontButton_slot() 261void configWnd::selEntrFontButton_slot()
261{ 262{
262 qWarning( "configWnd::selEntrFontButton_slot(): Not implemented yet" ); 263 qWarning( "configWnd::selEntrFontButton_slot(): Not implemented yet" );
263} 264}
264 265
diff --git a/pwmanager/pwmanager/pwm.cpp b/pwmanager/pwmanager/pwm.cpp
index e5579f8..08fcb25 100644
--- a/pwmanager/pwmanager/pwm.cpp
+++ b/pwmanager/pwmanager/pwm.cpp
@@ -1,1283 +1,1304 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 1.0.1 of pwmanager 14 * This file is originaly based on version 1.0.1 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
18 **************************************************************************/ 18 **************************************************************************/
19 19
20#include <klocale.h> 20#include <klocale.h>
21#include <klistview.h> 21#include <klistview.h>
22#include <ktoolbar.h> 22#include <ktoolbar.h>
23#include <kfiledialog.h> 23#include <kfiledialog.h>
24#include <kiconloader.h> 24#include <kiconloader.h>
25#include <kmessagebox.h> 25#include <kmessagebox.h>
26 26
27#ifndef PWM_EMBEDDED 27#ifndef PWM_EMBEDDED
28#include <kmenubar.h> 28#include <kmenubar.h>
29#include <kstatusbar.h> 29#include <kstatusbar.h>
30#include <dcopclient.h> 30#include <dcopclient.h>
31#include "configwndimpl.h"
32#include "configuration.h"
31#else 33#else
32#include <qmenubar.h> 34#include <qmenubar.h>
33#include <qmessagebox.h> 35#include <qmessagebox.h>
36#include <pwmprefs.h>
37#include <kpimglobalprefs.h>
38#include <kcmconfigs/kcmpwmconfig.h>
39#include <kcmconfigs/kcmkdepimconfig.h>
40#include <kcmultidialog.h>
34#endif 41#endif
35 42
36#include <qpixmap.h> 43#include <qpixmap.h>
37#include <qcheckbox.h> 44#include <qcheckbox.h>
38#include <qspinbox.h> 45#include <qspinbox.h>
39#include <qlineedit.h> 46#include <qlineedit.h>
40#include <qfileinfo.h> 47#include <qfileinfo.h>
41#include <qclipboard.h> 48#include <qclipboard.h>
42 49
43 50
44#include <stdio.h> 51#include <stdio.h>
45 52
46#include "pwm.h" 53#include "pwm.h"
47#include "pwminit.h" 54#include "pwminit.h"
48#include "configwndimpl.h"
49#include "pwmprint.h" 55#include "pwmprint.h"
50#include "addentrywndimpl.h" 56#include "addentrywndimpl.h"
51#include "globalstuff.h" 57#include "globalstuff.h"
52#include "findwndimpl.h" 58#include "findwndimpl.h"
53#include "configuration.h"
54 59
55#ifdef CONFIG_KWALLETIF 60#ifdef CONFIG_KWALLETIF
56# include "kwalletif.h" 61# include "kwalletif.h"
57# include "kwalletemu.h" 62# include "kwalletemu.h"
58#endif 63#endif
59#ifdef CONFIG_KEYCARD 64#ifdef CONFIG_KEYCARD
60# include "pwmkeycard.h" 65# include "pwmkeycard.h"
61#endif 66#endif
62 67
63 68
64 #define DEFAULT_SIZE (QSize(700, 400)) 69 #define DEFAULT_SIZE (QSize(700, 400))
65 70
66// Button IDs for "file" popup menu 71// Button IDs for "file" popup menu
67enum { 72enum {
68 BUTTON_POPUP_FILE_NEW = 0, 73 BUTTON_POPUP_FILE_NEW = 0,
69 BUTTON_POPUP_FILE_OPEN, 74 BUTTON_POPUP_FILE_OPEN,
70 BUTTON_POPUP_FILE_CLOSE, 75 BUTTON_POPUP_FILE_CLOSE,
71 BUTTON_POPUP_FILE_SAVE, 76 BUTTON_POPUP_FILE_SAVE,
72 BUTTON_POPUP_FILE_SAVEAS, 77 BUTTON_POPUP_FILE_SAVEAS,
73 BUTTON_POPUP_FILE_EXPORT, 78 BUTTON_POPUP_FILE_EXPORT,
74 BUTTON_POPUP_FILE_IMPORT, 79 BUTTON_POPUP_FILE_IMPORT,
75 BUTTON_POPUP_FILE_PRINT, 80 BUTTON_POPUP_FILE_PRINT,
76 BUTTON_POPUP_FILE_QUIT 81 BUTTON_POPUP_FILE_QUIT
77}; 82};
78// Button IDs for "manage" popup menu 83// Button IDs for "manage" popup menu
79enum { 84enum {
80 BUTTON_POPUP_MANAGE_ADD = 0, 85 BUTTON_POPUP_MANAGE_ADD = 0,
81 BUTTON_POPUP_MANAGE_EDIT, 86 BUTTON_POPUP_MANAGE_EDIT,
82 BUTTON_POPUP_MANAGE_DEL, 87 BUTTON_POPUP_MANAGE_DEL,
83 BUTTON_POPUP_MANAGE_CHANGEMP 88 BUTTON_POPUP_MANAGE_CHANGEMP
84}; 89};
85// Button IDs for chipcard popup menu 90// Button IDs for chipcard popup menu
86enum { 91enum {
87#ifdef CONFIG_KEYCARD 92#ifdef CONFIG_KEYCARD
88 BUTTON_POPUP_CHIPCARD_GENNEW = 0, 93 BUTTON_POPUP_CHIPCARD_GENNEW = 0,
89 BUTTON_POPUP_CHIPCARD_DEL, 94 BUTTON_POPUP_CHIPCARD_DEL,
90 BUTTON_POPUP_CHIPCARD_READID, 95 BUTTON_POPUP_CHIPCARD_READID,
91 BUTTON_POPUP_CHIPCARD_SAVEBACKUP, 96 BUTTON_POPUP_CHIPCARD_SAVEBACKUP,
92 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP 97 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP
93#else // CONFIG_KEYCARD 98#else // CONFIG_KEYCARD
94 BUTTON_POPUP_CHIPCARD_NO = 0 99 BUTTON_POPUP_CHIPCARD_NO = 0
95#endif // CONFIG_KEYCARD 100#endif // CONFIG_KEYCARD
96}; 101};
97// Button IDs for "view" popup menu 102// Button IDs for "view" popup menu
98enum { 103enum {
99 BUTTON_POPUP_VIEW_FIND = 0, 104 BUTTON_POPUP_VIEW_FIND = 0,
100 BUTTON_POPUP_VIEW_LOCK, 105 BUTTON_POPUP_VIEW_LOCK,
101 BUTTON_POPUP_VIEW_DEEPLOCK, 106 BUTTON_POPUP_VIEW_DEEPLOCK,
102 BUTTON_POPUP_VIEW_UNLOCK 107 BUTTON_POPUP_VIEW_UNLOCK
103}; 108};
104// Button IDs for "options" popup menu 109// Button IDs for "options" popup menu
105enum { 110enum {
106 BUTTON_POPUP_OPTIONS_CONFIG = 0 111 BUTTON_POPUP_OPTIONS_CONFIG = 0
107}; 112};
108// Button IDs for "export" popup menu (in "file" popup menu) 113// Button IDs for "export" popup menu (in "file" popup menu)
109enum { 114enum {
110 BUTTON_POPUP_EXPORT_TEXT = 0, 115 BUTTON_POPUP_EXPORT_TEXT = 0,
111 BUTTON_POPUP_EXPORT_GPASMAN 116 BUTTON_POPUP_EXPORT_GPASMAN
112#ifdef CONFIG_KWALLETIF 117#ifdef CONFIG_KWALLETIF
113 ,BUTTON_POPUP_EXPORT_KWALLET 118 ,BUTTON_POPUP_EXPORT_KWALLET
114#endif 119#endif
115}; 120};
116// Button IDs for "import" popup menu (in "file" popup menu) 121// Button IDs for "import" popup menu (in "file" popup menu)
117enum { 122enum {
118 BUTTON_POPUP_IMPORT_TEXT = 0, 123 BUTTON_POPUP_IMPORT_TEXT = 0,
119 BUTTON_POPUP_IMPORT_GPASMAN 124 BUTTON_POPUP_IMPORT_GPASMAN
120#ifdef CONFIG_KWALLETIF 125#ifdef CONFIG_KWALLETIF
121 ,BUTTON_POPUP_IMPORT_KWALLET 126 ,BUTTON_POPUP_IMPORT_KWALLET
122#endif 127#endif
123}; 128};
124 129
125#ifdef PWM_EMBEDDED 130#ifdef PWM_EMBEDDED
126// Button IDs for "help" popup menu 131// Button IDs for "help" popup menu
127enum { 132enum {
128 BUTTON_POPUP_HELP_LICENSE = 0, 133 BUTTON_POPUP_HELP_LICENSE = 0,
129 BUTTON_POPUP_HELP_FAQ, 134 BUTTON_POPUP_HELP_FAQ,
130 BUTTON_POPUP_HELP_ABOUT 135 BUTTON_POPUP_HELP_ABOUT
131}; 136};
132#endif 137#endif
133 138
134// Button IDs for toolbar 139// Button IDs for toolbar
135enum { 140enum {
136 BUTTON_TOOL_NEW = 0, 141 BUTTON_TOOL_NEW = 0,
137 BUTTON_TOOL_OPEN, 142 BUTTON_TOOL_OPEN,
138 BUTTON_TOOL_SAVE, 143 BUTTON_TOOL_SAVE,
139 BUTTON_TOOL_SAVEAS, 144 BUTTON_TOOL_SAVEAS,
140 BUTTON_TOOL_PRINT, 145 BUTTON_TOOL_PRINT,
141 BUTTON_TOOL_ADD, 146 BUTTON_TOOL_ADD,
142 BUTTON_TOOL_EDIT, 147 BUTTON_TOOL_EDIT,
143 BUTTON_TOOL_DEL, 148 BUTTON_TOOL_DEL,
144 BUTTON_TOOL_FIND, 149 BUTTON_TOOL_FIND,
145 BUTTON_TOOL_LOCK, 150 BUTTON_TOOL_LOCK,
146 BUTTON_TOOL_DEEPLOCK, 151 BUTTON_TOOL_DEEPLOCK,
147 BUTTON_TOOL_UNLOCK 152 BUTTON_TOOL_UNLOCK
148}; 153};
149 154
150 155
151PwM::PwM(PwMInit *_init, PwMDoc *doc, 156PwM::PwM(PwMInit *_init, PwMDoc *doc,
152 bool virginity, 157 bool virginity,
153 QWidget *parent, const char *name) 158 QWidget *parent, const char *name)
154 : KMainWindow(parent, name) 159 : KMainWindow(parent, name)
155 , forceQuit (false) 160 , forceQuit (false)
156 , forceMinimizeToTray (false) 161 , forceMinimizeToTray (false)
157{ 162{
158 init = _init; 163 init = _init;
159 connect(doc, SIGNAL(docClosed(PwMDoc *)), 164 connect(doc, SIGNAL(docClosed(PwMDoc *)),
160 this, SLOT(docClosed(PwMDoc *))); 165 this, SLOT(docClosed(PwMDoc *)));
161 initMenubar(); 166 initMenubar();
162 initToolbar(); 167 initToolbar();
163 initMetrics(); 168 initMetrics();
164 setVirgin(virginity); 169 setVirgin(virginity);
165 setFocusPolicy(QWidget::WheelFocus); 170 setFocusPolicy(QWidget::WheelFocus);
166#ifndef PWM_EMBEDDED 171#ifndef PWM_EMBEDDED
167 statusBar()->show(); 172 statusBar()->show();
168#endif 173#endif
169 view = makeNewListView(doc); 174 view = makeNewListView(doc);
170 setCentralWidget(view); 175 setCentralWidget(view);
171 updateCaption(); 176 updateCaption();
172 showStatMsg(i18n("Ready.")); 177 showStatMsg(i18n("Ready."));
173} 178}
174 179
175PwM::~PwM() 180PwM::~PwM()
176{ 181{
177 disconnect(curDoc(), SIGNAL(docClosed(PwMDoc *)), 182 disconnect(curDoc(), SIGNAL(docClosed(PwMDoc *)),
178 this, SLOT(docClosed(PwMDoc *))); 183 this, SLOT(docClosed(PwMDoc *)));
179 conf()->confWndMainWndSize(size()); 184 conf()->confWndMainWndSize(size());
180 emit closed(this); 185 emit closed(this);
181 delete view; 186 delete view;
182} 187}
183 188
184void PwM::initMenubar() 189void PwM::initMenubar()
185{ 190{
186 KIconLoader* picons; 191 KIconLoader* picons;
187#ifndef PWM_EMBEDDED 192#ifndef PWM_EMBEDDED
188 KIconLoader icons; 193 KIconLoader icons;
189 picons = &icons; 194 picons = &icons;
190#else 195#else
191 picons = KGlobal::iconLoader(); 196 picons = KGlobal::iconLoader();
192#endif 197#endif
193 filePopup = new KPopupMenu(this); 198 filePopup = new KPopupMenu(this);
194 importPopup = new KPopupMenu(filePopup); 199 importPopup = new KPopupMenu(filePopup);
195 exportPopup = new KPopupMenu(filePopup); 200 exportPopup = new KPopupMenu(filePopup);
196 managePopup = new KPopupMenu(this); 201 managePopup = new KPopupMenu(this);
197#ifdef CONFIG_KEYCARD 202#ifdef CONFIG_KEYCARD
198 chipcardPopup = new KPopupMenu(this); 203 chipcardPopup = new KPopupMenu(this);
199#endif // CONFIG_KEYCARD 204#endif // CONFIG_KEYCARD
200 viewPopup = new KPopupMenu(this); 205 viewPopup = new KPopupMenu(this);
201 optionsPopup = new KPopupMenu(this); 206 optionsPopup = new KPopupMenu(this);
202 207
203// "file" popup menu 208// "file" popup menu
204 filePopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)), 209 filePopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)),
205 i18n("&New"), this, 210 i18n("&New"), this,
206 SLOT(new_slot()), 0, BUTTON_POPUP_FILE_NEW); 211 SLOT(new_slot()), 0, BUTTON_POPUP_FILE_NEW);
207 filePopup->insertItem(QIconSet(picons->loadIcon("fileopen", KIcon::Small)), 212 filePopup->insertItem(QIconSet(picons->loadIcon("fileopen", KIcon::Small)),
208 i18n("&Open"), this, 213 i18n("&Open"), this,
209 SLOT(open_slot()), 0, BUTTON_POPUP_FILE_OPEN); 214 SLOT(open_slot()), 0, BUTTON_POPUP_FILE_OPEN);
210 filePopup->insertItem(QIconSet(picons->loadIcon("fileclose", KIcon::Small)), 215 filePopup->insertItem(QIconSet(picons->loadIcon("fileclose", KIcon::Small)),
211 i18n("&Close"), this, 216 i18n("&Close"), this,
212 SLOT(close_slot()), 0, BUTTON_POPUP_FILE_CLOSE); 217 SLOT(close_slot()), 0, BUTTON_POPUP_FILE_CLOSE);
213 filePopup->insertSeparator(); 218 filePopup->insertSeparator();
214 filePopup->insertItem(QIconSet(picons->loadIcon("filesave", KIcon::Small)), 219 filePopup->insertItem(QIconSet(picons->loadIcon("filesave", KIcon::Small)),
215 i18n("&Save"), this, 220 i18n("&Save"), this,
216 SLOT(save_slot()), 0, BUTTON_POPUP_FILE_SAVE); 221 SLOT(save_slot()), 0, BUTTON_POPUP_FILE_SAVE);
217 filePopup->insertItem(QIconSet(picons->loadIcon("filesaveas", KIcon::Small)), 222 filePopup->insertItem(QIconSet(picons->loadIcon("filesaveas", KIcon::Small)),
218 i18n("Save &as..."), 223 i18n("Save &as..."),
219 this, SLOT(saveAs_slot()), 0, 224 this, SLOT(saveAs_slot()), 0,
220 BUTTON_POPUP_FILE_SAVEAS); 225 BUTTON_POPUP_FILE_SAVEAS);
221 filePopup->insertSeparator(); 226 filePopup->insertSeparator();
222 // "file/export" popup menu 227 // "file/export" popup menu
223 exportPopup->insertItem(i18n("&Text-file..."), this, 228 exportPopup->insertItem(i18n("&Text-file..."), this,
224 SLOT(exportToText()), 0, BUTTON_POPUP_EXPORT_TEXT); 229 SLOT(exportToText()), 0, BUTTON_POPUP_EXPORT_TEXT);
225 exportPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this, 230 exportPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this,
226 SLOT(exportToGpasman()), 0, BUTTON_POPUP_EXPORT_GPASMAN); 231 SLOT(exportToGpasman()), 0, BUTTON_POPUP_EXPORT_GPASMAN);
227#ifdef CONFIG_KWALLETIF 232#ifdef CONFIG_KWALLETIF
228 exportPopup->insertItem(i18n("&KWallet..."), this, 233 exportPopup->insertItem(i18n("&KWallet..."), this,
229 SLOT(exportToKWallet()), 0, BUTTON_POPUP_EXPORT_KWALLET); 234 SLOT(exportToKWallet()), 0, BUTTON_POPUP_EXPORT_KWALLET);
230#endif 235#endif
231 filePopup->insertItem(QIconSet(picons->loadIcon("fileexport", KIcon::Small)), 236 filePopup->insertItem(QIconSet(picons->loadIcon("fileexport", KIcon::Small)),
232 i18n("E&xport"), exportPopup, 237 i18n("E&xport"), exportPopup,
233 BUTTON_POPUP_FILE_EXPORT); 238 BUTTON_POPUP_FILE_EXPORT);
234 // "file/import" popup menu 239 // "file/import" popup menu
235 importPopup->insertItem(i18n("&Text-file..."), this, 240 importPopup->insertItem(i18n("&Text-file..."), this,
236 SLOT(importFromText()), 0, BUTTON_POPUP_IMPORT_TEXT); 241 SLOT(importFromText()), 0, BUTTON_POPUP_IMPORT_TEXT);
237 importPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this, 242 importPopup->insertItem(i18n("&Gpasman / Kpasman ..."), this,
238 SLOT(importFromGpasman()), 0, BUTTON_POPUP_IMPORT_GPASMAN); 243 SLOT(importFromGpasman()), 0, BUTTON_POPUP_IMPORT_GPASMAN);
239#ifdef CONFIG_KWALLETIF 244#ifdef CONFIG_KWALLETIF
240 importPopup->insertItem(i18n("&KWallet..."), this, 245 importPopup->insertItem(i18n("&KWallet..."), this,
241 SLOT(importKWallet()), 0, BUTTON_POPUP_IMPORT_KWALLET); 246 SLOT(importKWallet()), 0, BUTTON_POPUP_IMPORT_KWALLET);
242#endif 247#endif
243 filePopup->insertItem(QIconSet(picons->loadIcon("fileimport", KIcon::Small)), 248 filePopup->insertItem(QIconSet(picons->loadIcon("fileimport", KIcon::Small)),
244 i18n("I&mport"), importPopup, 249 i18n("I&mport"), importPopup,
245 BUTTON_POPUP_FILE_IMPORT); 250 BUTTON_POPUP_FILE_IMPORT);
246 filePopup->insertSeparator(); 251 filePopup->insertSeparator();
247 filePopup->insertItem(QIconSet(picons->loadIcon("fileprint", KIcon::Small)), 252 filePopup->insertItem(QIconSet(picons->loadIcon("fileprint", KIcon::Small)),
248 i18n("&Print..."), this, 253 i18n("&Print..."), this,
249 SLOT(print_slot()), 0, BUTTON_POPUP_FILE_PRINT); 254 SLOT(print_slot()), 0, BUTTON_POPUP_FILE_PRINT);
250 filePopup->insertSeparator(); 255 filePopup->insertSeparator();
251 filePopup->insertItem(QIconSet(picons->loadIcon("exit", KIcon::Small)), 256 filePopup->insertItem(QIconSet(picons->loadIcon("exit", KIcon::Small)),
252 i18n("&Quit"), this, 257 i18n("&Quit"), this,
253 SLOT(quitButton_slot()), 0, BUTTON_POPUP_FILE_QUIT); 258 SLOT(quitButton_slot()), 0, BUTTON_POPUP_FILE_QUIT);
254 menuBar()->insertItem(i18n("&File"), filePopup); 259 menuBar()->insertItem(i18n("&File"), filePopup);
255// "manage" popup menu 260// "manage" popup menu
256 managePopup->insertItem(QIconSet(picons->loadIcon("pencil", KIcon::Small)), 261 managePopup->insertItem(QIconSet(picons->loadIcon("pencil", KIcon::Small)),
257 i18n("&Add password"), this, 262 i18n("&Add password"), this,
258 SLOT(addPwd_slot()), 0, 263 SLOT(addPwd_slot()), 0,
259 BUTTON_POPUP_MANAGE_ADD); 264 BUTTON_POPUP_MANAGE_ADD);
260 managePopup->insertItem(QIconSet(picons->loadIcon("edit", KIcon::Small)), 265 managePopup->insertItem(QIconSet(picons->loadIcon("edit", KIcon::Small)),
261 i18n("&Edit"), this, SLOT(editPwd_slot()), 0, 266 i18n("&Edit"), this, SLOT(editPwd_slot()), 0,
262 BUTTON_POPUP_MANAGE_EDIT); 267 BUTTON_POPUP_MANAGE_EDIT);
263 managePopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)), 268 managePopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)),
264 i18n("&Delete"), this, SLOT(deletePwd_slot()), 269 i18n("&Delete"), this, SLOT(deletePwd_slot()),
265 0, BUTTON_POPUP_MANAGE_DEL); 270 0, BUTTON_POPUP_MANAGE_DEL);
266 managePopup->insertSeparator(); 271 managePopup->insertSeparator();
267 managePopup->insertItem(QIconSet(picons->loadIcon("rotate", KIcon::Small)), 272 managePopup->insertItem(QIconSet(picons->loadIcon("rotate", KIcon::Small)),
268 i18n("Change &Master Password"), this, 273 i18n("Change &Master Password"), this,
269 SLOT(changeMasterPwd_slot()), 0, 274 SLOT(changeMasterPwd_slot()), 0,
270 BUTTON_POPUP_MANAGE_CHANGEMP); 275 BUTTON_POPUP_MANAGE_CHANGEMP);
271 menuBar()->insertItem(i18n("&Manage"), managePopup); 276 menuBar()->insertItem(i18n("&Manage"), managePopup);
272// "chipcard" popup menu 277// "chipcard" popup menu
273#ifdef CONFIG_KEYCARD 278#ifdef CONFIG_KEYCARD
274 chipcardPopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)), 279 chipcardPopup->insertItem(QIconSet(picons->loadIcon("filenew", KIcon::Small)),
275 i18n("&Generate new key-card"), this, 280 i18n("&Generate new key-card"), this,
276 SLOT(genNewCard_slot()), 0, 281 SLOT(genNewCard_slot()), 0,
277 BUTTON_POPUP_CHIPCARD_GENNEW); 282 BUTTON_POPUP_CHIPCARD_GENNEW);
278 chipcardPopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)), 283 chipcardPopup->insertItem(QIconSet(picons->loadIcon("editdelete", KIcon::Small)),
279 i18n("&Erase key-card"), this, 284 i18n("&Erase key-card"), this,
280 SLOT(eraseCard_slot()), 0, 285 SLOT(eraseCard_slot()), 0,
281 BUTTON_POPUP_CHIPCARD_DEL); 286 BUTTON_POPUP_CHIPCARD_DEL);
282 chipcardPopup->insertItem(QIconSet(picons->loadIcon("", KIcon::Small)), 287 chipcardPopup->insertItem(QIconSet(picons->loadIcon("", KIcon::Small)),
283 i18n("Read card-&ID"), this, 288 i18n("Read card-&ID"), this,
284 SLOT(readCardId_slot()), 0, 289 SLOT(readCardId_slot()), 0,
285 BUTTON_POPUP_CHIPCARD_READID); 290 BUTTON_POPUP_CHIPCARD_READID);
286 chipcardPopup->insertSeparator(); 291 chipcardPopup->insertSeparator();
287 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2rightarrow", KIcon::Small)), 292 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2rightarrow", KIcon::Small)),
288 i18n("&Make card backup-image"), this, 293 i18n("&Make card backup-image"), this,
289 SLOT(makeCardBackup_slot()), 0, 294 SLOT(makeCardBackup_slot()), 0,
290 BUTTON_POPUP_CHIPCARD_SAVEBACKUP); 295 BUTTON_POPUP_CHIPCARD_SAVEBACKUP);
291 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2leftarrow", KIcon::Small)), 296 chipcardPopup->insertItem(QIconSet(picons->loadIcon("2leftarrow", KIcon::Small)),
292 i18n("&Replay card backup-image"), this, 297 i18n("&Replay card backup-image"), this,
293 SLOT(replayCardBackup_slot()), 0, 298 SLOT(replayCardBackup_slot()), 0,
294 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP); 299 BUTTON_POPUP_CHIPCARD_REPLAYBACKUP);
295 menuBar()->insertItem(i18n("&Chipcard manager"), chipcardPopup); 300 menuBar()->insertItem(i18n("&Chipcard manager"), chipcardPopup);
296#endif // CONFIG_KEYCARD 301#endif // CONFIG_KEYCARD
297// "view" popup menu 302// "view" popup menu
298 viewPopup->insertItem(QIconSet(picons->loadIcon("find", KIcon::Small)), 303 viewPopup->insertItem(QIconSet(picons->loadIcon("find", KIcon::Small)),
299 i18n("&Find"), this, 304 i18n("&Find"), this,
300 SLOT(find_slot()), 0, BUTTON_POPUP_VIEW_FIND); 305 SLOT(find_slot()), 0, BUTTON_POPUP_VIEW_FIND);
301 viewPopup->insertSeparator(); 306 viewPopup->insertSeparator();
302 viewPopup->insertItem(QIconSet(picons->loadIcon("halfencrypted", KIcon::Small)), 307 viewPopup->insertItem(QIconSet(picons->loadIcon("halfencrypted", KIcon::Small)),
303 i18n("&Lock all entries"), this, 308 i18n("&Lock all entries"), this,
304 SLOT(lockWnd_slot()), 0, 309 SLOT(lockWnd_slot()), 0,
305 BUTTON_POPUP_VIEW_LOCK); 310 BUTTON_POPUP_VIEW_LOCK);
306 viewPopup->insertItem(QIconSet(picons->loadIcon("encrypted", KIcon::Small)), 311 viewPopup->insertItem(QIconSet(picons->loadIcon("encrypted", KIcon::Small)),
307 i18n("&Deep-lock all entries"), this, 312 i18n("&Deep-lock all entries"), this,
308 SLOT(deepLockWnd_slot()), 0, 313 SLOT(deepLockWnd_slot()), 0,
309 BUTTON_POPUP_VIEW_DEEPLOCK); 314 BUTTON_POPUP_VIEW_DEEPLOCK);
310 viewPopup->insertItem(QIconSet(picons->loadIcon("decrypted", KIcon::Small)), 315 viewPopup->insertItem(QIconSet(picons->loadIcon("decrypted", KIcon::Small)),
311 i18n("&Unlock all entries"), this, 316 i18n("&Unlock all entries"), this,
312 SLOT(unlockWnd_slot()), 0, 317 SLOT(unlockWnd_slot()), 0,
313 BUTTON_POPUP_VIEW_UNLOCK); 318 BUTTON_POPUP_VIEW_UNLOCK);
314 menuBar()->insertItem(i18n("&View"), viewPopup); 319 menuBar()->insertItem(i18n("&View"), viewPopup);
315// "options" popup menu 320// "options" popup menu
316 optionsPopup->insertItem(QIconSet(picons->loadIcon("configure", KIcon::Small)), 321 optionsPopup->insertItem(QIconSet(picons->loadIcon("configure", KIcon::Small)),
317 i18n("&Configure..."), this, 322 i18n("&Configure..."), this,
318 SLOT(config_slot()), 323 SLOT(config_slot()),
319 BUTTON_POPUP_OPTIONS_CONFIG); 324 BUTTON_POPUP_OPTIONS_CONFIG);
320 menuBar()->insertItem(i18n("&Options"), optionsPopup); 325 menuBar()->insertItem(i18n("&Options"), optionsPopup);
321// "help" popup menu 326// "help" popup menu
322#ifndef PWM_EMBEDDED 327#ifndef PWM_EMBEDDED
323 helpPopup = helpMenu(QString::null, false); 328 helpPopup = helpMenu(QString::null, false);
324#else 329#else
325 helpPopup = new KPopupMenu(this); 330 helpPopup = new KPopupMenu(this);
326 331
327 332
328 helpPopup->insertItem(i18n("&License"), this, 333 helpPopup->insertItem(i18n("&License"), this,
329 SLOT(showLicense_slot()), 0, 334 SLOT(showLicense_slot()), 0,
330 BUTTON_POPUP_HELP_LICENSE); 335 BUTTON_POPUP_HELP_LICENSE);
331 336
332 helpPopup->insertItem(i18n("&Faq"), this, 337 helpPopup->insertItem(i18n("&Faq"), this,
333 SLOT(faq_slot()), 0, 338 SLOT(faq_slot()), 0,
334 BUTTON_POPUP_HELP_FAQ); 339 BUTTON_POPUP_HELP_FAQ);
335 340
336 helpPopup->insertItem(i18n("&About PwManager"), this, 341 helpPopup->insertItem(i18n("&About PwManager"), this,
337 SLOT(createAboutData_slot()), 0, 342 SLOT(createAboutData_slot()), 0,
338 BUTTON_POPUP_HELP_ABOUT); 343 BUTTON_POPUP_HELP_ABOUT);
339 344
340#endif 345#endif
341 menuBar()->insertItem(i18n("&Help"), helpPopup); 346 menuBar()->insertItem(i18n("&Help"), helpPopup);
342 347
343} 348}
344 349
345void PwM::initToolbar() 350void PwM::initToolbar()
346{ 351{
347 KIconLoader* picons; 352 KIconLoader* picons;
348#ifndef PWM_EMBEDDED 353#ifndef PWM_EMBEDDED
349 KIconLoader icons; 354 KIconLoader icons;
350 picons = &icons; 355 picons = &icons;
351#else 356#else
352 picons = KGlobal::iconLoader(); 357 picons = KGlobal::iconLoader();
353#endif 358#endif
354 359
355 toolBar()->insertButton(picons->loadIcon("filenew", KIcon::Toolbar), 360 toolBar()->insertButton(picons->loadIcon("filenew", KIcon::Toolbar),
356 BUTTON_TOOL_NEW, SIGNAL(clicked(int)), this, 361 BUTTON_TOOL_NEW, SIGNAL(clicked(int)), this,
357 SLOT(new_slot()), true, i18n("New")); 362 SLOT(new_slot()), true, i18n("New"));
358 toolBar()->insertButton(picons->loadIcon("fileopen", KIcon::Toolbar), 363 toolBar()->insertButton(picons->loadIcon("fileopen", KIcon::Toolbar),
359 BUTTON_TOOL_OPEN, SIGNAL(clicked(int)), this, 364 BUTTON_TOOL_OPEN, SIGNAL(clicked(int)), this,
360 SLOT(open_slot()), true, i18n("Open")); 365 SLOT(open_slot()), true, i18n("Open"));
361 toolBar()->insertSeparator(); 366 toolBar()->insertSeparator();
362 toolBar()->insertButton(picons->loadIcon("filesave", KIcon::Toolbar), 367 toolBar()->insertButton(picons->loadIcon("filesave", KIcon::Toolbar),
363 BUTTON_TOOL_SAVE, SIGNAL(clicked(int)), this, 368 BUTTON_TOOL_SAVE, SIGNAL(clicked(int)), this,
364 SLOT(save_slot()), true, i18n("Save")); 369 SLOT(save_slot()), true, i18n("Save"));
365 toolBar()->insertButton(picons->loadIcon("filesaveas", KIcon::Toolbar), 370 toolBar()->insertButton(picons->loadIcon("filesaveas", KIcon::Toolbar),
366 BUTTON_TOOL_SAVEAS, SIGNAL(clicked(int)), this, 371 BUTTON_TOOL_SAVEAS, SIGNAL(clicked(int)), this,
367 SLOT(saveAs_slot()), true, i18n("Save as")); 372 SLOT(saveAs_slot()), true, i18n("Save as"));
368 toolBar()->insertButton(picons->loadIcon("fileprint", KIcon::Toolbar), 373 toolBar()->insertButton(picons->loadIcon("fileprint", KIcon::Toolbar),
369 BUTTON_TOOL_PRINT, SIGNAL(clicked(int)), this, 374 BUTTON_TOOL_PRINT, SIGNAL(clicked(int)), this,
370 SLOT(print_slot()), true, i18n("Print...")); 375 SLOT(print_slot()), true, i18n("Print..."));
371 toolBar()->insertSeparator(); 376 toolBar()->insertSeparator();
372 toolBar()->insertButton(picons->loadIcon("pencil", KIcon::Toolbar), 377 toolBar()->insertButton(picons->loadIcon("pencil", KIcon::Toolbar),
373 BUTTON_TOOL_ADD, SIGNAL(clicked(int)), this, 378 BUTTON_TOOL_ADD, SIGNAL(clicked(int)), this,
374 SLOT(addPwd_slot()), true, 379 SLOT(addPwd_slot()), true,
375 i18n("Add password")); 380 i18n("Add password"));
376 toolBar()->insertButton(picons->loadIcon("edit", KIcon::Toolbar), 381 toolBar()->insertButton(picons->loadIcon("edit", KIcon::Toolbar),
377 BUTTON_TOOL_EDIT, SIGNAL(clicked(int)), this, 382 BUTTON_TOOL_EDIT, SIGNAL(clicked(int)), this,
378 SLOT(editPwd_slot()), true, 383 SLOT(editPwd_slot()), true,
379 i18n("Edit password")); 384 i18n("Edit password"));
380 toolBar()->insertButton(picons->loadIcon("editdelete", KIcon::Toolbar), 385 toolBar()->insertButton(picons->loadIcon("editdelete", KIcon::Toolbar),
381 BUTTON_TOOL_DEL, SIGNAL(clicked(int)), this, 386 BUTTON_TOOL_DEL, SIGNAL(clicked(int)), this,
382 SLOT(deletePwd_slot()), true, 387 SLOT(deletePwd_slot()), true,
383 i18n("Delete password")); 388 i18n("Delete password"));
384 toolBar()->insertSeparator(); 389 toolBar()->insertSeparator();
385 toolBar()->insertButton(picons->loadIcon("find", KIcon::Toolbar), 390 toolBar()->insertButton(picons->loadIcon("find", KIcon::Toolbar),
386 BUTTON_TOOL_FIND, SIGNAL(clicked(int)), this, 391 BUTTON_TOOL_FIND, SIGNAL(clicked(int)), this,
387 SLOT(find_slot()), true, i18n("Find entry")); 392 SLOT(find_slot()), true, i18n("Find entry"));
388 toolBar()->insertSeparator(); 393 toolBar()->insertSeparator();
389 toolBar()->insertButton(picons->loadIcon("halfencrypted", KIcon::Toolbar), 394 toolBar()->insertButton(picons->loadIcon("halfencrypted", KIcon::Toolbar),
390 BUTTON_TOOL_LOCK, SIGNAL(clicked(int)), this, 395 BUTTON_TOOL_LOCK, SIGNAL(clicked(int)), this,
391 SLOT(lockWnd_slot()), true, 396 SLOT(lockWnd_slot()), true,
392 i18n("Lock all entries")); 397 i18n("Lock all entries"));
393 toolBar()->insertButton(picons->loadIcon("encrypted", KIcon::Toolbar), 398 toolBar()->insertButton(picons->loadIcon("encrypted", KIcon::Toolbar),
394 BUTTON_TOOL_DEEPLOCK, SIGNAL(clicked(int)), this, 399 BUTTON_TOOL_DEEPLOCK, SIGNAL(clicked(int)), this,
395 SLOT(deepLockWnd_slot()), true, 400 SLOT(deepLockWnd_slot()), true,
396 i18n("Deep-Lock all entries")); 401 i18n("Deep-Lock all entries"));
397 toolBar()->insertButton(picons->loadIcon("decrypted", KIcon::Toolbar), 402 toolBar()->insertButton(picons->loadIcon("decrypted", KIcon::Toolbar),
398 BUTTON_TOOL_UNLOCK, SIGNAL(clicked(int)), this, 403 BUTTON_TOOL_UNLOCK, SIGNAL(clicked(int)), this,
399 SLOT(unlockWnd_slot()), true, 404 SLOT(unlockWnd_slot()), true,
400 i18n("Unlock all entries")); 405 i18n("Unlock all entries"));
401} 406}
402 407
403void PwM::initMetrics() 408void PwM::initMetrics()
404{ 409{
405 QSize s = conf()->confWndMainWndSize(); 410 QSize s = conf()->confWndMainWndSize();
406 if (s.isValid()) 411 if (s.isValid())
407 resize(s); 412 resize(s);
408 else 413 else
409 resize(DEFAULT_SIZE); 414 resize(DEFAULT_SIZE);
410} 415}
411 416
412void PwM::updateCaption() 417void PwM::updateCaption()
413{ 418{
414 setPlainCaption(curDoc()->getTitle() + " - " PROG_NAME " " PACKAGE_VER); 419 setPlainCaption(curDoc()->getTitle() + " - " PROG_NAME " " PACKAGE_VER);
415} 420}
416 421
417void PwM::hideEvent(QHideEvent *) 422void PwM::hideEvent(QHideEvent *)
418{ 423{
419 if (isMinimized()) { 424 if (isMinimized()) {
420 if (init->tray()) { 425 if (init->tray()) {
421 forceMinimizeToTray = true; 426 forceMinimizeToTray = true;
422 close(); 427 close();
423 } 428 }
424 int mmlock = conf()->confGlobMinimizeLock(); 429 int mmlock = conf()->confGlobMinimizeLock();
425 switch (mmlock) { 430 switch (mmlock) {
426 case 0: // don't lock anything 431 case 0: // don't lock anything
427 break; 432 break;
428 case 1: {// normal lock 433 case 1: {// normal lock
429 curDoc()->lockAll(true); 434 curDoc()->lockAll(true);
430 break; 435 break;
431 } case 2: {// deep-lock 436 } case 2: {// deep-lock
432 curDoc()->deepLock(); 437 curDoc()->deepLock();
433 break; 438 break;
434 } default: 439 } default:
435 WARN(); 440 WARN();
436 } 441 }
437 } 442 }
438} 443}
439 444
440void PwM::setVirgin(bool v) 445void PwM::setVirgin(bool v)
441{ 446{
442 if (virgin == v) 447 if (virgin == v)
443 return; 448 return;
444 virgin = v; 449 virgin = v;
445 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVE, !v); 450 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVE, !v);
446 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVEAS, !v); 451 filePopup->setItemEnabled(BUTTON_POPUP_FILE_SAVEAS, !v);
447 filePopup->setItemEnabled(BUTTON_POPUP_FILE_EXPORT, !v); 452 filePopup->setItemEnabled(BUTTON_POPUP_FILE_EXPORT, !v);
448 filePopup->setItemEnabled(BUTTON_POPUP_FILE_PRINT, !v); 453 filePopup->setItemEnabled(BUTTON_POPUP_FILE_PRINT, !v);
449 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_EDIT, !v); 454 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_EDIT, !v);
450 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_DEL, !v); 455 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_DEL, !v);
451 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, !v); 456 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, !v);
452 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_LOCK, !v); 457 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_LOCK, !v);
453 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_DEEPLOCK, !v); 458 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_DEEPLOCK, !v);
454 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_UNLOCK, !v); 459 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_UNLOCK, !v);
455 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_FIND, !v); 460 viewPopup->setItemEnabled(BUTTON_POPUP_VIEW_FIND, !v);
456 toolBar()->setItemEnabled(BUTTON_TOOL_SAVE, !v); 461 toolBar()->setItemEnabled(BUTTON_TOOL_SAVE, !v);
457 toolBar()->setItemEnabled(BUTTON_TOOL_SAVEAS, !v); 462 toolBar()->setItemEnabled(BUTTON_TOOL_SAVEAS, !v);
458 toolBar()->setItemEnabled(BUTTON_TOOL_PRINT, !v); 463 toolBar()->setItemEnabled(BUTTON_TOOL_PRINT, !v);
459 toolBar()->setItemEnabled(BUTTON_TOOL_EDIT, !v); 464 toolBar()->setItemEnabled(BUTTON_TOOL_EDIT, !v);
460 toolBar()->setItemEnabled(BUTTON_TOOL_DEL, !v); 465 toolBar()->setItemEnabled(BUTTON_TOOL_DEL, !v);
461 toolBar()->setItemEnabled(BUTTON_TOOL_LOCK, !v); 466 toolBar()->setItemEnabled(BUTTON_TOOL_LOCK, !v);
462 toolBar()->setItemEnabled(BUTTON_TOOL_DEEPLOCK, !v); 467 toolBar()->setItemEnabled(BUTTON_TOOL_DEEPLOCK, !v);
463 toolBar()->setItemEnabled(BUTTON_TOOL_UNLOCK, !v); 468 toolBar()->setItemEnabled(BUTTON_TOOL_UNLOCK, !v);
464 toolBar()->setItemEnabled(BUTTON_TOOL_FIND, !v); 469 toolBar()->setItemEnabled(BUTTON_TOOL_FIND, !v);
465} 470}
466 471
467void PwM::new_slot() 472void PwM::new_slot()
468{ 473{
469 init->createMainWnd(); 474 init->createMainWnd();
470} 475}
471 476
472//US ENH 477//US ENH
473void PwM::open_slot() 478void PwM::open_slot()
474{ 479{
475 open_slot(""); 480 open_slot("");
476} 481}
477 482
478void PwM::open_slot(QString fn) 483void PwM::open_slot(QString fn)
479{ 484{
480 openDoc(fn); 485 openDoc(fn);
481} 486}
482 487
483PwMDoc * PwM::openDoc(QString filename, bool openDeepLocked) 488PwMDoc * PwM::openDoc(QString filename, bool openDeepLocked)
484{ 489{
485 if (!isVirgin()) { 490 if (!isVirgin()) {
486 // open the document in a new window. 491 // open the document in a new window.
487 PwM *newInstance = init->createMainWnd(); 492 PwM *newInstance = init->createMainWnd();
488 PwMDoc *newDoc = newInstance->openDoc(filename, openDeepLocked); 493 PwMDoc *newDoc = newInstance->openDoc(filename, openDeepLocked);
489 if (!newDoc) { 494 if (!newDoc) {
490 newInstance->setForceQuit(true); 495 newInstance->setForceQuit(true);
491 delete_and_null(newInstance); 496 delete_and_null(newInstance);
492 } 497 }
493 return newDoc; 498 return newDoc;
494 } 499 }
495 500
496 if (!curDoc()->openDocUi(curDoc(), filename, openDeepLocked)) 501 if (!curDoc()->openDocUi(curDoc(), filename, openDeepLocked))
497 return 0; 502 return 0;
498 showStatMsg(i18n("Successfully opened file.")); 503 showStatMsg(i18n("Successfully opened file."));
499 updateCaption(); 504 updateCaption();
500 setVirgin(false); 505 setVirgin(false);
501 return curDoc(); 506 return curDoc();
502} 507}
503 508
504PwMView * PwM::makeNewListView(PwMDoc *doc) 509PwMView * PwM::makeNewListView(PwMDoc *doc)
505{ 510{
506 PwMView *ret = new PwMView(this, this, doc); 511 PwMView *ret = new PwMView(this, this, doc);
507 ret->setFont(conf()->confGlobEntryFont()); 512 ret->setFont(conf()->confGlobEntryFont());
508 ret->show(); 513 ret->show();
509 return ret; 514 return ret;
510} 515}
511 516
512void PwM::close_slot() 517void PwM::close_slot()
513{ 518{
514 close(); 519 close();
515} 520}
516 521
517void PwM::quitButton_slot() 522void PwM::quitButton_slot()
518{ 523{
519 init->shutdownApp(0); 524 init->shutdownApp(0);
520} 525}
521 526
522void PwM::save_slot() 527void PwM::save_slot()
523{ 528{
524 save(); 529 save();
525} 530}
526 531
527bool PwM::save() 532bool PwM::save()
528{ 533{
529 if (!curDoc()->saveDocUi(curDoc())) 534 if (!curDoc()->saveDocUi(curDoc()))
530 return false; 535 return false;
531 showStatMsg(i18n("Successfully saved data.")); 536 showStatMsg(i18n("Successfully saved data."));
532 updateCaption(); 537 updateCaption();
533 return true; 538 return true;
534} 539}
535 540
536void PwM::saveAs_slot() 541void PwM::saveAs_slot()
537{ 542{
538 saveAs(); 543 saveAs();
539} 544}
540 545
541bool PwM::saveAs() 546bool PwM::saveAs()
542{ 547{
543 if (!curDoc()->saveAsDocUi(curDoc())) 548 if (!curDoc()->saveAsDocUi(curDoc()))
544 return false; 549 return false;
545 showStatMsg(i18n("Successfully saved data.")); 550 showStatMsg(i18n("Successfully saved data."));
546 updateCaption(); 551 updateCaption();
547 return true; 552 return true;
548} 553}
549 554
550//US ENH : changed code to run with older MOC 555//US ENH : changed code to run with older MOC
551void PwM::addPwd_slot() 556void PwM::addPwd_slot()
552{ 557{
553 addPwd_slot(0, 0); 558 addPwd_slot(0, 0);
554} 559}
555 560
556void PwM::addPwd_slot(QString *pw, PwMDoc *_doc) 561void PwM::addPwd_slot(QString *pw, PwMDoc *_doc)
557{ 562{
558 PwMDoc *doc; 563 PwMDoc *doc;
559 if (_doc) { 564 if (_doc) {
560 doc = _doc; 565 doc = _doc;
561 } else { 566 } else {
562 doc = curDoc(); 567 doc = curDoc();
563 } 568 }
564 PWM_ASSERT(doc); 569 PWM_ASSERT(doc);
565 doc->timer()->getLock(DocTimer::id_autoLockTimer); 570 doc->timer()->getLock(DocTimer::id_autoLockTimer);
566 AddEntryWndImpl w; 571 AddEntryWndImpl w;
567 vector<string> catList; 572 vector<string> catList;
568 doc->getCategoryList(&catList); 573 doc->getCategoryList(&catList);
569 unsigned i, size = catList.size(); 574 unsigned i, size = catList.size();
570 for (i = 0; i < size; ++i) { 575 for (i = 0; i < size; ++i) {
571 w.addCategory(catList[i].c_str()); 576 w.addCategory(catList[i].c_str());
572 } 577 }
573 w.setCurrCategory(view->getCurrentCategory()); 578 w.setCurrCategory(view->getCurrentCategory());
574 if (pw) 579 if (pw)
575 w.pwLineEdit->setText(*pw); 580 w.pwLineEdit->setText(*pw);
576 581
577 tryAgain: 582 tryAgain:
578 if (w.exec() == 1) 583 if (w.exec() == 1)
579 { 584 {
580 PwMDataItem d; 585 PwMDataItem d;
581 d.desc = w.getDescription().latin1(); 586 d.desc = w.getDescription().latin1();
582 d.name = w.getUsername().latin1(); 587 d.name = w.getUsername().latin1();
583 d.pw = w.getPassword().latin1(); 588 d.pw = w.getPassword().latin1();
584 d.comment = w.getComment().latin1(); 589 d.comment = w.getComment().latin1();
585 d.url = w.getUrl().latin1(); 590 d.url = w.getUrl().latin1();
586 d.launcher = w.getLauncher().latin1(); 591 d.launcher = w.getLauncher().latin1();
587 PwMerror ret = doc->addEntry(w.getCategory(), &d); 592 PwMerror ret = doc->addEntry(w.getCategory(), &d);
588 if (ret == e_entryExists) { 593 if (ret == e_entryExists) {
589 KMessageBox::error(this, 594 KMessageBox::error(this,
590 i18n 595 i18n
591 ("An entry with this \"Description\", " 596 ("An entry with this \"Description\", "
592 "does already exist.\n" 597 "does already exist.\n"
593 "Please select another description."), 598 "Please select another description."),
594 i18n("entry already exists.")); 599 i18n("entry already exists."));
595 goto tryAgain; 600 goto tryAgain;
596 } else if (ret == e_maxAllowedEntr) { 601 } else if (ret == e_maxAllowedEntr) {
597 KMessageBox::error(this, i18n("The maximum possible number of entries " 602 KMessageBox::error(this, i18n("The maximum possible number of entries "
598 "has been reached. You can't add more entries."), 603 "has been reached. You can't add more entries."),
599 i18n("maximum number of entries")); 604 i18n("maximum number of entries"));
600 doc->timer()->putLock(DocTimer::id_autoLockTimer); 605 doc->timer()->putLock(DocTimer::id_autoLockTimer);
601 return; 606 return;
602 } 607 }
603 } 608 }
604 setVirgin(false); 609 setVirgin(false);
605 doc->timer()->putLock(DocTimer::id_autoLockTimer); 610 doc->timer()->putLock(DocTimer::id_autoLockTimer);
606} 611}
607 612
608//US ENH : changed code to run with older MOC 613//US ENH : changed code to run with older MOC
609void PwM::editPwd_slot() 614void PwM::editPwd_slot()
610{ 615{
611 editPwd_slot(0,0,0); 616 editPwd_slot(0,0,0);
612} 617}
613 618
614void PwM::editPwd_slot(const QString *category) 619void PwM::editPwd_slot(const QString *category)
615{ 620{
616 editPwd_slot(category, 0, 0); 621 editPwd_slot(category, 0, 0);
617} 622}
618 623
619void PwM::editPwd_slot(const QString *category, const int *index, 624void PwM::editPwd_slot(const QString *category, const int *index,
620 PwMDoc *_doc) 625 PwMDoc *_doc)
621{ 626{
622 PwMDoc *doc; 627 PwMDoc *doc;
623 if (_doc) { 628 if (_doc) {
624 doc = _doc; 629 doc = _doc;
625 } else { 630 } else {
626 doc = curDoc(); 631 doc = curDoc();
627 } 632 }
628 PWM_ASSERT(doc); 633 PWM_ASSERT(doc);
629 if (doc->isDocEmpty()) 634 if (doc->isDocEmpty())
630 return; 635 return;
631 if (doc->isDeepLocked()) 636 if (doc->isDeepLocked())
632 return; 637 return;
633 doc->timer()->getLock(DocTimer::id_autoLockTimer); 638 doc->timer()->getLock(DocTimer::id_autoLockTimer);
634 unsigned int curEntryIndex; 639 unsigned int curEntryIndex;
635 if (index) { 640 if (index) {
636 curEntryIndex = *index; 641 curEntryIndex = *index;
637 } else { 642 } else {
638 if (!(view->getCurEntryIndex(&curEntryIndex))) { 643 if (!(view->getCurEntryIndex(&curEntryIndex))) {
639 printDebug("couldn't get index. Maybe we have a binary entry here."); 644 printDebug("couldn't get index. Maybe we have a binary entry here.");
640 doc->timer()->putLock(DocTimer::id_autoLockTimer); 645 doc->timer()->putLock(DocTimer::id_autoLockTimer);
641 return; 646 return;
642 } 647 }
643 } 648 }
644 QString curCategory; 649 QString curCategory;
645 if (category) { 650 if (category) {
646 curCategory = *category; 651 curCategory = *category;
647 } else { 652 } else {
648 curCategory = view->getCurrentCategory(); 653 curCategory = view->getCurrentCategory();
649 } 654 }
650 PwMDataItem currItem; 655 PwMDataItem currItem;
651 if (!doc->getEntry(curCategory, curEntryIndex, &currItem, true)) { 656 if (!doc->getEntry(curCategory, curEntryIndex, &currItem, true)) {
652 doc->timer()->putLock(DocTimer::id_autoLockTimer); 657 doc->timer()->putLock(DocTimer::id_autoLockTimer);
653 return; 658 return;
654 } 659 }
655 BUG_ON(currItem.binary); 660 BUG_ON(currItem.binary);
656 661
657 AddEntryWndImpl w; 662 AddEntryWndImpl w;
658 vector<string> catList; 663 vector<string> catList;
659 doc->getCategoryList(&catList); 664 doc->getCategoryList(&catList);
660 unsigned i, size = catList.size(); 665 unsigned i, size = catList.size();
661 for (i = 0; i < size; ++i) { 666 for (i = 0; i < size; ++i) {
662 w.addCategory(catList[i].c_str()); 667 w.addCategory(catList[i].c_str());
663 } 668 }
664 w.setCurrCategory(curCategory); 669 w.setCurrCategory(curCategory);
665 w.setDescription(currItem.desc.c_str()); 670 w.setDescription(currItem.desc.c_str());
666 w.setUsername(currItem.name.c_str()); 671 w.setUsername(currItem.name.c_str());
667 w.setPassword(currItem.pw.c_str()); 672 w.setPassword(currItem.pw.c_str());
668 w.setUrl(currItem.url.c_str()); 673 w.setUrl(currItem.url.c_str());
669 w.setLauncher(currItem.launcher.c_str()); 674 w.setLauncher(currItem.launcher.c_str());
670 w.setComment(currItem.comment.c_str()); 675 w.setComment(currItem.comment.c_str());
671 if (w.exec() == 1) { 676 if (w.exec() == 1) {
672 currItem.desc = w.getDescription().latin1(); 677 currItem.desc = w.getDescription().latin1();
673 currItem.name = w.getUsername().latin1(); 678 currItem.name = w.getUsername().latin1();
674 currItem.pw = w.getPassword().latin1(); 679 currItem.pw = w.getPassword().latin1();
675 currItem.comment = w.getComment().latin1(); 680 currItem.comment = w.getComment().latin1();
676 currItem.url = w.getUrl().latin1(); 681 currItem.url = w.getUrl().latin1();
677 currItem.launcher = w.getLauncher().latin1(); 682 currItem.launcher = w.getLauncher().latin1();
678 if (!doc->editEntry(curCategory, w.getCategory(), 683 if (!doc->editEntry(curCategory, w.getCategory(),
679 curEntryIndex, &currItem)) { 684 curEntryIndex, &currItem)) {
680 KMessageBox::error(this, 685 KMessageBox::error(this,
681 i18n("Couldn't edit the entry.\n" 686 i18n("Couldn't edit the entry.\n"
682 "Maybe you changed the category and " 687 "Maybe you changed the category and "
683 "this entry is already present in the new " 688 "this entry is already present in the new "
684 "category?"), 689 "category?"),
685 i18n("couldn't edit entry.")); 690 i18n("couldn't edit entry."));
686 doc->timer()->putLock(DocTimer::id_autoLockTimer); 691 doc->timer()->putLock(DocTimer::id_autoLockTimer);
687 return; 692 return;
688 } 693 }
689 } 694 }
690 doc->timer()->putLock(DocTimer::id_autoLockTimer); 695 doc->timer()->putLock(DocTimer::id_autoLockTimer);
691} 696}
692 697
693void PwM::deletePwd_slot() 698void PwM::deletePwd_slot()
694{ 699{
695 PWM_ASSERT(curDoc()); 700 PWM_ASSERT(curDoc());
696 if (curDoc()->isDocEmpty()) 701 if (curDoc()->isDocEmpty())
697 return; 702 return;
698 if (curDoc()->isDeepLocked()) 703 if (curDoc()->isDeepLocked())
699 return; 704 return;
700 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 705 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
701 unsigned int curEntryIndex = 0; 706 unsigned int curEntryIndex = 0;
702 if (!(view->getCurEntryIndex(&curEntryIndex))) { 707 if (!(view->getCurEntryIndex(&curEntryIndex))) {
703 printDebug("couldn't get index"); 708 printDebug("couldn't get index");
704 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 709 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
705 return; 710 return;
706 } 711 }
707 712
708 PwMDataItem currItem; 713 PwMDataItem currItem;
709 QString curCategory = view->getCurrentCategory(); 714 QString curCategory = view->getCurrentCategory();
710 if (!curDoc()->getEntry(curCategory, curEntryIndex, &currItem)) { 715 if (!curDoc()->getEntry(curCategory, curEntryIndex, &currItem)) {
711 printDebug("couldn't get entry"); 716 printDebug("couldn't get entry");
712 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 717 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
713 return; 718 return;
714 } 719 }
715 if (KMessageBox:: 720 if (KMessageBox::
716 questionYesNo(this, 721 questionYesNo(this,
717 i18n 722 i18n
718 ("Do you really want to delete the selected entry") + 723 ("Do you really want to delete the selected entry") +
719 " \"" + QString(currItem.desc.c_str()) 724 " \"" + QString(currItem.desc.c_str())
720 + "\" ?", i18n("delete?")) 725 + "\" ?", i18n("delete?"))
721 == KMessageBox::Yes) { 726 == KMessageBox::Yes) {
722 727
723 curDoc()->delEntry(curCategory, curEntryIndex); 728 curDoc()->delEntry(curCategory, curEntryIndex);
724 } 729 }
725 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 730 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
726} 731}
727 732
728void PwM::changeMasterPwd_slot() 733void PwM::changeMasterPwd_slot()
729{ 734{
730 PWM_ASSERT(curDoc()); 735 PWM_ASSERT(curDoc());
731 curDoc()->changeCurrentPw(); 736 curDoc()->changeCurrentPw();
732} 737}
733 738
734void PwM::lockWnd_slot() 739void PwM::lockWnd_slot()
735{ 740{
736 PWM_ASSERT(curDoc()); 741 PWM_ASSERT(curDoc());
737 curDoc()->lockAll(true); 742 curDoc()->lockAll(true);
738} 743}
739 744
740void PwM::deepLockWnd_slot() 745void PwM::deepLockWnd_slot()
741{ 746{
742 PWM_ASSERT(curDoc()); 747 PWM_ASSERT(curDoc());
743 curDoc()->deepLock(); 748 curDoc()->deepLock();
744} 749}
745 750
746void PwM::unlockWnd_slot() 751void PwM::unlockWnd_slot()
747{ 752{
748 PWM_ASSERT(curDoc()); 753 PWM_ASSERT(curDoc());
749 curDoc()->lockAll(false); 754 curDoc()->lockAll(false);
750} 755}
751 756
752void PwM::config_slot() 757void PwM::config_slot()
753{ 758{
754 Configuration *conf = Configuration::obj(); 759 int oldStyle = conf()->confWndMainViewStyle();
755 int oldStyle = conf->confWndMainViewStyle(); 760#ifdef PWM_EMBEDDED
761 KCMultiDialog* ConfigureDialog = new KCMultiDialog( "PIM", this ,"pwmconfigdialog", true );
762
763 KCMPwmConfig* pwmcfg = new KCMPwmConfig( ConfigureDialog->getNewVBoxPage(i18n( "PwManager")) , "KCMPwmConfig" );
764 ConfigureDialog->addModule(pwmcfg );
756 765
766 KCMKdePimConfig* kdelibcfg = new KCMKdePimConfig( ConfigureDialog->getNewVBoxPage(i18n( "Global")) , "KCMKdeLibConfig" );
767 ConfigureDialog->addModule(kdelibcfg );
768
769#ifndef DESKTOP_VERSION
770 ConfigureDialog->showMaximized();
771#endif
772 if ( ConfigureDialog->exec() )
773 KMessageBox::information( this, i18n("Some changes are only\neffective after a restart!\n") );
774 delete ConfigureDialog;
775
776#else //PWM_EMBEDDED
757 // display the configuration window (modal mode) 777 // display the configuration window (modal mode)
758 if (!conf->showConfWnd(this)) 778 if (!conf()->showConfWnd(this))
759 return; 779 return;
780#endif
760 781
761 int newStyle = conf->confWndMainViewStyle(); 782 int newStyle = conf()->confWndMainViewStyle();
762 // reinitialize tray 783 // reinitialize tray
763 init->initTray(); 784 init->initTray();
764 // reinitialize KWallet emulation 785 // reinitialize KWallet emulation
765 init->initKWalletEmu(); 786 init->initKWalletEmu();
766 787
767 PwMDocList *_dl = PwMDoc::getOpenDocList(); 788 PwMDocList *_dl = PwMDoc::getOpenDocList();
768 const vector<PwMDocList::listItem> *dl = _dl->getList(); 789 const vector<PwMDocList::listItem> *dl = _dl->getList();
769 vector<PwMDocList::listItem>::const_iterator i = dl->begin(), 790 vector<PwMDocList::listItem>::const_iterator i = dl->begin(),
770 end = dl->end(); 791 end = dl->end();
771 PwMDoc *doc; 792 PwMDoc *doc;
772 while (i != end) { 793 while (i != end) {
773 doc = (*i).doc; 794 doc = (*i).doc;
774 // unlock-without-mpw timeout 795 // unlock-without-mpw timeout
775 doc->timer()->start(DocTimer::id_mpwTimer); 796 doc->timer()->start(DocTimer::id_mpwTimer);
776 // auto-lock timeout 797 // auto-lock timeout
777 doc->timer()->start(DocTimer::id_autoLockTimer); 798 doc->timer()->start(DocTimer::id_autoLockTimer);
778 ++i; 799 ++i;
779 } 800 }
780 801
781 const QValueList<PwM *> *ml = init->mainWndList(); 802 const QValueList<PwM *> *ml = init->mainWndList();
782#ifndef PWM_EMBEDDED 803#ifndef PWM_EMBEDDED
783 QValueList<PwM *>::const_iterator i2 = ml->begin(), 804 QValueList<PwM *>::const_iterator i2 = ml->begin(),
784 end2 = ml->end(); 805 end2 = ml->end();
785#else 806#else
786 QValueList<PwM *>::ConstIterator i2 = ml->begin(), 807 QValueList<PwM *>::ConstIterator i2 = ml->begin(),
787 end2 = ml->end(); 808 end2 = ml->end();
788#endif 809#endif
789 PwM *pwm; 810 PwM *pwm;
790 while (i2 != end2) { 811 while (i2 != end2) {
791 pwm = *i2; 812 pwm = *i2;
792 // reinitialize the window style. 813 // reinitialize the window style.
793 if (oldStyle != newStyle) 814 if (oldStyle != newStyle)
794 pwm->curView()->initStyle(newStyle); 815 pwm->curView()->initStyle(newStyle);
795 // set the new font 816 // set the new font
796 pwm->curView()->setFont(conf->confGlobEntryFont()); 817 pwm->curView()->setFont(conf()->confGlobEntryFont());
797 ++i2; 818 ++i2;
798 } 819 }
799} 820}
800 821
801void PwM::activateMpButton(bool activate) 822void PwM::activateMpButton(bool activate)
802{ 823{
803 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, activate); 824 managePopup->setItemEnabled(BUTTON_POPUP_MANAGE_CHANGEMP, activate);
804} 825}
805 826
806void PwM::closeEvent(QCloseEvent *e) 827void PwM::closeEvent(QCloseEvent *e)
807{ 828{
808 e->accept(); 829 e->accept();
809} 830}
810 831
811void PwM::docClosed(PwMDoc *doc) 832void PwM::docClosed(PwMDoc *doc)
812{ 833{
813 PARAM_UNUSED(doc); 834 PARAM_UNUSED(doc);
814 PWM_ASSERT(doc == curDoc()); 835 PWM_ASSERT(doc == curDoc());
815 close(); 836 close();
816} 837}
817 838
818void PwM::find_slot() 839void PwM::find_slot()
819{ 840{
820 PWM_ASSERT(curDoc()); 841 PWM_ASSERT(curDoc());
821 if (curDoc()->isDocEmpty()) 842 if (curDoc()->isDocEmpty())
822 return; 843 return;
823 if (curDoc()->isDeepLocked()) 844 if (curDoc()->isDeepLocked())
824 return; 845 return;
825 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 846 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
826 FindWndImpl findWnd(view); 847 FindWndImpl findWnd(view);
827 findWnd.exec(); 848 findWnd.exec();
828 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 849 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
829} 850}
830 851
831void PwM::exportToText() 852void PwM::exportToText()
832{ 853{
833 PWM_ASSERT(curDoc()); 854 PWM_ASSERT(curDoc());
834 if (curDoc()->isDocEmpty()) { 855 if (curDoc()->isDocEmpty()) {
835 KMessageBox::information(this, 856 KMessageBox::information(this,
836 i18n 857 i18n
837 ("Sorry, there's nothing to export.\n" 858 ("Sorry, there's nothing to export.\n"
838 "Please first add some passwords."), 859 "Please first add some passwords."),
839 i18n("nothing to do")); 860 i18n("nothing to do"));
840 return; 861 return;
841 } 862 }
842 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 863 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
843 QString fn(KFileDialog::getSaveFileName(QString::null, 864 QString fn(KFileDialog::getSaveFileName(QString::null,
844 i18n("*|plain-text file"), 865 i18n("*|plain-text file"),
845 this)); 866 this));
846 if (fn == "") { 867 if (fn == "") {
847 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 868 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
848 return; 869 return;
849 } 870 }
850 871
851 PwMerror ret = curDoc()->exportToText(&fn); 872 PwMerror ret = curDoc()->exportToText(&fn);
852 if (ret != e_success) { 873 if (ret != e_success) {
853 KMessageBox::error(this, 874 KMessageBox::error(this,
854 i18n("Error: Couldn't write to file.\n" 875 i18n("Error: Couldn't write to file.\n"
855 "Please check if you have permission to write " 876 "Please check if you have permission to write "
856 "to the file in that directory."), 877 "to the file in that directory."),
857 i18n("error while writing")); 878 i18n("error while writing"));
858 } else 879 } else
859 showStatMsg(i18n("Successfully exported data.")); 880 showStatMsg(i18n("Successfully exported data."));
860 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 881 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
861} 882}
862 883
863bool PwM::importFromText() 884bool PwM::importFromText()
864{ 885{
865 if (!isVirgin()) { 886 if (!isVirgin()) {
866 if (KMessageBox::questionYesNo(this, 887 if (KMessageBox::questionYesNo(this,
867 i18n("Do you want to import the data " 888 i18n("Do you want to import the data "
868 "into the current document? (If you " 889 "into the current document? (If you "
869 "select \"no\", a new document will be " 890 "select \"no\", a new document will be "
870 "opened.)"), 891 "opened.)"),
871 i18n("import into this document?")) 892 i18n("import into this document?"))
872 == KMessageBox::No) { 893 == KMessageBox::No) {
873 // import the data to a new window. 894 // import the data to a new window.
874 PwM *newInstance = init->createMainWnd(); 895 PwM *newInstance = init->createMainWnd();
875 bool ok = newInstance->importFromText(); 896 bool ok = newInstance->importFromText();
876 if (!ok) { 897 if (!ok) {
877 newInstance->setForceQuit(true); 898 newInstance->setForceQuit(true);
878 delete_and_null(newInstance); 899 delete_and_null(newInstance);
879 } 900 }
880 return ok; 901 return ok;
881 } 902 }
882 } 903 }
883 904
884 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 905 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
885 PwMerror ret; 906 PwMerror ret;
886 QString path(KFileDialog::getOpenFileName(QString::null, 907 QString path(KFileDialog::getOpenFileName(QString::null,
887 i18n("*|PWM-exported text file"), 908 i18n("*|PWM-exported text file"),
888 this)); 909 this));
889 if (path == "") 910 if (path == "")
890 goto cancelImport; 911 goto cancelImport;
891 912
892 ret = curDoc()->importFromText(&path, 0); 913 ret = curDoc()->importFromText(&path, 0);
893 if (ret == e_fileFormat) { 914 if (ret == e_fileFormat) {
894 KMessageBox::error(this, 915 KMessageBox::error(this,
895 i18n("Could not read file-format.\n" 916 i18n("Could not read file-format.\n"
896 "This seems to be _not_ a valid file " 917 "This seems to be _not_ a valid file "
897 "exported by PwM."), 918 "exported by PwM."),
898 i18n("invalid file-format")); 919 i18n("invalid file-format"));
899 goto cancelImport; 920 goto cancelImport;
900 } else if (ret == e_invalidArg) { 921 } else if (ret == e_invalidArg) {
901 BUG(); 922 BUG();
902 goto cancelImport; 923 goto cancelImport;
903 } else if (ret != e_success) { 924 } else if (ret != e_success) {
904 KMessageBox::error(this, 925 KMessageBox::error(this,
905 i18n("Could not import file!\n" 926 i18n("Could not import file!\n"
906 "Do you have permission to read this file? " 927 "Do you have permission to read this file? "
907 "Do you have enough free memory?"), 928 "Do you have enough free memory?"),
908 i18n("import failed")); 929 i18n("import failed"));
909 goto cancelImport; 930 goto cancelImport;
910 } 931 }
911 setVirgin(false); 932 setVirgin(false);
912 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 933 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
913 return true; 934 return true;
914 935
915cancelImport: 936cancelImport:
916 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 937 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
917 return false; 938 return false;
918} 939}
919 940
920void PwM::exportToGpasman() 941void PwM::exportToGpasman()
921{ 942{
922 PWM_ASSERT(curDoc()); 943 PWM_ASSERT(curDoc());
923 if (curDoc()->isDocEmpty()) { 944 if (curDoc()->isDocEmpty()) {
924 KMessageBox::information(this, 945 KMessageBox::information(this,
925 i18n 946 i18n
926 ("Sorry, there's nothing to export.\n" 947 ("Sorry, there's nothing to export.\n"
927 "Please first add some passwords."), 948 "Please first add some passwords."),
928 i18n("nothing to do")); 949 i18n("nothing to do"));
929 return; 950 return;
930 } 951 }
931 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 952 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
932 QString fn(KFileDialog::getSaveFileName(QString::null, 953 QString fn(KFileDialog::getSaveFileName(QString::null,
933 i18n("*|Gpasman or Kpasman file"), 954 i18n("*|Gpasman or Kpasman file"),
934 this)); 955 this));
935 if (fn == "") { 956 if (fn == "") {
936 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 957 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
937 return; 958 return;
938 } 959 }
939 960
940 PwMerror ret = curDoc()->exportToGpasman(&fn); 961 PwMerror ret = curDoc()->exportToGpasman(&fn);
941 if (ret != e_success) { 962 if (ret != e_success) {
942 if (ret == e_noPw) { 963 if (ret == e_noPw) {
943 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 964 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
944 return; 965 return;
945 } 966 }
946 KMessageBox::error(this, 967 KMessageBox::error(this,
947 i18n("Error: Couldn't write to file.\n" 968 i18n("Error: Couldn't write to file.\n"
948 "Please check if you have permission to write " 969 "Please check if you have permission to write "
949 "to the file in that directory."), 970 "to the file in that directory."),
950 i18n("error while writing")); 971 i18n("error while writing"));
951 } else 972 } else
952 showStatMsg(i18n("Successfully exported data.")); 973 showStatMsg(i18n("Successfully exported data."));
953 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 974 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
954} 975}
955 976
956void PwM::exportToKWallet() 977void PwM::exportToKWallet()
957{ 978{
958#ifdef CONFIG_KWALLETIF 979#ifdef CONFIG_KWALLETIF
959 if (!checkAndAskForKWalletEmu()) 980 if (!checkAndAskForKWalletEmu())
960 return; 981 return;
961 PWM_ASSERT(curDoc()); 982 PWM_ASSERT(curDoc());
962 if (curDoc()->isDocEmpty()) { 983 if (curDoc()->isDocEmpty()) {
963 KMessageBox::information(this, 984 KMessageBox::information(this,
964 i18n 985 i18n
965 ("Sorry, there's nothing to export.\n" 986 ("Sorry, there's nothing to export.\n"
966 "Please first add some passwords."), 987 "Please first add some passwords."),
967 i18n("nothing to do")); 988 i18n("nothing to do"));
968 init->initKWalletEmu(); 989 init->initKWalletEmu();
969 return; 990 return;
970 } 991 }
971 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 992 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
972 KWalletIf walletIf(this); 993 KWalletIf walletIf(this);
973 if (walletIf.kwalletExport(curDoc())) { 994 if (walletIf.kwalletExport(curDoc())) {
974 KMessageBox::information(this, 995 KMessageBox::information(this,
975 i18n("Successfully exported the data of the current " 996 i18n("Successfully exported the data of the current "
976 "document to KWallet."), 997 "document to KWallet."),
977 i18n("Successfully exported data.")); 998 i18n("Successfully exported data."));
978 showStatMsg(i18n("Successfully exported data.")); 999 showStatMsg(i18n("Successfully exported data."));
979 } 1000 }
980 init->initKWalletEmu(); 1001 init->initKWalletEmu();
981 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1002 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
982#endif // CONFIG_KWALLETIF 1003#endif // CONFIG_KWALLETIF
983} 1004}
984 1005
985bool PwM::importFromGpasman() 1006bool PwM::importFromGpasman()
986{ 1007{
987 if (!isVirgin()) { 1008 if (!isVirgin()) {
988 if (KMessageBox::questionYesNo(this, 1009 if (KMessageBox::questionYesNo(this,
989 i18n("Do you want to import the data " 1010 i18n("Do you want to import the data "
990 "into the current document? (If you " 1011 "into the current document? (If you "
991 "select \"no\", a new document will be " 1012 "select \"no\", a new document will be "
992 "opened.)"), 1013 "opened.)"),
993 i18n("import into this document?")) 1014 i18n("import into this document?"))
994 == KMessageBox::No) { 1015 == KMessageBox::No) {
995 // import the data to a new window. 1016 // import the data to a new window.
996 PwM *newInstance = init->createMainWnd(); 1017 PwM *newInstance = init->createMainWnd();
997 bool ok = newInstance->importFromGpasman(); 1018 bool ok = newInstance->importFromGpasman();
998 if (!ok) { 1019 if (!ok) {
999 newInstance->setForceQuit(true); 1020 newInstance->setForceQuit(true);
1000 delete_and_null(newInstance); 1021 delete_and_null(newInstance);
1001 } 1022 }
1002 return ok; 1023 return ok;
1003 } 1024 }
1004 } 1025 }
1005 1026
1006 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 1027 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
1007 PwMerror ret; 1028 PwMerror ret;
1008 QString path(KFileDialog::getOpenFileName(QString::null, 1029 QString path(KFileDialog::getOpenFileName(QString::null,
1009 i18n("*|Gpasman or Kpasman file"), this)); 1030 i18n("*|Gpasman or Kpasman file"), this));
1010 if (path == "") 1031 if (path == "")
1011 goto cancelImport; 1032 goto cancelImport;
1012 ret = curDoc()->importFromGpasman(&path); 1033 ret = curDoc()->importFromGpasman(&path);
1013 if (ret == e_wrongPw) { 1034 if (ret == e_wrongPw) {
1014 if (KMessageBox::questionYesNo(this, 1035 if (KMessageBox::questionYesNo(this,
1015 i18n 1036 i18n
1016 ("This is probably the wrong master-password" 1037 ("This is probably the wrong master-password"
1017 "you have typed in.\n" 1038 "you have typed in.\n"
1018 "There is no real way to determine the " 1039 "There is no real way to determine the "
1019 "correctness of the password in the Gpasman " 1040 "correctness of the password in the Gpasman "
1020 "file-format. But I think this " 1041 "file-format. But I think this "
1021 "password ist wrong.\n" 1042 "password ist wrong.\n"
1022 "Do you want to continue nevertheless?"), 1043 "Do you want to continue nevertheless?"),
1023 i18n("password error")) 1044 i18n("password error"))
1024 == KMessageBox::No) { 1045 == KMessageBox::No) {
1025 goto cancelImport; 1046 goto cancelImport;
1026 } 1047 }
1027 } else if (ret != e_success) { 1048 } else if (ret != e_success) {
1028 KMessageBox::error(this, 1049 KMessageBox::error(this,
1029 i18n("Could not import file!\n" 1050 i18n("Could not import file!\n"
1030 "Do you have permission to read this file?"), 1051 "Do you have permission to read this file?"),
1031 i18n("import failed")); 1052 i18n("import failed"));
1032 goto cancelImport; 1053 goto cancelImport;
1033 } 1054 }
1034 setVirgin(false); 1055 setVirgin(false);
1035 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1056 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1036 return true; 1057 return true;
1037 1058
1038cancelImport: 1059cancelImport:
1039 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1060 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1040 return false; 1061 return false;
1041} 1062}
1042 1063
1043#ifdef CONFIG_KWALLETIF 1064#ifdef CONFIG_KWALLETIF
1044bool PwM::checkAndAskForKWalletEmu() 1065bool PwM::checkAndAskForKWalletEmu()
1045{ 1066{
1046 if (init->kwalletEmu()) { 1067 if (init->kwalletEmu()) {
1047 /* KWallet emulation is enabled. We can't import/export 1068 /* KWallet emulation is enabled. We can't import/export
1048 * data from/to it, while emulation is active. 1069 * data from/to it, while emulation is active.
1049 */ 1070 */
1050 if (KMessageBox::questionYesNo(this, 1071 if (KMessageBox::questionYesNo(this,
1051 i18n("KWallet emulation is enabled.\n" 1072 i18n("KWallet emulation is enabled.\n"
1052 "You can't import or export data from/to " 1073 "You can't import or export data from/to "
1053 "the original KWallet, while the emulation " 1074 "the original KWallet, while the emulation "
1054 "is active.\n" 1075 "is active.\n"
1055 "Do you want to tempoarly disable the KWallet emulation?"), 1076 "Do you want to tempoarly disable the KWallet emulation?"),
1056 i18n("Tempoarly disable KWallet emulation?")) 1077 i18n("Tempoarly disable KWallet emulation?"))
1057 == KMessageBox::Yes) { 1078 == KMessageBox::Yes) {
1058 init->initKWalletEmu(true); 1079 init->initKWalletEmu(true);
1059 PWM_ASSERT(!init->kwalletEmu()); 1080 PWM_ASSERT(!init->kwalletEmu());
1060 return true; 1081 return true;
1061 } 1082 }
1062 return false; 1083 return false;
1063 } 1084 }
1064 return true; 1085 return true;
1065} 1086}
1066#endif // CONFIG_KWALLETIF 1087#endif // CONFIG_KWALLETIF
1067 1088
1068bool PwM::importKWallet() 1089bool PwM::importKWallet()
1069{ 1090{
1070#ifdef CONFIG_KWALLETIF 1091#ifdef CONFIG_KWALLETIF
1071 if (!checkAndAskForKWalletEmu()) 1092 if (!checkAndAskForKWalletEmu())
1072 return false; 1093 return false;
1073 KWalletIf walletIf(this); 1094 KWalletIf walletIf(this);
1074 if (!isVirgin()) { 1095 if (!isVirgin()) {
1075 if (KMessageBox::questionYesNo(this, 1096 if (KMessageBox::questionYesNo(this,
1076 i18n("Do you want to import the data " 1097 i18n("Do you want to import the data "
1077 "into the current document? (If you " 1098 "into the current document? (If you "
1078 "select \"no\", a new document will be " 1099 "select \"no\", a new document will be "
1079 "opened.)"), 1100 "opened.)"),
1080 i18n("import into this document?")) 1101 i18n("import into this document?"))
1081 == KMessageBox::No) { 1102 == KMessageBox::No) {
1082 // import the data to a new window. 1103 // import the data to a new window.
1083 PwM *newInstance = init->createMainWnd(); 1104 PwM *newInstance = init->createMainWnd();
1084 bool ok = newInstance->importKWallet(); 1105 bool ok = newInstance->importKWallet();
1085 if (!ok) { 1106 if (!ok) {
1086 newInstance->setForceQuit(true); 1107 newInstance->setForceQuit(true);
1087 delete_and_null(newInstance); 1108 delete_and_null(newInstance);
1088 goto exit_fail; 1109 goto exit_fail;
1089 } else { 1110 } else {
1090 goto exit_ok; 1111 goto exit_ok;
1091 } 1112 }
1092 } 1113 }
1093 } 1114 }
1094 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 1115 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
1095 if (!walletIf.kwalletImport(curDoc())) { 1116 if (!walletIf.kwalletImport(curDoc())) {
1096 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1117 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1097 showStatMsg(i18n("KWallet import failed")); 1118 showStatMsg(i18n("KWallet import failed"));
1098 goto exit_fail; 1119 goto exit_fail;
1099 } 1120 }
1100 KMessageBox::information(this, 1121 KMessageBox::information(this,
1101 i18n("Successfully imported the KWallet data " 1122 i18n("Successfully imported the KWallet data "
1102 "into the current document."), 1123 "into the current document."),
1103 i18n("successfully imported")); 1124 i18n("successfully imported"));
1104 showStatMsg(i18n("successfully imported")); 1125 showStatMsg(i18n("successfully imported"));
1105 setVirgin(false); 1126 setVirgin(false);
1106 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1127 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1107 1128
1108exit_ok: 1129exit_ok:
1109 init->initKWalletEmu(); 1130 init->initKWalletEmu();
1110 return true; 1131 return true;
1111 1132
1112exit_fail: 1133exit_fail:
1113 init->initKWalletEmu(); 1134 init->initKWalletEmu();
1114#endif // CONFIG_KWALLETIF 1135#endif // CONFIG_KWALLETIF
1115 return false; 1136 return false;
1116} 1137}
1117 1138
1118void PwM::print_slot() 1139void PwM::print_slot()
1119{ 1140{
1120 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer); 1141 curDoc()->timer()->getLock(DocTimer::id_autoLockTimer);
1121#ifndef PWM_EMBEDDED 1142#ifndef PWM_EMBEDDED
1122 PwMPrint p(curDoc(), this); 1143 PwMPrint p(curDoc(), this);
1123 p.printNow(); 1144 p.printNow();
1124#else 1145#else
1125 qDebug("PwM::print_slot , PRINTING IS NOT IMPLEMENTED"); 1146 qDebug("PwM::print_slot , PRINTING IS NOT IMPLEMENTED");
1126#endif 1147#endif
1127 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer); 1148 curDoc()->timer()->putLock(DocTimer::id_autoLockTimer);
1128} 1149}
1129 1150
1130void PwM::genNewCard_slot() 1151void PwM::genNewCard_slot()
1131{ 1152{
1132#ifdef CONFIG_KEYCARD 1153#ifdef CONFIG_KEYCARD
1133 init->keycard()->genNewCard(); 1154 init->keycard()->genNewCard();
1134#endif 1155#endif
1135} 1156}
1136 1157
1137void PwM::eraseCard_slot() 1158void PwM::eraseCard_slot()
1138{ 1159{
1139#ifdef CONFIG_KEYCARD 1160#ifdef CONFIG_KEYCARD
1140 init->keycard()->eraseCard(); 1161 init->keycard()->eraseCard();
1141#endif 1162#endif
1142} 1163}
1143 1164
1144void PwM::readCardId_slot() 1165void PwM::readCardId_slot()
1145{ 1166{
1146#ifdef CONFIG_KEYCARD 1167#ifdef CONFIG_KEYCARD
1147 init->keycard()->displayKey(); 1168 init->keycard()->displayKey();
1148#endif 1169#endif
1149} 1170}
1150 1171
1151void PwM::makeCardBackup_slot() 1172void PwM::makeCardBackup_slot()
1152{ 1173{
1153#ifdef CONFIG_KEYCARD 1174#ifdef CONFIG_KEYCARD
1154 init->keycard()->makeBackupImage(); 1175 init->keycard()->makeBackupImage();
1155#endif 1176#endif
1156} 1177}
1157 1178
1158void PwM::replayCardBackup_slot() 1179void PwM::replayCardBackup_slot()
1159{ 1180{
1160#ifdef CONFIG_KEYCARD 1181#ifdef CONFIG_KEYCARD
1161 init->keycard()->replayBackupImage(); 1182 init->keycard()->replayBackupImage();
1162#endif 1183#endif
1163} 1184}
1164 1185
1165void PwM::execLauncher_slot() 1186void PwM::execLauncher_slot()
1166{ 1187{
1167 PWM_ASSERT(curDoc()); 1188 PWM_ASSERT(curDoc());
1168 if (curDoc()->isDeepLocked()) 1189 if (curDoc()->isDeepLocked())
1169 return; 1190 return;
1170 unsigned int curEntryIndex; 1191 unsigned int curEntryIndex;
1171 if (!view->getCurEntryIndex(&curEntryIndex)) 1192 if (!view->getCurEntryIndex(&curEntryIndex))
1172 return; 1193 return;
1173 bool ret = curDoc()->execLauncher(view->getCurrentCategory(), 1194 bool ret = curDoc()->execLauncher(view->getCurrentCategory(),
1174 curEntryIndex); 1195 curEntryIndex);
1175 if (ret) 1196 if (ret)
1176 showStatMsg(i18n("Executed the \"Launcher\".")); 1197 showStatMsg(i18n("Executed the \"Launcher\"."));
1177 else 1198 else
1178 showStatMsg(i18n("ERROR: Couldn't execute the \"Launcher\"!")); 1199 showStatMsg(i18n("ERROR: Couldn't execute the \"Launcher\"!"));
1179} 1200}
1180 1201
1181void PwM::goToURL_slot() 1202void PwM::goToURL_slot()
1182{ 1203{
1183 PWM_ASSERT(curDoc()); 1204 PWM_ASSERT(curDoc());
1184 if (curDoc()->isDeepLocked()) 1205 if (curDoc()->isDeepLocked())
1185 return; 1206 return;
1186 unsigned int curEntryIndex; 1207 unsigned int curEntryIndex;
1187 if (!view->getCurEntryIndex(&curEntryIndex)) 1208 if (!view->getCurEntryIndex(&curEntryIndex))
1188 return; 1209 return;
1189 bool ret = curDoc()->goToURL(view->getCurrentCategory(), 1210 bool ret = curDoc()->goToURL(view->getCurrentCategory(),
1190 curEntryIndex); 1211 curEntryIndex);
1191 if (ret) 1212 if (ret)
1192 showStatMsg(i18n("started browser with current URL.")); 1213 showStatMsg(i18n("started browser with current URL."));
1193 else 1214 else
1194 showStatMsg(i18n("ERROR: Couldn't start browser! Maybe invalid URL?")); 1215 showStatMsg(i18n("ERROR: Couldn't start browser! Maybe invalid URL?"));
1195} 1216}
1196 1217
1197void PwM::copyToClipboard(const QString &s) 1218void PwM::copyToClipboard(const QString &s)
1198{ 1219{
1199 QClipboard *cb = QApplication::clipboard(); 1220 QClipboard *cb = QApplication::clipboard();
1200#ifndef PWM_EMBEDDED 1221#ifndef PWM_EMBEDDED
1201 if (cb->supportsSelection()) 1222 if (cb->supportsSelection())
1202 cb->setText(s, QClipboard::Selection); 1223 cb->setText(s, QClipboard::Selection);
1203 cb->setText(s, QClipboard::Clipboard); 1224 cb->setText(s, QClipboard::Clipboard);
1204#else 1225#else
1205 cb->setText(s); 1226 cb->setText(s);
1206 1227
1207#endif 1228#endif
1208 1229
1209} 1230}
1210 1231
1211void PwM::showStatMsg(const QString &msg) 1232void PwM::showStatMsg(const QString &msg)
1212{ 1233{
1213#ifndef PWM_EMBEDDED 1234#ifndef PWM_EMBEDDED
1214 KStatusBar *statBar = statusBar(); 1235 KStatusBar *statBar = statusBar();
1215 statBar->message(msg, STATUSBAR_MSG_TIMEOUT * 1000); 1236 statBar->message(msg, STATUSBAR_MSG_TIMEOUT * 1000);
1216#else 1237#else
1217 qDebug("Statusbar : %s",msg.latin1()); 1238 qDebug("Statusbar : %s",msg.latin1());
1218#endif 1239#endif
1219} 1240}
1220 1241
1221void PwM::focusInEvent(QFocusEvent *e) 1242void PwM::focusInEvent(QFocusEvent *e)
1222{ 1243{
1223 if (e->gotFocus()) { 1244 if (e->gotFocus()) {
1224 emit gotFocus(this); 1245 emit gotFocus(this);
1225 } else if (e->lostFocus()) { 1246 } else if (e->lostFocus()) {
1226 emit lostFocus(this); 1247 emit lostFocus(this);
1227 } 1248 }
1228} 1249}
1229 1250
1230 1251
1231#ifdef PWM_EMBEDDED 1252#ifdef PWM_EMBEDDED
1232 1253
1233void PwM::showLicense_slot() 1254void PwM::showLicense_slot()
1234{ 1255{
1235 KApplication::showLicence(); 1256 KApplication::showLicence();
1236} 1257}
1237 1258
1238void PwM::faq_slot() 1259void PwM::faq_slot()
1239{ 1260{
1240 KApplication::showFile( "PWM/Pi FAQ", "kdepim/pwmanager/pwmanagerFAQ.txt" ); 1261 KApplication::showFile( "PWM/Pi FAQ", "kdepim/pwmanager/pwmanagerFAQ.txt" );
1241} 1262}
1242 1263
1243void PwM::createAboutData_slot() 1264void PwM::createAboutData_slot()
1244{ 1265{
1245 QString version; 1266 QString version;
1246#include <../version> 1267#include <../version>
1247 QMessageBox::about( this, "About PwManager/Pi", 1268 QMessageBox::about( this, "About PwManager/Pi",
1248 "PwManager/Platform-independent\n" 1269 "PwManager/Platform-independent\n"
1249 "(PWM/Pi) " +version + " - " + 1270 "(PWM/Pi) " +version + " - " +
1250#ifdef DESKTOP_VERSION 1271#ifdef DESKTOP_VERSION
1251 "Desktop Edition\n" 1272 "Desktop Edition\n"
1252#else 1273#else
1253 "PDA-Edition\n" 1274 "PDA-Edition\n"
1254 "for: Zaurus 5500 / 7x0 / 8x0\n" 1275 "for: Zaurus 5500 / 7x0 / 8x0\n"
1255#endif 1276#endif
1256 1277
1257 "(c) 2004 Ulf Schenk\n" 1278 "(c) 2004 Ulf Schenk\n"
1258 "(c) 2004 Lutz Rogowski\n" 1279 "(c) 2004 Lutz Rogowski\n"
1259 "(c) 1997-2003, The KDE PIM Team\n" 1280 "(c) 1997-2003, The KDE PIM Team\n"
1260 1281
1261 "Michael Buesch - main programming and current maintainer\nmbuesch@freenet.de\n" 1282 "Michael Buesch - main programming and current maintainer\nmbuesch@freenet.de\n"
1262 "Matt Scifo - original implementaion of \n" 1283 "Matt Scifo - original implementaion of \n"
1263 "\"categories\" and the password-tree \n" 1284 "\"categories\" and the password-tree \n"
1264 "in the system-tray. Original implementations of \n" 1285 "in the system-tray. Original implementations of \n"
1265 "numerous view-improvements.\n" 1286 "numerous view-improvements.\n"
1266 "mscifo@o1.com\n" 1287 "mscifo@o1.com\n"
1267 "Elias Probst - Gentoo ebuild maintainer.\nelias.probst@gmx.de\n" 1288 "Elias Probst - Gentoo ebuild maintainer.\nelias.probst@gmx.de\n"
1268 "George Staikos - KWallet\nstaikos@kde.org\n" 1289 "George Staikos - KWallet\nstaikos@kde.org\n"
1269 "Matthew Palmer - rc2 code\nmjp16@uow.edu.au\n" 1290 "Matthew Palmer - rc2 code\nmjp16@uow.edu.au\n"
1270 "Olivier Sessink - gpasman\ngpasman@nl.linux.org\n" 1291 "Olivier Sessink - gpasman\ngpasman@nl.linux.org\n"
1271 "The libgcrypt developers - Blowfish and SHA1 algorithms\nftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/\n" 1292 "The libgcrypt developers - Blowfish and SHA1 algorithms\nftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/\n"
1272 "Troy Engel - kpasman\n tengel@sonic.net\n" 1293 "Troy Engel - kpasman\n tengel@sonic.net\n"
1273 "Wickey - graphics-design in older versions\nwickey@gmx.at\n" 1294 "Wickey - graphics-design in older versions\nwickey@gmx.at\n"
1274 "Ian MacGregor - original documentation author.\n" 1295 "Ian MacGregor - original documentation author.\n"
1275 ); 1296 );
1276} 1297}
1277 1298
1278#endif 1299#endif
1279 1300
1280 1301
1281#ifndef PWM_EMBEDDED 1302#ifndef PWM_EMBEDDED
1282#include "pwm.moc" 1303#include "pwm.moc"
1283#endif 1304#endif
diff --git a/pwmanager/pwmanager/pwmanagerE.pro b/pwmanager/pwmanager/pwmanagerE.pro
index 2cd69a5..5c29ea4 100644
--- a/pwmanager/pwmanager/pwmanagerE.pro
+++ b/pwmanager/pwmanager/pwmanagerE.pro
@@ -1,144 +1,153 @@
1 TEMPLATE= app 1 TEMPLATE= app
2 CONFIG += qt warn_on 2 CONFIG += qt warn_on
3 3
4 4
5 TARGET = pwmpi 5 TARGET = pwmpi
6OBJECTS_DIR = obj/$(PLATFORM) 6OBJECTS_DIR = obj/$(PLATFORM)
7MOC_DIR = moc/$(PLATFORM) 7MOC_DIR = moc/$(PLATFORM)
8DESTDIR=$(QPEDIR)/bin 8DESTDIR=$(QPEDIR)/bin
9 9
10INCLUDEPATH += . ../../qtcompat ../../qtcompat/xml ../../microkde ../../microkde/kdecore ../../microkde/kdeui $(QPEDIR)/include 10INCLUDEPATH += . ../../qtcompat ../../qtcompat/xml ../../libkdepim ../../microkde ../../microkde/kdecore ../../microkde/kdeui ../../microkde/kutils $(QPEDIR)/include
11DEFINES += PWM_EMBEDDED PWM_DEBUG 11DEFINES += PWM_EMBEDDED PWM_DEBUG
12LIBS += -lmicrokde 12LIBS += -lmicrokde
13LIBS += -lmicroqtcompat 13LIBS += -lmicroqtcompat
14LIBS += -lmicrokdepim
14LIBS += -L$(QPEDIR)/lib 15LIBS += -L$(QPEDIR)/lib
15LIBS += -lqpe 16LIBS += -lqpe
16LIBS += -lbz2 17LIBS += -lbz2
17LIBS += $(QTOPIALIB) 18LIBS += $(QTOPIALIB)
18 19
19#INTERFACES = \ 20#INTERFACES = \
20#addentrywnd.ui \ 21#addentrywnd.ui \
21#configwnd.ui \ 22#configwnd.ui \
22#findwnd.ui \ 23#findwnd.ui \
23#getmasterpwwnd.ui \ 24#getmasterpwwnd.ui \
24#pwgenwnd.ui \ 25#pwgenwnd.ui \
25#setmasterpwwnd.ui \ 26#setmasterpwwnd.ui \
26#subtbledit.ui 27#subtbledit.ui
27 28
28#INTERFACES = \ 29#INTERFACES = \
29#subtbledit.ui \ 30#subtbledit.ui \
30 31
31 32
32 33
33#HEADERS = \ 34#HEADERS = \
35#configuration_31compat.h \
36#configuration.h \
37#configwnd.h \
38#configwndimpl.h \
34#selftest.h 39#selftest.h
35 40
36HEADERS = \ 41HEADERS = \
37addentrywnd.h \ 42addentrywnd.h \
38addentrywndimpl.h \ 43addentrywndimpl.h \
39base64.h \ 44base64.h \
40binentrygen.h \ 45binentrygen.h \
41blowfish.h \ 46blowfish.h \
42commentbox.h \ 47commentbox.h \
43compiler.h \ 48compiler.h \
44compressbzip2.h \ 49compressbzip2.h \
45compressgzip.h \ 50compressgzip.h \
46configuration_31compat.h \
47configuration.h \
48configwnd.h \
49configwndimpl.h \
50findwnd.h \ 51findwnd.h \
51findwndimpl.h \ 52findwndimpl.h \
52genpasswd.h \ 53genpasswd.h \
53getkeycardwnd.h \ 54getkeycardwnd.h \
54getmasterpwwnd.h \ 55getmasterpwwnd.h \
55getmasterpwwndimpl.h \ 56getmasterpwwndimpl.h \
56globalstuff.h \ 57globalstuff.h \
57gpasmanfile.h \ 58gpasmanfile.h \
58htmlgen.h \ 59htmlgen.h \
59htmlparse.h \ 60htmlparse.h \
60ipc.h \ 61ipc.h \
61listobjselectwnd.h \ 62listobjselectwnd.h \
62listviewpwm.h \ 63listviewpwm.h \
63printtext.h \ 64printtext.h \
64pwgenwnd.h \ 65pwgenwnd.h \
65pwgenwndimpl.h \ 66pwgenwndimpl.h \
66pwmdoc.h \ 67pwmdoc.h \
67pwmdocui.h \ 68pwmdocui.h \
68pwmexception.h \ 69pwmexception.h \
69pwm.h \ 70pwm.h \
70pwminit.h \ 71pwminit.h \
72pwmprefs.h \
71pwmprint.h \ 73pwmprint.h \
72pwmtray.h \ 74pwmtray.h \
73pwmview.h \ 75pwmview.h \
74pwmviewstyle_0.h \ 76pwmviewstyle_0.h \
75pwmviewstyle_1.h \ 77pwmviewstyle_1.h \
76pwmviewstyle.h \ 78pwmviewstyle.h \
77randomizer.h \ 79randomizer.h \
78rc2.h \ 80rc2.h \
79rencatwnd.h \ 81rencatwnd.h \
80serializer.h \ 82serializer.h \
81setmasterpwwnd.h \ 83setmasterpwwnd.h \
82setmasterpwwndimpl.h \ 84setmasterpwwndimpl.h \
83sha1.h \ 85sha1.h \
84subtbledit.h \ 86subtbledit.h \
85subtbleditimpl.h \ 87subtbleditimpl.h \
86waitwnd.h 88waitwnd.h \
89kcmconfigs/kcmpwmconfig.h \
90kcmconfigs/pwmconfigwidget.h \
87 91
92#sources that need not be build
88#SOURCES = \ 93#SOURCES = \
89#advcommeditimpl.cpp \ 94#advcommeditimpl.cpp \
95#configuration.cpp \
96#configwnd.cpp \
97#configwndimpl.cpp \
90#configuration_31compat.cpp \ 98#configuration_31compat.cpp \
91#htmlparse.cpp \ 99#htmlparse.cpp \
92#printtext.cpp \ 100#printtext.cpp \
93#selftest.cpp \ 101#selftest.cpp \
94#pwmprint.cpp \ 102#pwmprint.cpp \
95#spinforsignal.cpp 103#spinforsignal.cpp
96 104
97SOURCES = \ 105SOURCES = \
98addentrywnd.cpp \ 106addentrywnd.cpp \
99addentrywndimpl.cpp \ 107addentrywndimpl.cpp \
100base64.cpp \ 108base64.cpp \
101binentrygen.cpp \ 109binentrygen.cpp \
102blowfish.cpp \ 110blowfish.cpp \
103commentbox.cpp \ 111commentbox.cpp \
104compressbzip2.cpp \ 112compressbzip2.cpp \
105compressgzip.cpp \ 113compressgzip.cpp \
106configuration.cpp \
107configwnd.cpp \
108configwndimpl.cpp \
109findwnd.cpp \ 114findwnd.cpp \
110findwndimpl.cpp \ 115findwndimpl.cpp \
111genpasswd.cpp \ 116genpasswd.cpp \
112getkeycardwnd.cpp \ 117getkeycardwnd.cpp \
113getmasterpwwnd.cpp \ 118getmasterpwwnd.cpp \
114getmasterpwwndimpl.cpp \ 119getmasterpwwndimpl.cpp \
115globalstuff.cpp \ 120globalstuff.cpp \
116gpasmanfile.cpp \ 121gpasmanfile.cpp \
117htmlgen.cpp \ 122htmlgen.cpp \
118ipc.cpp \ 123ipc.cpp \
119listobjselectwnd.cpp \ 124listobjselectwnd.cpp \
120listviewpwm.cpp \ 125listviewpwm.cpp \
121main.cpp \ 126main.cpp \
122pwgenwnd.cpp \ 127pwgenwnd.cpp \
123pwgenwndimpl.cpp \ 128pwgenwndimpl.cpp \
124pwm.cpp \ 129pwm.cpp \
125pwmdoc.cpp \ 130pwmdoc.cpp \
126pwmdocui.cpp \ 131pwmdocui.cpp \
127pwmexception.cpp \ 132pwmexception.cpp \
128pwminit.cpp \ 133pwminit.cpp \
134pwmprefs.cpp \
129pwmtray.cpp \ 135pwmtray.cpp \
130pwmview.cpp \ 136pwmview.cpp \
131pwmviewstyle_0.cpp \ 137pwmviewstyle_0.cpp \
132pwmviewstyle_1.cpp \ 138pwmviewstyle_1.cpp \
133pwmviewstyle.cpp \ 139pwmviewstyle.cpp \
134randomizer.cpp \ 140randomizer.cpp \
135rc2.cpp \ 141rc2.cpp \
136rencatwnd.cpp \ 142rencatwnd.cpp \
137serializer.cpp \ 143serializer.cpp \
138setmasterpwwnd.cpp \ 144setmasterpwwnd.cpp \
139setmasterpwwndimpl.cpp \ 145setmasterpwwndimpl.cpp \
140sha1.cpp \ 146sha1.cpp \
141subtbledit.cpp \ 147subtbledit.cpp \
142subtbleditimpl.cpp \ 148subtbleditimpl.cpp \
143waitwnd.cpp \ 149waitwnd.cpp \
150kcmconfigs/kcmpwmconfig.cpp \
151kcmconfigs/pwmconfigwidget.cpp \
152
144 153
diff --git a/pwmanager/pwmanager/pwmdoc.cpp b/pwmanager/pwmanager/pwmdoc.cpp
index 04af360..9fe4809 100644
--- a/pwmanager/pwmanager/pwmdoc.cpp
+++ b/pwmanager/pwmanager/pwmdoc.cpp
@@ -1,2775 +1,2777 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 2.0 of pwmanager 14 * This file is originaly based on version 2.0 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
18 **************************************************************************/ 18 **************************************************************************/
19 19
20#include "pwmdoc.h" 20#include "pwmdoc.h"
21#include "pwmview.h" 21#include "pwmview.h"
22#include "blowfish.h" 22#include "blowfish.h"
23#include "sha1.h" 23#include "sha1.h"
24#include "globalstuff.h" 24#include "globalstuff.h"
25#include "gpasmanfile.h" 25#include "gpasmanfile.h"
26#include "serializer.h" 26#include "serializer.h"
27#include "compressgzip.h" 27#include "compressgzip.h"
28#include "compressbzip2.h" 28#include "compressbzip2.h"
29#include "randomizer.h" 29#include "randomizer.h"
30#include "pwminit.h" 30#include "pwminit.h"
31#ifndef PWM_EMBEDDED 31#ifndef PWM_EMBEDDED
32//US #include "libgryptif.h" 32//US #include "libgryptif.h"
33#else 33#else
34#include "pwmprefs.h"
35#include "kglobal.h"
34#endif 36#endif
35 37
36#ifdef CONFIG_KWALLETIF 38#ifdef CONFIG_KWALLETIF
37# include "kwalletemu.h" 39# include "kwalletemu.h"
38#endif // CONFIG_KWALLETIF 40#endif // CONFIG_KWALLETIF
39 41
40#include <qdatetime.h> 42#include <qdatetime.h>
41#include <qsize.h> 43#include <qsize.h>
42#include <qfileinfo.h> 44#include <qfileinfo.h>
43#include <qfile.h> 45#include <qfile.h>
44 46
45#include <stdio.h> 47#include <stdio.h>
46#include <stdlib.h> 48#include <stdlib.h>
47#include <errno.h> 49#include <errno.h>
48#include <string.h> 50#include <string.h>
49#include <iostream> 51#include <iostream>
50#include <algorithm> 52#include <algorithm>
51#include <sys/types.h> 53#include <sys/types.h>
52#include <sys/stat.h> 54#include <sys/stat.h>
53#include <unistd.h> 55#include <unistd.h>
54#include <stdint.h> 56#include <stdint.h>
55 57
56//TODO: reset to its normal value. 58//TODO: reset to its normal value.
57 #define META_CHECK_TIMER_INTERVAL10/*300*/ /* sek */ 59 #define META_CHECK_TIMER_INTERVAL10/*300*/ /* sek */
58 60
59using namespace std; 61using namespace std;
60 62
61 63
62void PwMDocList::add(PwMDoc *doc, const string &id) 64void PwMDocList::add(PwMDoc *doc, const string &id)
63{ 65{
64#ifdef PWM_DEBUG 66#ifdef PWM_DEBUG
65 // check for existance of object in debug mode only. 67 // check for existance of object in debug mode only.
66 vector<listItem>::iterator begin = docList.begin(), 68 vector<listItem>::iterator begin = docList.begin(),
67 end = docList.end(), 69 end = docList.end(),
68 i = begin; 70 i = begin;
69 while (i != end) { 71 while (i != end) {
70 if (i->doc == doc) { 72 if (i->doc == doc) {
71 BUG(); 73 BUG();
72 return; 74 return;
73 } 75 }
74 ++i; 76 ++i;
75 } 77 }
76#endif 78#endif
77 listItem newItem; 79 listItem newItem;
78 newItem.doc = doc; 80 newItem.doc = doc;
79 newItem.docId = id; 81 newItem.docId = id;
80 docList.push_back(newItem); 82 docList.push_back(newItem);
81} 83}
82 84
83void PwMDocList::edit(PwMDoc *doc, const string &newId) 85void PwMDocList::edit(PwMDoc *doc, const string &newId)
84{ 86{
85 vector<listItem>::iterator begin = docList.begin(), 87 vector<listItem>::iterator begin = docList.begin(),
86 end = docList.end(), 88 end = docList.end(),
87 i = begin; 89 i = begin;
88 while (i != end) { 90 while (i != end) {
89 if (i->doc == doc) { 91 if (i->doc == doc) {
90 i->docId = newId; 92 i->docId = newId;
91 return; 93 return;
92 } 94 }
93 ++i; 95 ++i;
94 } 96 }
95} 97}
96 98
97void PwMDocList::del(PwMDoc *doc) 99void PwMDocList::del(PwMDoc *doc)
98{ 100{
99 vector<listItem>::iterator begin = docList.begin(), 101 vector<listItem>::iterator begin = docList.begin(),
100 end = docList.end(), 102 end = docList.end(),
101 i = begin; 103 i = begin;
102 while (i != end) { 104 while (i != end) {
103 if (i->doc == doc) { 105 if (i->doc == doc) {
104 docList.erase(i); 106 docList.erase(i);
105 return; 107 return;
106 } 108 }
107 ++i; 109 ++i;
108 } 110 }
109} 111}
110 112
111bool PwMDocList::find(const string &id, listItem *ret) 113bool PwMDocList::find(const string &id, listItem *ret)
112{ 114{
113 vector<listItem>::iterator begin = docList.begin(), 115 vector<listItem>::iterator begin = docList.begin(),
114 end = docList.end(), 116 end = docList.end(),
115 i = begin; 117 i = begin;
116 while (i != end) { 118 while (i != end) {
117 if (i->docId == id) { 119 if (i->docId == id) {
118 if (ret) 120 if (ret)
119 *ret = *i; 121 *ret = *i;
120 return true; 122 return true;
121 } 123 }
122 ++i; 124 ++i;
123 } 125 }
124 return false; 126 return false;
125} 127}
126 128
127 129
128 130
129DocTimer::DocTimer(PwMDoc *_doc) 131DocTimer::DocTimer(PwMDoc *_doc)
130 : doc (_doc) 132 : doc (_doc)
131 , mpwLock (0) 133 , mpwLock (0)
132 , autoLockLock (0) 134 , autoLockLock (0)
133 , metaCheckLock (0) 135 , metaCheckLock (0)
134{ 136{
135 mpwTimer = new QTimer; 137 mpwTimer = new QTimer;
136 autoLockTimer = new QTimer; 138 autoLockTimer = new QTimer;
137 metaCheckTimer = new QTimer; 139 metaCheckTimer = new QTimer;
138 connect(mpwTimer, SIGNAL(timeout()), 140 connect(mpwTimer, SIGNAL(timeout()),
139 this, SLOT(mpwTimeout())); 141 this, SLOT(mpwTimeout()));
140 connect(autoLockTimer, SIGNAL(timeout()), 142 connect(autoLockTimer, SIGNAL(timeout()),
141 this, SLOT(autoLockTimeout())); 143 this, SLOT(autoLockTimeout()));
142 connect(metaCheckTimer, SIGNAL(timeout()), 144 connect(metaCheckTimer, SIGNAL(timeout()),
143 this, SLOT(metaCheckTimeout())); 145 this, SLOT(metaCheckTimeout()));
144} 146}
145 147
146DocTimer::~DocTimer() 148DocTimer::~DocTimer()
147{ 149{
148 delete mpwTimer; 150 delete mpwTimer;
149 delete autoLockTimer; 151 delete autoLockTimer;
150 delete metaCheckTimer; 152 delete metaCheckTimer;
151} 153}
152 154
153void DocTimer::start(TimerIDs timer) 155void DocTimer::start(TimerIDs timer)
154{ 156{
155 switch (timer) { 157 switch (timer) {
156 case id_mpwTimer: 158 case id_mpwTimer:
157 if (mpwTimer->isActive()) 159 if (mpwTimer->isActive())
158 mpwTimer->stop(); 160 mpwTimer->stop();
159 doc->setDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); 161 doc->setDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW);
160 mpwTimer->start(conf()->confGlobPwTimeout() * 1000, true); 162 mpwTimer->start(conf()->confGlobPwTimeout() * 1000, true);
161 break; 163 break;
162 case id_autoLockTimer: 164 case id_autoLockTimer:
163 if (autoLockTimer->isActive()) 165 if (autoLockTimer->isActive())
164 autoLockTimer->stop(); 166 autoLockTimer->stop();
165 if (conf()->confGlobLockTimeout() > 0) 167 if (conf()->confGlobLockTimeout() > 0)
166 autoLockTimer->start(conf()->confGlobLockTimeout() * 1000, true); 168 autoLockTimer->start(conf()->confGlobLockTimeout() * 1000, true);
167 break; 169 break;
168 case id_metaCheckTimer: 170 case id_metaCheckTimer:
169 if (metaCheckTimer->isActive()) 171 if (metaCheckTimer->isActive())
170 metaCheckTimer->stop(); 172 metaCheckTimer->stop();
171 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 173 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
172 break; 174 break;
173 } 175 }
174} 176}
175 177
176void DocTimer::stop(TimerIDs timer) 178void DocTimer::stop(TimerIDs timer)
177{ 179{
178 switch (timer) { 180 switch (timer) {
179 case id_mpwTimer: 181 case id_mpwTimer:
180 mpwTimer->stop(); 182 mpwTimer->stop();
181 break; 183 break;
182 case id_autoLockTimer: 184 case id_autoLockTimer:
183 autoLockTimer->stop(); 185 autoLockTimer->stop();
184 break; 186 break;
185 case id_metaCheckTimer: 187 case id_metaCheckTimer:
186 metaCheckTimer->stop(); 188 metaCheckTimer->stop();
187 break; 189 break;
188 } 190 }
189} 191}
190 192
191void DocTimer::getLock(TimerIDs timer) 193void DocTimer::getLock(TimerIDs timer)
192{ 194{
193 switch (timer) { 195 switch (timer) {
194 case id_mpwTimer: 196 case id_mpwTimer:
195 ++mpwLock; 197 ++mpwLock;
196 break; 198 break;
197 case id_autoLockTimer: 199 case id_autoLockTimer:
198 ++autoLockLock; 200 ++autoLockLock;
199 break; 201 break;
200 case id_metaCheckTimer: 202 case id_metaCheckTimer:
201 ++metaCheckLock; 203 ++metaCheckLock;
202 break; 204 break;
203 } 205 }
204} 206}
205 207
206void DocTimer::putLock(TimerIDs timer) 208void DocTimer::putLock(TimerIDs timer)
207{ 209{
208 switch (timer) { 210 switch (timer) {
209 case id_mpwTimer: 211 case id_mpwTimer:
210 if (mpwLock) 212 if (mpwLock)
211 --mpwLock; 213 --mpwLock;
212 break; 214 break;
213 case id_autoLockTimer: 215 case id_autoLockTimer:
214 if (autoLockLock) 216 if (autoLockLock)
215 --autoLockLock; 217 --autoLockLock;
216 break; 218 break;
217 case id_metaCheckTimer: 219 case id_metaCheckTimer:
218 if (metaCheckLock) 220 if (metaCheckLock)
219 --metaCheckLock; 221 --metaCheckLock;
220 break; 222 break;
221 } 223 }
222} 224}
223 225
224void DocTimer::mpwTimeout() 226void DocTimer::mpwTimeout()
225{ 227{
226 if (mpwLock) { 228 if (mpwLock) {
227 mpwTimer->start(1000, true); 229 mpwTimer->start(1000, true);
228 return; 230 return;
229 } 231 }
230 doc->unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); 232 doc->unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW);
231} 233}
232 234
233void DocTimer::autoLockTimeout() 235void DocTimer::autoLockTimeout()
234{ 236{
235 if (autoLockLock) { 237 if (autoLockLock) {
236 autoLockTimer->start(1000, true); 238 autoLockTimer->start(1000, true);
237 return; 239 return;
238 } 240 }
239 if (conf()->confGlobAutoDeepLock() && 241 if (conf()->confGlobAutoDeepLock() &&
240 doc->filename != QString::null && 242 doc->filename != QString::null &&
241 doc->filename != "") { 243 doc->filename != "") {
242 doc->deepLock(true); 244 doc->deepLock(true);
243 } else { 245 } else {
244 doc->lockAll(true); 246 doc->lockAll(true);
245 } 247 }
246} 248}
247 249
248void DocTimer::metaCheckTimeout() 250void DocTimer::metaCheckTimeout()
249{ 251{
250 if (metaCheckLock) { 252 if (metaCheckLock) {
251 // check again in one second. 253 // check again in one second.
252 metaCheckTimer->start(1000, true); 254 metaCheckTimer->start(1000, true);
253 return; 255 return;
254 } 256 }
255 if (doc->isDeepLocked()) { 257 if (doc->isDeepLocked()) {
256 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 258 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
257 return; 259 return;
258 } 260 }
259 if (doc->isDocEmpty()) { 261 if (doc->isDocEmpty()) {
260 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 262 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
261 return; 263 return;
262 } 264 }
263#ifdef CONFIG_KWALLETIF 265#ifdef CONFIG_KWALLETIF
264 KWalletEmu *kwlEmu = doc->init->kwalletEmu(); 266 KWalletEmu *kwlEmu = doc->init->kwalletEmu();
265 if (kwlEmu) 267 if (kwlEmu)
266 kwlEmu->suspendDocSignals(); 268 kwlEmu->suspendDocSignals();
267#endif // CONFIG_KWALLETIF 269#endif // CONFIG_KWALLETIF
268 /* We simply trigger all views to update their 270 /* We simply trigger all views to update their
269 * displayed values. This way they have a chance 271 * displayed values. This way they have a chance
270 * to get notified when some meta changes over time. 272 * to get notified when some meta changes over time.
271 * (for example an entry expired). 273 * (for example an entry expired).
272 * The _view_ is responsive for not updating its 274 * The _view_ is responsive for not updating its
273 * contents if nothing really changed! 275 * contents if nothing really changed!
274 */ 276 */
275 emit doc->dataChanged(doc); 277 emit doc->dataChanged(doc);
276#ifdef CONFIG_KWALLETIF 278#ifdef CONFIG_KWALLETIF
277 if (kwlEmu) 279 if (kwlEmu)
278 kwlEmu->resumeDocSignals(); 280 kwlEmu->resumeDocSignals();
279#endif // CONFIG_KWALLETIF 281#endif // CONFIG_KWALLETIF
280 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true); 282 metaCheckTimer->start(META_CHECK_TIMER_INTERVAL * 1000, true);
281} 283}
282 284
283 285
284 286
285PwMDocList PwMDoc::openDocList; 287PwMDocList PwMDoc::openDocList;
286unsigned int PwMDocList::unnamedDocCnt = 1; 288unsigned int PwMDocList::unnamedDocCnt = 1;
287 289
288PwMDoc::PwMDoc(QObject *parent, const char *name) 290PwMDoc::PwMDoc(QObject *parent, const char *name)
289 : PwMDocUi(parent, name) 291 : PwMDocUi(parent, name)
290 , dataChangedLock (0) 292 , dataChangedLock (0)
291{ 293{
292 deleted = false; 294 deleted = false;
293 unnamedNum = 0; 295 unnamedNum = 0;
294 getOpenDocList()->add(this, getTitle().latin1()); 296 getOpenDocList()->add(this, getTitle().latin1());
295 curDocStat = 0; 297 curDocStat = 0;
296 setMaxNumEntries(); 298 setMaxNumEntries();
297 _timer = new DocTimer(this); 299 _timer = new DocTimer(this);
298 timer()->start(DocTimer::id_mpwTimer); 300 timer()->start(DocTimer::id_mpwTimer);
299 timer()->start(DocTimer::id_autoLockTimer); 301 timer()->start(DocTimer::id_autoLockTimer);
300 timer()->start(DocTimer::id_metaCheckTimer); 302 timer()->start(DocTimer::id_metaCheckTimer);
301 addCategory(DEFAULT_CATEGORY, 0, false); 303 addCategory(DEFAULT_CATEGORY, 0, false);
302 listView = 0; 304 listView = 0;
303 emit docCreated(this); 305 emit docCreated(this);
304} 306}
305 307
306PwMDoc::~PwMDoc() 308PwMDoc::~PwMDoc()
307{ 309{
308 emit docClosed(this); 310 emit docClosed(this);
309 getOpenDocList()->del(this); 311 getOpenDocList()->del(this);
310 delete _timer; 312 delete _timer;
311} 313}
312 314
313PwMerror PwMDoc::saveDoc(char compress, const QString *file) 315PwMerror PwMDoc::saveDoc(char compress, const QString *file)
314{ 316{
315 PwMerror ret, e; 317 PwMerror ret, e;
316 if (!file) { 318 if (!file) {
317 if (filename == "") 319 if (filename == "")
318 return e_filename; 320 return e_filename;
319 } else { 321 } else {
320 if (*file == "" && filename == "") 322 if (*file == "" && filename == "")
321 return e_filename; 323 return e_filename;
322 if (*file != "") 324 if (*file != "")
323 filename = *file; 325 filename = *file;
324 } 326 }
325 327
326 bool wasDeepLocked = isDeepLocked(); 328 bool wasDeepLocked = isDeepLocked();
327 if (wasDeepLocked) { 329 if (wasDeepLocked) {
328 if (deepLock(false) != e_success) 330 if (deepLock(false) != e_success)
329 return e_noPw; 331 return e_noPw;
330 } 332 }
331 333
332 if (!isPwAvailable()) { 334 if (!isPwAvailable()) {
333 /* password is not available. This means, the 335 /* password is not available. This means, the
334 * document wasn't saved, yet. 336 * document wasn't saved, yet.
335 */ 337 */
336 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD); 338 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD);
337 QString pw(requestNewMpw(&useChipcard)); 339 QString pw(requestNewMpw(&useChipcard));
338 if (pw != "") { 340 if (pw != "") {
339 currentPw = pw; 341 currentPw = pw;
340 } else { 342 } else {
341 return e_noPw; 343 return e_noPw;
342 } 344 }
343 if (useChipcard) { 345 if (useChipcard) {
344 setDocStatFlag(DOC_STAT_USE_CHIPCARD); 346 setDocStatFlag(DOC_STAT_USE_CHIPCARD);
345 } else { 347 } else {
346 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 348 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
347 } 349 }
348 } 350 }
349#ifndef PWM_EMBEDDED 351#ifndef PWM_EMBEDDED
350 int _cryptAlgo = conf()->confGlobCryptAlgo(); 352 int _cryptAlgo = conf()->confGlobCryptAlgo();
351 int _hashAlgo = conf()->confGlobHashAlgo(); 353 int _hashAlgo = conf()->confGlobHashAlgo();
352#else 354#else
353 int _cryptAlgo = PWM_CRYPT_BLOWFISH; 355 int _cryptAlgo = PWM_CRYPT_BLOWFISH;
354 int _hashAlgo = PWM_HASH_SHA1; 356 int _hashAlgo = PWM_HASH_SHA1;
355#endif 357#endif
356 358
357 // sanity check for the selected algorithms 359 // sanity check for the selected algorithms
358 if (_cryptAlgo < PWM_CRYPT_BLOWFISH || 360 if (_cryptAlgo < PWM_CRYPT_BLOWFISH ||
359 _cryptAlgo > PWM_CRYPT_TWOFISH128) { 361 _cryptAlgo > PWM_CRYPT_TWOFISH128) {
360 printWarn("Invalid Crypto-Algorithm selected! " 362 printWarn("Invalid Crypto-Algorithm selected! "
361 "Config-file seems to be corrupt. " 363 "Config-file seems to be corrupt. "
362 "Falling back to Blowfish."); 364 "Falling back to Blowfish.");
363 _cryptAlgo = PWM_CRYPT_BLOWFISH; 365 _cryptAlgo = PWM_CRYPT_BLOWFISH;
364 } 366 }
365 if (_hashAlgo < PWM_HASH_SHA1 || 367 if (_hashAlgo < PWM_HASH_SHA1 ||
366 _hashAlgo > PWM_HASH_TIGER) { 368 _hashAlgo > PWM_HASH_TIGER) {
367 printWarn("Invalid Hash-Algorithm selected! " 369 printWarn("Invalid Hash-Algorithm selected! "
368 "Config-file seems to be corrupt. " 370 "Config-file seems to be corrupt. "
369 "Falling back to SHA1."); 371 "Falling back to SHA1.");
370 _hashAlgo = PWM_HASH_SHA1; 372 _hashAlgo = PWM_HASH_SHA1;
371 } 373 }
372 char cryptAlgo = static_cast<char>(_cryptAlgo); 374 char cryptAlgo = static_cast<char>(_cryptAlgo);
373 char hashAlgo = static_cast<char>(_hashAlgo); 375 char hashAlgo = static_cast<char>(_hashAlgo);
374 376
375 if (conf()->confGlobMakeFileBackup()) { 377 if (conf()->confGlobMakeFileBackup()) {
376 if (!backupFile(filename)) 378 if (!backupFile(filename))
377 return e_fileBackup; 379 return e_fileBackup;
378 } 380 }
379 QString tmpFileMoved(QString::null); 381 QString tmpFileMoved(QString::null);
380 if (QFile::exists(filename)) { 382 if (QFile::exists(filename)) {
381 /* Move the existing file to some tmp file. 383 /* Move the existing file to some tmp file.
382 * When saving file succeeds, delete tmp file. Otherwise 384 * When saving file succeeds, delete tmp file. Otherwise
383 * move tmp file back. See below. 385 * move tmp file back. See below.
384 */ 386 */
385 Randomizer *rnd = Randomizer::obj(); 387 Randomizer *rnd = Randomizer::obj();
386 char rnd_buf[5]; 388 char rnd_buf[5];
387 sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF, 389 sprintf(rnd_buf, "%X%X%X%X", rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF,
388 rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF); 390 rnd->genRndChar() & 0xFF, rnd->genRndChar() & 0xFF);
389 tmpFileMoved = filename + "." + rnd_buf + ".mv"; 391 tmpFileMoved = filename + "." + rnd_buf + ".mv";
390 if (!copyFile(filename, tmpFileMoved)) 392 if (!copyFile(filename, tmpFileMoved))
391 return e_openFile; 393 return e_openFile;
392 if (!QFile::remove(filename)) { 394 if (!QFile::remove(filename)) {
393 printWarn(string("removing orig file ") 395 printWarn(string("removing orig file ")
394 + filename.latin1() 396 + filename.latin1()
395 + " failed!"); 397 + " failed!");
396 } 398 }
397 } 399 }
398 QFile f(filename); 400 QFile f(filename);
399 string serialized; 401 string serialized;
400 if (!f.open(IO_ReadWrite)) { 402 if (!f.open(IO_ReadWrite)) {
401 ret = e_openFile; 403 ret = e_openFile;
402 goto out_moveback; 404 goto out_moveback;
403 } 405 }
404 e = writeFileHeader(hashAlgo, hashAlgo, 406 e = writeFileHeader(hashAlgo, hashAlgo,
405 cryptAlgo, compress, 407 cryptAlgo, compress,
406 &currentPw, &f); 408 &currentPw, &f);
407 if (e == e_hashNotImpl) { 409 if (e == e_hashNotImpl) {
408 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed: e_hashNotImpl"); 410 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed: e_hashNotImpl");
409 f.close(); 411 f.close();
410 ret = e_hashNotImpl; 412 ret = e_hashNotImpl;
411 goto out_moveback; 413 goto out_moveback;
412 } else if (e != e_success) { 414 } else if (e != e_success) {
413 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed"); 415 printDebug("PwMDoc::saveDoc(): writeFileHeader() failed");
414 f.close(); 416 f.close();
415 ret = e_writeHeader; 417 ret = e_writeHeader;
416 goto out_moveback; 418 goto out_moveback;
417 } 419 }
418 if (!serializeDta(&serialized)) { 420 if (!serializeDta(&serialized)) {
419 printDebug("PwMDoc::saveDoc(): serializeDta() failed"); 421 printDebug("PwMDoc::saveDoc(): serializeDta() failed");
420 f.close(); 422 f.close();
421 ret = e_serializeDta; 423 ret = e_serializeDta;
422 goto out_moveback; 424 goto out_moveback;
423 } 425 }
424 e = writeDataHash(hashAlgo, &serialized, &f); 426 e = writeDataHash(hashAlgo, &serialized, &f);
425 if (e == e_hashNotImpl) { 427 if (e == e_hashNotImpl) {
426 printDebug("PwMDoc::saveDoc(): writeDataHash() failed: e_hashNotImpl"); 428 printDebug("PwMDoc::saveDoc(): writeDataHash() failed: e_hashNotImpl");
427 f.close(); 429 f.close();
428 ret = e_hashNotImpl; 430 ret = e_hashNotImpl;
429 goto out_moveback; 431 goto out_moveback;
430 } else if (e != e_success) { 432 } else if (e != e_success) {
431 printDebug("PwMDoc::saveDoc(): writeDataHash() failed"); 433 printDebug("PwMDoc::saveDoc(): writeDataHash() failed");
432 f.close(); 434 f.close();
433 ret = e_writeHeader; 435 ret = e_writeHeader;
434 goto out_moveback; 436 goto out_moveback;
435 } 437 }
436 if (!compressDta(&serialized, compress)) { 438 if (!compressDta(&serialized, compress)) {
437 printDebug("PwMDoc::saveDoc(): compressDta() failed"); 439 printDebug("PwMDoc::saveDoc(): compressDta() failed");
438 f.close(); 440 f.close();
439 ret = e_enc; 441 ret = e_enc;
440 goto out_moveback; 442 goto out_moveback;
441 } 443 }
442 e = encrypt(&serialized, &currentPw, &f, cryptAlgo); 444 e = encrypt(&serialized, &currentPw, &f, cryptAlgo);
443 if (e == e_weakPw) { 445 if (e == e_weakPw) {
444 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw"); 446 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_weakPw");
445 f.close(); 447 f.close();
446 ret = e_weakPw; 448 ret = e_weakPw;
447 goto out_moveback; 449 goto out_moveback;
448 } else if (e == e_cryptNotImpl) { 450 } else if (e == e_cryptNotImpl) {
449 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl"); 451 printDebug("PwMDoc::saveDoc(): encrypt() failed: e_cryptNotImpl");
450 f.close(); 452 f.close();
451 ret = e_cryptNotImpl; 453 ret = e_cryptNotImpl;
452 goto out_moveback; 454 goto out_moveback;
453 } else if (e != e_success) { 455 } else if (e != e_success) {
454 printDebug("PwMDoc::saveDoc(): encrypt() failed"); 456 printDebug("PwMDoc::saveDoc(): encrypt() failed");
455 f.close(); 457 f.close();
456 ret = e_enc; 458 ret = e_enc;
457 goto out_moveback; 459 goto out_moveback;
458 } 460 }
459 unsetDocStatFlag(DOC_STAT_DISK_DIRTY); 461 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
460 f.close(); 462 f.close();
461 if (chmod(filename.latin1(), 463 if (chmod(filename.latin1(),
462 conf()->confGlobFilePermissions())) { 464 conf()->confGlobFilePermissions())) {
463 printWarn(string("chmod failed: ") + strerror(errno)); 465 printWarn(string("chmod failed: ") + strerror(errno));
464 } 466 }
465 openDocList.edit(this, getTitle().latin1()); 467 openDocList.edit(this, getTitle().latin1());
466 if (wasDeepLocked) 468 if (wasDeepLocked)
467 deepLock(true); 469 deepLock(true);
468 if (tmpFileMoved != QString::null) { 470 if (tmpFileMoved != QString::null) {
469 // now remove the moved file. 471 // now remove the moved file.
470 if (!QFile::remove(tmpFileMoved)) { 472 if (!QFile::remove(tmpFileMoved)) {
471 printWarn(string("removing file ") 473 printWarn(string("removing file ")
472 + tmpFileMoved.latin1() 474 + tmpFileMoved.latin1()
473 + " failed!"); 475 + " failed!");
474 } 476 }
475 } 477 }
476 ret = e_success; 478 ret = e_success;
477 printDebug(string("writing file { compress: ") 479 printDebug(string("writing file { compress: ")
478 + tostr(static_cast<int>(compress)) + " cryptAlgo: " 480 + tostr(static_cast<int>(compress)) + " cryptAlgo: "
479 + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: " 481 + tostr(static_cast<int>(cryptAlgo)) + " hashAlgo: "
480 + tostr(static_cast<int>(hashAlgo)) 482 + tostr(static_cast<int>(hashAlgo))
481 + " }"); 483 + " }");
482 goto out; 484 goto out;
483out_moveback: 485out_moveback:
484 if (tmpFileMoved != QString::null) { 486 if (tmpFileMoved != QString::null) {
485 if (copyFile(tmpFileMoved, filename)) { 487 if (copyFile(tmpFileMoved, filename)) {
486 if (!QFile::remove(tmpFileMoved)) { 488 if (!QFile::remove(tmpFileMoved)) {
487 printWarn(string("removing tmp file ") 489 printWarn(string("removing tmp file ")
488 + filename.latin1() 490 + filename.latin1()
489 + " failed!"); 491 + " failed!");
490 } 492 }
491 } else { 493 } else {
492 printWarn(string("couldn't copy file ") 494 printWarn(string("couldn't copy file ")
493 + tmpFileMoved.latin1() 495 + tmpFileMoved.latin1()
494 + " back to " 496 + " back to "
495 + filename.latin1()); 497 + filename.latin1());
496 } 498 }
497 } 499 }
498out: 500out:
499 return ret; 501 return ret;
500} 502}
501 503
502PwMerror PwMDoc::openDoc(const QString *file, int openLocked) 504PwMerror PwMDoc::openDoc(const QString *file, int openLocked)
503{ 505{
504 PWM_ASSERT(file); 506 PWM_ASSERT(file);
505 PWM_ASSERT(openLocked == 0 || openLocked == 1 || openLocked == 2); 507 PWM_ASSERT(openLocked == 0 || openLocked == 1 || openLocked == 2);
506 string decrypted, dataHash; 508 string decrypted, dataHash;
507 PwMerror ret; 509 PwMerror ret;
508 char cryptAlgo, dataHashType, compress; 510 char cryptAlgo, dataHashType, compress;
509 unsigned int headerLen; 511 unsigned int headerLen;
510 512
511 if (*file == "") 513 if (*file == "")
512 return e_readFile; 514 return e_readFile;
513 filename = *file; 515 filename = *file;
514 /* check if this file is already open. 516 /* check if this file is already open.
515 * This does not catch symlinks! 517 * This does not catch symlinks!
516 */ 518 */
517 if (!isDeepLocked()) { 519 if (!isDeepLocked()) {
518 if (getOpenDocList()->find(filename.latin1())) 520 if (getOpenDocList()->find(filename.latin1()))
519 return e_alreadyOpen; 521 return e_alreadyOpen;
520 } 522 }
521 QFile f(filename); 523 QFile f(filename);
522 524
523 if (openLocked == 2) { 525 if (openLocked == 2) {
524 // open deep-locked 526 // open deep-locked
525 if (!QFile::exists(filename)) 527 if (!QFile::exists(filename))
526 return e_openFile; 528 return e_openFile;
527 if (deepLock(true, false) != e_success) 529 if (deepLock(true, false) != e_success)
528 return e_openFile; 530 return e_openFile;
529 goto out_success; 531 goto out_success;
530 } 532 }
531 533
532 if (!f.open(IO_ReadOnly)) 534 if (!f.open(IO_ReadOnly))
533 return e_openFile; 535 return e_openFile;
534 536
535 ret = checkHeader(&cryptAlgo, &currentPw, &compress, &headerLen, 537 ret = checkHeader(&cryptAlgo, &currentPw, &compress, &headerLen,
536 &dataHashType, &dataHash, &f); 538 &dataHashType, &dataHash, &f);
537 if (ret != e_success) { 539 if (ret != e_success) {
538 printDebug("PwMDoc::openDoc(): checkHeader() failed"); 540 printDebug("PwMDoc::openDoc(): checkHeader() failed");
539 f.close(); 541 f.close();
540 if (ret == e_wrongPw) { 542 if (ret == e_wrongPw) {
541 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 543 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
542 return ret; 544 return ret;
543 } else if (ret == e_noPw || 545 } else if (ret == e_noPw ||
544 ret == e_fileVer || 546 ret == e_fileVer ||
545 ret == e_fileFormat || 547 ret == e_fileFormat ||
546 ret == e_hashNotImpl) { 548 ret == e_hashNotImpl) {
547 return ret; 549 return ret;
548 } else 550 } else
549 return e_readFile; 551 return e_readFile;
550 } 552 }
551 ret = decrypt(&decrypted, headerLen, &currentPw, cryptAlgo, &f); 553 ret = decrypt(&decrypted, headerLen, &currentPw, cryptAlgo, &f);
552 if (ret == e_cryptNotImpl) { 554 if (ret == e_cryptNotImpl) {
553 printDebug("PwMDoc::openDoc(): decrypt() failed: e_cryptNotImpl"); 555 printDebug("PwMDoc::openDoc(): decrypt() failed: e_cryptNotImpl");
554 f.close(); 556 f.close();
555 return e_cryptNotImpl; 557 return e_cryptNotImpl;
556 } else if (ret != e_success) { 558 } else if (ret != e_success) {
557 printDebug("PwMDoc::openDoc(): decrypt() failed"); 559 printDebug("PwMDoc::openDoc(): decrypt() failed");
558 f.close(); 560 f.close();
559 return e_readFile; 561 return e_readFile;
560 } 562 }
561 if (!decompressDta(&decrypted, compress)) { 563 if (!decompressDta(&decrypted, compress)) {
562 printDebug("PwMDoc::openDoc(): decompressDta() failed"); 564 printDebug("PwMDoc::openDoc(): decompressDta() failed");
563 f.close(); 565 f.close();
564 return e_fileCorrupt; 566 return e_fileCorrupt;
565 } 567 }
566 ret = checkDataHash(dataHashType, &dataHash, &decrypted); 568 ret = checkDataHash(dataHashType, &dataHash, &decrypted);
567 if (ret == e_hashNotImpl) { 569 if (ret == e_hashNotImpl) {
568 printDebug("PwMDoc::openDoc(): checkDataHash() failed: e_hashNotImpl"); 570 printDebug("PwMDoc::openDoc(): checkDataHash() failed: e_hashNotImpl");
569 f.close(); 571 f.close();
570 return e_hashNotImpl; 572 return e_hashNotImpl;
571 } else if (ret != e_success) { 573 } else if (ret != e_success) {
572 printDebug("PwMDoc::openDoc(): checkDataHash() failed"); 574 printDebug("PwMDoc::openDoc(): checkDataHash() failed");
573 f.close(); 575 f.close();
574 return e_fileCorrupt; 576 return e_fileCorrupt;
575 } 577 }
576 if (!deSerializeDta(&decrypted, openLocked == 1)) { 578 if (!deSerializeDta(&decrypted, openLocked == 1)) {
577 printDebug("PwMDoc::openDoc(): deSerializeDta() failed"); 579 printDebug("PwMDoc::openDoc(): deSerializeDta() failed");
578 f.close(); 580 f.close();
579 return e_readFile; 581 return e_readFile;
580 } 582 }
581 f.close(); 583 f.close();
582 timer()->start(DocTimer::id_mpwTimer); 584 timer()->start(DocTimer::id_mpwTimer);
583 timer()->start(DocTimer::id_autoLockTimer); 585 timer()->start(DocTimer::id_autoLockTimer);
584out_success: 586out_success:
585 openDocList.edit(this, getTitle().latin1()); 587 openDocList.edit(this, getTitle().latin1());
586 emit docOpened(this); 588 emit docOpened(this);
587 return e_success; 589 return e_success;
588} 590}
589 591
590PwMerror PwMDoc::writeFileHeader(char keyHash, char dataHash, char crypt, char compress, 592PwMerror PwMDoc::writeFileHeader(char keyHash, char dataHash, char crypt, char compress,
591 QString *pw, QFile *f) 593 QString *pw, QFile *f)
592{ 594{
593 PWM_ASSERT(pw); 595 PWM_ASSERT(pw);
594 PWM_ASSERT(f); 596 PWM_ASSERT(f);
595 PWM_ASSERT(listView); 597 PWM_ASSERT(listView);
596#ifndef PWM_EMBEDDED 598#ifndef PWM_EMBEDDED
597 if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) != 599 if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) !=
598 static_cast<Q_LONG>(strlen(FILE_ID_HEADER))) { 600 static_cast<Q_LONG>(strlen(FILE_ID_HEADER))) {
599 return e_writeFile; 601 return e_writeFile;
600 } 602 }
601 if (f->putch(PWM_FILE_VER) == -1 || 603 if (f->putch(PWM_FILE_VER) == -1 ||
602 f->putch(keyHash) == -1 || 604 f->putch(keyHash) == -1 ||
603 f->putch(dataHash) == -1 || 605 f->putch(dataHash) == -1 ||
604 f->putch(crypt) == -1 || 606 f->putch(crypt) == -1 ||
605 f->putch(compress) == -1 || 607 f->putch(compress) == -1 ||
606 f->putch((getDocStatFlag(DOC_STAT_USE_CHIPCARD)) ? 608 f->putch((getDocStatFlag(DOC_STAT_USE_CHIPCARD)) ?
607 (static_cast<char>(0x01)) : (static_cast<char>(0x00))) == -1) { 609 (static_cast<char>(0x01)) : (static_cast<char>(0x00))) == -1) {
608 return e_writeFile; 610 return e_writeFile;
609 } 611 }
610 612
611#else 613#else
612 if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) != 614 if (f->writeBlock(FILE_ID_HEADER, strlen(FILE_ID_HEADER)) !=
613 (long)(strlen(FILE_ID_HEADER))) { 615 (long)(strlen(FILE_ID_HEADER))) {
614 return e_writeFile; 616 return e_writeFile;
615 } 617 }
616 if (f->putch(PWM_FILE_VER) == -1 || 618 if (f->putch(PWM_FILE_VER) == -1 ||
617 f->putch(keyHash) == -1 || 619 f->putch(keyHash) == -1 ||
618 f->putch(dataHash) == -1 || 620 f->putch(dataHash) == -1 ||
619 f->putch(crypt) == -1 || 621 f->putch(crypt) == -1 ||
620 f->putch(compress) == -1 || 622 f->putch(compress) == -1 ||
621 f->putch((getDocStatFlag(DOC_STAT_USE_CHIPCARD)) ? 623 f->putch((getDocStatFlag(DOC_STAT_USE_CHIPCARD)) ?
622 ((char)(0x01)) : ((char)(0x00))) == -1) { 624 ((char)(0x01)) : ((char)(0x00))) == -1) {
623 return e_writeFile; 625 return e_writeFile;
624 } 626 }
625#endif 627#endif
626 // write bytes of NUL-data. These bytes are reserved for future-use. 628 // write bytes of NUL-data. These bytes are reserved for future-use.
627 const int bufSize = 64; 629 const int bufSize = 64;
628 char tmp_buf[bufSize]; 630 char tmp_buf[bufSize];
629 memset(tmp_buf, 0x00, bufSize); 631 memset(tmp_buf, 0x00, bufSize);
630 if (f->writeBlock(tmp_buf, bufSize) != bufSize) 632 if (f->writeBlock(tmp_buf, bufSize) != bufSize)
631 return e_writeFile; 633 return e_writeFile;
632 634
633 switch (keyHash) { 635 switch (keyHash) {
634 case PWM_HASH_SHA1: { 636 case PWM_HASH_SHA1: {
635 const int hashlen = SHA1_HASH_LEN_BYTE; 637 const int hashlen = SHA1_HASH_LEN_BYTE;
636 Sha1 hash; 638 Sha1 hash;
637 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length()); 639 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length());
638 string ret = hash.sha1_read(); 640 string ret = hash.sha1_read();
639 if (f->writeBlock(ret.c_str(), hashlen) != hashlen) 641 if (f->writeBlock(ret.c_str(), hashlen) != hashlen)
640 return e_writeFile; 642 return e_writeFile;
641 break; 643 break;
642 } 644 }
643#ifndef PWM_EMBEDDED 645#ifndef PWM_EMBEDDED
644 case PWM_HASH_SHA256: 646 case PWM_HASH_SHA256:
645 /*... fall through */ 647 /*... fall through */
646 case PWM_HASH_SHA384: 648 case PWM_HASH_SHA384:
647 case PWM_HASH_SHA512: 649 case PWM_HASH_SHA512:
648 case PWM_HASH_MD5: 650 case PWM_HASH_MD5:
649 case PWM_HASH_RMD160: 651 case PWM_HASH_RMD160:
650 case PWM_HASH_TIGER: 652 case PWM_HASH_TIGER:
651 { 653 {
652 if (!LibGCryptIf::available()) 654 if (!LibGCryptIf::available())
653 return e_hashNotImpl; 655 return e_hashNotImpl;
654 LibGCryptIf gc; 656 LibGCryptIf gc;
655 PwMerror err; 657 PwMerror err;
656 unsigned char *buf; 658 unsigned char *buf;
657 size_t hashLen; 659 size_t hashLen;
658 err = gc.hash(&buf, 660 err = gc.hash(&buf,
659 &hashLen, 661 &hashLen,
660 reinterpret_cast<const unsigned char *>(pw->latin1()), 662 reinterpret_cast<const unsigned char *>(pw->latin1()),
661 pw->length(), 663 pw->length(),
662 keyHash); 664 keyHash);
663 if (err != e_success) 665 if (err != e_success)
664 return e_hashNotImpl; 666 return e_hashNotImpl;
665 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen) 667 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen)
666 != static_cast<Q_LONG>(hashLen)) { 668 != static_cast<Q_LONG>(hashLen)) {
667 delete [] buf; 669 delete [] buf;
668 return e_hashNotImpl; 670 return e_hashNotImpl;
669 } 671 }
670 delete [] buf; 672 delete [] buf;
671 break; 673 break;
672 } 674 }
673#endif 675#endif
674 default: { 676 default: {
675 return e_hashNotImpl; 677 return e_hashNotImpl;
676 } } 678 } }
677 return e_success; 679 return e_success;
678} 680}
679 681
680PwMerror PwMDoc::checkHeader(char *cryptAlgo, QString *pw, char *compress, 682PwMerror PwMDoc::checkHeader(char *cryptAlgo, QString *pw, char *compress,
681 unsigned int *headerLength, char *dataHashType, 683 unsigned int *headerLength, char *dataHashType,
682 string *dataHash, QFile *f) 684 string *dataHash, QFile *f)
683{ 685{
684 PWM_ASSERT(cryptAlgo); 686 PWM_ASSERT(cryptAlgo);
685 PWM_ASSERT(pw); 687 PWM_ASSERT(pw);
686 PWM_ASSERT(headerLength); 688 PWM_ASSERT(headerLength);
687 PWM_ASSERT(dataHashType); 689 PWM_ASSERT(dataHashType);
688 PWM_ASSERT(dataHash); 690 PWM_ASSERT(dataHash);
689 PWM_ASSERT(f); 691 PWM_ASSERT(f);
690 int tmpRet; 692 int tmpRet;
691 // check "magic" header 693 // check "magic" header
692 const char magicHdr[] = FILE_ID_HEADER; 694 const char magicHdr[] = FILE_ID_HEADER;
693 const int hdrLen = array_size(magicHdr) - 1; 695 const int hdrLen = array_size(magicHdr) - 1;
694 char tmp[hdrLen]; 696 char tmp[hdrLen];
695 if (f->readBlock(tmp, hdrLen) != hdrLen) 697 if (f->readBlock(tmp, hdrLen) != hdrLen)
696 return e_readFile; 698 return e_readFile;
697 if (memcmp(tmp, magicHdr, hdrLen) != 0) 699 if (memcmp(tmp, magicHdr, hdrLen) != 0)
698 return e_fileFormat; 700 return e_fileFormat;
699 // read and check file ver 701 // read and check file ver
700 int fileV = f->getch(); 702 int fileV = f->getch();
701 if (fileV == -1) 703 if (fileV == -1)
702 return e_fileFormat; 704 return e_fileFormat;
703 if (fileV != PWM_FILE_VER) 705 if (fileV != PWM_FILE_VER)
704 return e_fileVer; 706 return e_fileVer;
705 // read hash hash type 707 // read hash hash type
706 int keyHash = f->getch(); 708 int keyHash = f->getch();
707 if (keyHash == -1) 709 if (keyHash == -1)
708 return e_fileFormat; 710 return e_fileFormat;
709 // read data hash type 711 // read data hash type
710 tmpRet = f->getch(); 712 tmpRet = f->getch();
711 if (tmpRet == -1) 713 if (tmpRet == -1)
712 return e_fileFormat; 714 return e_fileFormat;
713 *dataHashType = tmpRet; 715 *dataHashType = tmpRet;
714 // read crypt algo 716 // read crypt algo
715 tmpRet = f->getch(); 717 tmpRet = f->getch();
716 if (tmpRet == -1) 718 if (tmpRet == -1)
717 return e_fileFormat; 719 return e_fileFormat;
718 *cryptAlgo = tmpRet; 720 *cryptAlgo = tmpRet;
719 // get compression-algo 721 // get compression-algo
720 tmpRet = f->getch(); 722 tmpRet = f->getch();
721 if (tmpRet == -1) 723 if (tmpRet == -1)
722 return e_fileFormat; 724 return e_fileFormat;
723 *compress = tmpRet; 725 *compress = tmpRet;
724 // get the MPW-flag 726 // get the MPW-flag
725 int mpw_flag = f->getch(); 727 int mpw_flag = f->getch();
726 if (mpw_flag == -1) 728 if (mpw_flag == -1)
727 return e_fileFormat; 729 return e_fileFormat;
728 if (mpw_flag == 0x01) 730 if (mpw_flag == 0x01)
729 setDocStatFlag(DOC_STAT_USE_CHIPCARD); 731 setDocStatFlag(DOC_STAT_USE_CHIPCARD);
730 else 732 else
731 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 733 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
732 // skip the "RESERVED"-bytes 734 // skip the "RESERVED"-bytes
733 if (!(f->at(f->at() + 64))) 735 if (!(f->at(f->at() + 64)))
734 return e_fileFormat; 736 return e_fileFormat;
735 737
736 *pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 738 *pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
737 if (*pw == "") { 739 if (*pw == "") {
738 /* the user didn't give a master-password 740 /* the user didn't give a master-password
739 * or didn't insert a chipcard 741 * or didn't insert a chipcard
740 */ 742 */
741 return e_noPw; 743 return e_noPw;
742 } 744 }
743 // verify key-hash 745 // verify key-hash
744 switch (keyHash) { 746 switch (keyHash) {
745 case PWM_HASH_SHA1: { 747 case PWM_HASH_SHA1: {
746 // read hash from header 748 // read hash from header
747 const int hashLen = SHA1_HASH_LEN_BYTE; 749 const int hashLen = SHA1_HASH_LEN_BYTE;
748 string readHash; 750 string readHash;
749 int i; 751 int i;
750 for (i = 0; i < hashLen; ++i) 752 for (i = 0; i < hashLen; ++i)
751 readHash.push_back(f->getch()); 753 readHash.push_back(f->getch());
752 Sha1 hash; 754 Sha1 hash;
753 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length()); 755 hash.sha1_write(reinterpret_cast<const byte *>(pw->latin1()), pw->length());
754 string ret = hash.sha1_read(); 756 string ret = hash.sha1_read();
755 if (ret != readHash) 757 if (ret != readHash)
756 return e_wrongPw;// hash doesn't match (wrong key) 758 return e_wrongPw;// hash doesn't match (wrong key)
757 break; 759 break;
758 } 760 }
759#ifndef PWM_EMBEDDED 761#ifndef PWM_EMBEDDED
760 case PWM_HASH_SHA256: 762 case PWM_HASH_SHA256:
761 /*... fall through */ 763 /*... fall through */
762 case PWM_HASH_SHA384: 764 case PWM_HASH_SHA384:
763 case PWM_HASH_SHA512: 765 case PWM_HASH_SHA512:
764 case PWM_HASH_MD5: 766 case PWM_HASH_MD5:
765 case PWM_HASH_RMD160: 767 case PWM_HASH_RMD160:
766 case PWM_HASH_TIGER: { 768 case PWM_HASH_TIGER: {
767 if (!LibGCryptIf::available()) 769 if (!LibGCryptIf::available())
768 return e_hashNotImpl; 770 return e_hashNotImpl;
769 LibGCryptIf gc; 771 LibGCryptIf gc;
770 PwMerror err; 772 PwMerror err;
771 unsigned char *buf; 773 unsigned char *buf;
772 size_t hashLen; 774 size_t hashLen;
773 err = gc.hash(&buf, 775 err = gc.hash(&buf,
774 &hashLen, 776 &hashLen,
775 reinterpret_cast<const unsigned char *>(pw->latin1()), 777 reinterpret_cast<const unsigned char *>(pw->latin1()),
776 pw->length(), 778 pw->length(),
777 keyHash); 779 keyHash);
778 if (err != e_success) 780 if (err != e_success)
779 return e_hashNotImpl; 781 return e_hashNotImpl;
780 string calcHash(reinterpret_cast<const char *>(buf), 782 string calcHash(reinterpret_cast<const char *>(buf),
781 static_cast<string::size_type>(hashLen)); 783 static_cast<string::size_type>(hashLen));
782 delete [] buf; 784 delete [] buf;
783 // read hash from header 785 // read hash from header
784 string readHash; 786 string readHash;
785 size_t i; 787 size_t i;
786 for (i = 0; i < hashLen; ++i) 788 for (i = 0; i < hashLen; ++i)
787 readHash.push_back(f->getch()); 789 readHash.push_back(f->getch());
788 if (calcHash != readHash) 790 if (calcHash != readHash)
789 return e_wrongPw;// hash doesn't match (wrong key) 791 return e_wrongPw;// hash doesn't match (wrong key)
790 break; 792 break;
791 } 793 }
792#endif 794#endif
793 default: { 795 default: {
794 return e_hashNotImpl; 796 return e_hashNotImpl;
795 } } 797 } }
796 // read the data-hash from the file 798 // read the data-hash from the file
797 unsigned int hashLen, i; 799 unsigned int hashLen, i;
798 switch (*dataHashType) { 800 switch (*dataHashType) {
799 case PWM_HASH_SHA1: 801 case PWM_HASH_SHA1:
800 hashLen = SHA1_HASH_LEN_BYTE; 802 hashLen = SHA1_HASH_LEN_BYTE;
801 break; 803 break;
802#ifndef PWM_EMBEDDED 804#ifndef PWM_EMBEDDED
803 case PWM_HASH_SHA256: 805 case PWM_HASH_SHA256:
804 /*... fall through */ 806 /*... fall through */
805 case PWM_HASH_SHA384: 807 case PWM_HASH_SHA384:
806 case PWM_HASH_SHA512: 808 case PWM_HASH_SHA512:
807 case PWM_HASH_MD5: 809 case PWM_HASH_MD5:
808 case PWM_HASH_RMD160: 810 case PWM_HASH_RMD160:
809 case PWM_HASH_TIGER: { 811 case PWM_HASH_TIGER: {
810 if (!LibGCryptIf::available()) 812 if (!LibGCryptIf::available())
811 return e_hashNotImpl; 813 return e_hashNotImpl;
812 LibGCryptIf gc; 814 LibGCryptIf gc;
813 hashLen = gc.hashLength(*dataHashType); 815 hashLen = gc.hashLength(*dataHashType);
814 if (hashLen == 0) 816 if (hashLen == 0)
815 return e_hashNotImpl; 817 return e_hashNotImpl;
816 break; 818 break;
817 } 819 }
818#endif 820#endif
819 default: 821 default:
820 return e_hashNotImpl; 822 return e_hashNotImpl;
821 } 823 }
822 *dataHash = ""; 824 *dataHash = "";
823 for (i = 0; i < hashLen; ++i) { 825 for (i = 0; i < hashLen; ++i) {
824 tmpRet = f->getch(); 826 tmpRet = f->getch();
825 if (tmpRet == -1) 827 if (tmpRet == -1)
826 return e_fileFormat; 828 return e_fileFormat;
827 dataHash->push_back(static_cast<char>(tmpRet)); 829 dataHash->push_back(static_cast<char>(tmpRet));
828 } 830 }
829 *headerLength = f->at(); 831 *headerLength = f->at();
830#ifndef PWM_EMBEDDED 832#ifndef PWM_EMBEDDED
831 printDebug(string("opening file { compress: ") 833 printDebug(string("opening file { compress: ")
832 + tostr(static_cast<int>(*compress)) + " cryptAlgo: " 834 + tostr(static_cast<int>(*compress)) + " cryptAlgo: "
833 + tostr(static_cast<int>(*cryptAlgo)) + " keyHashAlgo: " 835 + tostr(static_cast<int>(*cryptAlgo)) + " keyHashAlgo: "
834 + tostr(static_cast<int>(keyHash)) 836 + tostr(static_cast<int>(keyHash))
835 + " }"); 837 + " }");
836#else 838#else
837 printDebug(string("opening file { compress: ") 839 printDebug(string("opening file { compress: ")
838 + tostr((int)(*compress)) + " cryptAlgo: " 840 + tostr((int)(*compress)) + " cryptAlgo: "
839 + tostr((int)(*cryptAlgo)) + " keyHashAlgo: " 841 + tostr((int)(*cryptAlgo)) + " keyHashAlgo: "
840 + tostr((int)(keyHash)) 842 + tostr((int)(keyHash))
841 + " }"); 843 + " }");
842#endif 844#endif
843 845
844 return e_success; 846 return e_success;
845} 847}
846 848
847PwMerror PwMDoc::writeDataHash(char dataHash, string *d, QFile *f) 849PwMerror PwMDoc::writeDataHash(char dataHash, string *d, QFile *f)
848{ 850{
849 PWM_ASSERT(d); 851 PWM_ASSERT(d);
850 PWM_ASSERT(f); 852 PWM_ASSERT(f);
851 853
852 switch (dataHash) { 854 switch (dataHash) {
853 case PWM_HASH_SHA1: { 855 case PWM_HASH_SHA1: {
854 const int hashLen = SHA1_HASH_LEN_BYTE; 856 const int hashLen = SHA1_HASH_LEN_BYTE;
855 Sha1 h; 857 Sha1 h;
856 h.sha1_write(reinterpret_cast<const byte *>(d->c_str()), d->size()); 858 h.sha1_write(reinterpret_cast<const byte *>(d->c_str()), d->size());
857 string hRet = h.sha1_read(); 859 string hRet = h.sha1_read();
858 if (f->writeBlock(hRet.c_str(), hashLen) != hashLen) 860 if (f->writeBlock(hRet.c_str(), hashLen) != hashLen)
859 return e_writeFile; 861 return e_writeFile;
860 break; 862 break;
861 } 863 }
862 #ifndef PWM_EMBEDDED 864 #ifndef PWM_EMBEDDED
863 case PWM_HASH_SHA256: 865 case PWM_HASH_SHA256:
864 /*... fall through */ 866 /*... fall through */
865 case PWM_HASH_SHA384: 867 case PWM_HASH_SHA384:
866 case PWM_HASH_SHA512: 868 case PWM_HASH_SHA512:
867 case PWM_HASH_MD5: 869 case PWM_HASH_MD5:
868 case PWM_HASH_RMD160: 870 case PWM_HASH_RMD160:
869 case PWM_HASH_TIGER: { 871 case PWM_HASH_TIGER: {
870 if (!LibGCryptIf::available()) 872 if (!LibGCryptIf::available())
871 return e_hashNotImpl; 873 return e_hashNotImpl;
872 LibGCryptIf gc; 874 LibGCryptIf gc;
873 PwMerror err; 875 PwMerror err;
874 unsigned char *buf; 876 unsigned char *buf;
875 size_t hashLen; 877 size_t hashLen;
876 err = gc.hash(&buf, 878 err = gc.hash(&buf,
877 &hashLen, 879 &hashLen,
878 reinterpret_cast<const unsigned char *>(d->c_str()), 880 reinterpret_cast<const unsigned char *>(d->c_str()),
879 d->size(), 881 d->size(),
880 dataHash); 882 dataHash);
881 if (err != e_success) 883 if (err != e_success)
882 return e_hashNotImpl; 884 return e_hashNotImpl;
883 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen) 885 if (f->writeBlock(reinterpret_cast<const char *>(buf), hashLen)
884 != static_cast<Q_LONG>(hashLen)) { 886 != static_cast<Q_LONG>(hashLen)) {
885 delete [] buf; 887 delete [] buf;
886 return e_hashNotImpl; 888 return e_hashNotImpl;
887 } 889 }
888 delete [] buf; 890 delete [] buf;
889 break; 891 break;
890 } 892 }
891#endif 893#endif
892 default: { 894 default: {
893 return e_hashNotImpl; 895 return e_hashNotImpl;
894 } } 896 } }
895 897
896 return e_success; 898 return e_success;
897} 899}
898 900
899bool PwMDoc::backupFile(const QString &filePath) 901bool PwMDoc::backupFile(const QString &filePath)
900{ 902{
901 QFileInfo fi(filePath); 903 QFileInfo fi(filePath);
902 if (!fi.exists()) 904 if (!fi.exists())
903 return true; // Yes, true is correct. 905 return true; // Yes, true is correct.
904 QString pathOnly(fi.dirPath(true)); 906 QString pathOnly(fi.dirPath(true));
905 QString nameOnly(fi.fileName()); 907 QString nameOnly(fi.fileName());
906 QString backupPath = pathOnly 908 QString backupPath = pathOnly
907 + "/~" 909 + "/~"
908 + nameOnly 910 + nameOnly
909 + ".backup"; 911 + ".backup";
910 return copyFile(filePath, backupPath); 912 return copyFile(filePath, backupPath);
911} 913}
912 914
913bool PwMDoc::copyFile(const QString &src, const QString &dst) 915bool PwMDoc::copyFile(const QString &src, const QString &dst)
914{ 916{
915 QFileInfo fi(src); 917 QFileInfo fi(src);
916 if (!fi.exists()) 918 if (!fi.exists())
917 return false; 919 return false;
918 if (QFile::exists(dst)) { 920 if (QFile::exists(dst)) {
919 if (!QFile::remove(dst)) 921 if (!QFile::remove(dst))
920 return false; 922 return false;
921 } 923 }
922 QFile srcFd(src); 924 QFile srcFd(src);
923 if (!srcFd.open(IO_ReadOnly)) 925 if (!srcFd.open(IO_ReadOnly))
924 return false; 926 return false;
925 QFile dstFd(dst); 927 QFile dstFd(dst);
926 if (!dstFd.open(IO_ReadWrite)) { 928 if (!dstFd.open(IO_ReadWrite)) {
927 srcFd.close(); 929 srcFd.close();
928 return false; 930 return false;
929 } 931 }
930 const int tmpBuf_size = 512; 932 const int tmpBuf_size = 512;
931 char tmpBuf[tmpBuf_size]; 933 char tmpBuf[tmpBuf_size];
932#ifndef PWM_EMBEDDED 934#ifndef PWM_EMBEDDED
933 Q_LONG bytesRead, bytesWritten; 935 Q_LONG bytesRead, bytesWritten;
934#else 936#else
935 long bytesRead, bytesWritten; 937 long bytesRead, bytesWritten;
936#endif 938#endif
937 while (!srcFd.atEnd()) { 939 while (!srcFd.atEnd()) {
938#ifndef PWM_EMBEDDED 940#ifndef PWM_EMBEDDED
939 bytesRead = srcFd.readBlock(tmpBuf, 941 bytesRead = srcFd.readBlock(tmpBuf,
940 static_cast<Q_ULONG>(tmpBuf_size)); 942 static_cast<Q_ULONG>(tmpBuf_size));
941#else 943#else
942 bytesRead = srcFd.readBlock(tmpBuf, 944 bytesRead = srcFd.readBlock(tmpBuf,
943 (unsigned long)(tmpBuf_size)); 945 (unsigned long)(tmpBuf_size));
944#endif 946#endif
945 if (bytesRead == -1) { 947 if (bytesRead == -1) {
946 srcFd.close(); 948 srcFd.close();
947 dstFd.close(); 949 dstFd.close();
948 return false; 950 return false;
949 } 951 }
950#ifndef PWM_EMBEDDED 952#ifndef PWM_EMBEDDED
951 bytesWritten = dstFd.writeBlock(tmpBuf, 953 bytesWritten = dstFd.writeBlock(tmpBuf,
952 static_cast<Q_ULONG>(bytesRead)); 954 static_cast<Q_ULONG>(bytesRead));
953#else 955#else
954 bytesWritten = dstFd.writeBlock(tmpBuf, 956 bytesWritten = dstFd.writeBlock(tmpBuf,
955 (unsigned long)(bytesRead)); 957 (unsigned long)(bytesRead));
956#endif 958#endif
957 if (bytesWritten != bytesRead) { 959 if (bytesWritten != bytesRead) {
958 srcFd.close(); 960 srcFd.close();
959 dstFd.close(); 961 dstFd.close();
960 return false; 962 return false;
961 } 963 }
962 } 964 }
963 srcFd.close(); 965 srcFd.close();
964 dstFd.close(); 966 dstFd.close();
965 return true; 967 return true;
966} 968}
967 969
968PwMerror PwMDoc::addEntry(const QString &category, PwMDataItem *d, 970PwMerror PwMDoc::addEntry(const QString &category, PwMDataItem *d,
969 bool dontFlagDirty, bool updateMeta) 971 bool dontFlagDirty, bool updateMeta)
970{ 972{
971 PWM_ASSERT(d); 973 PWM_ASSERT(d);
972 unsigned int cat = 0; 974 unsigned int cat = 0;
973 975
974 if (isDeepLocked()) { 976 if (isDeepLocked()) {
975 PwMerror ret; 977 PwMerror ret;
976 ret = deepLock(false); 978 ret = deepLock(false);
977 if (ret != e_success) 979 if (ret != e_success)
978 return e_lock; 980 return e_lock;
979 } 981 }
980 982
981 addCategory(category, &cat); 983 addCategory(category, &cat);
982 984
983 if (numEntries(category) >= maxEntries) 985 if (numEntries(category) >= maxEntries)
984 return e_maxAllowedEntr; 986 return e_maxAllowedEntr;
985 987
986 vector<unsigned int> foundPositions; 988 vector<unsigned int> foundPositions;
987 /* historically this was: 989 /* historically this was:
988 *const int searchIn = SEARCH_IN_DESC | SEARCH_IN_NAME | 990 *const int searchIn = SEARCH_IN_DESC | SEARCH_IN_NAME |
989 * SEARCH_IN_URL | SEARCH_IN_LAUNCHER; 991 * SEARCH_IN_URL | SEARCH_IN_LAUNCHER;
990 * But for now we only search in desc. 992 * But for now we only search in desc.
991 * That's a tweak to be KWallet compatible. But it should not add 993 * That's a tweak to be KWallet compatible. But it should not add
992 * usability-drop onto PwManager, does it? 994 * usability-drop onto PwManager, does it?
993 * (And yes, "int" was a bug. Correct is "unsigned int") 995 * (And yes, "int" was a bug. Correct is "unsigned int")
994 */ 996 */
995 const unsigned int searchIn = SEARCH_IN_DESC; 997 const unsigned int searchIn = SEARCH_IN_DESC;
996 findEntry(cat, *d, searchIn, &foundPositions, true); 998 findEntry(cat, *d, searchIn, &foundPositions, true);
997 if (foundPositions.size()) { 999 if (foundPositions.size()) {
998 // DOH! We found this entry. 1000 // DOH! We found this entry.
999 return e_entryExists; 1001 return e_entryExists;
1000 } 1002 }
1001 1003
1002 d->listViewPos = -1; 1004 d->listViewPos = -1;
1003 d->lockStat = conf()->confGlobNewEntrLockStat(); 1005 d->lockStat = conf()->confGlobNewEntrLockStat();
1004 if (updateMeta) { 1006 if (updateMeta) {
1005 d->meta.create = QDateTime::currentDateTime(); 1007 d->meta.create = QDateTime::currentDateTime();
1006 d->meta.update = d->meta.create; 1008 d->meta.update = d->meta.create;
1007 } 1009 }
1008 dta[cat].d.push_back(*d); 1010 dta[cat].d.push_back(*d);
1009 1011
1010 delAllEmptyCat(true); 1012 delAllEmptyCat(true);
1011 1013
1012 if (!dontFlagDirty) 1014 if (!dontFlagDirty)
1013 flagDirty(); 1015 flagDirty();
1014 return e_success; 1016 return e_success;
1015} 1017}
1016 1018
1017PwMerror PwMDoc::addCategory(const QString &category, unsigned int *categoryIndex, 1019PwMerror PwMDoc::addCategory(const QString &category, unsigned int *categoryIndex,
1018 bool checkIfExist) 1020 bool checkIfExist)
1019{ 1021{
1020 if (isDeepLocked()) { 1022 if (isDeepLocked()) {
1021 PwMerror ret; 1023 PwMerror ret;
1022 ret = deepLock(false); 1024 ret = deepLock(false);
1023 if (ret != e_success) 1025 if (ret != e_success)
1024 return e_lock; 1026 return e_lock;
1025 } 1027 }
1026 if (checkIfExist) { 1028 if (checkIfExist) {
1027 if (findCategory(category, categoryIndex)) 1029 if (findCategory(category, categoryIndex))
1028 return e_categoryExists; 1030 return e_categoryExists;
1029 } 1031 }
1030 PwMCategoryItem item; 1032 PwMCategoryItem item;
1031 item.name = category.latin1(); 1033 item.name = category.latin1();
1032 dta.push_back(item); 1034 dta.push_back(item);
1033 if (categoryIndex) 1035 if (categoryIndex)
1034 *categoryIndex = dta.size() - 1; 1036 *categoryIndex = dta.size() - 1;
1035 return e_success; 1037 return e_success;
1036} 1038}
1037 1039
1038bool PwMDoc::delEntry(const QString &category, unsigned int index, bool dontFlagDirty) 1040bool PwMDoc::delEntry(const QString &category, unsigned int index, bool dontFlagDirty)
1039{ 1041{
1040 unsigned int cat = 0; 1042 unsigned int cat = 0;
1041 1043
1042 if (!findCategory(category, &cat)) { 1044 if (!findCategory(category, &cat)) {
1043 BUG(); 1045 BUG();
1044 return false; 1046 return false;
1045 } 1047 }
1046 1048
1047 return delEntry(cat, index, dontFlagDirty); 1049 return delEntry(cat, index, dontFlagDirty);
1048} 1050}
1049 1051
1050bool PwMDoc::delEntry(unsigned int category, unsigned int index, bool dontFlagDirty) 1052bool PwMDoc::delEntry(unsigned int category, unsigned int index, bool dontFlagDirty)
1051{ 1053{
1052 if (isDeepLocked()) 1054 if (isDeepLocked())
1053 return false; 1055 return false;
1054 if (index > dta[category].d.size() - 1) 1056 if (index > dta[category].d.size() - 1)
1055 return false; 1057 return false;
1056 getDataChangedLock(); 1058 getDataChangedLock();
1057 if (!lockAt(category, index, false)) { 1059 if (!lockAt(category, index, false)) {
1058 putDataChangedLock(); 1060 putDataChangedLock();
1059 return false; 1061 return false;
1060 } 1062 }
1061 putDataChangedLock(); 1063 putDataChangedLock();
1062 int lvPos = dta[category].d[index].listViewPos; 1064 int lvPos = dta[category].d[index].listViewPos;
1063 1065
1064 // delete entry 1066 // delete entry
1065 dta[category].d.erase(dta[category].d.begin() + index); 1067 dta[category].d.erase(dta[category].d.begin() + index);
1066 1068
1067 unsigned int i, entries = numEntries(category); 1069 unsigned int i, entries = numEntries(category);
1068 if (!entries) { 1070 if (!entries) {
1069 // no more entries in this category, so 1071 // no more entries in this category, so
1070 // we can delete it, too. 1072 // we can delete it, too.
1071 BUG_ON(!delCategory(category)); 1073 BUG_ON(!delCategory(category));
1072 // delCategory() flags it dirty, so we need not to do so. 1074 // delCategory() flags it dirty, so we need not to do so.
1073 return true; 1075 return true;
1074 } 1076 }
1075 for (i = 0; i < entries; ++i) { 1077 for (i = 0; i < entries; ++i) {
1076 // decrement all listViewPositions that are greater than the deleted. 1078 // decrement all listViewPositions that are greater than the deleted.
1077 if (dta[category].d[i].listViewPos > lvPos) 1079 if (dta[category].d[i].listViewPos > lvPos)
1078 --dta[category].d[i].listViewPos; 1080 --dta[category].d[i].listViewPos;
1079 } 1081 }
1080 1082
1081 if (!dontFlagDirty) 1083 if (!dontFlagDirty)
1082 flagDirty(); 1084 flagDirty();
1083 return true; 1085 return true;
1084} 1086}
1085 1087
1086bool PwMDoc::editEntry(const QString &oldCategory, const QString &newCategory, 1088bool PwMDoc::editEntry(const QString &oldCategory, const QString &newCategory,
1087 unsigned int index, PwMDataItem *d, bool updateMeta) 1089 unsigned int index, PwMDataItem *d, bool updateMeta)
1088{ 1090{
1089 PWM_ASSERT(d); 1091 PWM_ASSERT(d);
1090 unsigned int oldCat = 0; 1092 unsigned int oldCat = 0;
1091 1093
1092 if (!findCategory(oldCategory, &oldCat)) { 1094 if (!findCategory(oldCategory, &oldCat)) {
1093 BUG(); 1095 BUG();
1094 return false; 1096 return false;
1095 } 1097 }
1096 1098
1097 return editEntry(oldCat, newCategory, index, d, updateMeta); 1099 return editEntry(oldCat, newCategory, index, d, updateMeta);
1098} 1100}
1099 1101
1100bool PwMDoc::editEntry(unsigned int oldCategory, const QString &newCategory, 1102bool PwMDoc::editEntry(unsigned int oldCategory, const QString &newCategory,
1101 unsigned int index, PwMDataItem *d, bool updateMeta) 1103 unsigned int index, PwMDataItem *d, bool updateMeta)
1102{ 1104{
1103 if (isDeepLocked()) 1105 if (isDeepLocked())
1104 return false; 1106 return false;
1105 if (updateMeta) { 1107 if (updateMeta) {
1106 d->meta.update = QDateTime::currentDateTime(); 1108 d->meta.update = QDateTime::currentDateTime();
1107 if (d->meta.create.isNull()) { 1109 if (d->meta.create.isNull()) {
1108 d->meta.create = d->meta.update; 1110 d->meta.create = d->meta.update;
1109 } 1111 }
1110 } 1112 }
1111 if (dta[oldCategory].name != newCategory.latin1()) { 1113 if (dta[oldCategory].name != newCategory.latin1()) {
1112 // the user changed the category. 1114 // the user changed the category.
1113 PwMerror ret; 1115 PwMerror ret;
1114 d->rev = 0; 1116 d->rev = 0;
1115 ret = addEntry(newCategory, d, true, false); 1117 ret = addEntry(newCategory, d, true, false);
1116 if (ret != e_success) 1118 if (ret != e_success)
1117 return false; 1119 return false;
1118 if (!delEntry(oldCategory, index, true)) 1120 if (!delEntry(oldCategory, index, true))
1119 return false; 1121 return false;
1120 } else { 1122 } else {
1121 d->rev = dta[oldCategory].d[index].rev + 1; // increment revision counter. 1123 d->rev = dta[oldCategory].d[index].rev + 1; // increment revision counter.
1122 dta[oldCategory].d[index] = *d; 1124 dta[oldCategory].d[index] = *d;
1123 } 1125 }
1124 flagDirty(); 1126 flagDirty();
1125 return true; 1127 return true;
1126} 1128}
1127 1129
1128unsigned int PwMDoc::numEntries(const QString &category) 1130unsigned int PwMDoc::numEntries(const QString &category)
1129{ 1131{
1130 unsigned int cat = 0; 1132 unsigned int cat = 0;
1131 1133
1132 if (!findCategory(category, &cat)) { 1134 if (!findCategory(category, &cat)) {
1133 BUG(); 1135 BUG();
1134 return 0; 1136 return 0;
1135 } 1137 }
1136 1138
1137 return numEntries(cat); 1139 return numEntries(cat);
1138} 1140}
1139 1141
1140bool PwMDoc::serializeDta(string *d) 1142bool PwMDoc::serializeDta(string *d)
1141{ 1143{
1142 PWM_ASSERT(d); 1144 PWM_ASSERT(d);
1143 Serializer ser; 1145 Serializer ser;
1144 if (!ser.serialize(dta)) 1146 if (!ser.serialize(dta))
1145 return false; 1147 return false;
1146 d->assign(ser.getXml()); 1148 d->assign(ser.getXml());
1147 if (!d->size()) 1149 if (!d->size())
1148 return false; 1150 return false;
1149 return true; 1151 return true;
1150} 1152}
1151 1153
1152bool PwMDoc::deSerializeDta(const string *d, bool entriesLocked) 1154bool PwMDoc::deSerializeDta(const string *d, bool entriesLocked)
1153{ 1155{
1154 PWM_ASSERT(d); 1156 PWM_ASSERT(d);
1155 try { 1157 try {
1156 Serializer ser(d->c_str()); 1158 Serializer ser(d->c_str());
1157 ser.setDefaultLockStat(entriesLocked); 1159 ser.setDefaultLockStat(entriesLocked);
1158 if (!ser.deSerialize(&dta)) 1160 if (!ser.deSerialize(&dta))
1159 return false; 1161 return false;
1160 } catch (PwMException) { 1162 } catch (PwMException) {
1161 return false; 1163 return false;
1162 } 1164 }
1163 emitDataChanged(this); 1165 emitDataChanged(this);
1164 return true; 1166 return true;
1165} 1167}
1166 1168
1167bool PwMDoc::getEntry(const QString &category, unsigned int index, 1169bool PwMDoc::getEntry(const QString &category, unsigned int index,
1168 PwMDataItem * d, bool unlockIfLocked) 1170 PwMDataItem * d, bool unlockIfLocked)
1169{ 1171{
1170 PWM_ASSERT(d); 1172 PWM_ASSERT(d);
1171 unsigned int cat = 0; 1173 unsigned int cat = 0;
1172 1174
1173 if (!findCategory(category, &cat)) { 1175 if (!findCategory(category, &cat)) {
1174 BUG(); 1176 BUG();
1175 return false; 1177 return false;
1176 } 1178 }
1177 1179
1178 return getEntry(cat, index, d, unlockIfLocked); 1180 return getEntry(cat, index, d, unlockIfLocked);
1179} 1181}
1180 1182
1181bool PwMDoc::getEntry(unsigned int category, unsigned int index, 1183bool PwMDoc::getEntry(unsigned int category, unsigned int index,
1182 PwMDataItem *d, bool unlockIfLocked) 1184 PwMDataItem *d, bool unlockIfLocked)
1183{ 1185{
1184 if (index > dta[category].d.size() - 1) 1186 if (index > dta[category].d.size() - 1)
1185 return false; 1187 return false;
1186 1188
1187 bool locked = isLocked(category, index); 1189 bool locked = isLocked(category, index);
1188 if (locked) { 1190 if (locked) {
1189 /* this entry is locked. We don't return a password, 1191 /* this entry is locked. We don't return a password,
1190 * until it's unlocked by the user by inserting 1192 * until it's unlocked by the user by inserting
1191 * chipcard or entering the mpw 1193 * chipcard or entering the mpw
1192 */ 1194 */
1193 if (unlockIfLocked) { 1195 if (unlockIfLocked) {
1194 if (!lockAt(category, index, false)) { 1196 if (!lockAt(category, index, false)) {
1195 return false; 1197 return false;
1196 } 1198 }
1197 locked = false; 1199 locked = false;
1198 } 1200 }
1199 } 1201 }
1200 1202
1201 *d = dta[category].d[index]; 1203 *d = dta[category].d[index];
1202 if (locked) 1204 if (locked)
1203 d->pw = LOCKED_STRING.latin1(); 1205 d->pw = LOCKED_STRING.latin1();
1204 1206
1205 return true; 1207 return true;
1206} 1208}
1207 1209
1208PwMerror PwMDoc::getCommentByLvp(const QString &category, int listViewPos, 1210PwMerror PwMDoc::getCommentByLvp(const QString &category, int listViewPos,
1209 string *foundComment) 1211 string *foundComment)
1210{ 1212{
1211 PWM_ASSERT(foundComment); 1213 PWM_ASSERT(foundComment);
1212 unsigned int cat = 0; 1214 unsigned int cat = 0;
1213 1215
1214 if (!findCategory(category, &cat)) 1216 if (!findCategory(category, &cat))
1215 return e_invalidArg; 1217 return e_invalidArg;
1216 1218
1217 unsigned int i, entries = numEntries(cat); 1219 unsigned int i, entries = numEntries(cat);
1218 for (i = 0; i < entries; ++i) { 1220 for (i = 0; i < entries; ++i) {
1219 if (dta[cat].d[i].listViewPos == listViewPos) { 1221 if (dta[cat].d[i].listViewPos == listViewPos) {
1220 *foundComment = dta[cat].d[i].comment; 1222 *foundComment = dta[cat].d[i].comment;
1221 if (dta[cat].d[i].binary) 1223 if (dta[cat].d[i].binary)
1222 return e_binEntry; 1224 return e_binEntry;
1223 return e_normalEntry; 1225 return e_normalEntry;
1224 } 1226 }
1225 } 1227 }
1226 BUG(); 1228 BUG();
1227 return e_generic; 1229 return e_generic;
1228} 1230}
1229 1231
1230bool PwMDoc::compressDta(string *d, char algo) 1232bool PwMDoc::compressDta(string *d, char algo)
1231{ 1233{
1232 PWM_ASSERT(d); 1234 PWM_ASSERT(d);
1233 switch (algo) { 1235 switch (algo) {
1234 case PWM_COMPRESS_GZIP: { 1236 case PWM_COMPRESS_GZIP: {
1235 CompressGzip comp; 1237 CompressGzip comp;
1236 return comp.compress(d); 1238 return comp.compress(d);
1237 } case PWM_COMPRESS_BZIP2: { 1239 } case PWM_COMPRESS_BZIP2: {
1238 CompressBzip2 comp; 1240 CompressBzip2 comp;
1239 return comp.compress(d); 1241 return comp.compress(d);
1240 } case PWM_COMPRESS_NONE: { 1242 } case PWM_COMPRESS_NONE: {
1241 return true; 1243 return true;
1242 } default: { 1244 } default: {
1243 BUG(); 1245 BUG();
1244 } 1246 }
1245 } 1247 }
1246 return false; 1248 return false;
1247} 1249}
1248 1250
1249bool PwMDoc::decompressDta(string *d, char algo) 1251bool PwMDoc::decompressDta(string *d, char algo)
1250{ 1252{
1251 PWM_ASSERT(d); 1253 PWM_ASSERT(d);
1252 switch (algo) { 1254 switch (algo) {
1253 case PWM_COMPRESS_GZIP: { 1255 case PWM_COMPRESS_GZIP: {
1254 CompressGzip comp; 1256 CompressGzip comp;
1255 return comp.decompress(d); 1257 return comp.decompress(d);
1256 } case PWM_COMPRESS_BZIP2: { 1258 } case PWM_COMPRESS_BZIP2: {
1257 CompressBzip2 comp; 1259 CompressBzip2 comp;
1258 return comp.decompress(d); 1260 return comp.decompress(d);
1259 } case PWM_COMPRESS_NONE: { 1261 } case PWM_COMPRESS_NONE: {
1260 return true; 1262 return true;
1261 } 1263 }
1262 } 1264 }
1263 return false; 1265 return false;
1264} 1266}
1265 1267
1266PwMerror PwMDoc::encrypt(string *d, const QString *pw, QFile *f, char algo) 1268PwMerror PwMDoc::encrypt(string *d, const QString *pw, QFile *f, char algo)
1267{ 1269{
1268 PWM_ASSERT(d); 1270 PWM_ASSERT(d);
1269 PWM_ASSERT(pw); 1271 PWM_ASSERT(pw);
1270 PWM_ASSERT(f); 1272 PWM_ASSERT(f);
1271 1273
1272 size_t encSize; 1274 size_t encSize;
1273 byte *encrypted = 0; 1275 byte *encrypted = 0;
1274 1276
1275 switch (algo) { 1277 switch (algo) {
1276 case PWM_CRYPT_BLOWFISH: { 1278 case PWM_CRYPT_BLOWFISH: {
1277 Blowfish::padNull(d); 1279 Blowfish::padNull(d);
1278 encSize = d->length(); 1280 encSize = d->length();
1279 encrypted = new byte[encSize]; 1281 encrypted = new byte[encSize];
1280 Blowfish bf; 1282 Blowfish bf;
1281 if (bf.bf_setkey((byte *) pw->latin1(), pw->length())) { 1283 if (bf.bf_setkey((byte *) pw->latin1(), pw->length())) {
1282 delete [] encrypted; 1284 delete [] encrypted;
1283 return e_weakPw; 1285 return e_weakPw;
1284 } 1286 }
1285 bf.bf_encrypt((byte *) encrypted, (byte *) d->c_str(), encSize); 1287 bf.bf_encrypt((byte *) encrypted, (byte *) d->c_str(), encSize);
1286 break; 1288 break;
1287 } 1289 }
1288 #ifndef PWM_EMBEDDED 1290 #ifndef PWM_EMBEDDED
1289 case PWM_CRYPT_AES128: 1291 case PWM_CRYPT_AES128:
1290 /*... fall through */ 1292 /*... fall through */
1291 case PWM_CRYPT_AES192: 1293 case PWM_CRYPT_AES192:
1292 case PWM_CRYPT_AES256: 1294 case PWM_CRYPT_AES256:
1293 case PWM_CRYPT_3DES: 1295 case PWM_CRYPT_3DES:
1294 case PWM_CRYPT_TWOFISH: 1296 case PWM_CRYPT_TWOFISH:
1295 case PWM_CRYPT_TWOFISH128: { 1297 case PWM_CRYPT_TWOFISH128: {
1296 if (!LibGCryptIf::available()) 1298 if (!LibGCryptIf::available())
1297 return e_cryptNotImpl; 1299 return e_cryptNotImpl;
1298 LibGCryptIf gc; 1300 LibGCryptIf gc;
1299 PwMerror err; 1301 PwMerror err;
1300 unsigned char *plain = new unsigned char[d->length() + 1024]; 1302 unsigned char *plain = new unsigned char[d->length() + 1024];
1301 memcpy(plain, d->c_str(), d->length()); 1303 memcpy(plain, d->c_str(), d->length());
1302 err = gc.encrypt(&encrypted, 1304 err = gc.encrypt(&encrypted,
1303 &encSize, 1305 &encSize,
1304 plain, 1306 plain,
1305 d->length(), 1307 d->length(),
1306 reinterpret_cast<const unsigned char *>(pw->latin1()), 1308 reinterpret_cast<const unsigned char *>(pw->latin1()),
1307 pw->length(), 1309 pw->length(),
1308 algo); 1310 algo);
1309 delete [] plain; 1311 delete [] plain;
1310 if (err != e_success) 1312 if (err != e_success)
1311 return e_cryptNotImpl; 1313 return e_cryptNotImpl;
1312 break; 1314 break;
1313 } 1315 }
1314#endif 1316#endif
1315 default: { 1317 default: {
1316 delete_ifnot_null_array(encrypted); 1318 delete_ifnot_null_array(encrypted);
1317 return e_cryptNotImpl; 1319 return e_cryptNotImpl;
1318 } } 1320 } }
1319 1321
1320 // write encrypted data to file 1322 // write encrypted data to file
1321#ifndef PWM_EMBEDDED 1323#ifndef PWM_EMBEDDED
1322 if (f->writeBlock(reinterpret_cast<const char *>(encrypted), 1324 if (f->writeBlock(reinterpret_cast<const char *>(encrypted),
1323 static_cast<Q_ULONG>(encSize)) 1325 static_cast<Q_ULONG>(encSize))
1324 != static_cast<Q_LONG>(encSize)) { 1326 != static_cast<Q_LONG>(encSize)) {
1325 delete_ifnot_null_array(encrypted); 1327 delete_ifnot_null_array(encrypted);
1326 return e_writeFile; 1328 return e_writeFile;
1327 } 1329 }
1328#else 1330#else
1329 if (f->writeBlock((const char *)(encrypted), 1331 if (f->writeBlock((const char *)(encrypted),
1330 (unsigned long)(encSize)) 1332 (unsigned long)(encSize))
1331 != (long)(encSize)) { 1333 != (long)(encSize)) {
1332 delete_ifnot_null_array(encrypted); 1334 delete_ifnot_null_array(encrypted);
1333 return e_writeFile; 1335 return e_writeFile;
1334 } 1336 }
1335#endif 1337#endif
1336 delete_ifnot_null_array(encrypted); 1338 delete_ifnot_null_array(encrypted);
1337 return e_success; 1339 return e_success;
1338} 1340}
1339 1341
1340PwMerror PwMDoc::decrypt(string *d, unsigned int pos, const QString *pw, 1342PwMerror PwMDoc::decrypt(string *d, unsigned int pos, const QString *pw,
1341 char algo, QFile *f) 1343 char algo, QFile *f)
1342{ 1344{
1343 PWM_ASSERT(d); 1345 PWM_ASSERT(d);
1344 PWM_ASSERT(pw); 1346 PWM_ASSERT(pw);
1345 PWM_ASSERT(f); 1347 PWM_ASSERT(f);
1346 1348
1347 unsigned int cryptLen = f->size() - pos; 1349 unsigned int cryptLen = f->size() - pos;
1348 byte *encrypted = new byte[cryptLen]; 1350 byte *encrypted = new byte[cryptLen];
1349 byte *decrypted = new byte[cryptLen]; 1351 byte *decrypted = new byte[cryptLen];
1350 1352
1351 f->at(pos); 1353 f->at(pos);
1352#ifndef PWM_EMBEDDED 1354#ifndef PWM_EMBEDDED
1353 if (f->readBlock(reinterpret_cast<char *>(encrypted), 1355 if (f->readBlock(reinterpret_cast<char *>(encrypted),
1354 static_cast<Q_ULONG>(cryptLen)) 1356 static_cast<Q_ULONG>(cryptLen))
1355 != static_cast<Q_LONG>(cryptLen)) { 1357 != static_cast<Q_LONG>(cryptLen)) {
1356 delete [] encrypted; 1358 delete [] encrypted;
1357 delete [] decrypted; 1359 delete [] decrypted;
1358 return e_readFile; 1360 return e_readFile;
1359 } 1361 }
1360#else 1362#else
1361 if (f->readBlock((char *)(encrypted), 1363 if (f->readBlock((char *)(encrypted),
1362 (unsigned long)(cryptLen)) 1364 (unsigned long)(cryptLen))
1363 != (long)(cryptLen)) { 1365 != (long)(cryptLen)) {
1364 delete [] encrypted; 1366 delete [] encrypted;
1365 delete [] decrypted; 1367 delete [] decrypted;
1366 return e_readFile; 1368 return e_readFile;
1367 } 1369 }
1368#endif 1370#endif
1369 switch (algo) { 1371 switch (algo) {
1370 case PWM_CRYPT_BLOWFISH: { 1372 case PWM_CRYPT_BLOWFISH: {
1371 Blowfish bf; 1373 Blowfish bf;
1372 bf.bf_setkey((byte *) pw->latin1(), pw->length()); 1374 bf.bf_setkey((byte *) pw->latin1(), pw->length());
1373 bf.bf_decrypt(decrypted, encrypted, cryptLen); 1375 bf.bf_decrypt(decrypted, encrypted, cryptLen);
1374 break; 1376 break;
1375 } 1377 }
1376#ifndef PWM_EMBEDDED 1378#ifndef PWM_EMBEDDED
1377 case PWM_CRYPT_AES128: 1379 case PWM_CRYPT_AES128:
1378 /*... fall through */ 1380 /*... fall through */
1379 case PWM_CRYPT_AES192: 1381 case PWM_CRYPT_AES192:
1380 case PWM_CRYPT_AES256: 1382 case PWM_CRYPT_AES256:
1381 case PWM_CRYPT_3DES: 1383 case PWM_CRYPT_3DES:
1382 case PWM_CRYPT_TWOFISH: 1384 case PWM_CRYPT_TWOFISH:
1383 case PWM_CRYPT_TWOFISH128: { 1385 case PWM_CRYPT_TWOFISH128: {
1384 if (!LibGCryptIf::available()) 1386 if (!LibGCryptIf::available())
1385 return e_cryptNotImpl; 1387 return e_cryptNotImpl;
1386 LibGCryptIf gc; 1388 LibGCryptIf gc;
1387 PwMerror err; 1389 PwMerror err;
1388 err = gc.decrypt(&decrypted, 1390 err = gc.decrypt(&decrypted,
1389 &cryptLen, 1391 &cryptLen,
1390 encrypted, 1392 encrypted,
1391 cryptLen, 1393 cryptLen,
1392 reinterpret_cast<const unsigned char *>(pw->latin1()), 1394 reinterpret_cast<const unsigned char *>(pw->latin1()),
1393 pw->length(), 1395 pw->length(),
1394 algo); 1396 algo);
1395 if (err != e_success) { 1397 if (err != e_success) {
1396 delete [] encrypted; 1398 delete [] encrypted;
1397 delete [] decrypted; 1399 delete [] decrypted;
1398 return e_cryptNotImpl; 1400 return e_cryptNotImpl;
1399 } 1401 }
1400 break; 1402 break;
1401 } 1403 }
1402#endif 1404#endif
1403 default: { 1405 default: {
1404 delete [] encrypted; 1406 delete [] encrypted;
1405 delete [] decrypted; 1407 delete [] decrypted;
1406 return e_cryptNotImpl; 1408 return e_cryptNotImpl;
1407 } } 1409 } }
1408 delete [] encrypted; 1410 delete [] encrypted;
1409#ifndef PWM_EMBEDDED 1411#ifndef PWM_EMBEDDED
1410 d->assign(reinterpret_cast<const char *>(decrypted), 1412 d->assign(reinterpret_cast<const char *>(decrypted),
1411 static_cast<string::size_type>(cryptLen)); 1413 static_cast<string::size_type>(cryptLen));
1412#else 1414#else
1413 d->assign((const char *)(decrypted), 1415 d->assign((const char *)(decrypted),
1414 (string::size_type)(cryptLen)); 1416 (string::size_type)(cryptLen));
1415#endif 1417#endif
1416 delete [] decrypted; 1418 delete [] decrypted;
1417 if (algo == PWM_CRYPT_BLOWFISH) { 1419 if (algo == PWM_CRYPT_BLOWFISH) {
1418 if (!Blowfish::unpadNull(d)) { 1420 if (!Blowfish::unpadNull(d)) {
1419 BUG(); 1421 BUG();
1420 return e_readFile; 1422 return e_readFile;
1421 } 1423 }
1422 } 1424 }
1423 return e_success; 1425 return e_success;
1424} 1426}
1425 1427
1426PwMerror PwMDoc::checkDataHash(char dataHashType, const string *dataHash, 1428PwMerror PwMDoc::checkDataHash(char dataHashType, const string *dataHash,
1427 const string *dataStream) 1429 const string *dataStream)
1428{ 1430{
1429 PWM_ASSERT(dataHash); 1431 PWM_ASSERT(dataHash);
1430 PWM_ASSERT(dataStream); 1432 PWM_ASSERT(dataStream);
1431 switch(dataHashType) { 1433 switch(dataHashType) {
1432 case PWM_HASH_SHA1: { 1434 case PWM_HASH_SHA1: {
1433 Sha1 hash; 1435 Sha1 hash;
1434 hash.sha1_write((byte*)dataStream->c_str(), dataStream->length()); 1436 hash.sha1_write((byte*)dataStream->c_str(), dataStream->length());
1435 string ret = hash.sha1_read(); 1437 string ret = hash.sha1_read();
1436 if (ret != *dataHash) 1438 if (ret != *dataHash)
1437 return e_fileCorrupt; 1439 return e_fileCorrupt;
1438 break; 1440 break;
1439 } 1441 }
1440#ifndef PWM_EMBEDDED 1442#ifndef PWM_EMBEDDED
1441 case PWM_HASH_SHA256: 1443 case PWM_HASH_SHA256:
1442 /*... fall through */ 1444 /*... fall through */
1443 case PWM_HASH_SHA384: 1445 case PWM_HASH_SHA384:
1444 case PWM_HASH_SHA512: 1446 case PWM_HASH_SHA512:
1445 case PWM_HASH_MD5: 1447 case PWM_HASH_MD5:
1446 case PWM_HASH_RMD160: 1448 case PWM_HASH_RMD160:
1447 case PWM_HASH_TIGER: { 1449 case PWM_HASH_TIGER: {
1448 if (!LibGCryptIf::available()) 1450 if (!LibGCryptIf::available())
1449 return e_hashNotImpl; 1451 return e_hashNotImpl;
1450 LibGCryptIf gc; 1452 LibGCryptIf gc;
1451 PwMerror err; 1453 PwMerror err;
1452 unsigned char *buf; 1454 unsigned char *buf;
1453 size_t hashLen; 1455 size_t hashLen;
1454 err = gc.hash(&buf, 1456 err = gc.hash(&buf,
1455 &hashLen, 1457 &hashLen,
1456 reinterpret_cast<const unsigned char *>(dataStream->c_str()), 1458 reinterpret_cast<const unsigned char *>(dataStream->c_str()),
1457 dataStream->length(), 1459 dataStream->length(),
1458 dataHashType); 1460 dataHashType);
1459 if (err != e_success) 1461 if (err != e_success)
1460 return e_hashNotImpl; 1462 return e_hashNotImpl;
1461 string calcHash(reinterpret_cast<const char *>(buf), 1463 string calcHash(reinterpret_cast<const char *>(buf),
1462 static_cast<string::size_type>(hashLen)); 1464 static_cast<string::size_type>(hashLen));
1463 delete [] buf; 1465 delete [] buf;
1464 if (calcHash != *dataHash) 1466 if (calcHash != *dataHash)
1465 return e_fileCorrupt; 1467 return e_fileCorrupt;
1466 break; 1468 break;
1467 } 1469 }
1468#endif 1470#endif
1469 default: 1471 default:
1470 return e_hashNotImpl; 1472 return e_hashNotImpl;
1471 } 1473 }
1472 return e_success; 1474 return e_success;
1473} 1475}
1474 1476
1475bool PwMDoc::lockAt(unsigned int category, unsigned int index, 1477bool PwMDoc::lockAt(unsigned int category, unsigned int index,
1476 bool lock) 1478 bool lock)
1477{ 1479{
1478 if (index >= numEntries(category)) { 1480 if (index >= numEntries(category)) {
1479 BUG(); 1481 BUG();
1480 return false; 1482 return false;
1481 } 1483 }
1482 if (lock == dta[category].d[index].lockStat) 1484 if (lock == dta[category].d[index].lockStat)
1483 return true; 1485 return true;
1484 1486
1485 if (!lock && currentPw != "") { 1487 if (!lock && currentPw != "") {
1486 // "unlocking" and "password is already set" 1488 // "unlocking" and "password is already set"
1487 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) { 1489 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) {
1488 // unlocking without pw not allowed 1490 // unlocking without pw not allowed
1489 QString pw; 1491 QString pw;
1490 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1492 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1491 if (pw != "") { 1493 if (pw != "") {
1492 if (pw != currentPw) { 1494 if (pw != currentPw) {
1493 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1495 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1494 return false; 1496 return false;
1495 } else { 1497 } else {
1496 timer()->start(DocTimer::id_mpwTimer); 1498 timer()->start(DocTimer::id_mpwTimer);
1497 } 1499 }
1498 } else { 1500 } else {
1499 return false; 1501 return false;
1500 } 1502 }
1501 } else { 1503 } else {
1502 timer()->start(DocTimer::id_mpwTimer); 1504 timer()->start(DocTimer::id_mpwTimer);
1503 } 1505 }
1504 } 1506 }
1505 1507
1506 dta[category].d[index].lockStat = lock; 1508 dta[category].d[index].lockStat = lock;
1507 dta[category].d[index].rev++; // increment revision counter. 1509 dta[category].d[index].rev++; // increment revision counter.
1508 1510
1509 emitDataChanged(this); 1511 emitDataChanged(this);
1510 if (!lock) 1512 if (!lock)
1511 timer()->start(DocTimer::id_autoLockTimer); 1513 timer()->start(DocTimer::id_autoLockTimer);
1512 1514
1513 return true; 1515 return true;
1514 1516
1515} 1517}
1516 1518
1517bool PwMDoc::lockAt(const QString &category,unsigned int index, 1519bool PwMDoc::lockAt(const QString &category,unsigned int index,
1518 bool lock) 1520 bool lock)
1519{ 1521{
1520 unsigned int cat = 0; 1522 unsigned int cat = 0;
1521 1523
1522 if (!findCategory(category, &cat)) { 1524 if (!findCategory(category, &cat)) {
1523 BUG(); 1525 BUG();
1524 return false; 1526 return false;
1525 } 1527 }
1526 1528
1527 return lockAt(cat, index, lock); 1529 return lockAt(cat, index, lock);
1528} 1530}
1529 1531
1530bool PwMDoc::lockAll(bool lock) 1532bool PwMDoc::lockAll(bool lock)
1531{ 1533{
1532 if (!lock && isDeepLocked()) { 1534 if (!lock && isDeepLocked()) {
1533 PwMerror ret; 1535 PwMerror ret;
1534 ret = deepLock(false); 1536 ret = deepLock(false);
1535 if (ret != e_success) 1537 if (ret != e_success)
1536 return false; 1538 return false;
1537 return true; 1539 return true;
1538 } 1540 }
1539 if (isDocEmpty()) { 1541 if (isDocEmpty()) {
1540 return true; 1542 return true;
1541 } 1543 }
1542 if (!lock && currentPw != "") { 1544 if (!lock && currentPw != "") {
1543 // unlocking and password is already set 1545 // unlocking and password is already set
1544 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) { 1546 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW)) {
1545 // unlocking without pw not allowed 1547 // unlocking without pw not allowed
1546 QString pw; 1548 QString pw;
1547 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1549 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1548 if (pw != "") { 1550 if (pw != "") {
1549 if (pw != currentPw) { 1551 if (pw != currentPw) {
1550 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1552 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1551 return false; 1553 return false;
1552 } else { 1554 } else {
1553 timer()->start(DocTimer::id_mpwTimer); 1555 timer()->start(DocTimer::id_mpwTimer);
1554 } 1556 }
1555 } else { 1557 } else {
1556 return false; 1558 return false;
1557 } 1559 }
1558 } else { 1560 } else {
1559 timer()->start(DocTimer::id_mpwTimer); 1561 timer()->start(DocTimer::id_mpwTimer);
1560 } 1562 }
1561 } 1563 }
1562 1564
1563 vector<PwMCategoryItem>::iterator catBegin = dta.begin(), 1565 vector<PwMCategoryItem>::iterator catBegin = dta.begin(),
1564 catEnd = dta.end(), 1566 catEnd = dta.end(),
1565 catI = catBegin; 1567 catI = catBegin;
1566 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 1568 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
1567 while (catI != catEnd) { 1569 while (catI != catEnd) {
1568 entrBegin = catI->d.begin(); 1570 entrBegin = catI->d.begin();
1569 entrEnd = catI->d.end(); 1571 entrEnd = catI->d.end();
1570 entrI = entrBegin; 1572 entrI = entrBegin;
1571 while (entrI != entrEnd) { 1573 while (entrI != entrEnd) {
1572 entrI->lockStat = lock; 1574 entrI->lockStat = lock;
1573 entrI->rev++; // increment revision counter. 1575 entrI->rev++; // increment revision counter.
1574 ++entrI; 1576 ++entrI;
1575 } 1577 }
1576 ++catI; 1578 ++catI;
1577 } 1579 }
1578 1580
1579 emitDataChanged(this); 1581 emitDataChanged(this);
1580 if (lock) 1582 if (lock)
1581 timer()->stop(DocTimer::id_autoLockTimer); 1583 timer()->stop(DocTimer::id_autoLockTimer);
1582 else 1584 else
1583 timer()->start(DocTimer::id_autoLockTimer); 1585 timer()->start(DocTimer::id_autoLockTimer);
1584 1586
1585 return true; 1587 return true;
1586} 1588}
1587 1589
1588bool PwMDoc::isLocked(const QString &category, unsigned int index) 1590bool PwMDoc::isLocked(const QString &category, unsigned int index)
1589{ 1591{
1590 unsigned int cat = 0; 1592 unsigned int cat = 0;
1591 1593
1592 if (!findCategory(category, &cat)) { 1594 if (!findCategory(category, &cat)) {
1593 BUG(); 1595 BUG();
1594 return false; 1596 return false;
1595 } 1597 }
1596 1598
1597 return isLocked(cat, index); 1599 return isLocked(cat, index);
1598} 1600}
1599 1601
1600bool PwMDoc::unlockAll_tempoary(bool revert) 1602bool PwMDoc::unlockAll_tempoary(bool revert)
1601{ 1603{
1602 static vector< vector<bool> > *oldLockStates = 0; 1604 static vector< vector<bool> > *oldLockStates = 0;
1603 static bool wasDeepLocked; 1605 static bool wasDeepLocked;
1604 1606
1605 if (revert) {// revert the unlocking 1607 if (revert) {// revert the unlocking
1606 if (oldLockStates) { 1608 if (oldLockStates) {
1607 /* we actually _have_ unlocked something, because 1609 /* we actually _have_ unlocked something, because
1608 * we have allocated space for the oldLockStates. 1610 * we have allocated space for the oldLockStates.
1609 * So, go on and revert them! 1611 * So, go on and revert them!
1610 */ 1612 */
1611 if (wasDeepLocked) { 1613 if (wasDeepLocked) {
1612 PwMerror ret = deepLock(true); 1614 PwMerror ret = deepLock(true);
1613 if (ret == e_success) { 1615 if (ret == e_success) {
1614 /* deep-lock succeed. We are save. 1616 /* deep-lock succeed. We are save.
1615 * (but if it failed, just go on 1617 * (but if it failed, just go on
1616 * lock them normally) 1618 * lock them normally)
1617 */ 1619 */
1618 delete_and_null(oldLockStates); 1620 delete_and_null(oldLockStates);
1619 timer()->start(DocTimer::id_autoLockTimer); 1621 timer()->start(DocTimer::id_autoLockTimer);
1620 printDebug("tempoary unlocking of dta " 1622 printDebug("tempoary unlocking of dta "
1621 "reverted by deep-locking."); 1623 "reverted by deep-locking.");
1622 return true; 1624 return true;
1623 } 1625 }
1624 printDebug("deep-lock failed while reverting! " 1626 printDebug("deep-lock failed while reverting! "
1625 "Falling back to normal-lock."); 1627 "Falling back to normal-lock.");
1626 } 1628 }
1627 if (unlikely(!wasDeepLocked && 1629 if (unlikely(!wasDeepLocked &&
1628 numCategories() != oldLockStates->size())) { 1630 numCategories() != oldLockStates->size())) {
1629 /* DOH! We have modified "dta" while 1631 /* DOH! We have modified "dta" while
1630 * it was unlocked tempoary. DON'T DO THIS! 1632 * it was unlocked tempoary. DON'T DO THIS!
1631 */ 1633 */
1632 BUG(); 1634 BUG();
1633 delete_and_null(oldLockStates); 1635 delete_and_null(oldLockStates);
1634 timer()->start(DocTimer::id_autoLockTimer); 1636 timer()->start(DocTimer::id_autoLockTimer);
1635 return false; 1637 return false;
1636 } 1638 }
1637 vector<PwMCategoryItem>::iterator catBegin = dta.begin(), 1639 vector<PwMCategoryItem>::iterator catBegin = dta.begin(),
1638 catEnd = dta.end(), 1640 catEnd = dta.end(),
1639 catI = catBegin; 1641 catI = catBegin;
1640 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 1642 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
1641 vector< vector<bool> >::iterator oldCatStatI = oldLockStates->begin(); 1643 vector< vector<bool> >::iterator oldCatStatI = oldLockStates->begin();
1642 vector<bool>::iterator oldEntrStatBegin, 1644 vector<bool>::iterator oldEntrStatBegin,
1643 oldEntrStatEnd, 1645 oldEntrStatEnd,
1644 oldEntrStatI; 1646 oldEntrStatI;
1645 while (catI != catEnd) { 1647 while (catI != catEnd) {
1646 entrBegin = catI->d.begin(); 1648 entrBegin = catI->d.begin();
1647 entrEnd = catI->d.end(); 1649 entrEnd = catI->d.end();
1648 entrI = entrBegin; 1650 entrI = entrBegin;
1649 if (likely(!wasDeepLocked)) { 1651 if (likely(!wasDeepLocked)) {
1650 oldEntrStatBegin = oldCatStatI->begin(); 1652 oldEntrStatBegin = oldCatStatI->begin();
1651 oldEntrStatEnd = oldCatStatI->end(); 1653 oldEntrStatEnd = oldCatStatI->end();
1652 oldEntrStatI = oldEntrStatBegin; 1654 oldEntrStatI = oldEntrStatBegin;
1653 if (unlikely(catI->d.size() != oldCatStatI->size())) { 1655 if (unlikely(catI->d.size() != oldCatStatI->size())) {
1654 /* DOH! We have modified "dta" while 1656 /* DOH! We have modified "dta" while
1655 * it was unlocked tempoary. DON'T DO THIS! 1657 * it was unlocked tempoary. DON'T DO THIS!
1656 */ 1658 */
1657 BUG(); 1659 BUG();
1658 delete_and_null(oldLockStates); 1660 delete_and_null(oldLockStates);
1659 timer()->start(DocTimer::id_autoLockTimer); 1661 timer()->start(DocTimer::id_autoLockTimer);
1660 return false; 1662 return false;
1661 } 1663 }
1662 } 1664 }
1663 while (entrI != entrEnd) { 1665 while (entrI != entrEnd) {
1664 if (wasDeepLocked) { 1666 if (wasDeepLocked) {
1665 /* this is an error-fallback if 1667 /* this is an error-fallback if
1666 * deeplock didn't succeed 1668 * deeplock didn't succeed
1667 */ 1669 */
1668 entrI->lockStat = true; 1670 entrI->lockStat = true;
1669 } else { 1671 } else {
1670 entrI->lockStat = *oldEntrStatI; 1672 entrI->lockStat = *oldEntrStatI;
1671 } 1673 }
1672 ++entrI; 1674 ++entrI;
1673 if (likely(!wasDeepLocked)) 1675 if (likely(!wasDeepLocked))
1674 ++oldEntrStatI; 1676 ++oldEntrStatI;
1675 } 1677 }
1676 ++catI; 1678 ++catI;
1677 if (likely(!wasDeepLocked)) 1679 if (likely(!wasDeepLocked))
1678 ++oldCatStatI; 1680 ++oldCatStatI;
1679 } 1681 }
1680 delete_and_null(oldLockStates); 1682 delete_and_null(oldLockStates);
1681 if (unlikely(wasDeepLocked)) { 1683 if (unlikely(wasDeepLocked)) {
1682 /* error fallback... */ 1684 /* error fallback... */
1683 unsetDocStatFlag(DOC_STAT_DEEPLOCKED); 1685 unsetDocStatFlag(DOC_STAT_DEEPLOCKED);
1684 emitDataChanged(this); 1686 emitDataChanged(this);
1685 printDebug("WARNING: unlockAll_tempoary(true) " 1687 printDebug("WARNING: unlockAll_tempoary(true) "
1686 "deeplock fallback!"); 1688 "deeplock fallback!");
1687 } 1689 }
1688 printDebug("tempoary unlocking of dta reverted."); 1690 printDebug("tempoary unlocking of dta reverted.");
1689 } else { 1691 } else {
1690 printDebug("unlockAll_tempoary(true): nothing to do."); 1692 printDebug("unlockAll_tempoary(true): nothing to do.");
1691 } 1693 }
1692 timer()->start(DocTimer::id_autoLockTimer); 1694 timer()->start(DocTimer::id_autoLockTimer);
1693 } else {// unlock all data tempoary 1695 } else {// unlock all data tempoary
1694 if (unlikely(oldLockStates != 0)) { 1696 if (unlikely(oldLockStates != 0)) {
1695 /* DOH! We have already unlocked the data tempoarly. 1697 /* DOH! We have already unlocked the data tempoarly.
1696 * No need to do it twice. ;) 1698 * No need to do it twice. ;)
1697 */ 1699 */
1698 BUG(); 1700 BUG();
1699 return false; 1701 return false;
1700 } 1702 }
1701 wasDeepLocked = false; 1703 wasDeepLocked = false;
1702 bool mustUnlock = false; 1704 bool mustUnlock = false;
1703 if (isDeepLocked()) { 1705 if (isDeepLocked()) {
1704 PwMerror ret; 1706 PwMerror ret;
1705 while (1) { 1707 while (1) {
1706 ret = deepLock(false); 1708 ret = deepLock(false);
1707 if (ret == e_success) { 1709 if (ret == e_success) {
1708 break; 1710 break;
1709 } else if (ret == e_wrongPw) { 1711 } else if (ret == e_wrongPw) {
1710 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1712 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1711 } else { 1713 } else {
1712 printDebug("deep-unlocking failed while " 1714 printDebug("deep-unlocking failed while "
1713 "tempoary unlocking!"); 1715 "tempoary unlocking!");
1714 return false; 1716 return false;
1715 } 1717 }
1716 } 1718 }
1717 wasDeepLocked = true; 1719 wasDeepLocked = true;
1718 mustUnlock = true; 1720 mustUnlock = true;
1719 } else { 1721 } else {
1720 // first check if it's needed to unlock some entries 1722 // first check if it's needed to unlock some entries
1721 vector<PwMCategoryItem>::iterator catBegin = dta.begin(), 1723 vector<PwMCategoryItem>::iterator catBegin = dta.begin(),
1722 catEnd = dta.end(), 1724 catEnd = dta.end(),
1723 catI = catBegin; 1725 catI = catBegin;
1724 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 1726 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
1725 while (catI != catEnd) { 1727 while (catI != catEnd) {
1726 entrBegin = catI->d.begin(); 1728 entrBegin = catI->d.begin();
1727 entrEnd = catI->d.end(); 1729 entrEnd = catI->d.end();
1728 entrI = entrBegin; 1730 entrI = entrBegin;
1729 while (entrI != entrEnd) { 1731 while (entrI != entrEnd) {
1730 if (entrI->lockStat == true) { 1732 if (entrI->lockStat == true) {
1731 mustUnlock = true; 1733 mustUnlock = true;
1732 break; 1734 break;
1733 } 1735 }
1734 ++entrI; 1736 ++entrI;
1735 } 1737 }
1736 if (mustUnlock) 1738 if (mustUnlock)
1737 break; 1739 break;
1738 ++catI; 1740 ++catI;
1739 } 1741 }
1740 } 1742 }
1741 if (!mustUnlock) { 1743 if (!mustUnlock) {
1742 // nothing to do. 1744 // nothing to do.
1743 timer()->stop(DocTimer::id_autoLockTimer); 1745 timer()->stop(DocTimer::id_autoLockTimer);
1744 printDebug("unlockAll_tempoary(): nothing to do."); 1746 printDebug("unlockAll_tempoary(): nothing to do.");
1745 return true; 1747 return true;
1746 } else if (!wasDeepLocked) { 1748 } else if (!wasDeepLocked) {
1747 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW) && 1749 if (!getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW) &&
1748 currentPw != "") { 1750 currentPw != "") {
1749 /* we can't unlock without mpw, so 1751 /* we can't unlock without mpw, so
1750 * we need to ask for it. 1752 * we need to ask for it.
1751 */ 1753 */
1752 QString pw; 1754 QString pw;
1753 while (1) { 1755 while (1) {
1754 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1756 pw = requestMpw(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1755 if (pw == "") { 1757 if (pw == "") {
1756 return false; 1758 return false;
1757 } else if (pw == currentPw) { 1759 } else if (pw == currentPw) {
1758 break; 1760 break;
1759 } 1761 }
1760 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD)); 1762 wrongMpwMsgBox(getDocStatFlag(DOC_STAT_USE_CHIPCARD));
1761 } 1763 }
1762 } 1764 }
1763 } 1765 }
1764 timer()->stop(DocTimer::id_autoLockTimer); 1766 timer()->stop(DocTimer::id_autoLockTimer);
1765 oldLockStates = new vector< vector<bool> >; 1767 oldLockStates = new vector< vector<bool> >;
1766 vector<bool> tmp_vec; 1768 vector<bool> tmp_vec;
1767 vector<PwMCategoryItem>::iterator catBegin = dta.begin(), 1769 vector<PwMCategoryItem>::iterator catBegin = dta.begin(),
1768 catEnd = dta.end(), 1770 catEnd = dta.end(),
1769 catI = catBegin; 1771 catI = catBegin;
1770 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 1772 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
1771 while (catI != catEnd) { 1773 while (catI != catEnd) {
1772 entrBegin = catI->d.begin(); 1774 entrBegin = catI->d.begin();
1773 entrEnd = catI->d.end(); 1775 entrEnd = catI->d.end();
1774 entrI = entrBegin; 1776 entrI = entrBegin;
1775 while (entrI != entrEnd) { 1777 while (entrI != entrEnd) {
1776 if (!wasDeepLocked) { 1778 if (!wasDeepLocked) {
1777 tmp_vec.push_back(entrI->lockStat); 1779 tmp_vec.push_back(entrI->lockStat);
1778 } 1780 }
1779 entrI->lockStat = false; 1781 entrI->lockStat = false;
1780 ++entrI; 1782 ++entrI;
1781 } 1783 }
1782 if (!wasDeepLocked) { 1784 if (!wasDeepLocked) {
1783 oldLockStates->push_back(tmp_vec); 1785 oldLockStates->push_back(tmp_vec);
1784 tmp_vec.clear(); 1786 tmp_vec.clear();
1785 } 1787 }
1786 ++catI; 1788 ++catI;
1787 } 1789 }
1788 printDebug("tempoary unlocked dta."); 1790 printDebug("tempoary unlocked dta.");
1789 } 1791 }
1790 1792
1791 return true; 1793 return true;
1792} 1794}
1793 1795
1794PwMerror PwMDoc::deepLock(bool lock, bool saveToFile) 1796PwMerror PwMDoc::deepLock(bool lock, bool saveToFile)
1795{ 1797{
1796 PwMerror ret; 1798 PwMerror ret;
1797 1799
1798 if (lock) { 1800 if (lock) {
1799 if (isDeepLocked()) 1801 if (isDeepLocked())
1800 return e_lock; 1802 return e_lock;
1801 if (saveToFile) { 1803 if (saveToFile) {
1802 if (isDocEmpty()) 1804 if (isDocEmpty())
1803 return e_docIsEmpty; 1805 return e_docIsEmpty;
1804 ret = saveDoc(conf()->confGlobCompression()); 1806 ret = saveDoc(conf()->confGlobCompression());
1805 if (ret == e_filename) { 1807 if (ret == e_filename) {
1806 /* the doc wasn't saved to a file 1808 /* the doc wasn't saved to a file
1807 * by the user, yet. 1809 * by the user, yet.
1808 */ 1810 */
1809 cantDeeplock_notSavedMsgBox(); 1811 cantDeeplock_notSavedMsgBox();
1810 return e_docNotSaved; 1812 return e_docNotSaved;
1811 } else if (ret != e_success) { 1813 } else if (ret != e_success) {
1812 return e_lock; 1814 return e_lock;
1813 } 1815 }
1814 } 1816 }
1815 timer()->stop(DocTimer::id_autoLockTimer); 1817 timer()->stop(DocTimer::id_autoLockTimer);
1816 clearDoc(); 1818 clearDoc();
1817 PwMDataItem d; 1819 PwMDataItem d;
1818 d.desc = IS_DEEPLOCKED_SHORTMSG.latin1(); 1820 d.desc = IS_DEEPLOCKED_SHORTMSG.latin1();
1819 d.comment = IS_DEEPLOCKED_MSG.latin1(); 1821 d.comment = IS_DEEPLOCKED_MSG.latin1();
1820 d.listViewPos = 0; 1822 d.listViewPos = 0;
1821 addEntry(DEFAULT_CATEGORY, &d, true); 1823 addEntry(DEFAULT_CATEGORY, &d, true);
1822 lockAt(DEFAULT_CATEGORY, 0, true); 1824 lockAt(DEFAULT_CATEGORY, 0, true);
1823 unsetDocStatFlag(DOC_STAT_DISK_DIRTY); 1825 unsetDocStatFlag(DOC_STAT_DISK_DIRTY);
1824 setDocStatFlag(DOC_STAT_DEEPLOCKED); 1826 setDocStatFlag(DOC_STAT_DEEPLOCKED);
1825 } else { 1827 } else {
1826 if (!isDeepLocked()) 1828 if (!isDeepLocked())
1827 return e_lock; 1829 return e_lock;
1828 ret = openDoc(&filename, (conf()->confGlobUnlockOnOpen()) 1830 ret = openDoc(&filename, (conf()->confGlobUnlockOnOpen())
1829 ? 0 : 1); 1831 ? 0 : 1);
1830 if (ret == e_wrongPw) { 1832 if (ret == e_wrongPw) {
1831 return e_wrongPw; 1833 return e_wrongPw;
1832 } else if (ret != e_success) { 1834 } else if (ret != e_success) {
1833 printDebug(string("PwMDoc::deepLock(false): ERR! openDoc() == ") 1835 printDebug(string("PwMDoc::deepLock(false): ERR! openDoc() == ")
1834 + tostr(static_cast<int>(ret))); 1836 + tostr(static_cast<int>(ret)));
1835 return e_lock; 1837 return e_lock;
1836 } 1838 }
1837 unsetDocStatFlag(DOC_STAT_DEEPLOCKED); 1839 unsetDocStatFlag(DOC_STAT_DEEPLOCKED);
1838 timer()->start(DocTimer::id_autoLockTimer); 1840 timer()->start(DocTimer::id_autoLockTimer);
1839 } 1841 }
1840 1842
1841 emitDataChanged(this); 1843 emitDataChanged(this);
1842 return e_success; 1844 return e_success;
1843} 1845}
1844 1846
1845void PwMDoc::_deepUnlock() 1847void PwMDoc::_deepUnlock()
1846{ 1848{
1847 deepLock(false); 1849 deepLock(false);
1848} 1850}
1849 1851
1850void PwMDoc::clearDoc() 1852void PwMDoc::clearDoc()
1851{ 1853{
1852 dta.clear(); 1854 dta.clear();
1853 PwMCategoryItem d; 1855 PwMCategoryItem d;
1854 d.name = DEFAULT_CATEGORY.latin1(); 1856 d.name = DEFAULT_CATEGORY.latin1();
1855 dta.push_back(d); 1857 dta.push_back(d);
1856 currentPw = ""; 1858 currentPw = "";
1857 unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); 1859 unsetDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW);
1858} 1860}
1859 1861
1860void PwMDoc::changeCurrentPw() 1862void PwMDoc::changeCurrentPw()
1861{ 1863{
1862 if (currentPw == "") 1864 if (currentPw == "")
1863 return; // doc hasn't been saved. No mpw available. 1865 return; // doc hasn't been saved. No mpw available.
1864 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD); 1866 bool useChipcard = getDocStatFlag(DOC_STAT_USE_CHIPCARD);
1865 QString pw = requestMpwChange(&currentPw, &useChipcard); 1867 QString pw = requestMpwChange(&currentPw, &useChipcard);
1866 if (pw == "") 1868 if (pw == "")
1867 return; 1869 return;
1868 if (useChipcard) 1870 if (useChipcard)
1869 setDocStatFlag(DOC_STAT_USE_CHIPCARD); 1871 setDocStatFlag(DOC_STAT_USE_CHIPCARD);
1870 else 1872 else
1871 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD); 1873 unsetDocStatFlag(DOC_STAT_USE_CHIPCARD);
1872 setCurrentPw(pw); 1874 setCurrentPw(pw);
1873} 1875}
1874 1876
1875void PwMDoc::setListViewPos(const QString &category, unsigned int index, 1877void PwMDoc::setListViewPos(const QString &category, unsigned int index,
1876 int pos) 1878 int pos)
1877{ 1879{
1878 unsigned int cat = 0; 1880 unsigned int cat = 0;
1879 1881
1880 if (!findCategory(category, &cat)) { 1882 if (!findCategory(category, &cat)) {
1881 BUG(); 1883 BUG();
1882 return; 1884 return;
1883 } 1885 }
1884 setListViewPos(cat, index, pos); 1886 setListViewPos(cat, index, pos);
1885} 1887}
1886 1888
1887void PwMDoc::setListViewPos(unsigned int category, unsigned int index, 1889void PwMDoc::setListViewPos(unsigned int category, unsigned int index,
1888 int pos) 1890 int pos)
1889{ 1891{
1890 dta[category].d[index].listViewPos = pos; 1892 dta[category].d[index].listViewPos = pos;
1891 1893
1892/* FIXME workaround: don't flag dirty, because this function sometimes 1894/* FIXME workaround: don't flag dirty, because this function sometimes
1893 * get's called when it shouldn't. It's because PwMView assumes 1895 * get's called when it shouldn't. It's because PwMView assumes
1894 * the user resorted the UI on behalf of signal layoutChanged(). 1896 * the user resorted the UI on behalf of signal layoutChanged().
1895 * This is somewhat broken and incorrect, but I've no other 1897 * This is somewhat broken and incorrect, but I've no other
1896 * solution for now. 1898 * solution for now.
1897 */ 1899 */
1898 //setDocStatFlag(DOC_STAT_DISK_DIRTY); 1900 //setDocStatFlag(DOC_STAT_DISK_DIRTY);
1899} 1901}
1900 1902
1901int PwMDoc::getListViewPos(const QString &category, unsigned int index) 1903int PwMDoc::getListViewPos(const QString &category, unsigned int index)
1902{ 1904{
1903 unsigned int cat = 0; 1905 unsigned int cat = 0;
1904 1906
1905 if (!findCategory(category, &cat)) { 1907 if (!findCategory(category, &cat)) {
1906 BUG(); 1908 BUG();
1907 return -1; 1909 return -1;
1908 } 1910 }
1909 1911
1910 return dta[cat].d[index].listViewPos; 1912 return dta[cat].d[index].listViewPos;
1911} 1913}
1912 1914
1913void PwMDoc::findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn, 1915void PwMDoc::findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn,
1914 vector<unsigned int> *foundPositions, bool breakAfterFound, 1916 vector<unsigned int> *foundPositions, bool breakAfterFound,
1915 bool caseSensitive, bool exactWordMatch, bool sortByLvp) 1917 bool caseSensitive, bool exactWordMatch, bool sortByLvp)
1916{ 1918{
1917 PWM_ASSERT(foundPositions); 1919 PWM_ASSERT(foundPositions);
1918 PWM_ASSERT(searchIn); 1920 PWM_ASSERT(searchIn);
1919 foundPositions->clear(); 1921 foundPositions->clear();
1920 1922
1921 unsigned int i, entries = numEntries(category); 1923 unsigned int i, entries = numEntries(category);
1922 for (i = 0; i < entries; ++i) { 1924 for (i = 0; i < entries; ++i) {
1923 if (searchIn & SEARCH_IN_DESC) { 1925 if (searchIn & SEARCH_IN_DESC) {
1924 if (!compareString(find.desc, dta[category].d[i].desc, 1926 if (!compareString(find.desc, dta[category].d[i].desc,
1925 caseSensitive, exactWordMatch)) { 1927 caseSensitive, exactWordMatch)) {
1926 continue; 1928 continue;
1927 } 1929 }
1928 } 1930 }
1929 if (searchIn & SEARCH_IN_NAME) { 1931 if (searchIn & SEARCH_IN_NAME) {
1930 if (!compareString(find.name, dta[category].d[i].name, 1932 if (!compareString(find.name, dta[category].d[i].name,
1931 caseSensitive, exactWordMatch)) { 1933 caseSensitive, exactWordMatch)) {
1932 continue; 1934 continue;
1933 } 1935 }
1934 } 1936 }
1935 if (searchIn & SEARCH_IN_PW) { 1937 if (searchIn & SEARCH_IN_PW) {
1936 bool wasLocked = isLocked(category, i); 1938 bool wasLocked = isLocked(category, i);
1937 getDataChangedLock(); 1939 getDataChangedLock();
1938 lockAt(category, i, false); 1940 lockAt(category, i, false);
1939 if (!compareString(find.pw, dta[category].d[i].pw, 1941 if (!compareString(find.pw, dta[category].d[i].pw,
1940 caseSensitive, exactWordMatch)) { 1942 caseSensitive, exactWordMatch)) {
1941 lockAt(category, i, wasLocked); 1943 lockAt(category, i, wasLocked);
1942 putDataChangedLock(); 1944 putDataChangedLock();
1943 continue; 1945 continue;
1944 } 1946 }
1945 lockAt(category, i, wasLocked); 1947 lockAt(category, i, wasLocked);
1946 putDataChangedLock(); 1948 putDataChangedLock();
1947 } 1949 }
1948 if (searchIn & SEARCH_IN_COMMENT) { 1950 if (searchIn & SEARCH_IN_COMMENT) {
1949 if (!compareString(find.comment, dta[category].d[i].comment, 1951 if (!compareString(find.comment, dta[category].d[i].comment,
1950 caseSensitive, exactWordMatch)) { 1952 caseSensitive, exactWordMatch)) {
1951 continue; 1953 continue;
1952 } 1954 }
1953 } 1955 }
1954 if (searchIn & SEARCH_IN_URL) { 1956 if (searchIn & SEARCH_IN_URL) {
1955 if (!compareString(find.url, dta[category].d[i].url, 1957 if (!compareString(find.url, dta[category].d[i].url,
1956 caseSensitive, exactWordMatch)) { 1958 caseSensitive, exactWordMatch)) {
1957 continue; 1959 continue;
1958 } 1960 }
1959 } 1961 }
1960 if (searchIn & SEARCH_IN_LAUNCHER) { 1962 if (searchIn & SEARCH_IN_LAUNCHER) {
1961 if (!compareString(find.launcher, dta[category].d[i].launcher, 1963 if (!compareString(find.launcher, dta[category].d[i].launcher,
1962 caseSensitive, exactWordMatch)) { 1964 caseSensitive, exactWordMatch)) {
1963 continue; 1965 continue;
1964 } 1966 }
1965 } 1967 }
1966 1968
1967 // all selected "searchIn" matched. 1969 // all selected "searchIn" matched.
1968 foundPositions->push_back(i); 1970 foundPositions->push_back(i);
1969 if (breakAfterFound) 1971 if (breakAfterFound)
1970 break; 1972 break;
1971 } 1973 }
1972 1974
1973 if (sortByLvp && foundPositions->size() > 1) { 1975 if (sortByLvp && foundPositions->size() > 1) {
1974 vector< pair<unsigned int /* foundPosition (real doc pos) */, 1976 vector< pair<unsigned int /* foundPosition (real doc pos) */,
1975 unsigned int /* lvp-pos */> > tmp_vec; 1977 unsigned int /* lvp-pos */> > tmp_vec;
1976 1978
1977 unsigned int i, items = foundPositions->size(); 1979 unsigned int i, items = foundPositions->size();
1978 pair<unsigned int, unsigned int> tmp_pair; 1980 pair<unsigned int, unsigned int> tmp_pair;
1979 for (i = 0; i < items; ++i) { 1981 for (i = 0; i < items; ++i) {
1980 tmp_pair.first = (*foundPositions)[i]; 1982 tmp_pair.first = (*foundPositions)[i];
1981 tmp_pair.second = dta[category].d[(*foundPositions)[i]].listViewPos; 1983 tmp_pair.second = dta[category].d[(*foundPositions)[i]].listViewPos;
1982 tmp_vec.push_back(tmp_pair); 1984 tmp_vec.push_back(tmp_pair);
1983 } 1985 }
1984 sort(tmp_vec.begin(), tmp_vec.end(), dta_lvp_greater()); 1986 sort(tmp_vec.begin(), tmp_vec.end(), dta_lvp_greater());
1985 foundPositions->clear(); 1987 foundPositions->clear();
1986 for (i = 0; i < items; ++i) { 1988 for (i = 0; i < items; ++i) {
1987 foundPositions->push_back(tmp_vec[i].first); 1989 foundPositions->push_back(tmp_vec[i].first);
1988 } 1990 }
1989 } 1991 }
1990} 1992}
1991 1993
1992void PwMDoc::findEntry(const QString &category, PwMDataItem find, unsigned int searchIn, 1994void PwMDoc::findEntry(const QString &category, PwMDataItem find, unsigned int searchIn,
1993 vector<unsigned int> *foundPositions, bool breakAfterFound, 1995 vector<unsigned int> *foundPositions, bool breakAfterFound,
1994 bool caseSensitive, bool exactWordMatch, bool sortByLvp) 1996 bool caseSensitive, bool exactWordMatch, bool sortByLvp)
1995{ 1997{
1996 PWM_ASSERT(foundPositions); 1998 PWM_ASSERT(foundPositions);
1997 unsigned int cat = 0; 1999 unsigned int cat = 0;
1998 2000
1999 if (!findCategory(category, &cat)) { 2001 if (!findCategory(category, &cat)) {
2000 foundPositions->clear(); 2002 foundPositions->clear();
2001 return; 2003 return;
2002 } 2004 }
2003 2005
2004 findEntry(cat, find, searchIn, foundPositions, breakAfterFound, 2006 findEntry(cat, find, searchIn, foundPositions, breakAfterFound,
2005 caseSensitive, exactWordMatch, sortByLvp); 2007 caseSensitive, exactWordMatch, sortByLvp);
2006} 2008}
2007 2009
2008bool PwMDoc::compareString(const string &s1, const string &s2, bool caseSensitive, 2010bool PwMDoc::compareString(const string &s1, const string &s2, bool caseSensitive,
2009 bool exactWordMatch) 2011 bool exactWordMatch)
2010{ 2012{
2011 QString _s1(s1.c_str()); 2013 QString _s1(s1.c_str());
2012 QString _s2(s2.c_str()); 2014 QString _s2(s2.c_str());
2013 if (!caseSensitive) { 2015 if (!caseSensitive) {
2014 _s1 = _s1.lower(); 2016 _s1 = _s1.lower();
2015 _s2 = _s2.lower(); 2017 _s2 = _s2.lower();
2016 } 2018 }
2017 if (exactWordMatch ? (_s1 == _s2) : (_s2.find(_s1) != -1)) 2019 if (exactWordMatch ? (_s1 == _s2) : (_s2.find(_s1) != -1))
2018 return true; 2020 return true;
2019 return false; 2021 return false;
2020} 2022}
2021 2023
2022bool PwMDoc::findCategory(const QString &name, unsigned int *index) 2024bool PwMDoc::findCategory(const QString &name, unsigned int *index)
2023{ 2025{
2024 vector<PwMCategoryItem>::iterator i = dta.begin(), 2026 vector<PwMCategoryItem>::iterator i = dta.begin(),
2025 end = dta.end(); 2027 end = dta.end();
2026 while (i != end) { 2028 while (i != end) {
2027 if ((*i).name == name.latin1()) { 2029 if ((*i).name == name.latin1()) {
2028 if (index) { 2030 if (index) {
2029 *index = i - dta.begin(); 2031 *index = i - dta.begin();
2030 } 2032 }
2031 return true; 2033 return true;
2032 } 2034 }
2033 ++i; 2035 ++i;
2034 } 2036 }
2035 return false; 2037 return false;
2036} 2038}
2037 2039
2038bool PwMDoc::renameCategory(const QString &category, const QString &newName) 2040bool PwMDoc::renameCategory(const QString &category, const QString &newName)
2039{ 2041{
2040 unsigned int cat = 0; 2042 unsigned int cat = 0;
2041 2043
2042 if (!findCategory(category, &cat)) 2044 if (!findCategory(category, &cat))
2043 return false; 2045 return false;
2044 2046
2045 return renameCategory(cat, newName); 2047 return renameCategory(cat, newName);
2046} 2048}
2047 2049
2048bool PwMDoc::renameCategory(unsigned int category, const QString &newName, 2050bool PwMDoc::renameCategory(unsigned int category, const QString &newName,
2049 bool dontFlagDirty) 2051 bool dontFlagDirty)
2050{ 2052{
2051 if (category > numCategories() - 1) 2053 if (category > numCategories() - 1)
2052 return false; 2054 return false;
2053 2055
2054 dta[category].name = newName.latin1(); 2056 dta[category].name = newName.latin1();
2055 if (!dontFlagDirty) 2057 if (!dontFlagDirty)
2056 flagDirty(); 2058 flagDirty();
2057 2059
2058 return true; 2060 return true;
2059} 2061}
2060 2062
2061bool PwMDoc::delCategory(const QString &category) 2063bool PwMDoc::delCategory(const QString &category)
2062{ 2064{
2063 unsigned int cat = 0; 2065 unsigned int cat = 0;
2064 2066
2065 if (!findCategory(category, &cat)) 2067 if (!findCategory(category, &cat))
2066 return false; 2068 return false;
2067 2069
2068 return delCategory(cat); 2070 return delCategory(cat);
2069} 2071}
2070 2072
2071bool PwMDoc::delCategory(unsigned int category, bool dontFlagDirty) 2073bool PwMDoc::delCategory(unsigned int category, bool dontFlagDirty)
2072{ 2074{
2073 if (category > numCategories() - 1) 2075 if (category > numCategories() - 1)
2074 return false; 2076 return false;
2075 2077
2076 // We don't delete it, if it is the last existing 2078 // We don't delete it, if it is the last existing
2077 // category! Instead we rename it to "Default". 2079 // category! Instead we rename it to "Default".
2078 if (numCategories() > 1) { 2080 if (numCategories() > 1) {
2079 dta.erase(dta.begin() + category); 2081 dta.erase(dta.begin() + category);
2080 } else { 2082 } else {
2081 renameCategory(category, DEFAULT_CATEGORY, dontFlagDirty); 2083 renameCategory(category, DEFAULT_CATEGORY, dontFlagDirty);
2082 return true; 2084 return true;
2083 } 2085 }
2084 if (!dontFlagDirty) 2086 if (!dontFlagDirty)
2085 flagDirty(); 2087 flagDirty();
2086 2088
2087 return true; 2089 return true;
2088} 2090}
2089 2091
2090void PwMDoc::delAllEmptyCat(bool dontFlagDirty) 2092void PwMDoc::delAllEmptyCat(bool dontFlagDirty)
2091{ 2093{
2092 vector<PwMCategoryItem>::iterator begin = dta.begin(), 2094 vector<PwMCategoryItem>::iterator begin = dta.begin(),
2093 end = dta.end(), 2095 end = dta.end(),
2094 i = begin; 2096 i = begin;
2095 while (i != end) { 2097 while (i != end) {
2096 if (i->d.empty()) { 2098 if (i->d.empty()) {
2097 delCategory(begin - i, dontFlagDirty); 2099 delCategory(begin - i, dontFlagDirty);
2098 } 2100 }
2099 ++i; 2101 ++i;
2100 } 2102 }
2101} 2103}
2102 2104
2103void PwMDoc::getCategoryList(vector<string> *list) 2105void PwMDoc::getCategoryList(vector<string> *list)
2104{ 2106{
2105 PWM_ASSERT(list); 2107 PWM_ASSERT(list);
2106 list->clear(); 2108 list->clear();
2107 vector<PwMCategoryItem>::iterator i = dta.begin(), 2109 vector<PwMCategoryItem>::iterator i = dta.begin(),
2108 end = dta.end(); 2110 end = dta.end();
2109 while (i != end) { 2111 while (i != end) {
2110 list->push_back(i->name); 2112 list->push_back(i->name);
2111 ++i; 2113 ++i;
2112 } 2114 }
2113} 2115}
2114 2116
2115void PwMDoc::getCategoryList(QStringList *list) 2117void PwMDoc::getCategoryList(QStringList *list)
2116{ 2118{
2117 PWM_ASSERT(list); 2119 PWM_ASSERT(list);
2118 list->clear(); 2120 list->clear();
2119 vector<PwMCategoryItem>::iterator i = dta.begin(), 2121 vector<PwMCategoryItem>::iterator i = dta.begin(),
2120 end = dta.end(); 2122 end = dta.end();
2121 while (i != end) { 2123 while (i != end) {
2122#ifndef PWM_EMBEDDED 2124#ifndef PWM_EMBEDDED
2123 list->push_back(i->name.c_str()); 2125 list->push_back(i->name.c_str());
2124#else 2126#else
2125 list->append(i->name.c_str()); 2127 list->append(i->name.c_str());
2126#endif 2128#endif
2127 ++i; 2129 ++i;
2128 } 2130 }
2129} 2131}
2130 2132
2131void PwMDoc::getEntryList(const QString &category, QStringList *list) 2133void PwMDoc::getEntryList(const QString &category, QStringList *list)
2132{ 2134{
2133 PWM_ASSERT(list); 2135 PWM_ASSERT(list);
2134 unsigned int cat = 0; 2136 unsigned int cat = 0;
2135 if (!findCategory(category, &cat)) { 2137 if (!findCategory(category, &cat)) {
2136 list->clear(); 2138 list->clear();
2137 return; 2139 return;
2138 } 2140 }
2139 getEntryList(cat, list); 2141 getEntryList(cat, list);
2140} 2142}
2141 2143
2142void PwMDoc::getEntryList(const QString &category, vector<string> *list) 2144void PwMDoc::getEntryList(const QString &category, vector<string> *list)
2143{ 2145{
2144 PWM_ASSERT(list); 2146 PWM_ASSERT(list);
2145 unsigned int cat = 0; 2147 unsigned int cat = 0;
2146 if (!findCategory(category, &cat)) { 2148 if (!findCategory(category, &cat)) {
2147 list->clear(); 2149 list->clear();
2148 return; 2150 return;
2149 } 2151 }
2150 getEntryList(cat, list); 2152 getEntryList(cat, list);
2151} 2153}
2152 2154
2153void PwMDoc::getEntryList(unsigned int category, vector<string> *list) 2155void PwMDoc::getEntryList(unsigned int category, vector<string> *list)
2154{ 2156{
2155 PWM_ASSERT(list); 2157 PWM_ASSERT(list);
2156 list->clear(); 2158 list->clear();
2157 vector<PwMDataItem>::iterator begin = dta[category].d.begin(), 2159 vector<PwMDataItem>::iterator begin = dta[category].d.begin(),
2158 end = dta[category].d.end(), 2160 end = dta[category].d.end(),
2159 i = begin; 2161 i = begin;
2160 while (i != end) { 2162 while (i != end) {
2161 list->push_back(i->desc); 2163 list->push_back(i->desc);
2162 ++i; 2164 ++i;
2163 } 2165 }
2164} 2166}
2165 2167
2166void PwMDoc::getEntryList(unsigned int category, QStringList *list) 2168void PwMDoc::getEntryList(unsigned int category, QStringList *list)
2167{ 2169{
2168 PWM_ASSERT(list); 2170 PWM_ASSERT(list);
2169 list->clear(); 2171 list->clear();
2170 vector<PwMDataItem>::iterator begin = dta[category].d.begin(), 2172 vector<PwMDataItem>::iterator begin = dta[category].d.begin(),
2171 end = dta[category].d.end(), 2173 end = dta[category].d.end(),
2172 i = begin; 2174 i = begin;
2173 while (i != end) { 2175 while (i != end) {
2174#ifndef PWM_EMBEDDED 2176#ifndef PWM_EMBEDDED
2175 list->push_back(i->desc.c_str()); 2177 list->push_back(i->desc.c_str());
2176#else 2178#else
2177 list->append(i->desc.c_str()); 2179 list->append(i->desc.c_str());
2178#endif 2180#endif
2179 ++i; 2181 ++i;
2180 } 2182 }
2181} 2183}
2182 2184
2183bool PwMDoc::execLauncher(const QString &category, unsigned int entryIndex) 2185bool PwMDoc::execLauncher(const QString &category, unsigned int entryIndex)
2184{ 2186{
2185 unsigned int cat = 0; 2187 unsigned int cat = 0;
2186 2188
2187 if (!findCategory(category, &cat)) 2189 if (!findCategory(category, &cat))
2188 return false; 2190 return false;
2189 2191
2190 return execLauncher(cat, entryIndex); 2192 return execLauncher(cat, entryIndex);
2191} 2193}
2192 2194
2193bool PwMDoc::execLauncher(unsigned int category, unsigned int entryIndex) 2195bool PwMDoc::execLauncher(unsigned int category, unsigned int entryIndex)
2194{ 2196{
2195 if (geteuid() == 0) { 2197 if (geteuid() == 0) {
2196 rootAlertMsgBox(); 2198 rootAlertMsgBox();
2197 return false; 2199 return false;
2198 } 2200 }
2199 QString command(dta[category].d[entryIndex].launcher.c_str()); 2201 QString command(dta[category].d[entryIndex].launcher.c_str());
2200 bool wasLocked = isLocked(category, entryIndex); 2202 bool wasLocked = isLocked(category, entryIndex);
2201 2203
2202 if (command.find("$p") != -1) { 2204 if (command.find("$p") != -1) {
2203 /* the user requested the password to be included 2205 /* the user requested the password to be included
2204 * into the command. We have to ask for the password, 2206 * into the command. We have to ask for the password,
2205 * if it's locked. We do that by unlocking the entry 2207 * if it's locked. We do that by unlocking the entry
2206 */ 2208 */
2207 if (!lockAt(category, entryIndex, false)) 2209 if (!lockAt(category, entryIndex, false))
2208 return false; 2210 return false;
2209 } 2211 }
2210#ifndef PWM_EMBEDDED 2212#ifndef PWM_EMBEDDED
2211 command.replace("$d", dta[category].d[entryIndex].desc.c_str()); 2213 command.replace("$d", dta[category].d[entryIndex].desc.c_str());
2212 command.replace("$n", dta[category].d[entryIndex].name.c_str()); 2214 command.replace("$n", dta[category].d[entryIndex].name.c_str());
2213 command.replace("$p", dta[category].d[entryIndex].pw.c_str()); 2215 command.replace("$p", dta[category].d[entryIndex].pw.c_str());
2214 command.replace("$u", dta[category].d[entryIndex].url.c_str()); 2216 command.replace("$u", dta[category].d[entryIndex].url.c_str());
2215 command.replace("$c", dta[category].d[entryIndex].comment.c_str()); 2217 command.replace("$c", dta[category].d[entryIndex].comment.c_str());
2216#else 2218#else
2217 command.replace(QRegExp("$d"), dta[category].d[entryIndex].desc.c_str()); 2219 command.replace(QRegExp("$d"), dta[category].d[entryIndex].desc.c_str());
2218 command.replace(QRegExp("$n"), dta[category].d[entryIndex].name.c_str()); 2220 command.replace(QRegExp("$n"), dta[category].d[entryIndex].name.c_str());
2219 command.replace(QRegExp("$p"), dta[category].d[entryIndex].pw.c_str()); 2221 command.replace(QRegExp("$p"), dta[category].d[entryIndex].pw.c_str());
2220 command.replace(QRegExp("$u"), dta[category].d[entryIndex].url.c_str()); 2222 command.replace(QRegExp("$u"), dta[category].d[entryIndex].url.c_str());
2221 command.replace(QRegExp("$c"), dta[category].d[entryIndex].comment.c_str()); 2223 command.replace(QRegExp("$c"), dta[category].d[entryIndex].comment.c_str());
2222#endif 2224#endif
2223 command.append(" &"); 2225 command.append(" &");
2224 2226
2225 QString customXterm(conf()->confGlobXtermCommand()); 2227 QString customXterm(conf()->confGlobXtermCommand());
2226 if (!customXterm.isEmpty()) 2228 if (!customXterm.isEmpty())
2227 command = customXterm + " " + command; 2229 command = customXterm + " " + command;
2228 2230
2229 system(command.latin1()); 2231 system(command.latin1());
2230 2232
2231 lockAt(category, entryIndex, wasLocked); 2233 lockAt(category, entryIndex, wasLocked);
2232 return true; 2234 return true;
2233} 2235}
2234 2236
2235bool PwMDoc::goToURL(const QString &category, unsigned int entryIndex) 2237bool PwMDoc::goToURL(const QString &category, unsigned int entryIndex)
2236{ 2238{
2237 unsigned int cat = 0; 2239 unsigned int cat = 0;
2238 2240
2239 if (!findCategory(category, &cat)) 2241 if (!findCategory(category, &cat))
2240 return false; 2242 return false;
2241 2243
2242 return goToURL(cat, entryIndex); 2244 return goToURL(cat, entryIndex);
2243} 2245}
2244 2246
2245bool PwMDoc::goToURL(unsigned int category, unsigned int entryIndex) 2247bool PwMDoc::goToURL(unsigned int category, unsigned int entryIndex)
2246{ 2248{
2247 if (geteuid() == 0) { 2249 if (geteuid() == 0) {
2248 rootAlertMsgBox(); 2250 rootAlertMsgBox();
2249 return false; 2251 return false;
2250 } 2252 }
2251 QString url(dta[category].d[entryIndex].url.c_str()); 2253 QString url(dta[category].d[entryIndex].url.c_str());
2252 if (url.isEmpty()) 2254 if (url.isEmpty())
2253 return false; 2255 return false;
2254 2256
2255 QString customBrowser(conf()->confGlobBrowserCommand()); 2257 QString customBrowser(conf()->confGlobBrowserCommand());
2256 if (!customBrowser.isEmpty()) { 2258 if (!customBrowser.isEmpty()) {
2257 browserProc.clearArguments(); 2259 browserProc.clearArguments();
2258 browserProc << customBrowser << url; 2260 browserProc << customBrowser << url;
2259 if (browserProc.start(KProcess::DontCare)) 2261 if (browserProc.start(KProcess::DontCare))
2260 return true; 2262 return true;
2261 } 2263 }
2262 2264
2263 browserProc.clearArguments(); 2265 browserProc.clearArguments();
2264 browserProc << "konqueror" << url; 2266 browserProc << "konqueror" << url;
2265 if (browserProc.start(KProcess::DontCare)) 2267 if (browserProc.start(KProcess::DontCare))
2266 return true; 2268 return true;
2267 2269
2268 browserProc.clearArguments(); 2270 browserProc.clearArguments();
2269 browserProc << "mozilla" << url; 2271 browserProc << "mozilla" << url;
2270 if (browserProc.start(KProcess::DontCare)) 2272 if (browserProc.start(KProcess::DontCare))
2271 return true; 2273 return true;
2272 2274
2273 browserProc.clearArguments(); 2275 browserProc.clearArguments();
2274 browserProc << "opera" << url; 2276 browserProc << "opera" << url;
2275 if (browserProc.start(KProcess::DontCare)) 2277 if (browserProc.start(KProcess::DontCare))
2276 return true; 2278 return true;
2277 return false; 2279 return false;
2278} 2280}
2279 2281
2280PwMerror PwMDoc::exportToText(const QString *file) 2282PwMerror PwMDoc::exportToText(const QString *file)
2281{ 2283{
2282 PWM_ASSERT(file); 2284 PWM_ASSERT(file);
2283 if (QFile::exists(*file)) { 2285 if (QFile::exists(*file)) {
2284 if (!QFile::remove(*file)) 2286 if (!QFile::remove(*file))
2285 return e_accessFile; 2287 return e_accessFile;
2286 } 2288 }
2287 QFile f(*file); 2289 QFile f(*file);
2288 if (!f.open(IO_ReadWrite)) 2290 if (!f.open(IO_ReadWrite))
2289 return e_openFile; 2291 return e_openFile;
2290 2292
2291 if (!unlockAll_tempoary()) { 2293 if (!unlockAll_tempoary()) {
2292 f.close(); 2294 f.close();
2293 return e_lock; 2295 return e_lock;
2294 } 2296 }
2295 2297
2296 // write header 2298 // write header
2297 string header = i18n("Password table generated by\nPwM v").latin1(); 2299 string header = i18n("Password table generated by\nPwM v").latin1();
2298 header += PACKAGE_VER; 2300 header += PACKAGE_VER;
2299 header += i18n("\non ").latin1(); 2301 header += i18n("\non ").latin1();
2300 QDate currDate = QDate::currentDate(); 2302 QDate currDate = QDate::currentDate();
2301 QTime currTime = QTime::currentTime(); 2303 QTime currTime = QTime::currentTime();
2302 2304
2303#ifndef PWM_EMBEDDED 2305#ifndef PWM_EMBEDDED
2304 header += currDate.toString("ddd MMMM d ").latin1(); 2306 header += currDate.toString("ddd MMMM d ").latin1();
2305 header += currTime.toString("hh:mm:ss ").latin1(); 2307 header += currTime.toString("hh:mm:ss ").latin1();
2306#else 2308#else
2307 QString dfs = KGlobal::locale()->dateFormatShort(); 2309 QString dfs = KGlobal::locale()->dateFormatShort();
2308 bool ampm = KGlobal::locale()->use12Clock(); 2310 bool ampm = KGlobal::locale()->use12Clock();
2309 KGlobal::locale()->setDateFormatShort("%A %B %d"); 2311 KGlobal::locale()->setDateFormatShort("%A %B %d");
2310 KGlobal::locale()->setHore24Format(true); 2312 KGlobal::locale()->setHore24Format(true);
2311 2313
2312 header += KGlobal::locale()->formatDate(currDate, true, KLocale::Userdefined); 2314 header += KGlobal::locale()->formatDate(currDate, true, KLocale::Userdefined);
2313 header += KGlobal::locale()->formatTime(currTime, true); 2315 header += KGlobal::locale()->formatTime(currTime, true);
2314 KGlobal::locale()->setDateFormatShort(dfs); 2316 KGlobal::locale()->setDateFormatShort(dfs);
2315 KGlobal::locale()->setHore24Format(!ampm); 2317 KGlobal::locale()->setHore24Format(!ampm);
2316 2318
2317#endif 2319#endif
2318 header += tostr(currDate.year()); 2320 header += tostr(currDate.year());
2319 header += "\n==============================\n\n"; 2321 header += "\n==============================\n\n";
2320 2322
2321 2323
2322#ifndef PWM_EMBEDDED 2324#ifndef PWM_EMBEDDED
2323 if (f.writeBlock(header.c_str(), header.length()) != (Q_LONG)header.length()) { 2325 if (f.writeBlock(header.c_str(), header.length()) != (Q_LONG)header.length()) {
2324 unlockAll_tempoary(true); 2326 unlockAll_tempoary(true);
2325 f.close(); 2327 f.close();
2326 return e_writeFile; 2328 return e_writeFile;
2327 } 2329 }
2328#else 2330#else
2329 if (f.writeBlock(header.c_str(), header.length()) != (long)header.length()) { 2331 if (f.writeBlock(header.c_str(), header.length()) != (long)header.length()) {
2330 unlockAll_tempoary(true); 2332 unlockAll_tempoary(true);
2331 f.close(); 2333 f.close();
2332 return e_writeFile; 2334 return e_writeFile;
2333 } 2335 }
2334#endif 2336#endif
2335 unsigned int i, numCat = numCategories(); 2337 unsigned int i, numCat = numCategories();
2336 unsigned int j, numEnt; 2338 unsigned int j, numEnt;
2337 string exp; 2339 string exp;
2338 for (i = 0; i < numCat; ++i) { 2340 for (i = 0; i < numCat; ++i) {
2339 numEnt = numEntries(i); 2341 numEnt = numEntries(i);
2340 2342
2341 exp = "\n== Category: "; 2343 exp = "\n== Category: ";
2342 exp += dta[i].name; 2344 exp += dta[i].name;
2343 exp += " ==\n"; 2345 exp += " ==\n";
2344#ifndef PWM_EMBEDDED 2346#ifndef PWM_EMBEDDED
2345 if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) { 2347 if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) {
2346 unlockAll_tempoary(true); 2348 unlockAll_tempoary(true);
2347 f.close(); 2349 f.close();
2348 return e_writeFile; 2350 return e_writeFile;
2349 } 2351 }
2350#else 2352#else
2351 if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) { 2353 if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) {
2352 unlockAll_tempoary(true); 2354 unlockAll_tempoary(true);
2353 f.close(); 2355 f.close();
2354 return e_writeFile; 2356 return e_writeFile;
2355 } 2357 }
2356#endif 2358#endif
2357 for (j = 0; j < numEnt; ++j) { 2359 for (j = 0; j < numEnt; ++j) {
2358 exp = "\n-- "; 2360 exp = "\n-- ";
2359 exp += dta[i].d[j].desc; 2361 exp += dta[i].d[j].desc;
2360 exp += " --\n"; 2362 exp += " --\n";
2361 2363
2362 exp += i18n("Username: ").latin1(); 2364 exp += i18n("Username: ").latin1();
2363 exp += dta[i].d[j].name; 2365 exp += dta[i].d[j].name;
2364 exp += "\n"; 2366 exp += "\n";
2365 2367
2366 exp += i18n("Password: ").latin1(); 2368 exp += i18n("Password: ").latin1();
2367 exp += dta[i].d[j].pw; 2369 exp += dta[i].d[j].pw;
2368 exp += "\n"; 2370 exp += "\n";
2369 2371
2370 exp += i18n("Comment: ").latin1(); 2372 exp += i18n("Comment: ").latin1();
2371 exp += dta[i].d[j].comment; 2373 exp += dta[i].d[j].comment;
2372 exp += "\n"; 2374 exp += "\n";
2373 2375
2374 exp += i18n("URL: ").latin1(); 2376 exp += i18n("URL: ").latin1();
2375 exp += dta[i].d[j].url; 2377 exp += dta[i].d[j].url;
2376 exp += "\n"; 2378 exp += "\n";
2377 2379
2378 exp += i18n("Launcher: ").latin1(); 2380 exp += i18n("Launcher: ").latin1();
2379 exp += dta[i].d[j].launcher; 2381 exp += dta[i].d[j].launcher;
2380 exp += "\n"; 2382 exp += "\n";
2381 2383
2382#ifndef PWM_EMBEDDED 2384#ifndef PWM_EMBEDDED
2383 if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) { 2385 if (f.writeBlock(exp.c_str(), exp.length()) != (Q_LONG)exp.length()) {
2384 unlockAll_tempoary(true); 2386 unlockAll_tempoary(true);
2385 f.close(); 2387 f.close();
2386 return e_writeFile; 2388 return e_writeFile;
2387 } 2389 }
2388#else 2390#else
2389 if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) { 2391 if (f.writeBlock(exp.c_str(), exp.length()) != (long)exp.length()) {
2390 unlockAll_tempoary(true); 2392 unlockAll_tempoary(true);
2391 f.close(); 2393 f.close();
2392 return e_writeFile; 2394 return e_writeFile;
2393 } 2395 }
2394#endif 2396#endif
2395 } 2397 }
2396 } 2398 }
2397 unlockAll_tempoary(true); 2399 unlockAll_tempoary(true);
2398 f.close(); 2400 f.close();
2399 2401
2400 return e_success; 2402 return e_success;
2401} 2403}
2402 2404
2403PwMerror PwMDoc::importFromText(const QString *file, int format) 2405PwMerror PwMDoc::importFromText(const QString *file, int format)
2404{ 2406{
2405 PWM_ASSERT(file); 2407 PWM_ASSERT(file);
2406 if (format == 0) 2408 if (format == 0)
2407 return importText_PwM(file); 2409 return importText_PwM(file);
2408 else if (format == -1) { 2410 else if (format == -1) {
2409 // probe for all formats 2411 // probe for all formats
2410 if (importText_PwM(file) == e_success) 2412 if (importText_PwM(file) == e_success)
2411 return e_success; 2413 return e_success;
2412 dta.clear(); 2414 dta.clear();
2413 emitDataChanged(this); 2415 emitDataChanged(this);
2414 // add next format here... 2416 // add next format here...
2415 return e_fileFormat; 2417 return e_fileFormat;
2416 } 2418 }
2417 return e_invalidArg; 2419 return e_invalidArg;
2418} 2420}
2419 2421
2420PwMerror PwMDoc::importText_PwM(const QString *file) 2422PwMerror PwMDoc::importText_PwM(const QString *file)
2421{ 2423{
2422 PWM_ASSERT(file); 2424 PWM_ASSERT(file);
2423 FILE *f; 2425 FILE *f;
2424 int tmp; 2426 int tmp;
2425 ssize_t ret; 2427 ssize_t ret;
2426 string curCat; 2428 string curCat;
2427 unsigned int entriesRead = 0; 2429 unsigned int entriesRead = 0;
2428 PwMDataItem currItem; 2430 PwMDataItem currItem;
2429 f = fopen(file->latin1(), "r"); 2431 f = fopen(file->latin1(), "r");
2430 if (!f) 2432 if (!f)
2431 return e_openFile; 2433 return e_openFile;
2432 size_t ch_tmp_size = 1024; 2434 size_t ch_tmp_size = 1024;
2433 char *ch_tmp = (char*)malloc(ch_tmp_size); 2435 char *ch_tmp = (char*)malloc(ch_tmp_size);
2434 if (!ch_tmp) { 2436 if (!ch_tmp) {
2435 fclose(f); 2437 fclose(f);
2436 return e_outOfMem; 2438 return e_outOfMem;
2437 } 2439 }
2438 2440
2439 // - check header 2441 // - check header
2440 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) // skip first line. 2442 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) // skip first line.
2441 goto formatError; 2443 goto formatError;
2442 // check version-string and return version in "ch_tmp". 2444 // check version-string and return version in "ch_tmp".
2443 if (fscanf(f, "PwM v%s", ch_tmp) != 1) { 2445 if (fscanf(f, "PwM v%s", ch_tmp) != 1) {
2444 // header not recognized as PwM generated header 2446 // header not recognized as PwM generated header
2445 goto formatError; 2447 goto formatError;
2446 } 2448 }
2447 // set filepointer behind version-string-line previously checked 2449 // set filepointer behind version-string-line previously checked
2448 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2450 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2449 goto formatError; 2451 goto formatError;
2450 // skip next line containing the build-date 2452 // skip next line containing the build-date
2451 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2453 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2452 goto formatError; 2454 goto formatError;
2453 // read header termination line 2455 // read header termination line
2454 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2456 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2455 goto formatError; 2457 goto formatError;
2456 if (strcmp(ch_tmp, "==============================\n")) 2458 if (strcmp(ch_tmp, "==============================\n"))
2457 goto formatError; 2459 goto formatError;
2458 2460
2459 // - read entries 2461 // - read entries
2460 do { 2462 do {
2461 // find beginning of next category 2463 // find beginning of next category
2462 do { 2464 do {
2463 tmp = fgetc(f); 2465 tmp = fgetc(f);
2464 } while (tmp == '\n' && tmp != EOF); 2466 } while (tmp == '\n' && tmp != EOF);
2465 if (tmp == EOF) 2467 if (tmp == EOF)
2466 break; 2468 break;
2467 2469
2468 // decrement filepos by one 2470 // decrement filepos by one
2469 fseek(f, -1, SEEK_CUR); 2471 fseek(f, -1, SEEK_CUR);
2470 // read cat-name 2472 // read cat-name
2471 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2473 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2472 goto formatError; 2474 goto formatError;
2473 // check cat-name format 2475 // check cat-name format
2474 if (memcmp(ch_tmp, "== Category: ", 13) != 0) 2476 if (memcmp(ch_tmp, "== Category: ", 13) != 0)
2475 goto formatError; 2477 goto formatError;
2476 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " ==", 3) != 0) 2478 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " ==", 3) != 0)
2477 goto formatError; 2479 goto formatError;
2478 // copy cat-name 2480 // copy cat-name
2479 curCat.assign(ch_tmp + 13, strlen(ch_tmp) - 1 - 16); 2481 curCat.assign(ch_tmp + 13, strlen(ch_tmp) - 1 - 16);
2480 2482
2481 do { 2483 do {
2482 // find beginning of next entry 2484 // find beginning of next entry
2483 do { 2485 do {
2484 tmp = fgetc(f); 2486 tmp = fgetc(f);
2485 } while (tmp == '\n' && tmp != EOF && tmp != '='); 2487 } while (tmp == '\n' && tmp != EOF && tmp != '=');
2486 if (tmp == EOF) 2488 if (tmp == EOF)
2487 break; 2489 break;
2488 if (tmp == '=') { 2490 if (tmp == '=') {
2489 fseek(f, -1, SEEK_CUR); 2491 fseek(f, -1, SEEK_CUR);
2490 break; 2492 break;
2491 } 2493 }
2492 // decrement filepos by one 2494 // decrement filepos by one
2493 fseek(f, -1, SEEK_CUR); 2495 fseek(f, -1, SEEK_CUR);
2494 // read desc-line 2496 // read desc-line
2495 if (getline(&ch_tmp, &ch_tmp_size, f) == -1) 2497 if (getline(&ch_tmp, &ch_tmp_size, f) == -1)
2496 goto formatError; 2498 goto formatError;
2497 // check desc-line format 2499 // check desc-line format
2498 if (memcmp(ch_tmp, "-- ", 3) != 0) 2500 if (memcmp(ch_tmp, "-- ", 3) != 0)
2499 goto formatError; 2501 goto formatError;
2500 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " --", 3) != 0) 2502 if (memcmp(ch_tmp + (strlen(ch_tmp) - 1 - 3), " --", 3) != 0)
2501 goto formatError; 2503 goto formatError;
2502 // add desc-line 2504 // add desc-line
2503 currItem.desc.assign(ch_tmp + 3, strlen(ch_tmp) - 1 - 6); 2505 currItem.desc.assign(ch_tmp + 3, strlen(ch_tmp) - 1 - 6);
2504 2506
2505 // read username-line 2507 // read username-line
2506 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2508 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2507 goto formatError; 2509 goto formatError;
2508 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.name)) 2510 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.name))
2509 goto formatError; 2511 goto formatError;
2510 2512
2511 // read pw-line 2513 // read pw-line
2512 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2514 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2513 goto formatError; 2515 goto formatError;
2514 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.pw)) 2516 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.pw))
2515 goto formatError; 2517 goto formatError;
2516 2518
2517 // read comment-line 2519 // read comment-line
2518 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2520 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2519 goto formatError; 2521 goto formatError;
2520 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.comment)) 2522 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.comment))
2521 goto formatError; 2523 goto formatError;
2522 2524
2523 // read URL-line 2525 // read URL-line
2524 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2526 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2525 goto formatError; 2527 goto formatError;
2526 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.url)) 2528 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.url))
2527 goto formatError; 2529 goto formatError;
2528 2530
2529 // read launcher-line 2531 // read launcher-line
2530 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1) 2532 if ((ret = getline(&ch_tmp, &ch_tmp_size, f)) == -1)
2531 goto formatError; 2533 goto formatError;
2532 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.launcher)) 2534 if (!textExtractEntry_PwM(ch_tmp, ret, &currItem.launcher))
2533 goto formatError; 2535 goto formatError;
2534 2536
2535 currItem.lockStat = true; 2537 currItem.lockStat = true;
2536 currItem.listViewPos = -1; 2538 currItem.listViewPos = -1;
2537 addEntry(curCat.c_str(), &currItem, true); 2539 addEntry(curCat.c_str(), &currItem, true);
2538 ++entriesRead; 2540 ++entriesRead;
2539 } while (1); 2541 } while (1);
2540 } while (1); 2542 } while (1);
2541 if (!entriesRead) 2543 if (!entriesRead)
2542 goto formatError; 2544 goto formatError;
2543 2545
2544 free(ch_tmp); 2546 free(ch_tmp);
2545 fclose(f); 2547 fclose(f);
2546 flagDirty(); 2548 flagDirty();
2547 return e_success; 2549 return e_success;
2548 2550
2549 formatError: 2551 formatError:
2550 free(ch_tmp); 2552 free(ch_tmp);
2551 fclose(f); 2553 fclose(f);
2552 return e_fileFormat; 2554 return e_fileFormat;
2553} 2555}
2554 2556
2555bool PwMDoc::textExtractEntry_PwM(const char *in, ssize_t in_size, string *out) 2557bool PwMDoc::textExtractEntry_PwM(const char *in, ssize_t in_size, string *out)
2556{ 2558{
2557 PWM_ASSERT(in && out); 2559 PWM_ASSERT(in && out);
2558 ssize_t i = 0, len = in_size - 1; 2560 ssize_t i = 0, len = in_size - 1;
2559 while (i < len) { 2561 while (i < len) {
2560 if (in[i] == ':') 2562 if (in[i] == ':')
2561 break; 2563 break;
2562 ++i; 2564 ++i;
2563 } 2565 }
2564 i += 2; 2566 i += 2;
2565 *out = ""; 2567 *out = "";
2566 out->append(in + i, in_size - i - 1); 2568 out->append(in + i, in_size - i - 1);
2567 return true; 2569 return true;
2568} 2570}
2569 2571
2570PwMerror PwMDoc::exportToGpasman(const QString *file) 2572PwMerror PwMDoc::exportToGpasman(const QString *file)
2571{ 2573{
2572 PWM_ASSERT(file); 2574 PWM_ASSERT(file);
2573 GpasmanFile gp; 2575 GpasmanFile gp;
2574 int ret; 2576 int ret;
2575 2577
2576 if (!unlockAll_tempoary()) 2578 if (!unlockAll_tempoary())
2577 return e_lock; 2579 return e_lock;
2578 2580
2579 QString gpmPassword; 2581 QString gpmPassword;
2580 while (1) { 2582 while (1) {
2581 gpmPassword = requestNewMpw(0); 2583 gpmPassword = requestNewMpw(0);
2582 if (gpmPassword == "") { 2584 if (gpmPassword == "") {
2583 unlockAll_tempoary(true); 2585 unlockAll_tempoary(true);
2584 return e_noPw; 2586 return e_noPw;
2585 } 2587 }
2586 if (gpmPassword.length() < 4) { 2588 if (gpmPassword.length() < 4) {
2587 gpmPwLenErrMsgBox(); 2589 gpmPwLenErrMsgBox();
2588 } else { 2590 } else {
2589 break; 2591 break;
2590 } 2592 }
2591 } 2593 }
2592 2594
2593 ret = gp.save_init(file->latin1(), gpmPassword.latin1()); 2595 ret = gp.save_init(file->latin1(), gpmPassword.latin1());
2594 if (ret != 1) { 2596 if (ret != 1) {
2595 unlockAll_tempoary(true); 2597 unlockAll_tempoary(true);
2596 return e_accessFile; 2598 return e_accessFile;
2597 } 2599 }
2598 2600
2599 char *entry[4]; 2601 char *entry[4];
2600 unsigned int numCat = numCategories(), i; 2602 unsigned int numCat = numCategories(), i;
2601 unsigned int numEntr, j; 2603 unsigned int numEntr, j;
2602 int descLen, nameLen, pwLen, commentLen; 2604 int descLen, nameLen, pwLen, commentLen;
2603 for (i = 0; i < numCat; ++i) { 2605 for (i = 0; i < numCat; ++i) {
2604 numEntr = numEntries(i); 2606 numEntr = numEntries(i);
2605 for (j = 0; j < numEntr; ++j) { 2607 for (j = 0; j < numEntr; ++j) {
2606 descLen = dta[i].d[j].desc.length(); 2608 descLen = dta[i].d[j].desc.length();
2607 nameLen = dta[i].d[j].name.length(); 2609 nameLen = dta[i].d[j].name.length();
2608 pwLen = dta[i].d[j].pw.length(); 2610 pwLen = dta[i].d[j].pw.length();
2609 commentLen = dta[i].d[j].comment.length(); 2611 commentLen = dta[i].d[j].comment.length();
2610 entry[0] = new char[descLen + 1]; 2612 entry[0] = new char[descLen + 1];
2611 entry[1] = new char[nameLen + 1]; 2613 entry[1] = new char[nameLen + 1];
2612 entry[2] = new char[pwLen + 1]; 2614 entry[2] = new char[pwLen + 1];
2613 entry[3] = new char[commentLen + 1]; 2615 entry[3] = new char[commentLen + 1];
2614 strcpy(entry[0], descLen == 0 ? " " : dta[i].d[j].desc.c_str()); 2616 strcpy(entry[0], descLen == 0 ? " " : dta[i].d[j].desc.c_str());
2615 strcpy(entry[1], nameLen == 0 ? " " : dta[i].d[j].name.c_str()); 2617 strcpy(entry[1], nameLen == 0 ? " " : dta[i].d[j].name.c_str());
2616 strcpy(entry[2], pwLen == 0 ? " " : dta[i].d[j].pw.c_str()); 2618 strcpy(entry[2], pwLen == 0 ? " " : dta[i].d[j].pw.c_str());
2617 strcpy(entry[3], commentLen == 0 ? " " : dta[i].d[j].comment.c_str()); 2619 strcpy(entry[3], commentLen == 0 ? " " : dta[i].d[j].comment.c_str());
2618 entry[0][descLen == 0 ? descLen + 1 : descLen] = '\0'; 2620 entry[0][descLen == 0 ? descLen + 1 : descLen] = '\0';
2619 entry[1][nameLen == 0 ? nameLen + 1 : nameLen] = '\0'; 2621 entry[1][nameLen == 0 ? nameLen + 1 : nameLen] = '\0';
2620 entry[2][pwLen == 0 ? pwLen + 1 : pwLen] = '\0'; 2622 entry[2][pwLen == 0 ? pwLen + 1 : pwLen] = '\0';
2621 entry[3][commentLen == 0 ? commentLen + 1 : commentLen] = '\0'; 2623 entry[3][commentLen == 0 ? commentLen + 1 : commentLen] = '\0';
2622 2624
2623 ret = gp.save_entry(entry); 2625 ret = gp.save_entry(entry);
2624 if (ret == -1){ 2626 if (ret == -1){
2625 delete [] entry[0]; 2627 delete [] entry[0];
2626 delete [] entry[1]; 2628 delete [] entry[1];
2627 delete [] entry[2]; 2629 delete [] entry[2];
2628 delete [] entry[3]; 2630 delete [] entry[3];
2629 gp.save_finalize(); 2631 gp.save_finalize();
2630 unlockAll_tempoary(true); 2632 unlockAll_tempoary(true);
2631 return e_writeFile; 2633 return e_writeFile;
2632 } 2634 }
2633 2635
2634 delete [] entry[0]; 2636 delete [] entry[0];
2635 delete [] entry[1]; 2637 delete [] entry[1];
2636 delete [] entry[2]; 2638 delete [] entry[2];
2637 delete [] entry[3]; 2639 delete [] entry[3];
2638 } 2640 }
2639 } 2641 }
2640 unlockAll_tempoary(true); 2642 unlockAll_tempoary(true);
2641 if (gp.save_finalize() == -1) 2643 if (gp.save_finalize() == -1)
2642 return e_writeFile; 2644 return e_writeFile;
2643 2645
2644 return e_success; 2646 return e_success;
2645} 2647}
2646 2648
2647PwMerror PwMDoc::importFromGpasman(const QString *file) 2649PwMerror PwMDoc::importFromGpasman(const QString *file)
2648{ 2650{
2649 PWM_ASSERT(file); 2651 PWM_ASSERT(file);
2650 QString pw = requestMpw(false); 2652 QString pw = requestMpw(false);
2651 if (pw == "") 2653 if (pw == "")
2652 return e_noPw; 2654 return e_noPw;
2653 GpasmanFile gp; 2655 GpasmanFile gp;
2654 int ret, i; 2656 int ret, i;
2655 PwMerror ret2; 2657 PwMerror ret2;
2656 char *entry[4]; 2658 char *entry[4];
2657 PwMDataItem tmpData; 2659 PwMDataItem tmpData;
2658 ret = gp.load_init(file->latin1(), pw.latin1()); 2660 ret = gp.load_init(file->latin1(), pw.latin1());
2659 if (ret != 1) 2661 if (ret != 1)
2660 return e_accessFile; 2662 return e_accessFile;
2661 2663
2662 do { 2664 do {
2663 ret = gp.load_entry(entry); 2665 ret = gp.load_entry(entry);
2664 if(ret != 1) 2666 if(ret != 1)
2665 break; 2667 break;
2666 tmpData.desc = entry[0]; 2668 tmpData.desc = entry[0];
2667 tmpData.name = entry[1]; 2669 tmpData.name = entry[1];
2668 tmpData.pw = entry[2]; 2670 tmpData.pw = entry[2];
2669 tmpData.comment = entry[3]; 2671 tmpData.comment = entry[3];
2670 tmpData.lockStat = true; 2672 tmpData.lockStat = true;
2671 tmpData.listViewPos = -1; 2673 tmpData.listViewPos = -1;
2672 ret2 = addEntry(DEFAULT_CATEGORY, &tmpData, true); 2674 ret2 = addEntry(DEFAULT_CATEGORY, &tmpData, true);
2673 for (i = 0; i < 4; ++i) 2675 for (i = 0; i < 4; ++i)
2674 free(entry[i]); 2676 free(entry[i]);
2675 if (ret2 == e_maxAllowedEntr) { 2677 if (ret2 == e_maxAllowedEntr) {
2676 gp.load_finalize(); 2678 gp.load_finalize();
2677 return e_maxAllowedEntr; 2679 return e_maxAllowedEntr;
2678 } 2680 }
2679 } while (1); 2681 } while (1);
2680 gp.load_finalize(); 2682 gp.load_finalize();
2681 if (isDocEmpty()) 2683 if (isDocEmpty())
2682 return e_wrongPw; // we assume this. 2684 return e_wrongPw; // we assume this.
2683 2685
2684 flagDirty(); 2686 flagDirty();
2685 return e_success; 2687 return e_success;
2686} 2688}
2687 2689
2688void PwMDoc::ensureLvp() 2690void PwMDoc::ensureLvp()
2689{ 2691{
2690 if (isDocEmpty()) 2692 if (isDocEmpty())
2691 return; 2693 return;
2692 2694
2693 vector< vector<PwMDataItem>::iterator > undefined; 2695 vector< vector<PwMDataItem>::iterator > undefined;
2694 vector< vector<PwMDataItem>::iterator >::iterator undefBegin, 2696 vector< vector<PwMDataItem>::iterator >::iterator undefBegin,
2695 undefEnd, 2697 undefEnd,
2696 undefI; 2698 undefI;
2697 vector<PwMCategoryItem>::iterator catBegin = dta.begin(), 2699 vector<PwMCategoryItem>::iterator catBegin = dta.begin(),
2698 catEnd = dta.end(), 2700 catEnd = dta.end(),
2699 catI = catBegin; 2701 catI = catBegin;
2700 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI; 2702 vector<PwMDataItem>::iterator entrBegin, entrEnd, entrI;
2701 int lvpTop, tmpLvp; 2703 int lvpTop, tmpLvp;
2702 2704
2703 while (catI != catEnd) { 2705 while (catI != catEnd) {
2704 lvpTop = -1; 2706 lvpTop = -1;
2705 undefined.clear(); 2707 undefined.clear();
2706 2708
2707 entrBegin = catI->d.begin(); 2709 entrBegin = catI->d.begin();
2708 entrEnd = catI->d.end(); 2710 entrEnd = catI->d.end();
2709 entrI = entrBegin; 2711 entrI = entrBegin;
2710 2712
2711 while (entrI != entrEnd) { 2713 while (entrI != entrEnd) {
2712 tmpLvp = entrI->listViewPos; 2714 tmpLvp = entrI->listViewPos;
2713 if (tmpLvp == -1) 2715 if (tmpLvp == -1)
2714 undefined.push_back(entrI); 2716 undefined.push_back(entrI);
2715 else if (tmpLvp > lvpTop) 2717 else if (tmpLvp > lvpTop)
2716 lvpTop = tmpLvp; 2718 lvpTop = tmpLvp;
2717 ++entrI; 2719 ++entrI;
2718 } 2720 }
2719 undefBegin = undefined.begin(); 2721 undefBegin = undefined.begin();
2720 undefEnd = undefined.end(); 2722 undefEnd = undefined.end();
2721 undefI = undefBegin; 2723 undefI = undefBegin;
2722 while (undefI != undefEnd) { 2724 while (undefI != undefEnd) {
2723 (*undefI)->listViewPos = ++lvpTop; 2725 (*undefI)->listViewPos = ++lvpTop;
2724 ++undefI; 2726 ++undefI;
2725 } 2727 }
2726 ++catI; 2728 ++catI;
2727 } 2729 }
2728} 2730}
2729 2731
2730QString PwMDoc::getTitle() 2732QString PwMDoc::getTitle()
2731{ 2733{
2732 /* NOTE: We have to ensure, that the returned title 2734 /* NOTE: We have to ensure, that the returned title
2733 * is unique and not reused somewhere else while 2735 * is unique and not reused somewhere else while
2734 * this document is valid (open). 2736 * this document is valid (open).
2735 */ 2737 */
2736 QString title(getFilename()); 2738 QString title(getFilename());
2737 if (title.isEmpty()) { 2739 if (title.isEmpty()) {
2738 if (unnamedNum == 0) { 2740 if (unnamedNum == 0) {
2739 unnamedNum = PwMDocList::getNewUnnamedNumber(); 2741 unnamedNum = PwMDocList::getNewUnnamedNumber();
2740 PWM_ASSERT(unnamedNum != 0); 2742 PWM_ASSERT(unnamedNum != 0);
2741 } 2743 }
2742 title = DEFAULT_TITLE; 2744 title = DEFAULT_TITLE;
2743 title += " "; 2745 title += " ";
2744 title += tostr(unnamedNum).c_str(); 2746 title += tostr(unnamedNum).c_str();
2745 } 2747 }
2746 return title; 2748 return title;
2747} 2749}
2748 2750
2749bool PwMDoc::tryDelete() 2751bool PwMDoc::tryDelete()
2750{ 2752{
2751 if (deleted) 2753 if (deleted)
2752 return true; 2754 return true;
2753 int ret; 2755 int ret;
2754 if (isDirty()) { 2756 if (isDirty()) {
2755 ret = dirtyAskSave(getTitle()); 2757 ret = dirtyAskSave(getTitle());
2756 if (ret == 0) { // save to disk 2758 if (ret == 0) { // save to disk
2757 if (!saveDocUi(this)) 2759 if (!saveDocUi(this))
2758 goto out_ignore; 2760 goto out_ignore;
2759 } else if (ret == 1) { // don't save and delete 2761 } else if (ret == 1) { // don't save and delete
2760 goto out_accept; 2762 goto out_accept;
2761 } else { // cancel operation 2763 } else { // cancel operation
2762 goto out_ignore; 2764 goto out_ignore;
2763 } 2765 }
2764 } 2766 }
2765out_accept: 2767out_accept:
2766 deleted = true; 2768 deleted = true;
2767 delete this; 2769 delete this;
2768 return true; 2770 return true;
2769out_ignore: 2771out_ignore:
2770 return false; 2772 return false;
2771} 2773}
2772 2774
2773#ifndef PWM_EMBEDDED 2775#ifndef PWM_EMBEDDED
2774#include "pwmdoc.moc" 2776#include "pwmdoc.moc"
2775#endif 2777#endif
diff --git a/pwmanager/pwmanager/pwmdoc.h b/pwmanager/pwmanager/pwmdoc.h
index 9650d55..193247e 100644
--- a/pwmanager/pwmanager/pwmdoc.h
+++ b/pwmanager/pwmanager/pwmdoc.h
@@ -1,701 +1,701 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 2.0 of pwmanager 14 * This file is originaly based on version 2.0 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
18 **************************************************************************/ 18 **************************************************************************/
19 19
20#ifndef __PWMDOC_H 20#ifndef __PWMDOC_H
21#define __PWMDOC_H 21#define __PWMDOC_H
22 22
23 #define PWM_FILE_VER (static_cast<char>(0x05)) 23 #define PWM_FILE_VER (static_cast<char>(0x05))
24 24
25 #define PWM_HASH_SHA1 (static_cast<char>(0x01)) 25 #define PWM_HASH_SHA1 (static_cast<char>(0x01))
26 #define PWM_HASH_SHA256 (static_cast<char>(0x02)) 26 #define PWM_HASH_SHA256 (static_cast<char>(0x02))
27 #define PWM_HASH_SHA384 (static_cast<char>(0x03)) 27 #define PWM_HASH_SHA384 (static_cast<char>(0x03))
28 #define PWM_HASH_SHA512 (static_cast<char>(0x04)) 28 #define PWM_HASH_SHA512 (static_cast<char>(0x04))
29 #define PWM_HASH_MD5 (static_cast<char>(0x05)) 29 #define PWM_HASH_MD5 (static_cast<char>(0x05))
30 #define PWM_HASH_RMD160 (static_cast<char>(0x06)) 30 #define PWM_HASH_RMD160 (static_cast<char>(0x06))
31 #define PWM_HASH_TIGER (static_cast<char>(0x07)) 31 #define PWM_HASH_TIGER (static_cast<char>(0x07))
32 32
33 #define PWM_CRYPT_BLOWFISH(static_cast<char>(0x01)) 33 #define PWM_CRYPT_BLOWFISH(static_cast<char>(0x01))
34 #define PWM_CRYPT_AES128(static_cast<char>(0x02)) 34 #define PWM_CRYPT_AES128(static_cast<char>(0x02))
35 #define PWM_CRYPT_AES192(static_cast<char>(0x03)) 35 #define PWM_CRYPT_AES192(static_cast<char>(0x03))
36 #define PWM_CRYPT_AES256(static_cast<char>(0x04)) 36 #define PWM_CRYPT_AES256(static_cast<char>(0x04))
37 #define PWM_CRYPT_3DES (static_cast<char>(0x05)) 37 #define PWM_CRYPT_3DES (static_cast<char>(0x05))
38 #define PWM_CRYPT_TWOFISH(static_cast<char>(0x06)) 38 #define PWM_CRYPT_TWOFISH(static_cast<char>(0x06))
39 #define PWM_CRYPT_TWOFISH128(static_cast<char>(0x07)) 39 #define PWM_CRYPT_TWOFISH128(static_cast<char>(0x07))
40 40
41 #define PWM_COMPRESS_NONE(static_cast<char>(0x00)) 41 #define PWM_COMPRESS_NONE(static_cast<char>(0x00))
42 #define PWM_COMPRESS_GZIP(static_cast<char>(0x01)) 42 #define PWM_COMPRESS_GZIP(static_cast<char>(0x01))
43 #define PWM_COMPRESS_BZIP2(static_cast<char>(0x02)) 43 #define PWM_COMPRESS_BZIP2(static_cast<char>(0x02))
44 44
45 #define DEFAULT_MAX_ENTRIES(~(static_cast<unsigned int>(0))) 45 #define DEFAULT_MAX_ENTRIES(~(static_cast<unsigned int>(0)))
46 #define FILE_ID_HEADER "PWM_PASSWORD_FILE" 46 #define FILE_ID_HEADER "PWM_PASSWORD_FILE"
47 47
48 48
49#include "pwmexception.h" 49#include "pwmexception.h"
50#include "pwmdocui.h" 50#include "pwmdocui.h"
51#include "configuration.h"
52 51
53#include <qobject.h> 52#include <qobject.h>
54#include <qtimer.h> 53#include <qtimer.h>
55#include <qdatetime.h> 54#include <qdatetime.h>
56 55
57#include <kprocess.h> 56#include <kprocess.h>
58 57
59#ifndef PWM_EMBEDDED 58#ifndef PWM_EMBEDDED
59#include "configuration.h"
60#else 60#else
61#include <kapplication.h> 61#include <kapplication.h>
62#endif 62#endif
63 63
64#include <string> 64#include <string>
65#include <vector> 65#include <vector>
66#include <utility> 66#include <utility>
67 67
68using std::vector; 68using std::vector;
69using std::string; 69using std::string;
70using std::pair; 70using std::pair;
71 71
72/* used in findEntry() function */ 72/* used in findEntry() function */
73 #define SEARCH_IN_DESC (1) 73 #define SEARCH_IN_DESC (1)
74 #define SEARCH_IN_NAME (1 << 1) 74 #define SEARCH_IN_NAME (1 << 1)
75 #define SEARCH_IN_PW (1 << 2) 75 #define SEARCH_IN_PW (1 << 2)
76 #define SEARCH_IN_COMMENT(1 << 3) 76 #define SEARCH_IN_COMMENT(1 << 3)
77 #define SEARCH_IN_URL (1 << 4) 77 #define SEARCH_IN_URL (1 << 4)
78 #define SEARCH_IN_LAUNCHER(1 << 5) 78 #define SEARCH_IN_LAUNCHER(1 << 5)
79 #define SEARCH_IN_ALL (SEARCH_IN_DESC | SEARCH_IN_NAME| \ 79 #define SEARCH_IN_ALL (SEARCH_IN_DESC | SEARCH_IN_NAME| \
80 SEARCH_IN_PW | SEARCH_IN_COMMENT| \ 80 SEARCH_IN_PW | SEARCH_IN_COMMENT| \
81 SEARCH_IN_URL| SEARCH_IN_LAUNCHER) 81 SEARCH_IN_URL| SEARCH_IN_LAUNCHER)
82 82
83/** document deeplocked. Data is out for lunch to disk */ 83/** document deeplocked. Data is out for lunch to disk */
84 #define DOC_STAT_DEEPLOCKED (1) 84 #define DOC_STAT_DEEPLOCKED (1)
85/** encrypted document on disk is dirty. data has to go to disk. */ 85/** encrypted document on disk is dirty. data has to go to disk. */
86 #define DOC_STAT_DISK_DIRTY (1 << 1) 86 #define DOC_STAT_DISK_DIRTY (1 << 1)
87/** we are using a chipcard to encrypt the data */ 87/** we are using a chipcard to encrypt the data */
88 #define DOC_STAT_USE_CHIPCARD (1 << 2) 88 #define DOC_STAT_USE_CHIPCARD (1 << 2)
89/** use "currentPw" to unlock. (This flag is set/unset by a timer) */ 89/** use "currentPw" to unlock. (This flag is set/unset by a timer) */
90 #define DOC_STAT_UNLOCK_WITHOUT_PW(1 << 3) 90 #define DOC_STAT_UNLOCK_WITHOUT_PW(1 << 3)
91 91
92class PwMDoc; 92class PwMDoc;
93class PwMView; 93class PwMView;
94class QFile; 94class QFile;
95 95
96/* meta data for a PwMDataItem */ 96/* meta data for a PwMDataItem */
97struct PwMMetaData 97struct PwMMetaData
98{ 98{
99 PwMMetaData() 99 PwMMetaData()
100 : updateInt (0) 100 : updateInt (0)
101 { } 101 { }
102 /** creation date of the PwMDataItem to which 102 /** creation date of the PwMDataItem to which
103 * this meta data belongs. 103 * this meta data belongs.
104 */ 104 */
105 QDateTimecreate; 105 QDateTimecreate;
106 /** becomes valid on this date */ 106 /** becomes valid on this date */
107 QDateTimevalid; 107 QDateTimevalid;
108 /** expire date */ 108 /** expire date */
109 QDateTimeexpire; 109 QDateTimeexpire;
110 /** update date (last updated at this date) */ 110 /** update date (last updated at this date) */
111 QDateTimeupdate; 111 QDateTimeupdate;
112 /** update interval (in minutes). Time since the 112 /** update interval (in minutes). Time since the
113 * last update to remind the user to update the item. 113 * last update to remind the user to update the item.
114 * 0 disables. 114 * 0 disables.
115 */ 115 */
116 unsigned long updateInt; 116 unsigned long updateInt;
117 117
118 //US ENH: enhancements of the filestructure 118 //US ENH: enhancements of the filestructure
119 /* each entry gets a unique id assigned */ 119 /* each entry gets a unique id assigned */
120 QString uniqueid; 120 QString uniqueid;
121 121
122 122
123 void clear() 123 void clear()
124 { 124 {
125 create = QDateTime(); 125 create = QDateTime();
126 expire = QDateTime(); 126 expire = QDateTime();
127 update = QDateTime(); 127 update = QDateTime();
128 updateInt = 0; 128 updateInt = 0;
129 uniqueid = KApplication::randomString(8); 129 uniqueid = KApplication::randomString(8);
130 } 130 }
131 inline bool isValid() const 131 inline bool isValid() const
132 { 132 {
133 if (valid.isNull()) 133 if (valid.isNull())
134 return true; 134 return true;
135 return (valid < QDateTime::currentDateTime()); 135 return (valid < QDateTime::currentDateTime());
136 } 136 }
137 inline bool isExpired() const 137 inline bool isExpired() const
138 { 138 {
139 if (expire.isNull()) 139 if (expire.isNull())
140 return false; 140 return false;
141 return (expire < QDateTime::currentDateTime()); 141 return (expire < QDateTime::currentDateTime());
142 } 142 }
143 inline bool isUpdateIntOver() const 143 inline bool isUpdateIntOver() const
144 { 144 {
145 if (updateInt == 0 || 145 if (updateInt == 0 ||
146 update.isNull()) 146 update.isNull())
147 return false; 147 return false;
148 QDateTime d(update); 148 QDateTime d(update);
149 return (d.addSecs(updateInt * 60) < QDateTime::currentDateTime()); 149 return (d.addSecs(updateInt * 60) < QDateTime::currentDateTime());
150 } 150 }
151}; 151};
152 152
153struct PwMDataItem 153struct PwMDataItem
154{ 154{
155 PwMDataItem() 155 PwMDataItem()
156 : lockStat (true) 156 : lockStat (true)
157 , listViewPos (-1) 157 , listViewPos (-1)
158 , binary (false) 158 , binary (false)
159 , rev (0) 159 , rev (0)
160 { } 160 { }
161 161
162 /** password description */ 162 /** password description */
163 stringdesc; 163 stringdesc;
164 /** user-name */ 164 /** user-name */
165 stringname; 165 stringname;
166 /** the password itself */ 166 /** the password itself */
167 stringpw; 167 stringpw;
168 /** some comment */ 168 /** some comment */
169 stringcomment; 169 stringcomment;
170 /** an URL string */ 170 /** an URL string */
171 stringurl; 171 stringurl;
172 /** launcher. Can be executed as a system() command */ 172 /** launcher. Can be executed as a system() command */
173 stringlauncher; 173 stringlauncher;
174 /** locking status. If locked (true), pw is not emitted through getEntry() */ 174 /** locking status. If locked (true), pw is not emitted through getEntry() */
175 boollockStat; 175 boollockStat;
176 /** position of this item in main "list-view" 176 /** position of this item in main "list-view"
177 * If -1, the position is not yet specified and should be appended to the list 177 * If -1, the position is not yet specified and should be appended to the list
178 */ 178 */
179 intlistViewPos; 179 intlistViewPos;
180 /** does this entry contain binary data? */ 180 /** does this entry contain binary data? */
181 bool binary; 181 bool binary;
182 /** meta data for this data item. */ 182 /** meta data for this data item. */
183 PwMMetaData meta; 183 PwMMetaData meta;
184 /** data revision counter. This counter can be used 184 /** data revision counter. This counter can be used
185 * to easily, efficiently determine if this data item 185 * to easily, efficiently determine if this data item
186 * has changed since some time. 186 * has changed since some time.
187 * This counter is incremented on every update. 187 * This counter is incremented on every update.
188 */ 188 */
189 unsigned int rev; 189 unsigned int rev;
190 190
191 void clear(bool clearMeta = true) 191 void clear(bool clearMeta = true)
192 { 192 {
193 /* NOTE: Don't use .clear() here to be 193 /* NOTE: Don't use .clear() here to be
194 * backward compatible with gcc-2 (Debian Woody) 194 * backward compatible with gcc-2 (Debian Woody)
195 */ 195 */
196 desc = ""; 196 desc = "";
197 name = ""; 197 name = "";
198 pw = ""; 198 pw = "";
199 comment = ""; 199 comment = "";
200 url = ""; 200 url = "";
201 launcher = ""; 201 launcher = "";
202 lockStat = true; 202 lockStat = true;
203 listViewPos = -1; 203 listViewPos = -1;
204 binary = false; 204 binary = false;
205 if (clearMeta) 205 if (clearMeta)
206 meta.clear(); 206 meta.clear();
207 } 207 }
208}; 208};
209 209
210struct PwMCategoryItem 210struct PwMCategoryItem
211{ 211{
212 /** all PwMDataItems (all passwords) within this category */ 212 /** all PwMDataItems (all passwords) within this category */
213 vector<PwMDataItem>d; 213 vector<PwMDataItem>d;
214 /** category name/description */ 214 /** category name/description */
215 string name; 215 string name;
216 216
217 void clear() 217 void clear()
218 { 218 {
219 d.clear(); 219 d.clear();
220 name = ""; 220 name = "";
221 } 221 }
222}; 222};
223 223
224/** "Function Object" for sort()ing PwMDataItem::listViewPos */ 224/** "Function Object" for sort()ing PwMDataItem::listViewPos */
225class dta_lvp_greater 225class dta_lvp_greater
226{ 226{
227public: 227public:
228 bool operator() (const pair<unsigned int, unsigned int> &d1, 228 bool operator() (const pair<unsigned int, unsigned int> &d1,
229 const pair<unsigned int, unsigned int> &d2) 229 const pair<unsigned int, unsigned int> &d2)
230 { 230 {
231 return d1.second > d2.second; 231 return d1.second > d2.second;
232 } 232 }
233}; 233};
234 234
235/** list of PwMDoc documents and it's IDs */ 235/** list of PwMDoc documents and it's IDs */
236class PwMDocList 236class PwMDocList
237{ 237{
238public: 238public:
239 struct listItem 239 struct listItem
240 { 240 {
241 /** document filename (known as ID, here) */ 241 /** document filename (known as ID, here) */
242 string docId; 242 string docId;
243 /** pointer to the document class */ 243 /** pointer to the document class */
244 PwMDoc *doc; 244 PwMDoc *doc;
245 }; 245 };
246 246
247 PwMDocList() {} 247 PwMDocList() {}
248 248
249 /** add a new item to the list */ 249 /** add a new item to the list */
250 void add(PwMDoc *doc, const string &id); 250 void add(PwMDoc *doc, const string &id);
251 /** changes the contents of an existing item */ 251 /** changes the contents of an existing item */
252 void edit(PwMDoc *doc, const string &newId); 252 void edit(PwMDoc *doc, const string &newId);
253 /** remove the given item */ 253 /** remove the given item */
254 void del(PwMDoc *doc); 254 void del(PwMDoc *doc);
255 /** get the item at index */ 255 /** get the item at index */
256 listItem getAt(int index) 256 listItem getAt(int index)
257 { return docList[index]; } 257 { return docList[index]; }
258 /** find an entry with this id */ 258 /** find an entry with this id */
259 bool find(const string &id, listItem *ret = 0); 259 bool find(const string &id, listItem *ret = 0);
260 /** returns a copy of the list */ 260 /** returns a copy of the list */
261 const vector<listItem>* getList() const 261 const vector<listItem>* getList() const
262 { return &docList; } 262 { return &docList; }
263 263
264 264
265 /** returns a new unique number to extend the name of 265 /** returns a new unique number to extend the name of
266 * an unnamed document. 266 * an unnamed document.
267 */ 267 */
268 static unsigned int getNewUnnamedNumber() 268 static unsigned int getNewUnnamedNumber()
269 { return unnamedDocCnt++; } 269 { return unnamedDocCnt++; }
270 270
271protected: 271protected:
272 /* Hm, I think we shouldn't really use a "list" here, should we? 272 /* Hm, I think we shouldn't really use a "list" here, should we?
273 * So I decided to actually use a vector. 273 * So I decided to actually use a vector.
274 */ 274 */
275 vector<listItem> docList; 275 vector<listItem> docList;
276 /** This value is used to get a new number for yet unnamed 276 /** This value is used to get a new number for yet unnamed
277 * documents. It is incremented on every request. So it's 277 * documents. It is incremented on every request. So it's
278 * theoretically possible to overflow it, but... :) 278 * theoretically possible to overflow it, but... :)
279 */ 279 */
280 static unsigned int unnamedDocCnt; 280 static unsigned int unnamedDocCnt;
281}; 281};
282 282
283/** implements timers for the document */ 283/** implements timers for the document */
284class DocTimer : public QObject 284class DocTimer : public QObject
285{ 285{
286 Q_OBJECT 286 Q_OBJECT
287public: 287public:
288 enum TimerIDs 288 enum TimerIDs
289 { 289 {
290 id_mpwTimer, 290 id_mpwTimer,
291 id_autoLockTimer, 291 id_autoLockTimer,
292 id_metaCheckTimer 292 id_metaCheckTimer
293 }; 293 };
294 294
295public: 295public:
296 DocTimer(PwMDoc *_doc); 296 DocTimer(PwMDoc *_doc);
297 ~DocTimer(); 297 ~DocTimer();
298 298
299 /** start the timer */ 299 /** start the timer */
300 void start(TimerIDs timer); 300 void start(TimerIDs timer);
301 /** stop the timer */ 301 /** stop the timer */
302 void stop(TimerIDs timer); 302 void stop(TimerIDs timer);
303 /** get the lock for a timer. 303 /** get the lock for a timer.
304 * This lock is a recursive lock. When a lock is 304 * This lock is a recursive lock. When a lock is
305 * held, the timer will be stopped and timeout is 305 * held, the timer will be stopped and timeout is
306 * guaranteed to not happen 306 * guaranteed to not happen
307 */ 307 */
308 void getLock(TimerIDs timer); 308 void getLock(TimerIDs timer);
309 /** put a recursive timer lock */ 309 /** put a recursive timer lock */
310 void putLock(TimerIDs timer); 310 void putLock(TimerIDs timer);
311 311
312protected slots: 312protected slots:
313 /** timeout slot for the mpw timer */ 313 /** timeout slot for the mpw timer */
314 void mpwTimeout(); 314 void mpwTimeout();
315 /** timeout slot for the autoLock timer */ 315 /** timeout slot for the autoLock timer */
316 void autoLockTimeout(); 316 void autoLockTimeout();
317 /** timeout slot for the metaCheck timer */ 317 /** timeout slot for the metaCheck timer */
318 void metaCheckTimeout(); 318 void metaCheckTimeout();
319 319
320protected: 320protected:
321 /** pointer to the document associated with this timer. */ 321 /** pointer to the document associated with this timer. */
322 PwMDoc *doc; 322 PwMDoc *doc;
323 /** timer object for mpw timer */ 323 /** timer object for mpw timer */
324 QTimer *mpwTimer; 324 QTimer *mpwTimer;
325 /** timer object for the autoLock timer */ 325 /** timer object for the autoLock timer */
326 QTimer *autoLockTimer; 326 QTimer *autoLockTimer;
327 /** timer object for the metaCheck timer */ 327 /** timer object for the metaCheck timer */
328 QTimer *metaCheckTimer; 328 QTimer *metaCheckTimer;
329 /** lock counter for the mpw timer */ 329 /** lock counter for the mpw timer */
330 unsigned int mpwLock; 330 unsigned int mpwLock;
331 /** lock counter for the autoLock timer */ 331 /** lock counter for the autoLock timer */
332 unsigned int autoLockLock; 332 unsigned int autoLockLock;
333 /** lock counter for the metaCheck timer */ 333 /** lock counter for the metaCheck timer */
334 unsigned int metaCheckLock; 334 unsigned int metaCheckLock;
335}; 335};
336 336
337/** Document class for PwM */ 337/** Document class for PwM */
338class PwMDoc : public PwMDocUi 338class PwMDoc : public PwMDocUi
339{ 339{
340 Q_OBJECT 340 Q_OBJECT
341 friend class DocTimer; 341 friend class DocTimer;
342 342
343public: 343public:
344 /** construtor */ 344 /** construtor */
345 PwMDoc(QObject* parent = 0, const char *name = 0); 345 PwMDoc(QObject* parent = 0, const char *name = 0);
346 /** destructor */ 346 /** destructor */
347 ~PwMDoc(); 347 ~PwMDoc();
348 348
349 /** returns a pointer to a list of all open documents */ 349 /** returns a pointer to a list of all open documents */
350 static PwMDocList* getOpenDocList() 350 static PwMDocList* getOpenDocList()
351 { return &openDocList; } 351 { return &openDocList; }
352 352
353 /** flag document dirty. dta changed */ 353 /** flag document dirty. dta changed */
354 void flagDirty() 354 void flagDirty()
355 { 355 {
356 setDocStatFlag(DOC_STAT_DISK_DIRTY); 356 setDocStatFlag(DOC_STAT_DISK_DIRTY);
357 emitDataChanged(this); 357 emitDataChanged(this);
358 } 358 }
359 /** modified? */ 359 /** modified? */
360 bool isDirty() 360 bool isDirty()
361 { return getDocStatFlag(DOC_STAT_DISK_DIRTY); } 361 { return getDocStatFlag(DOC_STAT_DISK_DIRTY); }
362 /** save document to disk */ 362 /** save document to disk */
363 PwMerror saveDoc(char compress, const QString *file = 0); 363 PwMerror saveDoc(char compress, const QString *file = 0);
364 /** read document from file. 364 /** read document from file.
365 * "openLocked is must be set to either of these values: 365 * "openLocked is must be set to either of these values:
366 * 0 == open with all entries unlocked 366 * 0 == open with all entries unlocked
367 * 1 == open with all entries locked 367 * 1 == open with all entries locked
368 * 2 == open deep-locked 368 * 2 == open deep-locked
369 */ 369 */
370 PwMerror openDoc(const QString *file, int openLocked); 370 PwMerror openDoc(const QString *file, int openLocked);
371 /** export document to ascii-textfile */ 371 /** export document to ascii-textfile */
372 PwMerror exportToText(const QString *file); 372 PwMerror exportToText(const QString *file);
373 /** export document to gpasman / kpasman file */ 373 /** export document to gpasman / kpasman file */
374 PwMerror exportToGpasman(const QString *file); 374 PwMerror exportToGpasman(const QString *file);
375 /** import document from ascii-textfile */ 375 /** import document from ascii-textfile */
376 PwMerror importFromText(const QString *file, int format = -1); 376 PwMerror importFromText(const QString *file, int format = -1);
377 /** import document from gpasman / kpasman file */ 377 /** import document from gpasman / kpasman file */
378 PwMerror importFromGpasman(const QString *file); 378 PwMerror importFromGpasman(const QString *file);
379 /** add new entry */ 379 /** add new entry */
380 PwMerror addEntry(const QString &category, PwMDataItem *d, 380 PwMerror addEntry(const QString &category, PwMDataItem *d,
381 bool dontFlagDirty = false, bool updateMeta = true); 381 bool dontFlagDirty = false, bool updateMeta = true);
382 /** add new category. This function doesn't flag the document dirty! */ 382 /** add new category. This function doesn't flag the document dirty! */
383 PwMerror addCategory(const QString &category, unsigned int *categoryIndex, 383 PwMerror addCategory(const QString &category, unsigned int *categoryIndex,
384 bool checkIfExist = true); 384 bool checkIfExist = true);
385 /** rename an existing category */ 385 /** rename an existing category */
386 bool renameCategory(const QString &category, const QString &newName); 386 bool renameCategory(const QString &category, const QString &newName);
387 /** rename an existing category */ 387 /** rename an existing category */
388 bool renameCategory(unsigned int category, const QString &newName, 388 bool renameCategory(unsigned int category, const QString &newName,
389 bool dontFlagDirty = false); 389 bool dontFlagDirty = false);
390 /** delete an existing category */ 390 /** delete an existing category */
391 bool delCategory(const QString &category); 391 bool delCategory(const QString &category);
392 /** delete an existing category */ 392 /** delete an existing category */
393 bool delCategory(unsigned int category, bool dontFlagDirty = false); 393 bool delCategory(unsigned int category, bool dontFlagDirty = false);
394 /** returns a list of all category-names */ 394 /** returns a list of all category-names */
395 void getCategoryList(vector<string> *list); 395 void getCategoryList(vector<string> *list);
396 /** returns a list of all category-names */ 396 /** returns a list of all category-names */
397 void getCategoryList(QStringList *list); 397 void getCategoryList(QStringList *list);
398 /** returns a list of all entry-descs in the given category */ 398 /** returns a list of all entry-descs in the given category */
399 void getEntryList(const QString &category, QStringList *list); 399 void getEntryList(const QString &category, QStringList *list);
400 /** returns a list of all entry-descs in the given category */ 400 /** returns a list of all entry-descs in the given category */
401 void getEntryList(const QString &category, vector<string> *list); 401 void getEntryList(const QString &category, vector<string> *list);
402 /** returns a list of all entry-descs in the given category */ 402 /** returns a list of all entry-descs in the given category */
403 void getEntryList(unsigned int category, vector<string> *list); 403 void getEntryList(unsigned int category, vector<string> *list);
404 /** returns a list of all entry-descs in the given category */ 404 /** returns a list of all entry-descs in the given category */
405 void getEntryList(unsigned int category, QStringList *list); 405 void getEntryList(unsigned int category, QStringList *list);
406 /** delete entry */ 406 /** delete entry */
407 bool delEntry(const QString &category, unsigned int index, bool dontFlagDirty = false); 407 bool delEntry(const QString &category, unsigned int index, bool dontFlagDirty = false);
408 /** delete entry */ 408 /** delete entry */
409 bool delEntry(unsigned int category, unsigned int index, bool dontFlagDirty = false); 409 bool delEntry(unsigned int category, unsigned int index, bool dontFlagDirty = false);
410 /** edit entry */ 410 /** edit entry */
411 bool editEntry(const QString &oldCategory, const QString &newCategory, 411 bool editEntry(const QString &oldCategory, const QString &newCategory,
412 unsigned int index, PwMDataItem *d, bool updateMeta = true); 412 unsigned int index, PwMDataItem *d, bool updateMeta = true);
413 /** edit entry */ 413 /** edit entry */
414 bool editEntry(unsigned int oldCategory, const QString &newCategory, 414 bool editEntry(unsigned int oldCategory, const QString &newCategory,
415 unsigned int index, PwMDataItem *d, bool updateMeta = true); 415 unsigned int index, PwMDataItem *d, bool updateMeta = true);
416 /** finds the category with the "name" and return it's index */ 416 /** finds the category with the "name" and return it's index */
417 bool findCategory(const QString &name, unsigned int *index); 417 bool findCategory(const QString &name, unsigned int *index);
418 /** search for an entry "find" and check while searching only for 418 /** search for an entry "find" and check while searching only for
419 * the data-fields specified by "searchIn". To set the "searchIn" 419 * the data-fields specified by "searchIn". To set the "searchIn"
420 * value, we may use one or more of the SEARCH_IN_* defines at 420 * value, we may use one or more of the SEARCH_IN_* defines at
421 * the top of this header-file. It returns the positions of all 421 * the top of this header-file. It returns the positions of all
422 * matched entries in "foundPositions". If "breakAfterFound" is true, 422 * matched entries in "foundPositions". If "breakAfterFound" is true,
423 * the function terminates after the first occurence of the entry 423 * the function terminates after the first occurence of the entry
424 * and doesn't go on searching. So foundPositions->size() is never 424 * and doesn't go on searching. So foundPositions->size() is never
425 * > 1 if breakAfterFound is true. 425 * > 1 if breakAfterFound is true.
426 */ 426 */
427 void findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn, 427 void findEntry(unsigned int category, PwMDataItem find, unsigned int searchIn,
428 vector<unsigned int> *foundPositions, bool breakAfterFound = false, 428 vector<unsigned int> *foundPositions, bool breakAfterFound = false,
429 bool caseSensitive = true, bool exactWordMatch = true, 429 bool caseSensitive = true, bool exactWordMatch = true,
430 bool sortByLvp = false); 430 bool sortByLvp = false);
431 /** see the above funtion. This function allows to set the category by name. */ 431 /** see the above funtion. This function allows to set the category by name. */
432 void findEntry(const QString &category, PwMDataItem find, unsigned int searchIn, 432 void findEntry(const QString &category, PwMDataItem find, unsigned int searchIn,
433 vector<unsigned int> *foundPositions, bool breakAfterFound = false, 433 vector<unsigned int> *foundPositions, bool breakAfterFound = false,
434 bool caseSensitive = true, bool exactWordMatch = true, 434 bool caseSensitive = true, bool exactWordMatch = true,
435 bool sortByLvp = false); 435 bool sortByLvp = false);
436 /** returns number of entries */ 436 /** returns number of entries */
437 unsigned int numEntries(const QString &category); 437 unsigned int numEntries(const QString &category);
438 unsigned int numEntries(unsigned int category) 438 unsigned int numEntries(unsigned int category)
439 { return dta[category].d.size(); } 439 { return dta[category].d.size(); }
440 /** returns number of categories */ 440 /** returns number of categories */
441 unsigned int numCategories() 441 unsigned int numCategories()
442 { return dta.size(); } 442 { return dta.size(); }
443 /** returns the name of the category at "index" */ 443 /** returns the name of the category at "index" */
444 const string* getCategory(unsigned int index) 444 const string* getCategory(unsigned int index)
445 { return (&(dta[index].name)); } 445 { return (&(dta[index].name)); }
446 /** returns the data of item at "index". 446 /** returns the data of item at "index".
447 * It unlocks the entry if it's locked and unlockIfLocked is true. 447 * It unlocks the entry if it's locked and unlockIfLocked is true.
448 * If the entry is locked, but unlockIfLocked is false, it'll not return 448 * If the entry is locked, but unlockIfLocked is false, it'll not return
449 * the pw. 449 * the pw.
450 */ 450 */
451 bool getEntry(const QString &category, unsigned int index, 451 bool getEntry(const QString &category, unsigned int index,
452 PwMDataItem *d, bool unlockIfLocked = false); 452 PwMDataItem *d, bool unlockIfLocked = false);
453 bool getEntry(unsigned int category, unsigned int index, 453 bool getEntry(unsigned int category, unsigned int index,
454 PwMDataItem *d, bool unlockIfLocked = false); 454 PwMDataItem *d, bool unlockIfLocked = false);
455 /** returns the comment-string by looking at the category 455 /** returns the comment-string by looking at the category
456 * and the listViewPos 456 * and the listViewPos
457 */ 457 */
458 PwMerror getCommentByLvp(const QString &category, int listViewPos, 458 PwMerror getCommentByLvp(const QString &category, int listViewPos,
459 string *foundComment); 459 string *foundComment);
460 /** checks if a password is already available. (currentPw) */ 460 /** checks if a password is already available. (currentPw) */
461 bool isPwAvailable() 461 bool isPwAvailable()
462 { return (currentPw != ""); } 462 { return (currentPw != ""); }
463 /** un/lock entry at "index". If needed, ask for password. */ 463 /** un/lock entry at "index". If needed, ask for password. */
464 bool lockAt(const QString &category, unsigned int index, 464 bool lockAt(const QString &category, unsigned int index,
465 bool lock = true); 465 bool lock = true);
466 bool lockAt(unsigned int category, unsigned int index, 466 bool lockAt(unsigned int category, unsigned int index,
467 bool lock = true); 467 bool lock = true);
468 /** returns the lock-status at "index" */ 468 /** returns the lock-status at "index" */
469 bool isLocked(const QString &category, unsigned int index); 469 bool isLocked(const QString &category, unsigned int index);
470 bool isLocked(unsigned int category, unsigned int index) 470 bool isLocked(unsigned int category, unsigned int index)
471 { return dta[category].d[index].lockStat; } 471 { return dta[category].d[index].lockStat; }
472 /** returns the deeplock status */ 472 /** returns the deeplock status */
473 bool isDeepLocked() 473 bool isDeepLocked()
474 { return getDocStatFlag(DOC_STAT_DEEPLOCKED); } 474 { return getDocStatFlag(DOC_STAT_DEEPLOCKED); }
475 /** (un)lock all entries */ 475 /** (un)lock all entries */
476 bool lockAll(bool lock); 476 bool lockAll(bool lock);
477 /** unlocks all entries tempoarly. 477 /** unlocks all entries tempoarly.
478 * 1st NOTE: Be very careful with this function! :) 478 * 1st NOTE: Be very careful with this function! :)
479 * 2nd NOTE: After you have called unlockAll_Tempoary(); , 479 * 2nd NOTE: After you have called unlockAll_Tempoary(); ,
480 * please DON'T forget to call unlockAll_Tempoary(true); 480 * please DON'T forget to call unlockAll_Tempoary(true);
481 * _before_ the user (or someone else) is able to change 481 * _before_ the user (or someone else) is able to change
482 * the document! 482 * the document!
483 * 3rd NOTE: Please DON'T change "dta" while the data is tempoary 483 * 3rd NOTE: Please DON'T change "dta" while the data is tempoary
484 * unlocked! This will cause corruption. 484 * unlocked! This will cause corruption.
485 */ 485 */
486 bool unlockAll_tempoary(bool revert = false); 486 bool unlockAll_tempoary(bool revert = false);
487 /** deep-(un)locks the document. 487 /** deep-(un)locks the document.
488 * deep-locking writes all data to the file, deletes all data 488 * deep-locking writes all data to the file, deletes all data
489 * in memory, but doesn't close the document. 489 * in memory, but doesn't close the document.
490 * deep-locking is only available, if the user previously saved 490 * deep-locking is only available, if the user previously saved
491 * the doc to a file (with a password). 491 * the doc to a file (with a password).
492 * If "saveToFile" is false, it does NOT write the data to the file! 492 * If "saveToFile" is false, it does NOT write the data to the file!
493 */ 493 */
494 PwMerror deepLock(bool lock = true, bool saveToFile = true); 494 PwMerror deepLock(bool lock = true, bool saveToFile = true);
495 /** is unlockable without pw? */ 495 /** is unlockable without pw? */
496 bool unlockWoPw() 496 bool unlockWoPw()
497 { return getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); } 497 { return getDocStatFlag(DOC_STAT_UNLOCK_WITHOUT_PW); }
498 /** get the "currentPassword" */ 498 /** get the "currentPassword" */
499 const QString& getCurrentPw() 499 const QString& getCurrentPw()
500 { return currentPw; } 500 { return currentPw; }
501 /** open a window and request the user to change the mpw */ 501 /** open a window and request the user to change the mpw */
502 void changeCurrentPw(); 502 void changeCurrentPw();
503 /** set the "listViewPos" variable of "dta" */ 503 /** set the "listViewPos" variable of "dta" */
504 void setListViewPos(const QString &category, unsigned int index, 504 void setListViewPos(const QString &category, unsigned int index,
505 int pos); 505 int pos);
506 /** set the "listViewPos" variable of "dta" */ 506 /** set the "listViewPos" variable of "dta" */
507 void setListViewPos(unsigned int category, unsigned int index, 507 void setListViewPos(unsigned int category, unsigned int index,
508 int pos); 508 int pos);
509 /** get the "listViewPos" variable of "dta" */ 509 /** get the "listViewPos" variable of "dta" */
510 int getListViewPos(const QString &category, unsigned int index); 510 int getListViewPos(const QString &category, unsigned int index);
511 /** set the maximum number of entries allowed */ 511 /** set the maximum number of entries allowed */
512 void setMaxNumEntries(unsigned int num = DEFAULT_MAX_ENTRIES) 512 void setMaxNumEntries(unsigned int num = DEFAULT_MAX_ENTRIES)
513 { maxEntries = num; } 513 { maxEntries = num; }
514 /** get the maximum number of entries allowed */ 514 /** get the maximum number of entries allowed */
515 unsigned int getMaxNumEntries() 515 unsigned int getMaxNumEntries()
516 { return maxEntries; } 516 { return maxEntries; }
517 /** ensure all listViewPos of all dta items are set. (are ! -1). 517 /** ensure all listViewPos of all dta items are set. (are ! -1).
518 * If there are some undefined entries, add them to the end of 518 * If there are some undefined entries, add them to the end of
519 * the listViewPos(itions). */ 519 * the listViewPos(itions). */
520 void ensureLvp(); 520 void ensureLvp();
521 /** execute the "launcher" of this entry */ 521 /** execute the "launcher" of this entry */
522 bool execLauncher(const QString &category, unsigned int entryIndex); 522 bool execLauncher(const QString &category, unsigned int entryIndex);
523 /** see above */ 523 /** see above */
524 bool execLauncher(unsigned int category, unsigned int entryIndex); 524 bool execLauncher(unsigned int category, unsigned int entryIndex);
525 /** open a browser with the URL-section of the given entry */ 525 /** open a browser with the URL-section of the given entry */
526 bool goToURL(const QString &category, unsigned int entryIndex); 526 bool goToURL(const QString &category, unsigned int entryIndex);
527 /** see above */ 527 /** see above */
528 bool goToURL(unsigned int category, unsigned int entryIndex); 528 bool goToURL(unsigned int category, unsigned int entryIndex);
529 /** returns true if there is no entry present in the document. 529 /** returns true if there is no entry present in the document.
530 * Note: The "default" Category is present everytime, so 530 * Note: The "default" Category is present everytime, so
531 * it's checked for it's entries. 531 * it's checked for it's entries.
532 */ 532 */
533 bool isDocEmpty() 533 bool isDocEmpty()
534 { 534 {
535 if (numCategories() > 1) 535 if (numCategories() > 1)
536 return false; 536 return false;
537 if (numEntries(0)) 537 if (numEntries(0))
538 return false; 538 return false;
539 return true; 539 return true;
540 } 540 }
541 /** returns the filename of this doc */ 541 /** returns the filename of this doc */
542 const QString& getFilename() 542 const QString& getFilename()
543 { return filename; } 543 { return filename; }
544 /** returns the title of the doc */ 544 /** returns the title of the doc */
545 QString getTitle(); 545 QString getTitle();
546 /** sets the list-view-pointer hold in the doc */ 546 /** sets the list-view-pointer hold in the doc */
547 void setListViewPointer(PwMView *_listView) 547 void setListViewPointer(PwMView *_listView)
548 { listView = _listView; } 548 { listView = _listView; }
549 /** returns the list-view-pointer */ 549 /** returns the list-view-pointer */
550 PwMView * getListViewPointer() 550 PwMView * getListViewPointer()
551 { return listView; } 551 { return listView; }
552 /** try to delete the doc. The user may be asked to save 552 /** try to delete the doc. The user may be asked to save
553 * the data. The user may cancel the whole operation. 553 * the data. The user may cancel the whole operation.
554 * false is returned, then. 554 * false is returned, then.
555 */ 555 */
556 bool tryDelete(); 556 bool tryDelete();
557 /** is the doc deleted? (with tryDelete() ) */ 557 /** is the doc deleted? (with tryDelete() ) */
558 bool isDeleted() 558 bool isDeleted()
559 { return deleted; } 559 { return deleted; }
560 /** returns the document timer object */ 560 /** returns the document timer object */
561 DocTimer * timer() 561 DocTimer * timer()
562 { return _timer; } 562 { return _timer; }
563 /** get a lock on the dataChanged signal. 563 /** get a lock on the dataChanged signal.
564 * If someone is holding a lock, the signal is not emitted. 564 * If someone is holding a lock, the signal is not emitted.
565 */ 565 */
566 void getDataChangedLock() 566 void getDataChangedLock()
567 { ++dataChangedLock; } 567 { ++dataChangedLock; }
568 /** put the dataChanged lock */ 568 /** put the dataChanged lock */
569 void putDataChangedLock() 569 void putDataChangedLock()
570 { --dataChangedLock; } 570 { --dataChangedLock; }
571 /** returns the revision count of the item at cat/index */ 571 /** returns the revision count of the item at cat/index */
572 unsigned int getEntryRevCnt(unsigned int category, unsigned int index) 572 unsigned int getEntryRevCnt(unsigned int category, unsigned int index)
573 { return dta[category].d[index].rev; } 573 { return dta[category].d[index].rev; }
574 /** returns a const pointer to the entries meta */ 574 /** returns a const pointer to the entries meta */
575 const PwMMetaData * getEntryMeta(unsigned int category, unsigned int index) 575 const PwMMetaData * getEntryMeta(unsigned int category, unsigned int index)
576 { return &(dta[category].d[index].meta); } 576 { return &(dta[category].d[index].meta); }
577 /** is the entry at "category" "index" a binary entry? */ 577 /** is the entry at "category" "index" a binary entry? */
578 bool isBinEntry(unsigned int category, unsigned int index) 578 bool isBinEntry(unsigned int category, unsigned int index)
579 { return dta[category].d[index].binary; } 579 { return dta[category].d[index].binary; }
580 580
581public slots: 581public slots:
582 /** wrapper for PwMTray */ 582 /** wrapper for PwMTray */
583 void _deepUnlock(); 583 void _deepUnlock();
584 584
585signals: 585signals:
586 /** the data of the document has changed and must be updated 586 /** the data of the document has changed and must be updated
587 * in all views. 587 * in all views.
588 * NOTE: use emitDataChanged(PwMDoc *document) to emit this signal! 588 * NOTE: use emitDataChanged(PwMDoc *document) to emit this signal!
589 */ 589 */
590 void dataChanged(PwMDoc *document); 590 void dataChanged(PwMDoc *document);
591 /** the document class is going to close. This signal may be 591 /** the document class is going to close. This signal may be
592 * used to nofify all views, that the user closed the document, 592 * used to nofify all views, that the user closed the document,
593 * so the views can go down, too. 593 * so the views can go down, too.
594 */ 594 */
595 void docClosed(PwMDoc *document); 595 void docClosed(PwMDoc *document);
596 /** somebody just opened the document */ 596 /** somebody just opened the document */
597 void docOpened(PwMDoc *document); 597 void docOpened(PwMDoc *document);
598 /** this document object just got created */ 598 /** this document object just got created */
599 void docCreated(PwMDoc *document); 599 void docCreated(PwMDoc *document);
600 600
601public: 601public:
602 /** emit the dataChanged signal after checking for a lock */ 602 /** emit the dataChanged signal after checking for a lock */
603 void emitDataChanged(PwMDoc *document) 603 void emitDataChanged(PwMDoc *document)
604 { 604 {
605 if (!dataChangedLock) 605 if (!dataChangedLock)
606 emit dataChanged(document); 606 emit dataChanged(document);
607 } 607 }
608 608
609protected: 609protected:
610 /** current file for this doc */ 610 /** current file for this doc */
611 QString filename; 611 QString filename;
612 /** holds all data */ 612 /** holds all data */
613 vector<PwMCategoryItem> dta; 613 vector<PwMCategoryItem> dta;
614 /** maximum number of entries */ 614 /** maximum number of entries */
615 unsigned int maxEntries; 615 unsigned int maxEntries;
616 /** currently used password to encrypt data */ 616 /** currently used password to encrypt data */
617 QString currentPw; 617 QString currentPw;
618 /** current global document status flags */ 618 /** current global document status flags */
619 unsigned int curDocStat; 619 unsigned int curDocStat;
620 /** browser process for goToURL() */ 620 /** browser process for goToURL() */
621 KProcess browserProc; 621 KProcess browserProc;
622 /** pointer to the list-view, using this document. 622 /** pointer to the list-view, using this document.
623 * As there can only be one list-view per doc, we 623 * As there can only be one list-view per doc, we
624 * don't need a list here. 624 * don't need a list here.
625 */ 625 */
626 PwMView *listView; 626 PwMView *listView;
627 /** unnamedNum is used to store the "unnamed counter" 627 /** unnamedNum is used to store the "unnamed counter"
628 * for this document, while it's unnamed. If it's 0, 628 * for this document, while it's unnamed. If it's 0,
629 * we have to get a new unique one. 629 * we have to get a new unique one.
630 */ 630 */
631 unsigned int unnamedNum; 631 unsigned int unnamedNum;
632 /** is this doc going to be deleted (executing in destructor context) */ 632 /** is this doc going to be deleted (executing in destructor context) */
633 bool deleted; 633 bool deleted;
634 /** document timer */ 634 /** document timer */
635 DocTimer *_timer; 635 DocTimer *_timer;
636 /** lock counter for the "dataChanged" signal */ 636 /** lock counter for the "dataChanged" signal */
637 unsigned int dataChangedLock; 637 unsigned int dataChangedLock;
638 638
639 /** list of all open documents */ 639 /** list of all open documents */
640 static PwMDocList openDocList; 640 static PwMDocList openDocList;
641 641
642protected: 642protected:
643 /** serialize "dta" and return it in "d". */ 643 /** serialize "dta" and return it in "d". */
644 bool serializeDta(string *d); 644 bool serializeDta(string *d);
645 /** de-serialize "d" and overwrite "dta" */ 645 /** de-serialize "d" and overwrite "dta" */
646 bool deSerializeDta(const string *d, bool entriesLocked); 646 bool deSerializeDta(const string *d, bool entriesLocked);
647 /** write header to file */ 647 /** write header to file */
648 PwMerror writeFileHeader(char keyHash, char dataHash, char crypt, char compress, 648 PwMerror writeFileHeader(char keyHash, char dataHash, char crypt, char compress,
649 QString *pw, QFile *f); 649 QString *pw, QFile *f);
650 /** write data-hash to file */ 650 /** write data-hash to file */
651 PwMerror writeDataHash(char dataHash, string *d, QFile *f); 651 PwMerror writeDataHash(char dataHash, string *d, QFile *f);
652 /** check header. Read header info and verify key-hash and filever. 652 /** check header. Read header info and verify key-hash and filever.
653 * returns length of header in "headerLength" */ 653 * returns length of header in "headerLength" */
654 PwMerror checkHeader(char *cryptAlgo, QString *pw, char *compress, 654 PwMerror checkHeader(char *cryptAlgo, QString *pw, char *compress,
655 unsigned int *headerLength, char *dataHashType, 655 unsigned int *headerLength, char *dataHashType,
656 string *dataHash, QFile *f); 656 string *dataHash, QFile *f);
657 /** check the data-hash */ 657 /** check the data-hash */
658 PwMerror checkDataHash(char dataHashType, const string *dataHash, const string *dataStream); 658 PwMerror checkDataHash(char dataHashType, const string *dataHash, const string *dataStream);
659 /** encrypt data "d" and write to "filename" */ 659 /** encrypt data "d" and write to "filename" */
660 PwMerror encrypt(string *d, const QString *pw, QFile *f, char algo); 660 PwMerror encrypt(string *d, const QString *pw, QFile *f, char algo);
661 /** read data from file beginning at "pos", decrypt and return it */ 661 /** read data from file beginning at "pos", decrypt and return it */
662 PwMerror decrypt(string *d, unsigned int pos, const QString *pw, char algo, QFile *f); 662 PwMerror decrypt(string *d, unsigned int pos, const QString *pw, char algo, QFile *f);
663 /** compress the data */ 663 /** compress the data */
664 bool compressDta(string *d, char algo); 664 bool compressDta(string *d, char algo);
665 /** uncompress the data */ 665 /** uncompress the data */
666 bool decompressDta(string *d, char algo); 666 bool decompressDta(string *d, char algo);
667 /** internal import function for a text-file generated by PwM. 667 /** internal import function for a text-file generated by PwM.
668 * If this is not a valid PwM-exported file, it returns e_fileFormat */ 668 * If this is not a valid PwM-exported file, it returns e_fileFormat */
669 PwMerror importText_PwM(const QString *file); 669 PwMerror importText_PwM(const QString *file);
670 /** PwM-text-import helper function to extract the name/pw/comment out 670 /** PwM-text-import helper function to extract the name/pw/comment out
671 * of one entry-line */ 671 * of one entry-line */
672 bool textExtractEntry_PwM(const char *in, ssize_t in_size, string *out); 672 bool textExtractEntry_PwM(const char *in, ssize_t in_size, string *out);
673 /** compare two strings */ 673 /** compare two strings */
674 bool compareString(const string &s1, const string &s2, bool caseSensitive, 674 bool compareString(const string &s1, const string &s2, bool caseSensitive,
675 bool exactWordMatch); 675 bool exactWordMatch);
676 /** clears all document-data */ 676 /** clears all document-data */
677 void clearDoc(); 677 void clearDoc();
678 /** delete all empty categories */ 678 /** delete all empty categories */
679 void delAllEmptyCat(bool dontFlagDirty); 679 void delAllEmptyCat(bool dontFlagDirty);
680 /** set a document status flag */ 680 /** set a document status flag */
681 void setDocStatFlag(unsigned int statFlag) 681 void setDocStatFlag(unsigned int statFlag)
682 { curDocStat |= statFlag; } 682 { curDocStat |= statFlag; }
683 /** unset a document status flag */ 683 /** unset a document status flag */
684 void unsetDocStatFlag(unsigned int statFlag) 684 void unsetDocStatFlag(unsigned int statFlag)
685 { curDocStat &= ~statFlag; } 685 { curDocStat &= ~statFlag; }
686 /** get a document status flag */ 686 /** get a document status flag */
687 bool getDocStatFlag(unsigned int statFlag) const 687 bool getDocStatFlag(unsigned int statFlag) const
688 { return (curDocStat & statFlag); } 688 { return (curDocStat & statFlag); }
689 /** set the "currentPassword" */ 689 /** set the "currentPassword" */
690 void setCurrentPw(const QString &pw) 690 void setCurrentPw(const QString &pw)
691 { 691 {
692 currentPw = pw; 692 currentPw = pw;
693 setDocStatFlag(DOC_STAT_DISK_DIRTY); 693 setDocStatFlag(DOC_STAT_DISK_DIRTY);
694 } 694 }
695 /** make a backup-copy of the given file */ 695 /** make a backup-copy of the given file */
696 bool backupFile(const QString &filePath); 696 bool backupFile(const QString &filePath);
697 /** copy a file from src to dst */ 697 /** copy a file from src to dst */
698 bool copyFile(const QString &src, const QString &dst); 698 bool copyFile(const QString &src, const QString &dst);
699}; 699};
700 700
701#endif 701#endif
diff --git a/pwmanager/pwmanager/pwmdocui.cpp b/pwmanager/pwmanager/pwmdocui.cpp
index b308b40..3993fa8 100644
--- a/pwmanager/pwmanager/pwmdocui.cpp
+++ b/pwmanager/pwmanager/pwmdocui.cpp
@@ -1,453 +1,454 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 1.0.1 of pwmanager 14 * This file is originaly based on version 1.0.1 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
18 **************************************************************************/ 18 **************************************************************************/
19 19
20#include "pwmdocui.h" 20#include "pwmdocui.h"
21#include "setmasterpwwndimpl.h" 21#include "setmasterpwwndimpl.h"
22#include "getmasterpwwndimpl.h" 22#include "getmasterpwwndimpl.h"
23#include "pwmexception.h" 23#include "pwmexception.h"
24#include "getkeycardwnd.h" 24#include "getkeycardwnd.h"
25#include "pwm.h" 25#include "pwm.h"
26#include "globalstuff.h" 26#include "globalstuff.h"
27#include "spinforsignal.h" 27#include "spinforsignal.h"
28 28
29#include <qlineedit.h> 29#include <qlineedit.h>
30#include <qtabwidget.h> 30#include <qtabwidget.h>
31 31
32#include <kmessagebox.h> 32#include <kmessagebox.h>
33#include <kfiledialog.h> 33#include <kfiledialog.h>
34 34
35#ifndef PWM_EMBEDDED 35#ifndef PWM_EMBEDDED
36#include <kwin.h> 36#include <kwin.h>
37#else 37#else
38#include <qdir.h> 38#include <qdir.h>
39#include "pwmprefs.h"
39#endif 40#endif
40 41
41 42
42#ifdef CONFIG_KEYCARD 43#ifdef CONFIG_KEYCARD
43# include "pwmkeycard.h" 44# include "pwmkeycard.h"
44#endif 45#endif
45 46
46 47
47PwMDocUi::PwMDocUi(QObject *parent, const char *name) 48PwMDocUi::PwMDocUi(QObject *parent, const char *name)
48 : QObject(parent, name) 49 : QObject(parent, name)
49{ 50{
50 currentView = 0; 51 currentView = 0;
51 keyCard = 0; 52 keyCard = 0;
52} 53}
53 54
54PwMDocUi::~PwMDocUi() 55PwMDocUi::~PwMDocUi()
55{ 56{
56} 57}
57 58
58QString PwMDocUi::requestMpw(bool chipcard) 59QString PwMDocUi::requestMpw(bool chipcard)
59{ 60{
60 QString pw; 61 QString pw;
61 62
62 if (chipcard) { 63 if (chipcard) {
63#ifdef CONFIG_KEYCARD 64#ifdef CONFIG_KEYCARD
64 PWM_ASSERT(keyCard); 65 PWM_ASSERT(keyCard);
65 uint32_t id; 66 uint32_t id;
66 string ret; 67 string ret;
67 SpinForSignal *spinner = keyCard->getSpinner(); 68 SpinForSignal *spinner = keyCard->getSpinner();
68 connect(keyCard, SIGNAL(keyAvailable(uint32_t, const string &)), 69 connect(keyCard, SIGNAL(keyAvailable(uint32_t, const string &)),
69 spinner, SLOT(u32_str_slot(uint32_t, const string &))); 70 spinner, SLOT(u32_str_slot(uint32_t, const string &)));
70 keyCard->getKey(); 71 keyCard->getKey();
71 spinner->spin(&id, &ret); 72 spinner->spin(&id, &ret);
72 disconnect(keyCard, SIGNAL(keyAvailable(uint32_t, const string &)), 73 disconnect(keyCard, SIGNAL(keyAvailable(uint32_t, const string &)),
73 spinner, SLOT(u32_str_slot(uint32_t, const string &))); 74 spinner, SLOT(u32_str_slot(uint32_t, const string &)));
74 if (ret == "") 75 if (ret == "")
75 return ""; 76 return "";
76 pw = ret.c_str(); 77 pw = ret.c_str();
77#else // CONFIG_KEYCARD 78#else // CONFIG_KEYCARD
78 no_keycard_support_msg_box(currentView); 79 no_keycard_support_msg_box(currentView);
79#endif // CONFIG_KEYCARD 80#endif // CONFIG_KEYCARD
80 } else { 81 } else {
81 GetMasterPwWndImpl pwWnd; 82 GetMasterPwWndImpl pwWnd;
82#ifndef PWM_EMBEDDED 83#ifndef PWM_EMBEDDED
83 KWin::setState(pwWnd.winId(), NET::StaysOnTop); 84 KWin::setState(pwWnd.winId(), NET::StaysOnTop);
84#endif 85#endif
85 if (pwWnd.exec() != 1) 86 if (pwWnd.exec() != 1)
86 return ""; 87 return "";
87 pw = pwWnd.pwLineEdit->text(); 88 pw = pwWnd.pwLineEdit->text();
88 } 89 }
89 90
90 return pw; 91 return pw;
91} 92}
92 93
93QString PwMDocUi::requestNewMpw(bool *chipcard) 94QString PwMDocUi::requestNewMpw(bool *chipcard)
94{ 95{
95 QString pw; 96 QString pw;
96 SetMasterPwWndImpl pwWnd(currentView); 97 SetMasterPwWndImpl pwWnd(currentView);
97 pwWnd.setPwMKeyCard(keyCard); 98 pwWnd.setPwMKeyCard(keyCard);
98#ifndef PWM_EMBEDDED 99#ifndef PWM_EMBEDDED
99 if (!chipcard) { 100 if (!chipcard) {
100 pwWnd.mainTab->removePage(pwWnd.mainTab->page(1)); 101 pwWnd.mainTab->removePage(pwWnd.mainTab->page(1));
101 } 102 }
102#else 103#else
103 qDebug("PwMDocUi::requestNewMpw must be implemented"); 104 qDebug("PwMDocUi::requestNewMpw must be implemented");
104#endif 105#endif
105 106
106 if (pwWnd.exec() != 1) 107 if (pwWnd.exec() != 1)
107 return ""; 108 return "";
108 pw = pwWnd.getPw(chipcard).c_str(); 109 pw = pwWnd.getPw(chipcard).c_str();
109 110
110 return pw; 111 return pw;
111} 112}
112 113
113QString PwMDocUi::requestMpwChange(const QString *currentPw, bool *chipcard) 114QString PwMDocUi::requestMpwChange(const QString *currentPw, bool *chipcard)
114{ 115{
115 QString pw(requestMpw(*chipcard)); 116 QString pw(requestMpw(*chipcard));
116 if (pw == "") 117 if (pw == "")
117 return ""; 118 return "";
118 if (pw != *currentPw) { 119 if (pw != *currentPw) {
119 wrongMpwMsgBox(*chipcard); 120 wrongMpwMsgBox(*chipcard);
120 return ""; 121 return "";
121 } 122 }
122 123
123 pw = requestNewMpw(chipcard); 124 pw = requestNewMpw(chipcard);
124 if (pw == "") 125 if (pw == "")
125 return ""; 126 return "";
126 return pw; 127 return pw;
127} 128}
128 129
129void PwMDocUi::wrongMpwMsgBox(bool chipcard, QString prefix, QString postfix) 130void PwMDocUi::wrongMpwMsgBox(bool chipcard, QString prefix, QString postfix)
130{ 131{
131 QString msg; 132 QString msg;
132 if (prefix != "") { 133 if (prefix != "") {
133 msg += prefix; 134 msg += prefix;
134 msg += "\n"; 135 msg += "\n";
135 } 136 }
136 137
137 if (chipcard) { 138 if (chipcard) {
138 msg += i18n("Wrong key-card!\n" 139 msg += i18n("Wrong key-card!\n"
139 "Please try again with the " 140 "Please try again with the "
140 "correct key-card."); 141 "correct key-card.");
141 } else { 142 } else {
142 msg += i18n("Wrong master-password!\n" 143 msg += i18n("Wrong master-password!\n"
143 "Please try again."); 144 "Please try again.");
144 } 145 }
145 146
146 if (postfix != "") { 147 if (postfix != "") {
147 msg += "\n"; 148 msg += "\n";
148 msg += postfix; 149 msg += postfix;
149 } 150 }
150 KMessageBox::error(currentView, msg, 151 KMessageBox::error(currentView, msg,
151 (chipcard) ? (i18n("wrong chipcard")) 152 (chipcard) ? (i18n("wrong chipcard"))
152 : (i18n("password error"))); 153 : (i18n("password error")));
153} 154}
154 155
155void PwMDocUi::noMpwMsgBox(bool chipcard, QString prefix, QString postfix) 156void PwMDocUi::noMpwMsgBox(bool chipcard, QString prefix, QString postfix)
156{ 157{
157 QString msg; 158 QString msg;
158 if (prefix != "") { 159 if (prefix != "") {
159 msg += prefix; 160 msg += prefix;
160 msg += "\n"; 161 msg += "\n";
161 } 162 }
162 163
163 if (chipcard) { 164 if (chipcard) {
164 msg += i18n("No key-card found!\n" 165 msg += i18n("No key-card found!\n"
165 "Please insert the " 166 "Please insert the "
166 "correct key-card."); 167 "correct key-card.");
167 } else { 168 } else {
168 msg += i18n("No master-password given!"); 169 msg += i18n("No master-password given!");
169 } 170 }
170 171
171 if (postfix != "") { 172 if (postfix != "") {
172 msg += "\n"; 173 msg += "\n";
173 msg += postfix; 174 msg += postfix;
174 } 175 }
175 KMessageBox::error(currentView, msg, 176 KMessageBox::error(currentView, msg,
176 (chipcard) ? (i18n("no chipcard")) 177 (chipcard) ? (i18n("no chipcard"))
177 : (i18n("password error"))); 178 : (i18n("password error")));
178} 179}
179 180
180void PwMDocUi::rootAlertMsgBox() 181void PwMDocUi::rootAlertMsgBox()
181{ 182{
182 KMessageBox::error(currentView, 183 KMessageBox::error(currentView,
183 i18n("This feature is not available, " 184 i18n("This feature is not available, "
184 "if you execute PwM with \"root\" " 185 "if you execute PwM with \"root\" "
185 "UID 0 privileges, for security reasons!"), 186 "UID 0 privileges, for security reasons!"),
186 i18n("not allowed as root!")); 187 i18n("not allowed as root!"));
187} 188}
188 189
189void PwMDocUi::cantDeeplock_notSavedMsgBox() 190void PwMDocUi::cantDeeplock_notSavedMsgBox()
190{ 191{
191 KMessageBox::error(currentView, 192 KMessageBox::error(currentView,
192 i18n("Can't deep-lock, because the document " 193 i18n("Can't deep-lock, because the document "
193 "hasn't been saved, yet. Please save " 194 "hasn't been saved, yet. Please save "
194 "to a file and try again."), 195 "to a file and try again."),
195 i18n("not saved, yet")); 196 i18n("not saved, yet"));
196} 197}
197 198
198void PwMDocUi::gpmPwLenErrMsgBox() 199void PwMDocUi::gpmPwLenErrMsgBox()
199{ 200{
200 KMessageBox::error(currentView, 201 KMessageBox::error(currentView,
201 i18n("GPasman does not support passwords " 202 i18n("GPasman does not support passwords "
202 "shorter than 4 characters! Please try " 203 "shorter than 4 characters! Please try "
203 "again with a longer password."), 204 "again with a longer password."),
204 i18n("password too short")); 205 i18n("password too short"));
205} 206}
206 207
207int PwMDocUi::dirtyAskSave(const QString &docTitle) 208int PwMDocUi::dirtyAskSave(const QString &docTitle)
208{ 209{
209 int ret; 210 int ret;
210#ifndef PWM_EMBEDDED 211#ifndef PWM_EMBEDDED
211 ret = KMessageBox::questionYesNoCancel(currentView, 212 ret = KMessageBox::questionYesNoCancel(currentView,
212 i18n("The list \"") + 213 i18n("The list \"") +
213 docTitle + 214 docTitle +
214 i18n 215 i18n
215 ("\" has been modified.\n" 216 ("\" has been modified.\n"
216 "Do you want to save it?"), 217 "Do you want to save it?"),
217 i18n("save?")); 218 i18n("save?"));
218 if (ret == KMessageBox::Yes) { 219 if (ret == KMessageBox::Yes) {
219 return 0; 220 return 0;
220 } else if (ret == KMessageBox::No) { 221 } else if (ret == KMessageBox::No) {
221 return 1; 222 return 1;
222 } 223 }
223#else 224#else
224 ret = KMessageBox::warningYesNoCancel(currentView, 225 ret = KMessageBox::warningYesNoCancel(currentView,
225 i18n("The list \"") + 226 i18n("The list \"") +
226 docTitle + 227 docTitle +
227 i18n 228 i18n
228 ("\" has been modified.\n" 229 ("\" has been modified.\n"
229 "Do you want to save it?"), 230 "Do you want to save it?"),
230 i18n("save?")); 231 i18n("save?"));
231 if (ret == KMessageBox::Yes) { 232 if (ret == KMessageBox::Yes) {
232 return 0; 233 return 0;
233 } else if (ret == KMessageBox::No) { 234 } else if (ret == KMessageBox::No) {
234 return 1; 235 return 1;
235 } 236 }
236 237
237#endif 238#endif
238 239
239 // cancel 240 // cancel
240 return -1; 241 return -1;
241} 242}
242 243
243bool PwMDocUi::saveDocUi(PwMDoc *doc) 244bool PwMDocUi::saveDocUi(PwMDoc *doc)
244{ 245{
245 PWM_ASSERT(doc); 246 PWM_ASSERT(doc);
246 doc->timer()->getLock(DocTimer::id_autoLockTimer); 247 doc->timer()->getLock(DocTimer::id_autoLockTimer);
247 if (doc->isDocEmpty()) { 248 if (doc->isDocEmpty()) {
248 KMessageBox::information(currentView, 249 KMessageBox::information(currentView,
249 i18n 250 i18n
250 ("Sorry, there's nothing to save.\n" 251 ("Sorry, there's nothing to save.\n"
251 "Please first add some passwords."), 252 "Please first add some passwords."),
252 i18n("nothing to do")); 253 i18n("nothing to do"));
253 doc->timer()->putLock(DocTimer::id_autoLockTimer); 254 doc->timer()->putLock(DocTimer::id_autoLockTimer);
254 return true; 255 return true;
255 } 256 }
256 PwMerror ret = doc->saveDoc(conf()->confGlobCompression()); 257 PwMerror ret = doc->saveDoc(conf()->confGlobCompression());
257 if (ret == e_filename) { 258 if (ret == e_filename) {
258 doc->timer()->putLock(DocTimer::id_autoLockTimer); 259 doc->timer()->putLock(DocTimer::id_autoLockTimer);
259 return saveAsDocUi(doc); 260 return saveAsDocUi(doc);
260 } else if (ret == e_weakPw) { 261 } else if (ret == e_weakPw) {
261 KMessageBox::error(currentView, 262 KMessageBox::error(currentView,
262 i18n("Error: This is a weak password.\n" 263 i18n("Error: This is a weak password.\n"
263 "Please select another password."), 264 "Please select another password."),
264 i18n("weak password")); 265 i18n("weak password"));
265 doc->timer()->putLock(DocTimer::id_autoLockTimer); 266 doc->timer()->putLock(DocTimer::id_autoLockTimer);
266 return false; 267 return false;
267 } else if (ret == e_fileBackup) { 268 } else if (ret == e_fileBackup) {
268 KMessageBox::error(currentView, 269 KMessageBox::error(currentView,
269 i18n("Error: Couldn't make backup-file!"), 270 i18n("Error: Couldn't make backup-file!"),
270 i18n("backup failed")); 271 i18n("backup failed"));
271 doc->timer()->putLock(DocTimer::id_autoLockTimer); 272 doc->timer()->putLock(DocTimer::id_autoLockTimer);
272 return false; 273 return false;
273 } else if (ret != e_success) { 274 } else if (ret != e_success) {
274 KMessageBox::error(currentView, 275 KMessageBox::error(currentView,
275 i18n("Error: Couldn't write to file.\n" 276 i18n("Error: Couldn't write to file.\n"
276 "Please check if you have permission to " 277 "Please check if you have permission to "
277 "write to the file in that directory."), 278 "write to the file in that directory."),
278 i18n("error while writing")); 279 i18n("error while writing"));
279 doc->timer()->putLock(DocTimer::id_autoLockTimer); 280 doc->timer()->putLock(DocTimer::id_autoLockTimer);
280 return false; 281 return false;
281 } 282 }
282 doc->timer()->putLock(DocTimer::id_autoLockTimer); 283 doc->timer()->putLock(DocTimer::id_autoLockTimer);
283 return true; 284 return true;
284} 285}
285 286
286bool PwMDocUi::saveAsDocUi(PwMDoc *doc) 287bool PwMDocUi::saveAsDocUi(PwMDoc *doc)
287{ 288{
288 PWM_ASSERT(doc); 289 PWM_ASSERT(doc);
289 doc->timer()->getLock(DocTimer::id_autoLockTimer); 290 doc->timer()->getLock(DocTimer::id_autoLockTimer);
290 if (doc->isDocEmpty()) { 291 if (doc->isDocEmpty()) {
291 KMessageBox::information(currentView, 292 KMessageBox::information(currentView,
292 i18n 293 i18n
293 ("Sorry, there's nothing to save.\n" 294 ("Sorry, there's nothing to save.\n"
294 "Please first add some passwords."), 295 "Please first add some passwords."),
295 i18n("nothing to do")); 296 i18n("nothing to do"));
296 doc->timer()->putLock(DocTimer::id_autoLockTimer); 297 doc->timer()->putLock(DocTimer::id_autoLockTimer);
297 return true; 298 return true;
298 } 299 }
299#ifndef PWM_EMBEDDED 300#ifndef PWM_EMBEDDED
300 QString fn(KFileDialog::getSaveFileName(QString::null, 301 QString fn(KFileDialog::getSaveFileName(QString::null,
301 i18n("*.pwm|PwManager Password file"), 302 i18n("*.pwm|PwManager Password file"),
302 currentView)); 303 currentView));
303#else 304#else
304 QString fn = locateLocal( "data", KGlobal::getAppName() + "/*.pwm" ); 305 QString fn = locateLocal( "data", KGlobal::getAppName() + "/*.pwm" );
305 fn = KFileDialog::getSaveFileName(fn, 306 fn = KFileDialog::getSaveFileName(fn,
306 i18n("password filename(*.pwm)"), 307 i18n("password filename(*.pwm)"),
307 currentView); 308 currentView);
308 309
309#endif 310#endif
310 if (fn == "") { 311 if (fn == "") {
311 doc->timer()->putLock(DocTimer::id_autoLockTimer); 312 doc->timer()->putLock(DocTimer::id_autoLockTimer);
312 return false; 313 return false;
313 } 314 }
314 if (fn.right(4) != ".pwm") 315 if (fn.right(4) != ".pwm")
315 fn += ".pwm"; 316 fn += ".pwm";
316 317
317 PwMerror ret = doc->saveDoc(conf()->confGlobCompression(), &fn); 318 PwMerror ret = doc->saveDoc(conf()->confGlobCompression(), &fn);
318 if (ret != e_success) { 319 if (ret != e_success) {
319 KMessageBox::error(currentView, 320 KMessageBox::error(currentView,
320 i18n("Error: Couldn't write to file.\n" 321 i18n("Error: Couldn't write to file.\n"
321 "Please check if you have permission to " 322 "Please check if you have permission to "
322 "write to the file in that directory."), 323 "write to the file in that directory."),
323 i18n("error while writing")); 324 i18n("error while writing"));
324 doc->timer()->putLock(DocTimer::id_autoLockTimer); 325 doc->timer()->putLock(DocTimer::id_autoLockTimer);
325 return false; 326 return false;
326 } 327 }
327 doc->timer()->putLock(DocTimer::id_autoLockTimer); 328 doc->timer()->putLock(DocTimer::id_autoLockTimer);
328 return true; 329 return true;
329} 330}
330 331
331bool PwMDocUi::openDocUi(PwMDoc *doc, 332bool PwMDocUi::openDocUi(PwMDoc *doc,
332 QString filename, 333 QString filename,
333 bool openDeepLocked) 334 bool openDeepLocked)
334{ 335{
335 if (filename.isEmpty()) 336 if (filename.isEmpty())
336 { 337 {
337#ifndef PWM_EMBEDDED 338#ifndef PWM_EMBEDDED
338 filename = KFileDialog::getOpenFileName(QString::null, 339 filename = KFileDialog::getOpenFileName(QString::null,
339 i18n("*.pwm|PwManager Password file\n" 340 i18n("*.pwm|PwManager Password file\n"
340 "*|All files"), getCurrentView()); 341 "*|All files"), getCurrentView());
341#else 342#else
342 filename = locateLocal( "data", KGlobal::getAppName() + "/*.pwm"); 343 filename = locateLocal( "data", KGlobal::getAppName() + "/*.pwm");
343 filename = KFileDialog::getOpenFileName(filename, 344 filename = KFileDialog::getOpenFileName(filename,
344 i18n("password filename(*.pwm)"), getCurrentView()); 345 i18n("password filename(*.pwm)"), getCurrentView());
345#endif 346#endif
346 } 347 }
347 if (filename.isEmpty()) 348 if (filename.isEmpty())
348 goto cancelOpen; 349 goto cancelOpen;
349 PwMerror ret; 350 PwMerror ret;
350 while (true) { 351 while (true) {
351 int lockStat = -1; 352 int lockStat = -1;
352 if (openDeepLocked) { 353 if (openDeepLocked) {
353 lockStat = 2; 354 lockStat = 2;
354 } else { 355 } else {
355 if (conf()->confGlobUnlockOnOpen()) { 356 if (conf()->confGlobUnlockOnOpen()) {
356 lockStat = 0; 357 lockStat = 0;
357 } else { 358 } else {
358 lockStat = 1; 359 lockStat = 1;
359 } 360 }
360 } 361 }
361 ret = doc->openDoc(&filename, lockStat); 362 ret = doc->openDoc(&filename, lockStat);
362 if (ret != e_success) { 363 if (ret != e_success) {
363 if (ret == e_readFile || ret == e_openFile) { 364 if (ret == e_readFile || ret == e_openFile) {
364 KMessageBox::error(getCurrentView(), 365 KMessageBox::error(getCurrentView(),
365 i18n("Could not read file!") 366 i18n("Could not read file!")
366 + "\n" 367 + "\n"
367 + filename, 368 + filename,
368 i18n("file error")); 369 i18n("file error"));
369 goto cancelOpen; 370 goto cancelOpen;
370 } 371 }
371 if (ret == e_alreadyOpen) { 372 if (ret == e_alreadyOpen) {
372 KMessageBox::error(getCurrentView(), 373 KMessageBox::error(getCurrentView(),
373 i18n("This file is already open."), 374 i18n("This file is already open."),
374 i18n("already open")); 375 i18n("already open"));
375 goto cancelOpen; 376 goto cancelOpen;
376 } 377 }
377 if (ret == e_fileVer) { 378 if (ret == e_fileVer) {
378 KMessageBox::error(getCurrentView(), 379 KMessageBox::error(getCurrentView(),
379 i18n 380 i18n
380 ("File-version is not supported!\n" 381 ("File-version is not supported!\n"
381 "Did you create this file with an older or newer version of PwM?"), 382 "Did you create this file with an older or newer version of PwM?"),
382 i18n 383 i18n
383 ("incompatible version")); 384 ("incompatible version"));
384 goto cancelOpen; 385 goto cancelOpen;
385 } 386 }
386 if (ret == e_wrongPw) { 387 if (ret == e_wrongPw) {
387 continue; 388 continue;
388 } 389 }
389 if (ret == e_noPw) { 390 if (ret == e_noPw) {
390 goto cancelOpen; 391 goto cancelOpen;
391 } 392 }
392 if (ret == e_fileFormat) { 393 if (ret == e_fileFormat) {
393 KMessageBox::error(getCurrentView(), 394 KMessageBox::error(getCurrentView(),
394 i18n 395 i18n
395 ("Sorry, this file has not been recognized " 396 ("Sorry, this file has not been recognized "
396 "as a PwM Password file.\n" 397 "as a PwM Password file.\n"
397 "Probably you have selected the wrong file."), 398 "Probably you have selected the wrong file."),
398 i18n 399 i18n
399 ("no PwM password-file")); 400 ("no PwM password-file"));
400 goto cancelOpen; 401 goto cancelOpen;
401 } 402 }
402 if (ret == e_fileCorrupt) { 403 if (ret == e_fileCorrupt) {
403 KMessageBox::error(getCurrentView(), 404 KMessageBox::error(getCurrentView(),
404 i18n 405 i18n
405 ("File corrupt!\n" 406 ("File corrupt!\n"
406 "Maybe the media, you stored this file on, " 407 "Maybe the media, you stored this file on, "
407 "had bad sectors?"), 408 "had bad sectors?"),
408 i18n 409 i18n
409 ("checksum error")); 410 ("checksum error"));
410 goto cancelOpen; 411 goto cancelOpen;
411 } 412 }
412 } 413 }
413 break; 414 break;
414 } 415 }
415 return true; 416 return true;
416 417
417 cancelOpen: 418 cancelOpen:
418 return false; 419 return false;
419} 420}
420 421
421QString PwMDocUi::string_defaultCategory() 422QString PwMDocUi::string_defaultCategory()
422{ 423{
423 return i18n("Default"); 424 return i18n("Default");
424} 425}
425 426
426QString PwMDocUi::string_locked() 427QString PwMDocUi::string_locked()
427{ 428{
428 return i18n("<LOCKED>"); 429 return i18n("<LOCKED>");
429} 430}
430 431
431QString PwMDocUi::string_deepLockedShort() 432QString PwMDocUi::string_deepLockedShort()
432{ 433{
433 return i18n("DEEP-LOCKED"); 434 return i18n("DEEP-LOCKED");
434} 435}
435 436
436QString PwMDocUi::string_deepLockedLong() 437QString PwMDocUi::string_deepLockedLong()
437{ 438{
438 return i18n("This file is DEEP-LOCKED!\n" 439 return i18n("This file is DEEP-LOCKED!\n"
439 "That means all data has been encrypted " 440 "That means all data has been encrypted "
440 "and written out to the file. If you want " 441 "and written out to the file. If you want "
441 "to see the entries, please UNLOCK the file. " 442 "to see the entries, please UNLOCK the file. "
442 "While unlocking, you will be prompted for the " 443 "While unlocking, you will be prompted for the "
443 "master-password or the key-card."); 444 "master-password or the key-card.");
444} 445}
445 446
446QString PwMDocUi::string_defaultTitle() 447QString PwMDocUi::string_defaultTitle()
447{ 448{
448 return i18n("Untitled"); 449 return i18n("Untitled");
449} 450}
450 451
451#ifndef PWM_EMBEDDED 452#ifndef PWM_EMBEDDED
452#include "pwmdocui.moc" 453#include "pwmdocui.moc"
453#endif 454#endif
diff --git a/pwmanager/pwmanager/pwminit.cpp b/pwmanager/pwmanager/pwminit.cpp
index 2f1aa4e..8946443 100644
--- a/pwmanager/pwmanager/pwminit.cpp
+++ b/pwmanager/pwmanager/pwminit.cpp
@@ -1,615 +1,632 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2004 by Michael Buesch * 3 * copyright (C) 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 1.0.1 of pwmanager 14 * This file is originaly based on version 1.0.1 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
18 **************************************************************************/ 18 **************************************************************************/
19 19
20#include "pwminit.h" 20#include "pwminit.h"
21#include "configuration.h"
22#include "randomizer.h" 21#include "randomizer.h"
23 22
24#ifndef PWM_EMBEDDED 23#ifndef PWM_EMBEDDED
25#include "selftest.h" 24#include "selftest.h"
25#include "configuration.h"
26#else
27#include "pwmprefs.h"
26#endif 28#endif
27 29
28#include "pwm.h" 30#include "pwm.h"
29#include "pwmexception.h" 31#include "pwmexception.h"
30#include "pwmtray.h" 32#include "pwmtray.h"
31#include "pwmdoc.h" 33#include "pwmdoc.h"
32 34
33#ifdef CONFIG_KWALLETIF 35#ifdef CONFIG_KWALLETIF
34# include "kwalletemu.h" 36# include "kwalletemu.h"
35#endif // CONFIG_KWALLETIF 37#endif // CONFIG_KWALLETIF
36#ifdef CONFIG_KEYCARD 38#ifdef CONFIG_KEYCARD
37# include "pwmkeycard.h" 39# include "pwmkeycard.h"
38#endif // CONFIG_KEYCARD 40#endif // CONFIG_KEYCARD
39 41
40#include <qmessagebox.h> 42#include <qmessagebox.h>
41 43
42#include <kmessagebox.h> 44#include <kmessagebox.h>
43#ifndef PWM_EMBEDDED 45#ifndef PWM_EMBEDDED
44#include <kcmdlineargs.h> 46#include <kcmdlineargs.h>
45#include <kwin.h> 47#include <kwin.h>
46#include <dcopclient.h> 48#include <dcopclient.h>
47#endif 49#endif
48 50
49#include <kapplication.h> 51#include <kapplication.h>
50#include <kiconloader.h> 52#include <kiconloader.h>
51 53
52#include <signal.h> 54#include <signal.h>
53 55
54static PwMInit *sig_init_pointer; 56static PwMInit *sig_init_pointer;
55static NOREGPARM void sig_handler(int signum) 57static NOREGPARM void sig_handler(int signum)
56{ 58{
57 switch (signum) { 59 switch (signum) {
58 case SIGINT: 60 case SIGINT:
59 case SIGTERM: 61 case SIGTERM:
60 sig_init_pointer->shutdownApp(20 + signum); 62 sig_init_pointer->shutdownApp(20 + signum);
61 break; 63 break;
62 default: 64 default:
63 printDebug(string("unhandled signal ") 65 printDebug(string("unhandled signal ")
64 + tostr(signum)); 66 + tostr(signum));
65 } 67 }
66} 68}
67 69
68 70
69 71
70 72
71PwMInit::PwMInit(PwMApplication *_app) 73PwMInit::PwMInit(PwMApplication *_app)
72 : runStatus (unknown) 74 : runStatus (unknown)
73 , _curWidget (0) 75 , _curWidget (0)
74 , _dcopClient (0) 76 , _dcopClient (0)
75 , _kwalletEmu (0) 77 , _kwalletEmu (0)
76 , _keycard (0) 78 , _keycard (0)
77 , _tray (0) 79 , _tray (0)
78{ 80{
79 sig_init_pointer = this; 81 sig_init_pointer = this;
80 app = _app; 82 app = _app;
81} 83}
82 84
83PwMInit::~PwMInit() 85PwMInit::~PwMInit()
84{ 86{
85#ifndef PWM_EMBEDDED 87#ifndef PWM_EMBEDDED
86 SelfTest::cancel(); 88 SelfTest::cancel();
87 // close all open mainwnds 89 // close all open mainwnds
88 QValueList<PwM *>::iterator i = _mainWndList.begin(), 90 QValueList<PwM *>::iterator i = _mainWndList.begin(),
89 end = _mainWndList.end(); 91 end = _mainWndList.end();
90 92
91#else 93#else
92 // close all open mainwnds 94 // close all open mainwnds
93 QValueList<PwM *>::Iterator i = _mainWndList.begin(), 95 QValueList<PwM *>::Iterator i = _mainWndList.begin(),
94 end = _mainWndList.end(); 96 end = _mainWndList.end();
95#endif 97#endif
96 while (i != end) { 98 while (i != end) {
97 disconnect(*i, SIGNAL(closed(PwM *)), 99 disconnect(*i, SIGNAL(closed(PwM *)),
98 this, SLOT(mainWndClosed(PwM *))); 100 this, SLOT(mainWndClosed(PwM *)));
99 delete *i; 101 delete *i;
100 ++i; 102 ++i;
101 } 103 }
102 _mainWndList.clear(); 104 _mainWndList.clear();
103 // close all remaining open documents 105 // close all remaining open documents
104 PwMDocList *_dl = PwMDoc::getOpenDocList(); 106 PwMDocList *_dl = PwMDoc::getOpenDocList();
105 vector<PwMDocList::listItem> dl = *(_dl->getList()); 107 vector<PwMDocList::listItem> dl = *(_dl->getList());
106 vector<PwMDocList::listItem>::iterator i2 = dl.begin(), 108 vector<PwMDocList::listItem>::iterator i2 = dl.begin(),
107 end2 = dl.end(); 109 end2 = dl.end();
108 while (i2 != end2) { 110 while (i2 != end2) {
109 delete (*i2).doc; 111 delete (*i2).doc;
110 ++i2; 112 ++i2;
111 } 113 }
112 114
113#ifdef CONFIG_KWALLETIF 115#ifdef CONFIG_KWALLETIF
114 delete_ifnot_null(_kwalletEmu); 116 delete_ifnot_null(_kwalletEmu);
115#endif // CONFIG_KWALLETIF 117#endif // CONFIG_KWALLETIF
116#ifdef CONFIG_KEYCARD 118#ifdef CONFIG_KEYCARD
117 delete_ifnot_null(_keycard); 119 delete_ifnot_null(_keycard);
118#endif // CONFIG_KEYCARD 120#endif // CONFIG_KEYCARD
119 delete_ifnot_null(_tray); 121 delete_ifnot_null(_tray);
120 122
121 Randomizer::cleanup(); 123 Randomizer::cleanup();
124#ifndef PWM_EMBEDDED
122 Configuration::cleanup(); 125 Configuration::cleanup();
126#endif
123} 127}
124 128
125void PwMInit::initializeApp() 129void PwMInit::initializeApp()
126{ 130{
127 PWM_ASSERT(runStatus == unknown); 131 PWM_ASSERT(runStatus == unknown);
128 runStatus = init; 132 runStatus = init;
129 initPosixSignalHandler(); 133 initPosixSignalHandler();
130 Randomizer::init(); 134 Randomizer::init();
135#ifndef PWM_EMBEDDED
131 Configuration::init(); 136 Configuration::init();
137#endif
132 initDCOP(); 138 initDCOP();
133 initKWalletEmu(); 139 initKWalletEmu();
134 initKeycard(); 140 initKeycard();
135 initTray(); 141 initTray();
136 handleCmdLineArgs(); 142 handleCmdLineArgs();
137 143
138 bool openDeeplocked = false; 144 bool openDeeplocked = false;
139 if (conf()->confGlobAutostartDeepLocked() || 145 if (conf()->confGlobAutostartDeepLocked() ||
140 savedCmd.open_deeplocked) 146 savedCmd.open_deeplocked)
141 openDeeplocked = true; 147 openDeeplocked = true;
142 if (conf()->confWndAutoMinimizeOnStart() || 148 if (conf()->confWndAutoMinimizeOnStart() ||
143 savedCmd.minToTray) { 149 savedCmd.minToTray) {
144 PwMDoc *newDoc = createDoc(); 150 PwMDoc *newDoc = createDoc();
145 if (!newDoc->openDocUi(newDoc, 151 if (!newDoc->openDocUi(newDoc,
146 conf()->confGlobAutoStart(), 152 conf()->confGlobAutoStart(),
147 openDeeplocked)) { 153 openDeeplocked)) {
148 delete newDoc; 154 delete newDoc;
155
156 //US ENH for embedded devices: in the case of failure, open a document the default way
157 createMainWnd(conf()->confGlobAutoStart(),
158 openDeeplocked,
159 true,
160 0,
161 savedCmd.minimized);
162
163
164
165
149 } 166 }
150 } else { 167 } else {
151 createMainWnd(conf()->confGlobAutoStart(), 168 createMainWnd(conf()->confGlobAutoStart(),
152 openDeeplocked, 169 openDeeplocked,
153 true, 170 true,
154 0, 171 0,
155 savedCmd.minimized); 172 savedCmd.minimized);
156 } 173 }
157 174
158 runStatus = running; 175 runStatus = running;
159} 176}
160 177
161void PwMInit::shutdownApp(int exitStatus) 178void PwMInit::shutdownApp(int exitStatus)
162{ 179{
163 printDebug(string("PwMInit::shutdownApp(") 180 printDebug(string("PwMInit::shutdownApp(")
164 + tostr(exitStatus) + ") called."); 181 + tostr(exitStatus) + ") called.");
165 PWM_ASSERT((runStatus == running) || (runStatus == init)); 182 PWM_ASSERT((runStatus == running) || (runStatus == init));
166 runStatus = shutdown; 183 runStatus = shutdown;
167 QApplication::exit(exitStatus); 184 QApplication::exit(exitStatus);
168 /* The destructor of PwMInit is called when control 185 /* The destructor of PwMInit is called when control
169 * leaves main() 186 * leaves main()
170 */ 187 */
171} 188}
172 189
173void PwMInit::initPosixSignalHandler() 190void PwMInit::initPosixSignalHandler()
174{ 191{
175 signal(SIGINT, sig_handler); 192 signal(SIGINT, sig_handler);
176 signal(SIGTERM, sig_handler); 193 signal(SIGTERM, sig_handler);
177} 194}
178 195
179void PwMInit::initDCOP() 196void PwMInit::initDCOP()
180{ 197{
181#ifndef PWM_EMBEDDED 198#ifndef PWM_EMBEDDED
182 _dcopClient = app->dcopClient(); 199 _dcopClient = app->dcopClient();
183 _dcopClient->setNotifications(true); 200 _dcopClient->setNotifications(true);
184#endif 201#endif
185 202
186} 203}
187 204
188void PwMInit::initKWalletEmu(bool forceDisable, bool forceReload) 205void PwMInit::initKWalletEmu(bool forceDisable, bool forceReload)
189{ 206{
190#ifdef CONFIG_KWALLETIF 207#ifdef CONFIG_KWALLETIF
191 if (!conf()->confGlobKwalletEmu() || 208 if (!conf()->confGlobKwalletEmu() ||
192 forceDisable) { 209 forceDisable) {
193 delete_ifnot_null(_kwalletEmu); 210 delete_ifnot_null(_kwalletEmu);
194 return; 211 return;
195 } 212 }
196 try { 213 try {
197 if (_kwalletEmu && forceReload) 214 if (_kwalletEmu && forceReload)
198 delete_and_null(_kwalletEmu); 215 delete_and_null(_kwalletEmu);
199 if (!_kwalletEmu) 216 if (!_kwalletEmu)
200 _kwalletEmu = new KWalletEmu(this); 217 _kwalletEmu = new KWalletEmu(this);
201 } catch (PwMException e) { 218 } catch (PwMException e) {
202 string errMsg("initializing KWallet emulation failed. ID: "); 219 string errMsg("initializing KWallet emulation failed. ID: ");
203 errMsg += tostr(static_cast<int>(e.getId())); 220 errMsg += tostr(static_cast<int>(e.getId()));
204 errMsg += " err-message: "; 221 errMsg += " err-message: ";
205 errMsg += e.getMessage(); 222 errMsg += e.getMessage();
206 printWarn(errMsg); 223 printWarn(errMsg);
207 return; 224 return;
208 } 225 }
209#else // CONFIG_KWALLETIF 226#else // CONFIG_KWALLETIF
210 PARAM_UNUSED(forceDisable); 227 PARAM_UNUSED(forceDisable);
211 PARAM_UNUSED(forceReload); 228 PARAM_UNUSED(forceReload);
212#endif // CONFIG_KWALLETIF 229#endif // CONFIG_KWALLETIF
213} 230}
214 231
215void PwMInit::initKeycard() 232void PwMInit::initKeycard()
216{ 233{
217#ifdef CONFIG_KEYCARD 234#ifdef CONFIG_KEYCARD
218 PWM_ASSERT(!_keycard); 235 PWM_ASSERT(!_keycard);
219 _keycard = new PwMKeyCard(this); 236 _keycard = new PwMKeyCard(this);
220#endif // CONFIG_KEYCARD 237#endif // CONFIG_KEYCARD
221} 238}
222 239
223void PwMInit::initTray() 240void PwMInit::initTray()
224{ 241{
225#ifdef PWM_EMBEDDED 242#ifdef PWM_EMBEDDED
226 //US ENH : embedded version does not support a tray 243 //US ENH : embedded version does not support a tray
227 return; 244 return;
228#endif 245#endif
229 246
230 if (!conf()->confGlobTray()) { 247 if (!conf()->confGlobTray()) {
231 if (!_tray) 248 if (!_tray)
232 return; 249 return;
233 _tray->hide(); 250 _tray->hide();
234 delete_and_null(_tray); 251 delete_and_null(_tray);
235 return; 252 return;
236 } 253 }
237 if (_tray) 254 if (_tray)
238 return; 255 return;
239 _tray = new PwMTray(this); 256 _tray = new PwMTray(this);
240 connect(_tray, SIGNAL(quitSelected()), 257 connect(_tray, SIGNAL(quitSelected()),
241 this, SLOT(removeTrayAndQuit())); 258 this, SLOT(removeTrayAndQuit()));
242 connect(_tray, SIGNAL(closed(PwMTray *)), 259 connect(_tray, SIGNAL(closed(PwMTray *)),
243 this, SLOT(trayIconClosed(PwMTray *))); 260 this, SLOT(trayIconClosed(PwMTray *)));
244 KIconLoader icons; 261 KIconLoader icons;
245#ifndef PWM_EMBEDDED 262#ifndef PWM_EMBEDDED
246 _tray->setPixmap(icons.loadIcon(PACKAGE_NAME, KIcon::Small)); 263 _tray->setPixmap(icons.loadIcon(PACKAGE_NAME, KIcon::Small));
247#endif 264#endif
248 _tray->show(); 265 _tray->show();
249 // connect the signals of all open documents. 266 // connect the signals of all open documents.
250 const vector<PwMDocList::listItem> *dl = PwMDoc::getOpenDocList()->getList(); 267 const vector<PwMDocList::listItem> *dl = PwMDoc::getOpenDocList()->getList();
251 vector<PwMDocList::listItem>::const_iterator i = dl->begin(), 268 vector<PwMDocList::listItem>::const_iterator i = dl->begin(),
252 end = dl->end(); 269 end = dl->end();
253 while (i != end) { 270 while (i != end) {
254 _tray->connectDocToTray((*i).doc); 271 _tray->connectDocToTray((*i).doc);
255 ++i; 272 ++i;
256 } 273 }
257} 274}
258 275
259void PwMInit::removeTrayAndQuit() 276void PwMInit::removeTrayAndQuit()
260{ 277{
261 PWM_ASSERT(_tray); 278 PWM_ASSERT(_tray);
262 // _tray is deleted in ~PwMInit 279 // _tray is deleted in ~PwMInit
263 shutdownApp(0); 280 shutdownApp(0);
264} 281}
265 282
266PwM * PwMInit::createMainWnd(const QString &loadFile, 283PwM * PwMInit::createMainWnd(const QString &loadFile,
267 bool loadFileDeepLocked, 284 bool loadFileDeepLocked,
268 bool virginity, 285 bool virginity,
269 PwMDoc *doc, 286 PwMDoc *doc,
270 bool minimized) 287 bool minimized)
271{ 288{
272 PwM *newWnd; 289 PwM *newWnd;
273 if (!doc) 290 if (!doc)
274 doc = createDoc(); 291 doc = createDoc();
275 newWnd = new PwM(this, doc, virginity); 292 newWnd = new PwM(this, doc, virginity);
276#ifndef PWM_EMBEDDED 293#ifndef PWM_EMBEDDED
277 _mainWndList.push_back(newWnd); 294 _mainWndList.push_back(newWnd);
278#else 295#else
279 _mainWndList.append(newWnd); 296 _mainWndList.append(newWnd);
280#endif 297#endif
281 connect(newWnd, SIGNAL(closed(PwM *)), 298 connect(newWnd, SIGNAL(closed(PwM *)),
282 this, SLOT(mainWndClosed(PwM *))); 299 this, SLOT(mainWndClosed(PwM *)));
283 connect(newWnd, SIGNAL(gotFocus(PwM *)), 300 connect(newWnd, SIGNAL(gotFocus(PwM *)),
284 this, SLOT(setCurWidget(PwM *))); 301 this, SLOT(setCurWidget(PwM *)));
285 connect(newWnd, SIGNAL(lostFocus(PwM *)), 302 connect(newWnd, SIGNAL(lostFocus(PwM *)),
286 this, SLOT(resetCurWidget())); 303 this, SLOT(resetCurWidget()));
287 304
288 //US ENH 305 //US ENH
289#ifndef PWM_EMBEDDED 306#ifndef PWM_EMBEDDED
290 if (minimized) 307 if (minimized)
291 newWnd->showMinimized(); 308 newWnd->showMinimized();
292 else 309 else
293 newWnd->show(); 310 newWnd->show();
294 311
295#else //PWM_EMBEDDED 312#else //PWM_EMBEDDED
296 313
297#ifndef DESKTOP_VERSION 314#ifndef DESKTOP_VERSION
298 app->showMainWidget( newWnd ); 315 app->showMainWidget( newWnd );
299#else //DESKTOP_VERSION 316#else //DESKTOP_VERSION
300 app->setMainWidget( newWnd ); 317 app->setMainWidget( newWnd );
301 newWnd->resize (640, 480 ); 318 newWnd->resize (640, 480 );
302 newWnd->show(); 319 newWnd->show();
303#endif //DESKTOP_VERSION 320#endif //DESKTOP_VERSION
304 321
305#endif //PWM_EMBEDDED 322#endif //PWM_EMBEDDED
306 323
307 if (loadFile != QString::null && 324 if (loadFile != QString::null &&
308 loadFile != "") { 325 loadFile != "") {
309 newWnd->openDoc(loadFile, loadFileDeepLocked); 326 newWnd->openDoc(loadFile, loadFileDeepLocked);
310 } 327 }
311 return newWnd; 328 return newWnd;
312} 329}
313 330
314PwMDoc * PwMInit::createDoc() 331PwMDoc * PwMInit::createDoc()
315{ 332{
316 PwMDoc *doc = new PwMDoc(this); 333 PwMDoc *doc = new PwMDoc(this);
317#ifdef CONFIG_KEYCARD 334#ifdef CONFIG_KEYCARD
318 doc->setPwMKeyCard(keycard()); 335 doc->setPwMKeyCard(keycard());
319#endif 336#endif
320#ifdef CONFIG_KWALLETIF 337#ifdef CONFIG_KWALLETIF
321 if (kwalletEmu()) 338 if (kwalletEmu())
322 kwalletEmu()->connectDocSignals(doc); 339 kwalletEmu()->connectDocSignals(doc);
323#endif 340#endif
324 341
325 if (_tray) 342 if (_tray)
326 _tray->connectDocToTray(doc); 343 _tray->connectDocToTray(doc);
327 344
328 return doc; 345 return doc;
329 346
330} 347}
331 348
332void PwMInit::mainWndClosed(PwM *wnd) 349void PwMInit::mainWndClosed(PwM *wnd)
333{ 350{
334 bool doMinimizeToTray = false; 351 bool doMinimizeToTray = false;
335 bool doDeleteDoc = false; 352 bool doDeleteDoc = false;
336#ifndef PWM_EMBEDDED 353#ifndef PWM_EMBEDDED
337 dcopClient()->suspend(); 354 dcopClient()->suspend();
338 dcopClient()->setAcceptCalls(false); 355 dcopClient()->setAcceptCalls(false);
339#endif 356#endif
340again: 357again:
341 358
342 if (wnd->isForceMinimizeToTray()) { 359 if (wnd->isForceMinimizeToTray()) {
343 if (unlikely(!_tray)) { 360 if (unlikely(!_tray)) {
344 /* This should not happen! If we set forceMinimizeToTray , 361 /* This should not happen! If we set forceMinimizeToTray ,
345 * we must be sure that _tray exists. 362 * we must be sure that _tray exists.
346 */ 363 */
347 BUG(); 364 BUG();
348 wnd->setForceMinimizeToTray(false); 365 wnd->setForceMinimizeToTray(false);
349 goto again; 366 goto again;
350 } 367 }
351 doMinimizeToTray = true; 368 doMinimizeToTray = true;
352 } else { 369 } else {
353 // Ask to minimize to tray. If not, delete doc. 370 // Ask to minimize to tray. If not, delete doc.
354 if (_tray && 371 if (_tray &&
355 runStatus != shutdown && 372 runStatus != shutdown &&
356 !wnd->isForceQuit() && 373 !wnd->isForceQuit() &&
357 !wnd->curDoc()->isDeleted()) { 374 !wnd->curDoc()->isDeleted()) {
358 if (conf()->confWndClose()) 375 if (conf()->confWndClose())
359 doDeleteDoc = true; 376 doDeleteDoc = true;
360 else 377 else
361 doMinimizeToTray = true; 378 doMinimizeToTray = true;
362 } else { 379 } else {
363 doDeleteDoc = true; 380 doDeleteDoc = true;
364 } 381 }
365 } 382 }
366 383
367 if (doMinimizeToTray) { 384 if (doMinimizeToTray) {
368 385
369 PWM_ASSERT(_tray); 386 PWM_ASSERT(_tray);
370 int mmlock = conf()->confGlobMinimizeLock(); 387 int mmlock = conf()->confGlobMinimizeLock();
371 switch (mmlock) { 388 switch (mmlock) {
372 case 0: // don't lock anything 389 case 0: // don't lock anything
373 break; 390 break;
374 case 1: // normal lock 391 case 1: // normal lock
375 wnd->curDoc()->lockAll(true); 392 wnd->curDoc()->lockAll(true);
376 break; 393 break;
377 case 2: // deep-lock 394 case 2: // deep-lock
378 wnd->curDoc()->deepLock(); 395 wnd->curDoc()->deepLock();
379 break; 396 break;
380 default: 397 default:
381 WARN(); 398 WARN();
382 } 399 }
383 } else if (doDeleteDoc) { 400 } else if (doDeleteDoc) {
384 if (!wnd->curDoc()->tryDelete()) { 401 if (!wnd->curDoc()->tryDelete()) {
385 /* We failed deleting the doc, 402 /* We failed deleting the doc,
386 * so open a new window with it, again. 403 * so open a new window with it, again.
387 */ 404 */
388 createMainWnd(QString::null, false, 405 createMainWnd(QString::null, false,
389 false, wnd->curDoc()); 406 false, wnd->curDoc());
390 } 407 }
391 } 408 }
392#ifndef PWM_EMBEDDED 409#ifndef PWM_EMBEDDED
393 // find the closed window in the "mainWndList" and delete it. 410 // find the closed window in the "mainWndList" and delete it.
394 QValueList<PwM *>::iterator i = _mainWndList.begin(), 411 QValueList<PwM *>::iterator i = _mainWndList.begin(),
395 end = _mainWndList.end(); 412 end = _mainWndList.end();
396#else 413#else
397 // find the closed window in the "mainWndList" and delete it. 414 // find the closed window in the "mainWndList" and delete it.
398 QValueList<PwM *>::Iterator i = _mainWndList.begin(), 415 QValueList<PwM *>::Iterator i = _mainWndList.begin(),
399 end = _mainWndList.end(); 416 end = _mainWndList.end();
400#endif 417#endif
401 while (i != end) { 418 while (i != end) {
402 if (*i == wnd) { 419 if (*i == wnd) {
403#ifndef PWM_EMBEDDED 420#ifndef PWM_EMBEDDED
404 _mainWndList.erase(i); 421 _mainWndList.erase(i);
405#else 422#else
406 _mainWndList.remove(i); 423 _mainWndList.remove(i);
407#endif 424#endif
408 goto out_success; 425 goto out_success;
409 } 426 }
410 ++i; 427 ++i;
411 } 428 }
412 BUG(); 429 BUG();
413out_success: 430out_success:
414#ifndef PWM_EMBEDDED 431#ifndef PWM_EMBEDDED
415 if (!_mainWndList.size()) 432 if (!_mainWndList.size())
416#else 433#else
417 if (!_mainWndList.count()) 434 if (!_mainWndList.count())
418#endif 435#endif
419 436
420 { 437 {
421 /* If there's no main window and no tray icon 438 /* If there's no main window and no tray icon
422 * left, we have no user interface, so we can 439 * left, we have no user interface, so we can
423 * shut down the application. 440 * shut down the application.
424 */ 441 */
425 if (!_tray) { 442 if (!_tray) {
426#ifndef PWM_EMBEDDED 443#ifndef PWM_EMBEDDED
427 dcopClient()->setAcceptCalls(true); 444 dcopClient()->setAcceptCalls(true);
428 dcopClient()->resume(); 445 dcopClient()->resume();
429#endif 446#endif
430 shutdownApp(0); 447 shutdownApp(0);
431 return; 448 return;
432 } 449 }
433 /* There is no widget left, so set 450 /* There is no widget left, so set
434 * _curWidget to 0 451 * _curWidget to 0
435 */ 452 */
436 resetCurWidget(); 453 resetCurWidget();
437 } 454 }
438#ifndef PWM_EMBEDDED 455#ifndef PWM_EMBEDDED
439 dcopClient()->setAcceptCalls(true); 456 dcopClient()->setAcceptCalls(true);
440 dcopClient()->resume(); 457 dcopClient()->resume();
441#endif 458#endif
442} 459}
443 460
444void PwMInit::trayIconClosed(PwMTray *tray) 461void PwMInit::trayIconClosed(PwMTray *tray)
445{ 462{
446 if (runStatus != running) 463 if (runStatus != running)
447 return; 464 return;
448 PARAM_UNUSED(tray); 465 PARAM_UNUSED(tray);
449 PWM_ASSERT(tray == _tray); 466 PWM_ASSERT(tray == _tray);
450 /* If there's no main wnd left we have to 467 /* If there's no main wnd left we have to
451 * shutdown the app (same as in mainWndClosed()) 468 * shutdown the app (same as in mainWndClosed())
452 */ 469 */
453#ifndef PWM_EMBEDDED 470#ifndef PWM_EMBEDDED
454 if (!_mainWndList.size()) 471 if (!_mainWndList.size())
455 shutdownApp(0); 472 shutdownApp(0);
456#else 473#else
457 if (!_mainWndList.count()) 474 if (!_mainWndList.count())
458 shutdownApp(0); 475 shutdownApp(0);
459#endif 476#endif
460} 477}
461 478
462void PwMInit::handleCmdLineArgs(bool initial) 479void PwMInit::handleCmdLineArgs(bool initial)
463{ 480{
464#ifndef PWM_EMBEDDED 481#ifndef PWM_EMBEDDED
465 KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); 482 KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
466 PWM_ASSERT(args); 483 PWM_ASSERT(args);
467 int i, numArgs = args->count(); 484 int i, numArgs = args->count();
468 const char *curArg; 485 const char *curArg;
469 486
470 // read all cmdline options 487 // read all cmdline options
471 savedCmd.open_deeplocked = args->isSet("open-deeplocked"); 488 savedCmd.open_deeplocked = args->isSet("open-deeplocked");
472 savedCmd.minimized = args->isSet("minimized"); 489 savedCmd.minimized = args->isSet("minimized");
473 savedCmd.minToTray = args->isSet("mintray"); 490 savedCmd.minToTray = args->isSet("mintray");
474 savedCmd.skipSelfTest = args->isSet("skip-self-test"); 491 savedCmd.skipSelfTest = args->isSet("skip-self-test");
475 if (savedCmd.minimized && 492 if (savedCmd.minimized &&
476 savedCmd.minToTray) { 493 savedCmd.minToTray) {
477 printInfo(i18n("Commandline option \"--minimized\" and " 494 printInfo(i18n("Commandline option \"--minimized\" and "
478 "\"--mintray\" selected. These are incompatible. " 495 "\"--mintray\" selected. These are incompatible. "
479 "\"--mintray\" will be selected.").latin1()); 496 "\"--mintray\" will be selected.").latin1());
480 } 497 }
481 /* Iterate through all non-option arguments. 498 /* Iterate through all non-option arguments.
482 * Every non-option arg is a filename to open. 499 * Every non-option arg is a filename to open.
483 */ 500 */
484 for (i = 0; i < numArgs; ++i) { 501 for (i = 0; i < numArgs; ++i) {
485 curArg = args->arg(i); 502 curArg = args->arg(i);
486 PWM_ASSERT(curArg); 503 PWM_ASSERT(curArg);
487 if (savedCmd.minToTray) { 504 if (savedCmd.minToTray) {
488 PwMDoc *newDoc = createDoc(); 505 PwMDoc *newDoc = createDoc();
489 if (!newDoc->openDocUi(newDoc, 506 if (!newDoc->openDocUi(newDoc,
490 curArg, 507 curArg,
491 savedCmd.open_deeplocked)) { 508 savedCmd.open_deeplocked)) {
492 delete newDoc; 509 delete newDoc;
493 } 510 }
494 } else { 511 } else {
495 PwM *newInstance = createMainWnd(QString::null, 512 PwM *newInstance = createMainWnd(QString::null,
496 false, 513 false,
497 true, 514 true,
498 0, 515 0,
499 savedCmd.minimized); 516 savedCmd.minimized);
500 PwMDoc *newDoc = newInstance->openDoc(curArg, 517 PwMDoc *newDoc = newInstance->openDoc(curArg,
501 savedCmd.open_deeplocked); 518 savedCmd.open_deeplocked);
502 if (!newDoc) { 519 if (!newDoc) {
503 newInstance->setForceQuit(true); 520 newInstance->setForceQuit(true);
504 delete_and_null(newInstance); 521 delete_and_null(newInstance);
505 } 522 }
506 } 523 }
507 } 524 }
508 525
509 if (savedCmd.minToTray) { 526 if (savedCmd.minToTray) {
510 minimizeAllMainWnd(true); 527 minimizeAllMainWnd(true);
511 } else if (savedCmd.minimized) { 528 } else if (savedCmd.minimized) {
512 minimizeAllMainWnd(false); 529 minimizeAllMainWnd(false);
513 } 530 }
514 if (!savedCmd.skipSelfTest && initial) { 531 if (!savedCmd.skipSelfTest && initial) {
515 SelfTest::schedule(); 532 SelfTest::schedule();
516 } 533 }
517 args->clear(); 534 args->clear();
518#endif 535#endif
519} 536}
520 537
521void PwMInit::minimizeAllMainWnd(bool toTray) 538void PwMInit::minimizeAllMainWnd(bool toTray)
522{ 539{
523#ifndef PWM_EMBEDDED 540#ifndef PWM_EMBEDDED
524 if (!_mainWndList.size()) 541 if (!_mainWndList.size())
525 return; 542 return;
526#else 543#else
527 if (!_mainWndList.count()) 544 if (!_mainWndList.count())
528 return; 545 return;
529#endif 546#endif
530 const QValueList<PwM *> *ml = mainWndList(); 547 const QValueList<PwM *> *ml = mainWndList();
531#ifndef PWM_EMBEDDED 548#ifndef PWM_EMBEDDED
532 QValueList<PwM *>::const_iterator it = ml->begin(), 549 QValueList<PwM *>::const_iterator it = ml->begin(),
533 end = ml->end(); 550 end = ml->end();
534#else 551#else
535 QValueList<PwM *>::ConstIterator it = ml->begin(), 552 QValueList<PwM *>::ConstIterator it = ml->begin(),
536 end = ml->end(); 553 end = ml->end();
537#endif 554#endif
538 PwM *wnd; 555 PwM *wnd;
539 if (toTray && _tray) { 556 if (toTray && _tray) {
540 /* minimize to tray. 557 /* minimize to tray.
541 * close all mainWnd. 558 * close all mainWnd.
542 */ 559 */
543 while (it != end) { 560 while (it != end) {
544 wnd = *it; 561 wnd = *it;
545 wnd->setForceMinimizeToTray(true); 562 wnd->setForceMinimizeToTray(true);
546 wnd->close_slot(); 563 wnd->close_slot();
547 ++it; 564 ++it;
548 } 565 }
549 } else { 566 } else {
550 // normal minimize 567 // normal minimize
551 while (it != end) { 568 while (it != end) {
552 wnd = *it; 569 wnd = *it;
553 wnd->hide(); 570 wnd->hide();
554 wnd->showMinimized(); 571 wnd->showMinimized();
555 ++it; 572 ++it;
556 } 573 }
557 } 574 }
558} 575}
559 576
560#ifdef PWM_EMBEDDED 577#ifdef PWM_EMBEDDED
561 578
562#ifndef DESKTOP_VERSION 579#ifndef DESKTOP_VERSION
563 580
564PwMApplication::PwMApplication(int & argc, char ** argv) 581PwMApplication::PwMApplication(int & argc, char ** argv)
565 : QPEApplication( argc, argv ) 582 : QPEApplication( argc, argv )
566 , init (0) 583 , init (0)
567{ 584{
568 this->setKeepRunning (); 585 this->setKeepRunning ();
569} 586}
570 587
571PwMApplication::~PwMApplication() 588PwMApplication::~PwMApplication()
572{ 589{
573 delete_ifnot_null(init); 590 delete_ifnot_null(init);
574} 591}
575#else //DESKTOP_VERSION 592#else //DESKTOP_VERSION
576 593
577PwMApplication::PwMApplication(int & argc, char ** argv) 594PwMApplication::PwMApplication(int & argc, char ** argv)
578 : QApplication( argc, argv ) 595 : QApplication( argc, argv )
579 , init (0) 596 , init (0)
580{ 597{
581 setStyle( new QPlatinumStyle ()); 598 setStyle( new QPlatinumStyle ());
582 QString hdir = QDir::homeDirPath(); 599 QString hdir = QDir::homeDirPath();
583 // there is a bug when creating dirs for WIN 98 600 // there is a bug when creating dirs for WIN 98
584 // it is difficult to fix, because we have no WIN 98 runnung 601 // it is difficult to fix, because we have no WIN 98 runnung
585 // such that we try it to create the dirs at startup here 602 // such that we try it to create the dirs at startup here
586 if ( hdir == "C:\\" ) 603 if ( hdir == "C:\\" )
587 { 604 {
588 // win 98 or ME 605 // win 98 or ME
589 QDir app_dir; 606 QDir app_dir;
590 if ( !app_dir.exists("C:\\kdepim") ) 607 if ( !app_dir.exists("C:\\kdepim") )
591 app_dir.mkdir ("C:\\kdepim"); 608 app_dir.mkdir ("C:\\kdepim");
592 if ( !app_dir.exists("C:\\kdepim\\apps") ) 609 if ( !app_dir.exists("C:\\kdepim\\apps") )
593 app_dir.mkdir ("C:\\kdepim\\apps"); 610 app_dir.mkdir ("C:\\kdepim\\apps");
594 if ( !app_dir.exists("C:\\kdepim\\config") ) 611 if ( !app_dir.exists("C:\\kdepim\\config") )
595 app_dir.mkdir ("C:\\kdepim\\config"); 612 app_dir.mkdir ("C:\\kdepim\\config");
596 if ( !app_dir.exists("C:\\kdepim\\apps\\pwmanager") ) 613 if ( !app_dir.exists("C:\\kdepim\\apps\\pwmanager") )
597 app_dir.mkdir ("C:\\kdepim\\apps\\pwmanager"); 614 app_dir.mkdir ("C:\\kdepim\\apps\\pwmanager");
598 } 615 }
599} 616}
600 617
601PwMApplication::~PwMApplication() 618PwMApplication::~PwMApplication()
602{ 619{
603 delete_ifnot_null(init); 620 delete_ifnot_null(init);
604} 621}
605 622
606#endif //DESKTOP_VERSION 623#endif //DESKTOP_VERSION
607 624
608#endif //PWM_EMBEDDED 625#endif //PWM_EMBEDDED
609 626
610 627
611 628
612 629
613#ifndef PWM_EMBEDDED 630#ifndef PWM_EMBEDDED
614#include "pwminit.moc" 631#include "pwminit.moc"
615#endif 632#endif
diff --git a/pwmanager/pwmanager/pwmtray.cpp b/pwmanager/pwmanager/pwmtray.cpp
index 0f286c1..fe074ca 100644
--- a/pwmanager/pwmanager/pwmtray.cpp
+++ b/pwmanager/pwmanager/pwmtray.cpp
@@ -1,482 +1,486 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * Original implementation of the tray-tree * 6 * Original implementation of the tray-tree *
7 * (c) by Matt Scifo <mscifo@o1.com> * 7 * (c) by Matt Scifo <mscifo@o1.com> *
8 * * 8 * *
9 * This program is free software; you can redistribute it and/or modify * 9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License version 2 * 10 * it under the terms of the GNU General Public License version 2 *
11 * as published by the Free Software Foundation. * 11 * as published by the Free Software Foundation. *
12 * * 12 * *
13 ***************************************************************************/ 13 ***************************************************************************/
14 14
15/*************************************************************************** 15/***************************************************************************
16 * copyright (C) 2004 by Ulf Schenk 16 * copyright (C) 2004 by Ulf Schenk
17 * This file is originaly based on version 1.0.1 of pwmanager 17 * This file is originaly based on version 1.0.1 of pwmanager
18 * and was modified to run on embedded devices that run microkde 18 * and was modified to run on embedded devices that run microkde
19 * 19 *
20 * $Id$ 20 * $Id$
21 **************************************************************************/ 21 **************************************************************************/
22 22
23#include "pwmtray.h" 23#include "pwmtray.h"
24#include "pwmexception.h" 24#include "pwmexception.h"
25#include "pwm.h" 25#include "pwm.h"
26#include "pwmdoc.h" 26#include "pwmdoc.h"
27#include "pwminit.h" 27#include "pwminit.h"
28#ifndef PWM_EMBEDDED
28#include "configuration.h" 29#include "configuration.h"
30#else
31#include "pwmprefs.h"
32#endif
29 33
30#include <klocale.h> 34#include <klocale.h>
31 35
32 36
33void ActiveTreeItem::execIt() 37void ActiveTreeItem::execIt()
34{ 38{
35#ifndef PWM_EMBEDDED 39#ifndef PWM_EMBEDDED
36 unsigned int entr = static_cast<unsigned int>(entry); 40 unsigned int entr = static_cast<unsigned int>(entry);
37 unsigned int cat = static_cast<unsigned int>(category); 41 unsigned int cat = static_cast<unsigned int>(category);
38#else 42#else
39 unsigned int entr = (unsigned int)(entry); 43 unsigned int entr = (unsigned int)(entry);
40 unsigned int cat = (unsigned int)(category); 44 unsigned int cat = (unsigned int)(category);
41#endif 45#endif
42 switch (task) { 46 switch (task) {
43 case pwToClipboard: { 47 case pwToClipboard: {
44 PwMDataItem d; 48 PwMDataItem d;
45 doc->getDataChangedLock(); 49 doc->getDataChangedLock();
46 bool wasLocked = doc->isLocked(cat, entr); 50 bool wasLocked = doc->isLocked(cat, entr);
47 doc->getEntry(cat, entr, &d, true); 51 doc->getEntry(cat, entr, &d, true);
48 if (wasLocked) 52 if (wasLocked)
49 doc->lockAt(cat, entr, true); 53 doc->lockAt(cat, entr, true);
50 doc->putDataChangedLock(); 54 doc->putDataChangedLock();
51 PwM::copyToClipboard(d.pw.c_str()); 55 PwM::copyToClipboard(d.pw.c_str());
52 break; 56 break;
53 } case nameToClipboard: { 57 } case nameToClipboard: {
54 PwMDataItem d; 58 PwMDataItem d;
55 doc->getEntry(cat, entr, &d); 59 doc->getEntry(cat, entr, &d);
56 PwM::copyToClipboard(d.name.c_str()); 60 PwM::copyToClipboard(d.name.c_str());
57 break; 61 break;
58 } case descToClipboard: { 62 } case descToClipboard: {
59 PwMDataItem d; 63 PwMDataItem d;
60 doc->getEntry(cat, entr, &d); 64 doc->getEntry(cat, entr, &d);
61 PwM::copyToClipboard(d.desc.c_str()); 65 PwM::copyToClipboard(d.desc.c_str());
62 break; 66 break;
63 } case urlToClipboard: { 67 } case urlToClipboard: {
64 PwMDataItem d; 68 PwMDataItem d;
65 doc->getEntry(cat, entr, &d); 69 doc->getEntry(cat, entr, &d);
66 PwM::copyToClipboard(d.url.c_str()); 70 PwM::copyToClipboard(d.url.c_str());
67 break; 71 break;
68 } case launcherToClipboard: { 72 } case launcherToClipboard: {
69 PwMDataItem d; 73 PwMDataItem d;
70 doc->getEntry(cat, entr, &d); 74 doc->getEntry(cat, entr, &d);
71 PwM::copyToClipboard(d.launcher.c_str()); 75 PwM::copyToClipboard(d.launcher.c_str());
72 break; 76 break;
73 } case commentToClipboard: { 77 } case commentToClipboard: {
74 PwMDataItem d; 78 PwMDataItem d;
75 doc->getEntry(cat, entr, &d); 79 doc->getEntry(cat, entr, &d);
76 PwM::copyToClipboard(d.comment.c_str()); 80 PwM::copyToClipboard(d.comment.c_str());
77 break; 81 break;
78 } case execLauncher: { 82 } case execLauncher: {
79 doc->execLauncher(cat, entr); 83 doc->execLauncher(cat, entr);
80 break; 84 break;
81 } case goToURL: { 85 } case goToURL: {
82 doc->goToURL(cat, entr); 86 doc->goToURL(cat, entr);
83 break; 87 break;
84 } case openMainWnd: { 88 } case openMainWnd: {
85 // search if there is already an open window. 89 // search if there is already an open window.
86 const QValueList<PwM *> *wl = tray->init->mainWndList(); 90 const QValueList<PwM *> *wl = tray->init->mainWndList();
87#ifndef PWM_EMBEDDED 91#ifndef PWM_EMBEDDED
88 QValueList<PwM *>::const_iterator i = wl->begin(), 92 QValueList<PwM *>::const_iterator i = wl->begin(),
89 end = wl->end(); 93 end = wl->end();
90#else 94#else
91 QValueList<PwM *>::ConstIterator i = wl->begin(), 95 QValueList<PwM *>::ConstIterator i = wl->begin(),
92 end = wl->end(); 96 end = wl->end();
93#endif 97#endif
94 PwM *wnd; 98 PwM *wnd;
95 while (i != end) { 99 while (i != end) {
96 wnd = *i; 100 wnd = *i;
97 if (wnd->curDoc() == doc) { 101 if (wnd->curDoc() == doc) {
98 // now bring this window to the foreground. 102 // now bring this window to the foreground.
99 if (!wnd->hasFocus()) { 103 if (!wnd->hasFocus()) {
100 wnd->hide(); 104 wnd->hide();
101 wnd->showNormal(); 105 wnd->showNormal();
102 wnd->setFocus(); 106 wnd->setFocus();
103 } 107 }
104 return; 108 return;
105 } 109 }
106 ++i; 110 ++i;
107 } 111 }
108 // there is no open window, so open a new one. 112 // there is no open window, so open a new one.
109 tray->init->createMainWnd(QString::null, false, false, doc); 113 tray->init->createMainWnd(QString::null, false, false, doc);
110 break; 114 break;
111 } case closeDoc: { 115 } case closeDoc: {
112 doc->tryDelete(); 116 doc->tryDelete();
113 break; 117 break;
114 } case lock: { 118 } case lock: {
115 doc->lockAll(true); 119 doc->lockAll(true);
116 break; 120 break;
117 } case deepLock: { 121 } case deepLock: {
118 doc->deepLock(); 122 doc->deepLock();
119 break; 123 break;
120 } case unlock: { 124 } case unlock: {
121 doc->lockAll(false); 125 doc->lockAll(false);
122 break; 126 break;
123 } default: { 127 } default: {
124 BUG(); 128 BUG();
125 } 129 }
126 } 130 }
127} 131}
128 132
129 133
130 134
131#ifndef PWM_EMBEDDED 135#ifndef PWM_EMBEDDED
132PwMTray::PwMTray(PwMInit *_init, QWidget * parent, const char *name) 136PwMTray::PwMTray(PwMInit *_init, QWidget * parent, const char *name)
133 : KSystemTray(parent, name) 137 : KSystemTray(parent, name)
134#else 138#else
135PwMTray::PwMTray(PwMInit *_init, QWidget * parent, const char *name) 139PwMTray::PwMTray(PwMInit *_init, QWidget * parent, const char *name)
136 : QWidget(parent, name) 140 : QWidget(parent, name)
137#endif 141#endif
138{ 142{
139 init = _init; 143 init = _init;
140 buildMain(); 144 buildMain();
141} 145}
142 146
143PwMTray::~PwMTray() 147PwMTray::~PwMTray()
144{ 148{
145 emit closed(this); 149 emit closed(this);
146} 150}
147 151
148//US ENH for embedded tray class 152//US ENH for embedded tray class
149KPopupMenu* PwMTray::contextMenu() 153KPopupMenu* PwMTray::contextMenu()
150{ 154{
151 if (m_ctxMenu == 0) 155 if (m_ctxMenu == 0)
152 { 156 {
153 m_ctxMenu = new KPopupMenu(); 157 m_ctxMenu = new KPopupMenu();
154 } 158 }
155 159
156 return m_ctxMenu; 160 return m_ctxMenu;
157} 161}
158 162
159 163
160void PwMTray::buildMain() 164void PwMTray::buildMain()
161{ 165{
162 KPopupMenu *ctxMenu = contextMenu(); 166 KPopupMenu *ctxMenu = contextMenu();
163 167
164 ctxMenu->insertSeparator(); 168 ctxMenu->insertSeparator();
165 ctxMenu->insertItem(i18n("&New main window..."), this, 169 ctxMenu->insertItem(i18n("&New main window..."), this,
166 SLOT(newMainWnd())); 170 SLOT(newMainWnd()));
167 ctxMenu->insertItem(i18n("&Open file..."), this, 171 ctxMenu->insertItem(i18n("&Open file..."), this,
168 SLOT(openDoc())); 172 SLOT(openDoc()));
169 ctxMenu->insertSeparator(); 173 ctxMenu->insertSeparator();
170 ctxMenu->insertItem(i18n("&Remove from tray"), this, 174 ctxMenu->insertItem(i18n("&Remove from tray"), this,
171 SLOT(undock())); 175 SLOT(undock()));
172} 176}
173 177
174void PwMTray::insertActiveTreeItem(KPopupMenu *insertIn, const QString &text, 178void PwMTray::insertActiveTreeItem(KPopupMenu *insertIn, const QString &text,
175 ActiveTreeItem::Task task, PwMDoc *doc, 179 ActiveTreeItem::Task task, PwMDoc *doc,
176 int docCategory, int docEntry, 180 int docCategory, int docEntry,
177 QValueList<int> *activeItemsList) 181 QValueList<int> *activeItemsList)
178{ 182{
179 ActiveTreeItem *activeItem; 183 ActiveTreeItem *activeItem;
180 int id; 184 int id;
181 185
182 activeItem = new ActiveTreeItem(text, insertIn->font(), task, 186 activeItem = new ActiveTreeItem(text, insertIn->font(), task,
183 doc, docCategory, docEntry, 187 doc, docCategory, docEntry,
184 this); 188 this);
185 id = insertIn->insertItem(activeItem); 189 id = insertIn->insertItem(activeItem);
186 insertIn->connectItem(id, activeItem, SLOT(execIt())); 190 insertIn->connectItem(id, activeItem, SLOT(execIt()));
187#ifndef PWM_EMBEDDED 191#ifndef PWM_EMBEDDED
188 activeItemsList->push_back(id); 192 activeItemsList->push_back(id);
189#else 193#else
190 activeItemsList->append(id); 194 activeItemsList->append(id);
191#endif 195#endif
192} 196}
193 197
194void PwMTray::rebuildTree(KPopupMenu *popup, PwMDoc *doc, 198void PwMTray::rebuildTree(KPopupMenu *popup, PwMDoc *doc,
195 QValueList<int> *activeItems) 199 QValueList<int> *activeItems)
196{ 200{
197 PWM_ASSERT(doc); 201 PWM_ASSERT(doc);
198 PWM_ASSERT(popup); 202 PWM_ASSERT(popup);
199 activeItems->clear(); 203 activeItems->clear();
200 popup->clear(); 204 popup->clear();
201#ifndef PWM_EMBEDDED 205#ifndef PWM_EMBEDDED
202 popup->insertTitle(i18n("Categories:")); 206 popup->insertTitle(i18n("Categories:"));
203#endif 207#endif
204 vector<string> catList; 208 vector<string> catList;
205 vector<string> entrList; 209 vector<string> entrList;
206 doc->getCategoryList(&catList); 210 doc->getCategoryList(&catList);
207 KPopupMenu *newCatMenu; 211 KPopupMenu *newCatMenu;
208 KPopupMenu *newEntrMenu; 212 KPopupMenu *newEntrMenu;
209 int i, size = catList.size(); 213 int i, size = catList.size();
210 int j, entries; 214 int j, entries;
211 for (i = 0; i < size; ++i) { 215 for (i = 0; i < size; ++i) {
212 newCatMenu = new KPopupMenu(popup); 216 newCatMenu = new KPopupMenu(popup);
213 popup->insertItem(catList[i].c_str(), newCatMenu); 217 popup->insertItem(catList[i].c_str(), newCatMenu);
214 doc->getEntryList(i, &entrList); 218 doc->getEntryList(i, &entrList);
215 219
216 entries = entrList.size(); 220 entries = entrList.size();
217 for (j = 0; j < entries; ++j) { 221 for (j = 0; j < entries; ++j) {
218 newEntrMenu = new KPopupMenu(newCatMenu); 222 newEntrMenu = new KPopupMenu(newCatMenu);
219 newCatMenu->insertItem(entrList[j].c_str(), newEntrMenu); 223 newCatMenu->insertItem(entrList[j].c_str(), newEntrMenu);
220 224
221 if (doc->isBinEntry(i, j)) { 225 if (doc->isBinEntry(i, j)) {
222 /* This is a binary entry. Don't insert the usual 226 /* This is a binary entry. Don't insert the usual
223 * menu items. 227 * menu items.
224 */ 228 */
225#ifndef PWM_EMBEDDED 229#ifndef PWM_EMBEDDED
226 newEntrMenu->insertTitle(i18n("This is a binary entry.\n" 230 newEntrMenu->insertTitle(i18n("This is a binary entry.\n"
227 "It is not a normal password-entry, as it contains " 231 "It is not a normal password-entry, as it contains "
228 "binary data, which PwManager can't display here.")); 232 "binary data, which PwManager can't display here."));
229#endif 233#endif
230 continue; 234 continue;
231 } 235 }
232 236
233 insertActiveTreeItem(newEntrMenu, 237 insertActiveTreeItem(newEntrMenu,
234 i18n("copy password to clipboard"), 238 i18n("copy password to clipboard"),
235 ActiveTreeItem::pwToClipboard, doc, i, j, 239 ActiveTreeItem::pwToClipboard, doc, i, j,
236 activeItems); 240 activeItems);
237 241
238 insertActiveTreeItem(newEntrMenu, 242 insertActiveTreeItem(newEntrMenu,
239 i18n("copy username to clipboard"), 243 i18n("copy username to clipboard"),
240 ActiveTreeItem::nameToClipboard, doc, i, j, 244 ActiveTreeItem::nameToClipboard, doc, i, j,
241 activeItems); 245 activeItems);
242 246
243 insertActiveTreeItem(newEntrMenu, 247 insertActiveTreeItem(newEntrMenu,
244 i18n("copy description to clipboard"), 248 i18n("copy description to clipboard"),
245 ActiveTreeItem::descToClipboard, doc, i, j, 249 ActiveTreeItem::descToClipboard, doc, i, j,
246 activeItems); 250 activeItems);
247 251
248 insertActiveTreeItem(newEntrMenu, 252 insertActiveTreeItem(newEntrMenu,
249 i18n("copy url to clipboard"), 253 i18n("copy url to clipboard"),
250 ActiveTreeItem::urlToClipboard, doc, i, j, 254 ActiveTreeItem::urlToClipboard, doc, i, j,
251 activeItems); 255 activeItems);
252 256
253 insertActiveTreeItem(newEntrMenu, 257 insertActiveTreeItem(newEntrMenu,
254 i18n("copy launcher to clipboard"), 258 i18n("copy launcher to clipboard"),
255 ActiveTreeItem::launcherToClipboard, doc, i, j, 259 ActiveTreeItem::launcherToClipboard, doc, i, j,
256 activeItems); 260 activeItems);
257 261
258 insertActiveTreeItem(newEntrMenu, 262 insertActiveTreeItem(newEntrMenu,
259 i18n("copy comment to clipboard"), 263 i18n("copy comment to clipboard"),
260 ActiveTreeItem::commentToClipboard, doc, i, j, 264 ActiveTreeItem::commentToClipboard, doc, i, j,
261 activeItems); 265 activeItems);
262 266
263 newEntrMenu->insertSeparator(); 267 newEntrMenu->insertSeparator();
264 268
265 insertActiveTreeItem(newEntrMenu, 269 insertActiveTreeItem(newEntrMenu,
266 i18n("Execute \"Launcher\""), 270 i18n("Execute \"Launcher\""),
267 ActiveTreeItem::execLauncher, doc, i, j, 271 ActiveTreeItem::execLauncher, doc, i, j,
268 activeItems); 272 activeItems);
269 273
270 insertActiveTreeItem(newEntrMenu, 274 insertActiveTreeItem(newEntrMenu,
271 i18n("Go to \"URL\""), 275 i18n("Go to \"URL\""),
272 ActiveTreeItem::goToURL, doc, i, j, 276 ActiveTreeItem::goToURL, doc, i, j,
273 activeItems); 277 activeItems);
274 } 278 }
275 } 279 }
276 insertMainWndCtrl(popup, doc); 280 insertMainWndCtrl(popup, doc);
277} 281}
278 282
279void PwMTray::insertMainWndCtrl(KPopupMenu *menu, PwMDoc *doc) 283void PwMTray::insertMainWndCtrl(KPopupMenu *menu, PwMDoc *doc)
280{ 284{
281 ActiveTreeItem *activeItem; 285 ActiveTreeItem *activeItem;
282 int id; 286 int id;
283 287
284#ifndef PWM_EMBEDDED 288#ifndef PWM_EMBEDDED
285 menu->insertTitle(i18n("Manager:")); 289 menu->insertTitle(i18n("Manager:"));
286#endif 290#endif
287 activeItem = new ActiveTreeItem(i18n("&Open main manager window ..."), 291 activeItem = new ActiveTreeItem(i18n("&Open main manager window ..."),
288 menu->font(), ActiveTreeItem::openMainWnd, 292 menu->font(), ActiveTreeItem::openMainWnd,
289 doc, 0, 0, this); 293 doc, 0, 0, this);
290 id = menu->insertItem(activeItem); 294 id = menu->insertItem(activeItem);
291 menu->connectItem(id, activeItem, SLOT(execIt())); 295 menu->connectItem(id, activeItem, SLOT(execIt()));
292 296
293 activeItem = new ActiveTreeItem(i18n("&Close this document ..."), 297 activeItem = new ActiveTreeItem(i18n("&Close this document ..."),
294 menu->font(), ActiveTreeItem::closeDoc, 298 menu->font(), ActiveTreeItem::closeDoc,
295 doc, 0, 0, this); 299 doc, 0, 0, this);
296 id = menu->insertItem(activeItem); 300 id = menu->insertItem(activeItem);
297 menu->connectItem(id, activeItem, SLOT(execIt())); 301 menu->connectItem(id, activeItem, SLOT(execIt()));
298 302
299 menu->insertSeparator(); 303 menu->insertSeparator();
300 304
301 activeItem = new ActiveTreeItem(i18n("&Lock all entries"), 305 activeItem = new ActiveTreeItem(i18n("&Lock all entries"),
302 menu->font(), ActiveTreeItem::lock, 306 menu->font(), ActiveTreeItem::lock,
303 doc, 0, 0, this); 307 doc, 0, 0, this);
304 id = menu->insertItem(activeItem); 308 id = menu->insertItem(activeItem);
305 menu->connectItem(id, activeItem, SLOT(execIt())); 309 menu->connectItem(id, activeItem, SLOT(execIt()));
306 310
307 activeItem = new ActiveTreeItem(i18n("&Deep-lock all entries"), 311 activeItem = new ActiveTreeItem(i18n("&Deep-lock all entries"),
308 menu->font(), ActiveTreeItem::deepLock, 312 menu->font(), ActiveTreeItem::deepLock,
309 doc, 0, 0, this); 313 doc, 0, 0, this);
310 id = menu->insertItem(activeItem); 314 id = menu->insertItem(activeItem);
311 menu->connectItem(id, activeItem, SLOT(execIt())); 315 menu->connectItem(id, activeItem, SLOT(execIt()));
312 316
313 activeItem = new ActiveTreeItem(i18n("&Unlock all entries"), 317 activeItem = new ActiveTreeItem(i18n("&Unlock all entries"),
314 menu->font(), ActiveTreeItem::unlock, 318 menu->font(), ActiveTreeItem::unlock,
315 doc, 0, 0, this); 319 doc, 0, 0, this);
316 id = menu->insertItem(activeItem); 320 id = menu->insertItem(activeItem);
317 menu->connectItem(id, activeItem, SLOT(execIt())); 321 menu->connectItem(id, activeItem, SLOT(execIt()));
318} 322}
319 323
320void PwMTray::updateTree(PwMDoc *document) 324void PwMTray::updateTree(PwMDoc *document)
321{ 325{
322 PWM_ASSERT(document); 326 PWM_ASSERT(document);
323 KPopupMenu *treeEntry; 327 KPopupMenu *treeEntry;
324 int treeItemNum = -1; 328 int treeItemNum = -1;
325 int id = findTreeEntry(document, &treeEntry, &treeItemNum); 329 int id = findTreeEntry(document, &treeEntry, &treeItemNum);
326 if (id == -1) { 330 if (id == -1) {
327 // tree-entry doesn't exist, yet. 331 // tree-entry doesn't exist, yet.
328 id = insertTreeEntry(document, &treeEntry); 332 id = insertTreeEntry(document, &treeEntry);
329 } 333 }
330 if (treeItemNum != -1) { 334 if (treeItemNum != -1) {
331 // delete all *old* active items 335 // delete all *old* active items
332 KPopupMenu *ctxMenu = contextMenu(); 336 KPopupMenu *ctxMenu = contextMenu();
333 QValueList<int> *oldItems = &tree[treeItemNum].activeItems; 337 QValueList<int> *oldItems = &tree[treeItemNum].activeItems;
334#ifndef PWM_EMBEDDED 338#ifndef PWM_EMBEDDED
335 QValueList<int>::iterator i = oldItems->begin(); 339 QValueList<int>::iterator i = oldItems->begin();
336#else 340#else
337 QValueList<int>::Iterator i = oldItems->begin(); 341 QValueList<int>::Iterator i = oldItems->begin();
338#endif 342#endif
339 while (i != oldItems->end()) { 343 while (i != oldItems->end()) {
340 ctxMenu->removeItem(*i); 344 ctxMenu->removeItem(*i);
341 ++i; 345 ++i;
342 } 346 }
343 oldItems->clear(); 347 oldItems->clear();
344 ctxMenu->changeItem(id, document->getTitle()); 348 ctxMenu->changeItem(id, document->getTitle());
345 } 349 }
346 350
347 treeItem newTreeItem; 351 treeItem newTreeItem;
348 if (document->isDeepLocked()) { 352 if (document->isDeepLocked()) {
349 treeEntry->clear(); 353 treeEntry->clear();
350 #ifndef PWM_EMBEDDED 354 #ifndef PWM_EMBEDDED
351 treeEntry->insertTitle(i18n("Categories:")); 355 treeEntry->insertTitle(i18n("Categories:"));
352#endif 356#endif
353 QString msg(IS_DEEPLOCKED_SHORTMSG); 357 QString msg(IS_DEEPLOCKED_SHORTMSG);
354 msg += " "; 358 msg += " ";
355 msg += i18n("(Click here to unlock)"); 359 msg += i18n("(Click here to unlock)");
356 treeEntry->insertItem(msg, document, 360 treeEntry->insertItem(msg, document,
357 SLOT(_deepUnlock())); 361 SLOT(_deepUnlock()));
358 insertMainWndCtrl(treeEntry, document); 362 insertMainWndCtrl(treeEntry, document);
359 } else { 363 } else {
360 rebuildTree(treeEntry, document, &newTreeItem.activeItems); 364 rebuildTree(treeEntry, document, &newTreeItem.activeItems);
361 } 365 }
362 newTreeItem.menuId = id; 366 newTreeItem.menuId = id;
363 newTreeItem.doc = document; 367 newTreeItem.doc = document;
364 newTreeItem.menu = treeEntry; 368 newTreeItem.menu = treeEntry;
365 if (treeItemNum == -1) { 369 if (treeItemNum == -1) {
366#ifndef PWM_EMBEDDED 370#ifndef PWM_EMBEDDED
367 tree.push_back(newTreeItem); 371 tree.push_back(newTreeItem);
368#else 372#else
369 tree.append(newTreeItem); 373 tree.append(newTreeItem);
370#endif 374#endif
371 } else { 375 } else {
372 tree[treeItemNum] = newTreeItem; 376 tree[treeItemNum] = newTreeItem;
373 } 377 }
374} 378}
375 379
376void PwMTray::closeTreeEntry(PwMDoc *document) 380void PwMTray::closeTreeEntry(PwMDoc *document)
377{ 381{
378 KPopupMenu *menu; 382 KPopupMenu *menu;
379 int treeItem; 383 int treeItem;
380 int id = findTreeEntry(document, &menu, &treeItem); 384 int id = findTreeEntry(document, &menu, &treeItem);
381 if (id != -1) { 385 if (id != -1) {
382 removeTreeEntry(id, treeItem, &menu); 386 removeTreeEntry(id, treeItem, &menu);
383 } 387 }
384} 388}
385 389
386int PwMTray::findTreeEntry(PwMDoc *doc, KPopupMenu **menu, int *treeItem) 390int PwMTray::findTreeEntry(PwMDoc *doc, KPopupMenu **menu, int *treeItem)
387{ 391{
388 PWM_ASSERT(doc); 392 PWM_ASSERT(doc);
389#ifndef PWM_EMBEDDED 393#ifndef PWM_EMBEDDED
390 int i, count = tree.size(); 394 int i, count = tree.size();
391#else 395#else
392 int i, count = tree.count(); 396 int i, count = tree.count();
393#endif 397#endif
394 for (i = 0; i < count; ++i) { 398 for (i = 0; i < count; ++i) {
395 if (tree[i].doc == doc) { 399 if (tree[i].doc == doc) {
396 if (menu) 400 if (menu)
397 *menu = tree[i].menu; 401 *menu = tree[i].menu;
398 if (treeItem) 402 if (treeItem)
399 *treeItem = i; 403 *treeItem = i;
400 return tree[i].menuId; 404 return tree[i].menuId;
401 } 405 }
402 } 406 }
403 if (menu) 407 if (menu)
404 *menu = 0; 408 *menu = 0;
405 if (treeItem) 409 if (treeItem)
406 *treeItem = -1; 410 *treeItem = -1;
407 return -1; 411 return -1;
408} 412}
409 413
410int PwMTray::insertTreeEntry(PwMDoc *doc, KPopupMenu **popup) 414int PwMTray::insertTreeEntry(PwMDoc *doc, KPopupMenu **popup)
411{ 415{
412 PWM_ASSERT(doc); 416 PWM_ASSERT(doc);
413 PWM_ASSERT(popup); 417 PWM_ASSERT(popup);
414 KPopupMenu *ctxMenu = contextMenu(); 418 KPopupMenu *ctxMenu = contextMenu();
415 *popup = new KPopupMenu(ctxMenu); 419 *popup = new KPopupMenu(ctxMenu);
416 return ctxMenu->insertItem(doc->getTitle(), *popup, -1, 1); 420 return ctxMenu->insertItem(doc->getTitle(), *popup, -1, 1);
417} 421}
418 422
419void PwMTray::removeTreeEntry(int menuId, int treeItem, KPopupMenu **menu) 423void PwMTray::removeTreeEntry(int menuId, int treeItem, KPopupMenu **menu)
420{ 424{
421 PWM_ASSERT(menu); 425 PWM_ASSERT(menu);
422 KPopupMenu *ctxMenu = contextMenu(); 426 KPopupMenu *ctxMenu = contextMenu();
423 ctxMenu->removeItem(menuId); 427 ctxMenu->removeItem(menuId);
424 delete_and_null(*menu); 428 delete_and_null(*menu);
425#ifndef PWM_EMBEDDED 429#ifndef PWM_EMBEDDED
426 tree.erase(tree.at(treeItem)); 430 tree.erase(tree.at(treeItem));
427#else 431#else
428 tree.remove(tree.at(treeItem)); 432 tree.remove(tree.at(treeItem));
429#endif 433#endif
430} 434}
431 435
432void PwMTray::mouseReleaseEvent(QMouseEvent *e) 436void PwMTray::mouseReleaseEvent(QMouseEvent *e)
433{ 437{
434 QWidget *curWnd = init->curWidget(); 438 QWidget *curWnd = init->curWidget();
435 KPopupMenu *ctxMenu = contextMenu(); 439 KPopupMenu *ctxMenu = contextMenu();
436 // give focus to init->curWidget() 440 // give focus to init->curWidget()
437 if (curWnd && !curWnd->hasFocus()) { 441 if (curWnd && !curWnd->hasFocus()) {
438 curWnd->hide(); 442 curWnd->hide();
439 curWnd->showNormal(); 443 curWnd->showNormal();
440 curWnd->setFocus(); 444 curWnd->setFocus();
441 } 445 }
442 // popup the context menu 446 // popup the context menu
443 ctxMenu->popup(e->globalPos()); 447 ctxMenu->popup(e->globalPos());
444 emit clickedIcon(this); 448 emit clickedIcon(this);
445} 449}
446 450
447void PwMTray::connectDocToTray(PwMDoc *doc) 451void PwMTray::connectDocToTray(PwMDoc *doc)
448{ 452{
449 connect(doc, SIGNAL(dataChanged(PwMDoc *)), 453 connect(doc, SIGNAL(dataChanged(PwMDoc *)),
450 this, SLOT(updateTree(PwMDoc *))); 454 this, SLOT(updateTree(PwMDoc *)));
451 connect(doc, SIGNAL(docClosed(PwMDoc *)), 455 connect(doc, SIGNAL(docClosed(PwMDoc *)),
452 this, SLOT(closeTreeEntry(PwMDoc *))); 456 this, SLOT(closeTreeEntry(PwMDoc *)));
453 // fake a dataChanged signal for this doc to update the tray tree. 457 // fake a dataChanged signal for this doc to update the tray tree.
454 updateTree(doc); 458 updateTree(doc);
455} 459}
456 460
457void PwMTray::openDoc() 461void PwMTray::openDoc()
458{ 462{
459 // open the document in a new window. 463 // open the document in a new window.
460 PwM *newInstance = init->createMainWnd(); 464 PwM *newInstance = init->createMainWnd();
461 PwMDoc *newDoc = newInstance->openDoc(""); 465 PwMDoc *newDoc = newInstance->openDoc("");
462 if (!newDoc) { 466 if (!newDoc) {
463 newInstance->setForceQuit(true); 467 newInstance->setForceQuit(true);
464 delete_and_null(newInstance); 468 delete_and_null(newInstance);
465 } 469 }
466} 470}
467 471
468void PwMTray::newMainWnd() 472void PwMTray::newMainWnd()
469{ 473{
470 init->createMainWnd(); 474 init->createMainWnd();
471} 475}
472 476
473void PwMTray::undock() 477void PwMTray::undock()
474{ 478{
475 conf()->confGlobTray(false); 479 conf()->confGlobTray(false);
476 init->initTray(); 480 init->initTray();
477 // Attention! "this" is already deleted here! 481 // Attention! "this" is already deleted here!
478} 482}
479 483
480#ifndef PWM_EMBEDDED 484#ifndef PWM_EMBEDDED
481#include "pwmtray.moc" 485#include "pwmtray.moc"
482#endif 486#endif
diff --git a/pwmanager/pwmanager/pwmview.cpp b/pwmanager/pwmanager/pwmview.cpp
index c09fbf5..58c2fca 100644
--- a/pwmanager/pwmanager/pwmview.cpp
+++ b/pwmanager/pwmanager/pwmview.cpp
@@ -1,452 +1,456 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2003, 2004 by Michael Buesch * 3 * copyright (C) 2003, 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * copyright (C) 2004 by Ulf Schenk 13 * copyright (C) 2004 by Ulf Schenk
14 * This file is originaly based on version 1.0.1 of pwmanager 14 * This file is originaly based on version 1.0.1 of pwmanager
15 * and was modified to run on embedded devices that run microkde 15 * and was modified to run on embedded devices that run microkde
16 * 16 *
17 * $Id$ 17 * $Id$
18 **************************************************************************/ 18 **************************************************************************/
19 19
20#include "pwmview.h" 20#include "pwmview.h"
21#include "pwmexception.h" 21#include "pwmexception.h"
22#include "globalstuff.h" 22#include "globalstuff.h"
23#include "pwm.h" 23#include "pwm.h"
24#include "rencatwnd.h" 24#include "rencatwnd.h"
25#ifndef PWM_EMBEDDED
25#include "configuration.h" 26#include "configuration.h"
27#else
28#include "pwmprefs.h"
29#endif
26#include "commentbox.h" 30#include "commentbox.h"
27 31
28#include <kmessagebox.h> 32#include <kmessagebox.h>
29#include <klocale.h> 33#include <klocale.h>
30 34
31#include <qlineedit.h> 35#include <qlineedit.h>
32#include <qpoint.h> 36#include <qpoint.h>
33#include <qapplication.h> 37#include <qapplication.h>
34 38
35 #define COLUMN_DESC 0 39 #define COLUMN_DESC 0
36 #define COLUMN_NAME 1 40 #define COLUMN_NAME 1
37 #define COLUMN_PW 2 41 #define COLUMN_PW 2
38 #define COLUMN_URL 3 42 #define COLUMN_URL 3
39 #define COLUMN_LAUNCHER 4 43 #define COLUMN_LAUNCHER 4
40 44
41 45
42PwMView::PwMView(PwM *_mainClass, 46PwMView::PwMView(PwM *_mainClass,
43 QWidget *parent, PwMDoc *_doc, 47 QWidget *parent, PwMDoc *_doc,
44 const char *name) 48 const char *name)
45 : PwMViewStyle(parent, name) 49 : PwMViewStyle(parent, name)
46{ 50{
47 PWM_ASSERT(_mainClass); 51 PWM_ASSERT(_mainClass);
48 PWM_ASSERT(parent); 52 PWM_ASSERT(parent);
49 PWM_ASSERT(_doc); 53 PWM_ASSERT(_doc);
50 setView(this); 54 setView(this);
51 doc = _doc; 55 doc = _doc;
52 doc->setListViewPointer(this); 56 doc->setListViewPointer(this);
53 mainClass = _mainClass; 57 mainClass = _mainClass;
54 resize(_mainClass->size()); 58 resize(_mainClass->size());
55 initStyle(conf()->confWndMainViewStyle()); 59 initStyle(conf()->confWndMainViewStyle());
56 initCtxMenu(); 60 initCtxMenu();
57 doc->setCurrentView(this); 61 doc->setCurrentView(this);
58 connect(doc, SIGNAL(dataChanged(PwMDoc *)), this, SLOT(updateView())); 62 connect(doc, SIGNAL(dataChanged(PwMDoc *)), this, SLOT(updateView()));
59} 63}
60 64
61PwMView::~PwMView() 65PwMView::~PwMView()
62{ 66{
63} 67}
64 68
65void PwMView::initCtxMenu() 69void PwMView::initCtxMenu()
66{ 70{
67 ctxMenu = new QPopupMenu(this); 71 ctxMenu = new QPopupMenu(this);
68 ctxMenu->insertItem(i18n("&Add password"), mainClass, SLOT(addPwd_slot())); 72 ctxMenu->insertItem(i18n("&Add password"), mainClass, SLOT(addPwd_slot()));
69 ctxMenu->insertSeparator(); 73 ctxMenu->insertSeparator();
70 ctxMenu->insertItem(i18n("&Edit"), mainClass, SLOT(editPwd_slot())); 74 ctxMenu->insertItem(i18n("&Edit"), mainClass, SLOT(editPwd_slot()));
71 ctxMenu->insertItem(i18n("&Delete"), mainClass, SLOT(deletePwd_slot())); 75 ctxMenu->insertItem(i18n("&Delete"), mainClass, SLOT(deletePwd_slot()));
72 ctxMenu->insertSeparator(); 76 ctxMenu->insertSeparator();
73 ctxMenu->insertItem(i18n("copy password to clipboard"), 77 ctxMenu->insertItem(i18n("copy password to clipboard"),
74 this, SLOT(copyPwToClip())); 78 this, SLOT(copyPwToClip()));
75 ctxMenu->insertItem(i18n("copy username to clipboard"), 79 ctxMenu->insertItem(i18n("copy username to clipboard"),
76 this, SLOT(copyNameToClip())); 80 this, SLOT(copyNameToClip()));
77 ctxMenu->insertItem(i18n("copy description to clipboard"), 81 ctxMenu->insertItem(i18n("copy description to clipboard"),
78 this, SLOT(copyDescToClip())); 82 this, SLOT(copyDescToClip()));
79 ctxMenu->insertItem(i18n("copy url to clipboard"), 83 ctxMenu->insertItem(i18n("copy url to clipboard"),
80 this, SLOT(copyUrlToClip())); 84 this, SLOT(copyUrlToClip()));
81 ctxMenu->insertItem(i18n("copy launcher to clipboard"), 85 ctxMenu->insertItem(i18n("copy launcher to clipboard"),
82 this, SLOT(copyLauncherToClip())); 86 this, SLOT(copyLauncherToClip()));
83 ctxMenu->insertItem(i18n("copy comment to clipboard"), 87 ctxMenu->insertItem(i18n("copy comment to clipboard"),
84 this, SLOT(copyCommentToClip())); 88 this, SLOT(copyCommentToClip()));
85 ctxMenu->insertSeparator(); 89 ctxMenu->insertSeparator();
86 ctxMenu->insertItem(i18n("Execute \"Launcher\""), mainClass, 90 ctxMenu->insertItem(i18n("Execute \"Launcher\""), mainClass,
87 SLOT(execLauncher_slot())); 91 SLOT(execLauncher_slot()));
88 ctxMenu->insertItem(i18n("Go to \"URL\""), mainClass, 92 ctxMenu->insertItem(i18n("Go to \"URL\""), mainClass,
89 SLOT(goToURL_slot())); 93 SLOT(goToURL_slot()));
90} 94}
91 95
92void PwMView::resizeEvent(QResizeEvent *) 96void PwMView::resizeEvent(QResizeEvent *)
93{ 97{
94 resizeView(size()); 98 resizeView(size());
95} 99}
96 100
97void PwMView::refreshCommentTextEdit(QListViewItem *curItem) 101void PwMView::refreshCommentTextEdit(QListViewItem *curItem)
98{ 102{
99 PWM_ASSERT(commentBox); 103 PWM_ASSERT(commentBox);
100 if (!curItem) 104 if (!curItem)
101 return; 105 return;
102 string comment; 106 string comment;
103 PwMerror ret; 107 PwMerror ret;
104 ret = document()->getCommentByLvp(getCurrentCategory(), 108 ret = document()->getCommentByLvp(getCurrentCategory(),
105 lv->childCount() - lv->itemIndex(curItem) - 1, 109 lv->childCount() - lv->itemIndex(curItem) - 1,
106 &comment); 110 &comment);
107 if (ret == e_binEntry) { 111 if (ret == e_binEntry) {
108 commentBox->setContent(i18n("This is a binary entry.\n" 112 commentBox->setContent(i18n("This is a binary entry.\n"
109 "It is not a normal password-entry, as it contains " 113 "It is not a normal password-entry, as it contains "
110 "binary data, which PwManager can't display here.")); 114 "binary data, which PwManager can't display here."));
111 } else if (ret == e_normalEntry) { 115 } else if (ret == e_normalEntry) {
112 commentBox->setContent(comment.c_str()); 116 commentBox->setContent(comment.c_str());
113 } else { 117 } else {
114 BUG(); 118 BUG();
115 return; 119 return;
116 } 120 }
117 lv->ensureItemVisible(curItem); 121 lv->ensureItemVisible(curItem);
118} 122}
119 123
120void PwMView::keyReleaseEvent(QKeyEvent * /*e*/) 124void PwMView::keyReleaseEvent(QKeyEvent * /*e*/)
121{ 125{
122 refreshCommentTextEdit(lv->currentItem()); 126 refreshCommentTextEdit(lv->currentItem());
123} 127}
124 128
125bool PwMView::getCurEntryIndex(unsigned int *index) 129bool PwMView::getCurEntryIndex(unsigned int *index)
126{ 130{
127 QListViewItem *current = lv->currentItem(); 131 QListViewItem *current = lv->currentItem();
128 if (!current) 132 if (!current)
129 return false; 133 return false;
130 return getDocEntryIndex(index, current); 134 return getDocEntryIndex(index, current);
131} 135}
132 136
133bool PwMView::getDocEntryIndex(unsigned int *index, 137bool PwMView::getDocEntryIndex(unsigned int *index,
134 const QListViewItem *item) 138 const QListViewItem *item)
135{ 139{
136 vector<unsigned int> foundPositions; 140 vector<unsigned int> foundPositions;
137 PwMDataItem curItem; 141 PwMDataItem curItem;
138 curItem.desc = item->text(COLUMN_DESC).latin1(); 142 curItem.desc = item->text(COLUMN_DESC).latin1();
139 curItem.name = item->text(COLUMN_NAME).latin1(); 143 curItem.name = item->text(COLUMN_NAME).latin1();
140 document()->getCommentByLvp(getCurrentCategory(), 144 document()->getCommentByLvp(getCurrentCategory(),
141 lv->childCount() - lv->itemIndex(item) - 1, 145 lv->childCount() - lv->itemIndex(item) - 1,
142 &curItem.comment); 146 &curItem.comment);
143 curItem.url = item->text(COLUMN_URL).latin1(); 147 curItem.url = item->text(COLUMN_URL).latin1();
144 curItem.launcher = item->text(COLUMN_LAUNCHER).latin1(); 148 curItem.launcher = item->text(COLUMN_LAUNCHER).latin1();
145 document()->findEntry(getCurrentCategory(), curItem, SEARCH_IN_DESC | 149 document()->findEntry(getCurrentCategory(), curItem, SEARCH_IN_DESC |
146 SEARCH_IN_NAME | SEARCH_IN_COMMENT | SEARCH_IN_URL | 150 SEARCH_IN_NAME | SEARCH_IN_COMMENT | SEARCH_IN_URL |
147 SEARCH_IN_LAUNCHER, 151 SEARCH_IN_LAUNCHER,
148 &foundPositions, true); 152 &foundPositions, true);
149 if (foundPositions.size()) { 153 if (foundPositions.size()) {
150 *index = foundPositions[0]; 154 *index = foundPositions[0];
151 return true; 155 return true;
152 } 156 }
153 157
154 return false; 158 return false;
155} 159}
156 160
157void PwMView::handleToggle(QListViewItem *item) 161void PwMView::handleToggle(QListViewItem *item)
158{ 162{
159 PWM_ASSERT(doc); 163 PWM_ASSERT(doc);
160 if (!item) 164 if (!item)
161 return; 165 return;
162 QCheckListItem *clItem = (QCheckListItem *)item; 166 QCheckListItem *clItem = (QCheckListItem *)item;
163 QString curCat(getCurrentCategory()); 167 QString curCat(getCurrentCategory());
164 168
165 // find document position of this entry. 169 // find document position of this entry.
166 unsigned int curEntryDocIndex; 170 unsigned int curEntryDocIndex;
167 if (!getDocEntryIndex(&curEntryDocIndex, item)) 171 if (!getDocEntryIndex(&curEntryDocIndex, item))
168 return; 172 return;
169 173
170 // hack to refresh the comment, if only one item is present 174 // hack to refresh the comment, if only one item is present
171 if (lv->childCount() == 1) 175 if (lv->childCount() == 1)
172 refreshCommentTextEdit(lv->currentItem()); 176 refreshCommentTextEdit(lv->currentItem());
173 177
174 if (doc->isLocked(curCat, curEntryDocIndex) != clItem->isOn()) 178 if (doc->isLocked(curCat, curEntryDocIndex) != clItem->isOn())
175 return; // this is just a click somewhere on the entry 179 return; // this is just a click somewhere on the entry
176 if (doc->isDeepLocked()) { 180 if (doc->isDeepLocked()) {
177 PwMerror ret; 181 PwMerror ret;
178 ret = doc->deepLock(false); 182 ret = doc->deepLock(false);
179 if (ret != e_success) 183 if (ret != e_success)
180 clItem->setOn(false); 184 clItem->setOn(false);
181 return; 185 return;
182 } 186 }
183 doc->lockAt(curCat, curEntryDocIndex, !clItem->isOn()); 187 doc->lockAt(curCat, curEntryDocIndex, !clItem->isOn());
184} 188}
185 189
186void PwMView::handleRightClick(QListViewItem *item, const QPoint &point, int) 190void PwMView::handleRightClick(QListViewItem *item, const QPoint &point, int)
187{ 191{
188 if (!item) 192 if (!item)
189 return; 193 return;
190 ctxMenu->move(point); 194 ctxMenu->move(point);
191 /* don't use ctxMenu->exec() here, as it generates race conditions 195 /* don't use ctxMenu->exec() here, as it generates race conditions
192 * with the card interface code. Believe it or not. :) 196 * with the card interface code. Believe it or not. :)
193 */ 197 */
194 ctxMenu->show(); 198 ctxMenu->show();
195} 199}
196 200
197void PwMView::updateCategories() 201void PwMView::updateCategories()
198{ 202{
199 QString oldSel(getCurrentCategory()); 203 QString oldSel(getCurrentCategory());
200 delAllCategories(); 204 delAllCategories();
201 QStringList catList; 205 QStringList catList;
202 document()->getCategoryList(&catList); 206 document()->getCategoryList(&catList);
203 catList.sort(); 207 catList.sort();
204#ifndef PWM_EMBEDDED 208#ifndef PWM_EMBEDDED
205 QStringList::iterator i = catList.begin(), 209 QStringList::iterator i = catList.begin(),
206 end = catList.end(); 210 end = catList.end();
207#else 211#else
208 QStringList::Iterator i = catList.begin(), 212 QStringList::Iterator i = catList.begin(),
209 end = catList.end(); 213 end = catList.end();
210#endif 214#endif
211 while (i != end) { 215 while (i != end) {
212 addCategory(*i); 216 addCategory(*i);
213 ++i; 217 ++i;
214 } 218 }
215 selectCategory(oldSel); 219 selectCategory(oldSel);
216} 220}
217 221
218void PwMView::shiftToView() 222void PwMView::shiftToView()
219{ 223{
220 int cX = lv->contentsX(); 224 int cX = lv->contentsX();
221 int cY = lv->contentsY(); 225 int cY = lv->contentsY();
222 commentBox->clear(); 226 commentBox->clear();
223 227
224 unsigned int catDocIndex; 228 unsigned int catDocIndex;
225 if (unlikely( 229 if (unlikely(
226 !(document()->findCategory(getCurrentCategory(), 230 !(document()->findCategory(getCurrentCategory(),
227 &catDocIndex)))) { 231 &catDocIndex)))) {
228 BUG(); 232 BUG();
229 } 233 }
230 234
231 // ensure all listViewPos are set 235 // ensure all listViewPos are set
232 doc->ensureLvp(); 236 doc->ensureLvp();
233 237
234 // clear all tmp-data vectors 238 // clear all tmp-data vectors
235 unsigned int i, entries = doc->numEntries(catDocIndex); 239 unsigned int i, entries = doc->numEntries(catDocIndex);
236 if (entries) { 240 if (entries) {
237 mainClass->setVirgin(false); 241 mainClass->setVirgin(false);
238 } 242 }
239 vector<PwMDataItem> tmpSorted; 243 vector<PwMDataItem> tmpSorted;
240 PwMDataItem currItem; 244 PwMDataItem currItem;
241 currItem.clear(); 245 currItem.clear();
242 tmpSorted.insert(tmpSorted.begin(), entries, currItem); 246 tmpSorted.insert(tmpSorted.begin(), entries, currItem);
243 247
244 // Sort items and store them in tempoary tmpSorted. 248 // Sort items and store them in tempoary tmpSorted.
245 for (i = 0; i < entries; ++i) { 249 for (i = 0; i < entries; ++i) {
246 doc->getEntry(catDocIndex, i, &currItem); 250 doc->getEntry(catDocIndex, i, &currItem);
247 tmpSorted[currItem.listViewPos] = currItem; 251 tmpSorted[currItem.listViewPos] = currItem;
248 } 252 }
249 253
250 // shift tempoary data to ListView. 254 // shift tempoary data to ListView.
251 tmpDisableSort(); 255 tmpDisableSort();
252 lv->clear(); 256 lv->clear();
253 QCheckListItem *newItem; 257 QCheckListItem *newItem;
254 vector<PwMDataItem>::iterator it = tmpSorted.begin(), 258 vector<PwMDataItem>::iterator it = tmpSorted.begin(),
255 end = tmpSorted.end(); 259 end = tmpSorted.end();
256 while (it != end) { 260 while (it != end) {
257 newItem = new ListViewItemPwM(lv); 261 newItem = new ListViewItemPwM(lv);
258 newItem->setText(COLUMN_DESC, (*it).desc.c_str()); 262 newItem->setText(COLUMN_DESC, (*it).desc.c_str());
259 if ((*it).binary) { 263 if ((*it).binary) {
260 newItem->setText(COLUMN_NAME, ""); 264 newItem->setText(COLUMN_NAME, "");
261 newItem->setText(COLUMN_PW, i18n("<BINARY ENTRY>")); 265 newItem->setText(COLUMN_PW, i18n("<BINARY ENTRY>"));
262 newItem->setText(COLUMN_URL, ""); 266 newItem->setText(COLUMN_URL, "");
263 newItem->setText(COLUMN_LAUNCHER, (*it).launcher.c_str()); 267 newItem->setText(COLUMN_LAUNCHER, (*it).launcher.c_str());
264 } else { 268 } else {
265 newItem->setText(COLUMN_NAME, (*it).name.c_str()); 269 newItem->setText(COLUMN_NAME, (*it).name.c_str());
266 if ((*it).lockStat) { 270 if ((*it).lockStat) {
267 newItem->setText(COLUMN_PW, QString((*it).pw.c_str()) 271 newItem->setText(COLUMN_PW, QString((*it).pw.c_str())
268 + " " 272 + " "
269 + i18n("To unlock click the icon on the left.")); 273 + i18n("To unlock click the icon on the left."));
270 } else { 274 } else {
271 newItem->setText(COLUMN_PW, (*it).pw.c_str()); 275 newItem->setText(COLUMN_PW, (*it).pw.c_str());
272 } 276 }
273 newItem->setText(COLUMN_URL, (*it).url.c_str()); 277 newItem->setText(COLUMN_URL, (*it).url.c_str());
274 newItem->setText(COLUMN_LAUNCHER, (*it).launcher.c_str()); 278 newItem->setText(COLUMN_LAUNCHER, (*it).launcher.c_str());
275 } 279 }
276 newItem->setOn(!((*it).lockStat)); 280 newItem->setOn(!((*it).lockStat));
277 lv->insertItem(newItem); 281 lv->insertItem(newItem);
278 ++it; 282 ++it;
279 } 283 }
280 tmpReEnableSort(); 284 tmpReEnableSort();
281 285
282 if (cY || cX) 286 if (cY || cX)
283 lv->setContentsPos(cX, cY); 287 lv->setContentsPos(cX, cY);
284} 288}
285 289
286void PwMView::reorgLp() 290void PwMView::reorgLp()
287{ 291{
288 if (!lv->childCount()) 292 if (!lv->childCount())
289 return; 293 return;
290 PWM_ASSERT(doc); 294 PWM_ASSERT(doc);
291 PWM_ASSERT(!doc->isDocEmpty()); 295 PWM_ASSERT(!doc->isDocEmpty());
292 QListViewItem *currItem; 296 QListViewItem *currItem;
293 vector<unsigned int> foundPos; 297 vector<unsigned int> foundPos;
294 /* This searchIn _should_ be: 298 /* This searchIn _should_ be:
295 *const unsigned int searchIn = SEARCH_IN_DESC; 299 *const unsigned int searchIn = SEARCH_IN_DESC;
296 * But we want backward compatibility (see comment in PwMDoc::addEntry()). 300 * But we want backward compatibility (see comment in PwMDoc::addEntry()).
297 * So we need to search again, if we don't find the entry. (see below) 301 * So we need to search again, if we don't find the entry. (see below)
298 */ 302 */
299 const unsigned int searchIn = SEARCH_IN_DESC | SEARCH_IN_NAME | 303 const unsigned int searchIn = SEARCH_IN_DESC | SEARCH_IN_NAME |
300 SEARCH_IN_URL | SEARCH_IN_LAUNCHER; 304 SEARCH_IN_URL | SEARCH_IN_LAUNCHER;
301 QString curCat(getCurrentCategory()); 305 QString curCat(getCurrentCategory());
302 PwMDataItem findThis; 306 PwMDataItem findThis;
303 unsigned int i, cnt = lv->childCount(); 307 unsigned int i, cnt = lv->childCount();
304 for (i = 0; i < cnt; ++i) { 308 for (i = 0; i < cnt; ++i) {
305 currItem = lv->itemAtIndex(i); 309 currItem = lv->itemAtIndex(i);
306 findThis.desc = currItem->text(COLUMN_DESC).latin1(); 310 findThis.desc = currItem->text(COLUMN_DESC).latin1();
307 findThis.name = currItem->text(COLUMN_NAME).latin1(); 311 findThis.name = currItem->text(COLUMN_NAME).latin1();
308 findThis.url = currItem->text(COLUMN_URL).latin1(); 312 findThis.url = currItem->text(COLUMN_URL).latin1();
309 findThis.launcher = currItem->text(COLUMN_LAUNCHER).latin1(); 313 findThis.launcher = currItem->text(COLUMN_LAUNCHER).latin1();
310 doc->findEntry(curCat, findThis, searchIn, 314 doc->findEntry(curCat, findThis, searchIn,
311 &foundPos, true); 315 &foundPos, true);
312 if (!foundPos.size()) { 316 if (!foundPos.size()) {
313 /* Did not find the entry. We seem to have a binary 317 /* Did not find the entry. We seem to have a binary
314 * entry here (pray for it!). So search again with 318 * entry here (pray for it!). So search again with
315 * the "correct" searchIn flags. 319 * the "correct" searchIn flags.
316 */ 320 */
317 const unsigned int searchIn2 = SEARCH_IN_DESC; 321 const unsigned int searchIn2 = SEARCH_IN_DESC;
318 doc->findEntry(curCat, findThis, searchIn2, 322 doc->findEntry(curCat, findThis, searchIn2,
319 &foundPos, true); 323 &foundPos, true);
320 if (unlikely(!foundPos.size())) { 324 if (unlikely(!foundPos.size())) {
321 BUG(); 325 BUG();
322 continue; 326 continue;
323 } 327 }
324 /* We assert that it's a binary entry, now. 328 /* We assert that it's a binary entry, now.
325 * No chance to efficiently verify it here. 329 * No chance to efficiently verify it here.
326 */ 330 */
327 } 331 }
328 doc->setListViewPos(curCat, foundPos[0], cnt - i - 1); 332 doc->setListViewPos(curCat, foundPos[0], cnt - i - 1);
329 } 333 }
330} 334}
331 335
332void PwMView::selAt(int index) 336void PwMView::selAt(int index)
333{ 337{
334 QListViewItem *item = lv->itemAtIndex(index); 338 QListViewItem *item = lv->itemAtIndex(index);
335 if (!item) 339 if (!item)
336 return; 340 return;
337 lv->setCurrentItem(item); 341 lv->setCurrentItem(item);
338 lv->ensureItemVisible(item); 342 lv->ensureItemVisible(item);
339} 343}
340 344
341void PwMView::renCatButton_slot() 345void PwMView::renCatButton_slot()
342{ 346{
343 if (doc->isDeepLocked()) 347 if (doc->isDeepLocked())
344 return; 348 return;
345 RenCatWnd wnd(this); 349 RenCatWnd wnd(this);
346 if (wnd.exec() == 1) { 350 if (wnd.exec() == 1) {
347 QString newName(wnd.getNewName()); 351 QString newName(wnd.getNewName());
348 if (newName == "") 352 if (newName == "")
349 return; 353 return;
350 document()->renameCategory(getCurrentCategory(), 354 document()->renameCategory(getCurrentCategory(),
351 newName); 355 newName);
352 } 356 }
353} 357}
354 358
355void PwMView::delCatButton_slot() 359void PwMView::delCatButton_slot()
356{ 360{
357 if (doc->isDeepLocked()) 361 if (doc->isDeepLocked())
358 return; 362 return;
359 if (numCategories() <= 1) { 363 if (numCategories() <= 1) {
360 mainClass->showStatMsg(i18n("Can't remove the last category.")); 364 mainClass->showStatMsg(i18n("Can't remove the last category."));
361 return; 365 return;
362 } 366 }
363 if (KMessageBox::questionYesNo(this, 367 if (KMessageBox::questionYesNo(this,
364 i18n("Do you really want to " 368 i18n("Do you really want to "
365 "delete the selected " 369 "delete the selected "
366 "category? All password-" 370 "category? All password-"
367 "entries will be lost in " 371 "entries will be lost in "
368 "this category!"), 372 "this category!"),
369 i18n("Delete category?")) 373 i18n("Delete category?"))
370 == KMessageBox::No) { 374 == KMessageBox::No) {
371 return; 375 return;
372 } 376 }
373 document()->delCategory(getCurrentCategory()); 377 document()->delCategory(getCurrentCategory());
374} 378}
375 379
376void PwMView::copyPwToClip() 380void PwMView::copyPwToClip()
377{ 381{
378 if (doc->isDeepLocked()) 382 if (doc->isDeepLocked())
379 return; 383 return;
380 unsigned int curIndex = 0; 384 unsigned int curIndex = 0;
381 if (!getCurEntryIndex(&curIndex)) 385 if (!getCurEntryIndex(&curIndex))
382 return; 386 return;
383 PwMDataItem d; 387 PwMDataItem d;
384 document()->getDataChangedLock(); 388 document()->getDataChangedLock();
385 document()->getEntry(getCurrentCategory(), curIndex, &d, true); 389 document()->getEntry(getCurrentCategory(), curIndex, &d, true);
386 document()->putDataChangedLock(); 390 document()->putDataChangedLock();
387 PwM::copyToClipboard(d.pw.c_str()); 391 PwM::copyToClipboard(d.pw.c_str());
388} 392}
389 393
390void PwMView::copyNameToClip() 394void PwMView::copyNameToClip()
391{ 395{
392 if (doc->isDeepLocked()) 396 if (doc->isDeepLocked())
393 return; 397 return;
394 unsigned int curIndex = 0; 398 unsigned int curIndex = 0;
395 if (!getCurEntryIndex(&curIndex)) 399 if (!getCurEntryIndex(&curIndex))
396 return; 400 return;
397 PwMDataItem d; 401 PwMDataItem d;
398 document()->getEntry(getCurrentCategory(), curIndex, &d); 402 document()->getEntry(getCurrentCategory(), curIndex, &d);
399 PwM::copyToClipboard(d.name.c_str()); 403 PwM::copyToClipboard(d.name.c_str());
400} 404}
401 405
402void PwMView::copyDescToClip() 406void PwMView::copyDescToClip()
403{ 407{
404 if (doc->isDeepLocked()) 408 if (doc->isDeepLocked())
405 return; 409 return;
406 unsigned int curIndex = 0; 410 unsigned int curIndex = 0;
407 if (!getCurEntryIndex(&curIndex)) 411 if (!getCurEntryIndex(&curIndex))
408 return; 412 return;
409 PwMDataItem d; 413 PwMDataItem d;
410 document()->getEntry(getCurrentCategory(), curIndex, &d); 414 document()->getEntry(getCurrentCategory(), curIndex, &d);
411 PwM::copyToClipboard(d.desc.c_str()); 415 PwM::copyToClipboard(d.desc.c_str());
412} 416}
413 417
414void PwMView::copyUrlToClip() 418void PwMView::copyUrlToClip()
415{ 419{
416 if (doc->isDeepLocked()) 420 if (doc->isDeepLocked())
417 return; 421 return;
418 unsigned int curIndex = 0; 422 unsigned int curIndex = 0;
419 if (!getCurEntryIndex(&curIndex)) 423 if (!getCurEntryIndex(&curIndex))
420 return; 424 return;
421 PwMDataItem d; 425 PwMDataItem d;
422 document()->getEntry(getCurrentCategory(), curIndex, &d); 426 document()->getEntry(getCurrentCategory(), curIndex, &d);
423 PwM::copyToClipboard(d.url.c_str()); 427 PwM::copyToClipboard(d.url.c_str());
424} 428}
425 429
426void PwMView::copyLauncherToClip() 430void PwMView::copyLauncherToClip()
427{ 431{
428 if (doc->isDeepLocked()) 432 if (doc->isDeepLocked())
429 return; 433 return;
430 unsigned int curIndex = 0; 434 unsigned int curIndex = 0;
431 if (!getCurEntryIndex(&curIndex)) 435 if (!getCurEntryIndex(&curIndex))
432 return; 436 return;
433 PwMDataItem d; 437 PwMDataItem d;
434 document()->getEntry(getCurrentCategory(), curIndex, &d); 438 document()->getEntry(getCurrentCategory(), curIndex, &d);
435 PwM::copyToClipboard(d.launcher.c_str()); 439 PwM::copyToClipboard(d.launcher.c_str());
436} 440}
437 441
438void PwMView::copyCommentToClip() 442void PwMView::copyCommentToClip()
439{ 443{
440 if (doc->isDeepLocked()) 444 if (doc->isDeepLocked())
441 return; 445 return;
442 unsigned int curIndex = 0; 446 unsigned int curIndex = 0;
443 if (!getCurEntryIndex(&curIndex)) 447 if (!getCurEntryIndex(&curIndex))
444 return; 448 return;
445 PwMDataItem d; 449 PwMDataItem d;
446 document()->getEntry(getCurrentCategory(), curIndex, &d); 450 document()->getEntry(getCurrentCategory(), curIndex, &d);
447 PwM::copyToClipboard(d.comment.c_str()); 451 PwM::copyToClipboard(d.comment.c_str());
448} 452}
449 453
450#ifndef PWM_EMBEDDED 454#ifndef PWM_EMBEDDED
451#include "pwmview.moc" 455#include "pwmview.moc"
452#endif 456#endif
diff --git a/pwmanager/pwmanager/serializer.cpp b/pwmanager/pwmanager/serializer.cpp
index 65e442d..f29ef6c 100644
--- a/pwmanager/pwmanager/serializer.cpp
+++ b/pwmanager/pwmanager/serializer.cpp
@@ -1,664 +1,665 @@
1/*************************************************************************** 1/***************************************************************************
2 * * 2 * *
3 * copyright (C) 2004 by Michael Buesch * 3 * copyright (C) 2004 by Michael Buesch *
4 * email: mbuesch@freenet.de * 4 * email: mbuesch@freenet.de *
5 * * 5 * *
6 * This program is free software; you can redistribute it and/or modify * 6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License version 2 * 7 * it under the terms of the GNU General Public License version 2 *
8 * as published by the Free Software Foundation. * 8 * as published by the Free Software Foundation. *
9 * * 9 * *
10 ***************************************************************************/ 10 ***************************************************************************/
11 11
12 12
13/*************************************************************************** 13/***************************************************************************
14 * copyright (C) 2004 by Ulf Schenk 14 * copyright (C) 2004 by Ulf Schenk
15 * This file is originaly based on version 2.0 of pwmanager 15 * This file is originaly based on version 2.0 of pwmanager
16 * and was modified to run on embedded devices that run microkde 16 * and was modified to run on embedded devices that run microkde
17 * 17 *
18 * $Id$ 18 * $Id$
19 **************************************************************************/ 19 **************************************************************************/
20 20
21#include "serializer.h" 21#include "serializer.h"
22#include "pwmexception.h" 22#include "pwmexception.h"
23 23
24#ifdef PWM_EMBEDDED 24#ifdef PWM_EMBEDDED
25#include <kglobal.h>
25#include <klocale.h> 26#include <klocale.h>
26#endif 27#endif
27 28
28/* enable/disable serializer debugging (0/1) */ 29/* enable/disable serializer debugging (0/1) */
29 #define SERIALIZER_DEBUG0 30 #define SERIALIZER_DEBUG0
30/* use the old xml tags for writing (0/1) */ 31/* use the old xml tags for writing (0/1) */
31 #define USE_OLD_TAGS 0 32 #define USE_OLD_TAGS 0
32/* write a CDATA section (0/1) */ 33/* write a CDATA section (0/1) */
33 #define WRITE_CDATA_SEC 0 34 #define WRITE_CDATA_SEC 0
34 35
35 36
36 #define META_CREATE_DATE"c" 37 #define META_CREATE_DATE"c"
37 #define META_VALID_DATE "v" 38 #define META_VALID_DATE "v"
38 #define META_EXPIRE_DATE"e" 39 #define META_EXPIRE_DATE"e"
39 #define META_UPDATE_DATE"u" 40 #define META_UPDATE_DATE"u"
40 #define META_UPDATE_INT "i" 41 #define META_UPDATE_INT "i"
41//US ENH : uniqueid 42//US ENH : uniqueid
42#define META_UNIQUEID "n" 43#define META_UNIQUEID "n"
43 44
44/* This is compatibility stuff. 45/* This is compatibility stuff.
45 * The names of the entries have changed and here are the 46 * The names of the entries have changed and here are the
46 * new and old ones 47 * new and old ones
47 */ 48 */
48 #define ROOT_MAGIC_OLD "PwM-xml-dat" 49 #define ROOT_MAGIC_OLD "PwM-xml-dat"
49 #define VER_STR_OLD "ver" 50 #define VER_STR_OLD "ver"
50 #define COMPAT_VER_OLD "0x02" 51 #define COMPAT_VER_OLD "0x02"
51 #define CAT_ROOT_OLD "categories" 52 #define CAT_ROOT_OLD "categories"
52 #define CAT_PREFIX_OLD "cat_" 53 #define CAT_PREFIX_OLD "cat_"
53 #define CAT_NAME_OLD "name" 54 #define CAT_NAME_OLD "name"
54 #define ENTRY_PREFIX_OLD"entry_" 55 #define ENTRY_PREFIX_OLD"entry_"
55 #define ENTRY_DESC_OLD "desc" 56 #define ENTRY_DESC_OLD "desc"
56 #define ENTRY_NAME_OLD "name" 57 #define ENTRY_NAME_OLD "name"
57 #define ENTRY_PW_OLD "pw" 58 #define ENTRY_PW_OLD "pw"
58 #define ENTRY_COMMENT_OLD"comment" 59 #define ENTRY_COMMENT_OLD"comment"
59 #define ENTRY_URL_OLD "url" 60 #define ENTRY_URL_OLD "url"
60 #define ENTRY_LAUNCHER_OLD"launcher" 61 #define ENTRY_LAUNCHER_OLD"launcher"
61 #define ENTRY_LVP_OLD "listViewPos" 62 #define ENTRY_LVP_OLD "listViewPos"
62 #define ENTRY_BIN_OLD "b" 63 #define ENTRY_BIN_OLD "b"
63 #define ENTRY_META_OLD "m" 64 #define ENTRY_META_OLD "m"
64 65
65 #define ROOT_MAGIC_NEW "P" 66 #define ROOT_MAGIC_NEW "P"
66 #define VER_STR_NEW "v" 67 #define VER_STR_NEW "v"
67 #define COMPAT_VER_NEW "2" 68 #define COMPAT_VER_NEW "2"
68 #define CAT_ROOT_NEW "c" 69 #define CAT_ROOT_NEW "c"
69 #define CAT_PREFIX_NEW "c" 70 #define CAT_PREFIX_NEW "c"
70 #define CAT_NAME_NEW "n" 71 #define CAT_NAME_NEW "n"
71 #define ENTRY_PREFIX_NEW"e" 72 #define ENTRY_PREFIX_NEW"e"
72 #define ENTRY_DESC_NEW "d" 73 #define ENTRY_DESC_NEW "d"
73 #define ENTRY_NAME_NEW "n" 74 #define ENTRY_NAME_NEW "n"
74 #define ENTRY_PW_NEW "p" 75 #define ENTRY_PW_NEW "p"
75 #define ENTRY_COMMENT_NEW"c" 76 #define ENTRY_COMMENT_NEW"c"
76 #define ENTRY_URL_NEW "u" 77 #define ENTRY_URL_NEW "u"
77 #define ENTRY_LAUNCHER_NEW"l" 78 #define ENTRY_LAUNCHER_NEW"l"
78 #define ENTRY_LVP_NEW "v" 79 #define ENTRY_LVP_NEW "v"
79 #define ENTRY_BIN_NEW ENTRY_BIN_OLD 80 #define ENTRY_BIN_NEW ENTRY_BIN_OLD
80 #define ENTRY_META_NEW ENTRY_META_OLD 81 #define ENTRY_META_NEW ENTRY_META_OLD
81 82
82#if USE_OLD_TAGS != 0 83#if USE_OLD_TAGS != 0
83 # define ROOT_MAGIC_WR ROOT_MAGIC_OLD 84 # define ROOT_MAGIC_WR ROOT_MAGIC_OLD
84 # define VER_STR_WR VER_STR_OLD 85 # define VER_STR_WR VER_STR_OLD
85 # define COMPAT_VER_WR COMPAT_VER_OLD 86 # define COMPAT_VER_WR COMPAT_VER_OLD
86 # define CAT_ROOT_WR CAT_ROOT_OLD 87 # define CAT_ROOT_WR CAT_ROOT_OLD
87 # define CAT_PREFIX_WR CAT_PREFIX_OLD 88 # define CAT_PREFIX_WR CAT_PREFIX_OLD
88 # define CAT_NAME_WR CAT_NAME_OLD 89 # define CAT_NAME_WR CAT_NAME_OLD
89 # define ENTRY_PREFIX_WRENTRY_PREFIX_OLD 90 # define ENTRY_PREFIX_WRENTRY_PREFIX_OLD
90 # define ENTRY_DESC_WR ENTRY_DESC_OLD 91 # define ENTRY_DESC_WR ENTRY_DESC_OLD
91 # define ENTRY_NAME_WR ENTRY_NAME_OLD 92 # define ENTRY_NAME_WR ENTRY_NAME_OLD
92 # define ENTRY_PW_WR ENTRY_PW_OLD 93 # define ENTRY_PW_WR ENTRY_PW_OLD
93 # define ENTRY_COMMENT_WRENTRY_COMMENT_OLD 94 # define ENTRY_COMMENT_WRENTRY_COMMENT_OLD
94 # define ENTRY_URL_WR ENTRY_URL_OLD 95 # define ENTRY_URL_WR ENTRY_URL_OLD
95 # define ENTRY_LAUNCHER_WRENTRY_LAUNCHER_OLD 96 # define ENTRY_LAUNCHER_WRENTRY_LAUNCHER_OLD
96 # define ENTRY_LVP_WR ENTRY_LVP_OLD 97 # define ENTRY_LVP_WR ENTRY_LVP_OLD
97 # define ENTRY_BIN_WR ENTRY_BIN_OLD 98 # define ENTRY_BIN_WR ENTRY_BIN_OLD
98 # define ENTRY_META_WR ENTRY_META_OLD 99 # define ENTRY_META_WR ENTRY_META_OLD
99#else 100#else
100 # define ROOT_MAGIC_WR ROOT_MAGIC_NEW 101 # define ROOT_MAGIC_WR ROOT_MAGIC_NEW
101 # define VER_STR_WR VER_STR_NEW 102 # define VER_STR_WR VER_STR_NEW
102 # define COMPAT_VER_WR COMPAT_VER_NEW 103 # define COMPAT_VER_WR COMPAT_VER_NEW
103 # define CAT_ROOT_WR CAT_ROOT_NEW 104 # define CAT_ROOT_WR CAT_ROOT_NEW
104 # define CAT_PREFIX_WR CAT_PREFIX_NEW 105 # define CAT_PREFIX_WR CAT_PREFIX_NEW
105 # define CAT_NAME_WR CAT_NAME_NEW 106 # define CAT_NAME_WR CAT_NAME_NEW
106 # define ENTRY_PREFIX_WRENTRY_PREFIX_NEW 107 # define ENTRY_PREFIX_WRENTRY_PREFIX_NEW
107 # define ENTRY_DESC_WR ENTRY_DESC_NEW 108 # define ENTRY_DESC_WR ENTRY_DESC_NEW
108 # define ENTRY_NAME_WR ENTRY_NAME_NEW 109 # define ENTRY_NAME_WR ENTRY_NAME_NEW
109 # define ENTRY_PW_WR ENTRY_PW_NEW 110 # define ENTRY_PW_WR ENTRY_PW_NEW
110 # define ENTRY_COMMENT_WRENTRY_COMMENT_NEW 111 # define ENTRY_COMMENT_WRENTRY_COMMENT_NEW
111 # define ENTRY_URL_WR ENTRY_URL_NEW 112 # define ENTRY_URL_WR ENTRY_URL_NEW
112 # define ENTRY_LAUNCHER_WRENTRY_LAUNCHER_NEW 113 # define ENTRY_LAUNCHER_WRENTRY_LAUNCHER_NEW
113 # define ENTRY_LVP_WR ENTRY_LVP_NEW 114 # define ENTRY_LVP_WR ENTRY_LVP_NEW
114 # define ENTRY_BIN_WR ENTRY_BIN_NEW 115 # define ENTRY_BIN_WR ENTRY_BIN_NEW
115 # define ENTRY_META_WR ENTRY_META_NEW 116 # define ENTRY_META_WR ENTRY_META_NEW
116#endif 117#endif
117 118
118 119
119Serializer::Serializer() 120Serializer::Serializer()
120{ 121{
121 defaultLockStat = true; 122 defaultLockStat = true;
122 domDoc = new QDomDocument; 123 domDoc = new QDomDocument;
123} 124}
124 125
125Serializer::Serializer(const QCString &buffer) 126Serializer::Serializer(const QCString &buffer)
126{ 127{
127 defaultLockStat = true; 128 defaultLockStat = true;
128 domDoc = new QDomDocument; 129 domDoc = new QDomDocument;
129 if (!parseXml(buffer)) { 130 if (!parseXml(buffer)) {
130 delete domDoc; 131 delete domDoc;
131#ifndef PWM_EMBEDDED 132#ifndef PWM_EMBEDDED
132 throw PwMException(PwMException::EX_PARSE); 133 throw PwMException(PwMException::EX_PARSE);
133#else 134#else
134 qDebug("Serializer::Serializer : Parse Exception "); 135 qDebug("Serializer::Serializer : Parse Exception ");
135#endif 136#endif
136 } 137 }
137} 138}
138 139
139Serializer::~Serializer() 140Serializer::~Serializer()
140{ 141{
141 delete_ifnot_null(domDoc); 142 delete_ifnot_null(domDoc);
142} 143}
143 144
144void Serializer::clear() 145void Serializer::clear()
145{ 146{
146 delete_ifnot_null(domDoc); 147 delete_ifnot_null(domDoc);
147 domDoc = new QDomDocument; 148 domDoc = new QDomDocument;
148} 149}
149 150
150bool Serializer::parseXml(const QCString &buffer) 151bool Serializer::parseXml(const QCString &buffer)
151{ 152{
152 PWM_ASSERT(domDoc); 153 PWM_ASSERT(domDoc);
153#ifndef PWM_EMBEDDED 154#ifndef PWM_EMBEDDED
154 if (!domDoc->setContent(buffer, true)) 155 if (!domDoc->setContent(buffer, true))
155 return false; 156 return false;
156#else 157#else
157 if (!domDoc->setContent(buffer)) 158 if (!domDoc->setContent(buffer))
158 return false; 159 return false;
159#endif 160#endif
160 if (!checkValid()) 161 if (!checkValid())
161 return false; 162 return false;
162 return true; 163 return true;
163} 164}
164 165
165QCString Serializer::getXml() 166QCString Serializer::getXml()
166{ 167{
167 PWM_ASSERT(domDoc); 168 PWM_ASSERT(domDoc);
168 169
169#ifndef PWM_EMBEDDED 170#ifndef PWM_EMBEDDED
170#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0 171#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0
171 QCString tmp(domDoc->toCString(8)); 172 QCString tmp(domDoc->toCString(8));
172 printDebug("<BEGIN Serializer::getXml() dump>\n"); 173 printDebug("<BEGIN Serializer::getXml() dump>\n");
173 cout << tmp << endl; 174 cout << tmp << endl;
174 printDebug("<END Serializer::getXml() dump>"); 175 printDebug("<END Serializer::getXml() dump>");
175#endif // DEBUG 176#endif // DEBUG
176 177
177 QCString ret(domDoc->toCString(0)); 178 QCString ret(domDoc->toCString(0));
178 ret.replace('\n', ""); 179 ret.replace('\n', "");
179 return ret; 180 return ret;
180#else 181#else
181 182
182#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0 183#if defined(PWM_DEBUG) && SERIALIZER_DEBUG != 0
183 QCString tmp(" " + domDoc->toCString()); 184 QCString tmp(" " + domDoc->toCString());
184 printDebug("<BEGIN Serializer::getXml() dump>\n"); 185 printDebug("<BEGIN Serializer::getXml() dump>\n");
185 cout << tmp << endl; 186 cout << tmp << endl;
186 printDebug("<END Serializer::getXml() dump>"); 187 printDebug("<END Serializer::getXml() dump>");
187#endif // DEBUG 188#endif // DEBUG
188 189
189 QCString ret(domDoc->toCString()); 190 QCString ret(domDoc->toCString());
190 ret.replace(QRegExp("\n"), ""); 191 ret.replace(QRegExp("\n"), "");
191 return ret; 192 return ret;
192 193
193#endif 194#endif
194} 195}
195 196
196bool Serializer::serialize(const vector<PwMCategoryItem> &dta) 197bool Serializer::serialize(const vector<PwMCategoryItem> &dta)
197{ 198{
198 PWM_ASSERT(domDoc); 199 PWM_ASSERT(domDoc);
199 QDomElement root(genNewRoot()); 200 QDomElement root(genNewRoot());
200 QDomElement catNode(domDoc->createElement(CAT_ROOT_WR)); 201 QDomElement catNode(domDoc->createElement(CAT_ROOT_WR));
201 root.appendChild(catNode); 202 root.appendChild(catNode);
202 if (!addCategories(&catNode, dta)) 203 if (!addCategories(&catNode, dta))
203 return false; 204 return false;
204 return true; 205 return true;
205} 206}
206 207
207bool Serializer::deSerialize(vector<PwMCategoryItem> *dta) 208bool Serializer::deSerialize(vector<PwMCategoryItem> *dta)
208{ 209{
209 PWM_ASSERT(domDoc); 210 PWM_ASSERT(domDoc);
210 PWM_ASSERT(dta); 211 PWM_ASSERT(dta);
211 QDomElement root(domDoc->documentElement()); 212 QDomElement root(domDoc->documentElement());
212 QDomNode n; 213 QDomNode n;
213 214
214 dta->clear(); 215 dta->clear();
215 for (n = root.firstChild(); !n.isNull(); n = n.nextSibling()) { 216 for (n = root.firstChild(); !n.isNull(); n = n.nextSibling()) {
216 // find <categories> ... </categories> 217 // find <categories> ... </categories>
217 // <c> ... </c> 218 // <c> ... </c>
218 if (n.nodeName() == CAT_ROOT_NEW || 219 if (n.nodeName() == CAT_ROOT_NEW ||
219 n.nodeName() == CAT_ROOT_OLD) { 220 n.nodeName() == CAT_ROOT_OLD) {
220 if (!readCategories(n, dta)) { 221 if (!readCategories(n, dta)) {
221 return false; 222 return false;
222 } 223 }
223 224
224 /* NOTE: We can stop processing here, as we 225 /* NOTE: We can stop processing here, as we
225 * don't have more nodes in root, yet. 226 * don't have more nodes in root, yet.
226 */ 227 */
227 return true; 228 return true;
228 } 229 }
229 } 230 }
230 return false; 231 return false;
231} 232}
232 233
233bool Serializer::readCategories(const QDomNode &n, 234bool Serializer::readCategories(const QDomNode &n,
234 vector<PwMCategoryItem> *dta) 235 vector<PwMCategoryItem> *dta)
235{ 236{
236 QDomNodeList nl(n.childNodes()); 237 QDomNodeList nl(n.childNodes());
237 QDomNode cur; 238 QDomNode cur;
238 QString name; 239 QString name;
239 unsigned int numCat = nl.count(), i; 240 unsigned int numCat = nl.count(), i;
240 PwMCategoryItem curCat; 241 PwMCategoryItem curCat;
241 vector<PwMDataItem> curEntr; 242 vector<PwMDataItem> curEntr;
242 243
243 if (!numCat) { 244 if (!numCat) {
244 printDebug("Serializer::readCategories(): empty"); 245 printDebug("Serializer::readCategories(): empty");
245 return false; 246 return false;
246 } 247 }
247 for (i = 0; i < numCat; ++i) { 248 for (i = 0; i < numCat; ++i) {
248 cur = nl.item(i); 249 cur = nl.item(i);
249 if (cur.nodeName().left(1) == CAT_PREFIX_NEW || 250 if (cur.nodeName().left(1) == CAT_PREFIX_NEW ||
250 cur.nodeName().left(4) == CAT_PREFIX_OLD) { 251 cur.nodeName().left(4) == CAT_PREFIX_OLD) {
251 name = cur.toElement().attribute(CAT_NAME_NEW); 252 name = cur.toElement().attribute(CAT_NAME_NEW);
252 if (name == QString::null) 253 if (name == QString::null)
253 name = cur.toElement().attribute(CAT_NAME_OLD); 254 name = cur.toElement().attribute(CAT_NAME_OLD);
254 PWM_ASSERT(name != QString::null); 255 PWM_ASSERT(name != QString::null);
255 PWM_ASSERT(name != ""); 256 PWM_ASSERT(name != "");
256 curCat.clear(); 257 curCat.clear();
257 curCat.name = name.latin1(); 258 curCat.name = name.latin1();
258 if (!readEntries(cur, &curEntr)) { 259 if (!readEntries(cur, &curEntr)) {
259 dta->clear(); 260 dta->clear();
260 return false; 261 return false;
261 } 262 }
262 curCat.d = curEntr; 263 curCat.d = curEntr;
263 dta->push_back(curCat); 264 dta->push_back(curCat);
264 } else { 265 } else {
265 printDebug("Serializer::readCategories(): uh? not a category?"); 266 printDebug("Serializer::readCategories(): uh? not a category?");
266 } 267 }
267 } 268 }
268 return true; 269 return true;
269} 270}
270 271
271bool Serializer::readEntries(const QDomNode &n, 272bool Serializer::readEntries(const QDomNode &n,
272 vector<PwMDataItem> *dta) 273 vector<PwMDataItem> *dta)
273{ 274{
274 QDomNodeList nl(n.childNodes()); 275 QDomNodeList nl(n.childNodes());
275 QDomNode cur; 276 QDomNode cur;
276 unsigned int numEntr = nl.count(), i; 277 unsigned int numEntr = nl.count(), i;
277 PwMDataItem curEntr; 278 PwMDataItem curEntr;
278 279
279 dta->clear(); 280 dta->clear();
280 for (i = 0; i < numEntr; ++i) { 281 for (i = 0; i < numEntr; ++i) {
281 cur = nl.item(i); 282 cur = nl.item(i);
282 if (cur.nodeName().left(1) == ENTRY_PREFIX_NEW || 283 if (cur.nodeName().left(1) == ENTRY_PREFIX_NEW ||
283 cur.nodeName().left(6) == ENTRY_PREFIX_OLD) { 284 cur.nodeName().left(6) == ENTRY_PREFIX_OLD) {
284 if (!extractEntry(cur, &curEntr)) { 285 if (!extractEntry(cur, &curEntr)) {
285 return false; 286 return false;
286 } 287 }
287 dta->push_back(curEntr); 288 dta->push_back(curEntr);
288 } else { 289 } else {
289 printDebug("Serializer::readEntries(): hm? not an entry?"); 290 printDebug("Serializer::readEntries(): hm? not an entry?");
290 } 291 }
291 } 292 }
292 return true; 293 return true;
293} 294}
294 295
295bool Serializer::extractEntry(const QDomNode &n, 296bool Serializer::extractEntry(const QDomNode &n,
296 PwMDataItem *dta) 297 PwMDataItem *dta)
297{ 298{
298 QDomNodeList nl(n.childNodes()); 299 QDomNodeList nl(n.childNodes());
299 QDomNode cur, cdata; 300 QDomNode cur, cdata;
300 unsigned int cnt = nl.count(), i; 301 unsigned int cnt = nl.count(), i;
301 QString name, text; 302 QString name, text;
302 303
303 if (!cnt) { 304 if (!cnt) {
304 printDebug("Serializer::extractEntry(): empty"); 305 printDebug("Serializer::extractEntry(): empty");
305 return false; 306 return false;
306 } 307 }
307 dta->clear(); 308 dta->clear();
308 for (i = 0; i < cnt; ++i) { 309 for (i = 0; i < cnt; ++i) {
309 cur = nl.item(i); 310 cur = nl.item(i);
310 name = cur.nodeName(); 311 name = cur.nodeName();
311 cdata = cur.firstChild(); 312 cdata = cur.firstChild();
312 if (unlikely(cdata.isCDATASection())) { 313 if (unlikely(cdata.isCDATASection())) {
313 text = cdata.toCDATASection().data(); 314 text = cdata.toCDATASection().data();
314 } else if (likely(cur.isElement())) { 315 } else if (likely(cur.isElement())) {
315 text = cur.toElement().text(); 316 text = cur.toElement().text();
316 } else { 317 } else {
317 printDebug("Serializer::extractEntry(): neither CDATA nor element."); 318 printDebug("Serializer::extractEntry(): neither CDATA nor element.");
318 return false; 319 return false;
319 } 320 }
320 if (text == " ") 321 if (text == " ")
321 text = ""; // for backward compatibility. 322 text = ""; // for backward compatibility.
322 if (name == ENTRY_DESC_NEW || 323 if (name == ENTRY_DESC_NEW ||
323 name == ENTRY_DESC_OLD) { 324 name == ENTRY_DESC_OLD) {
324 dta->desc = unescapeEntryData(text).latin1(); 325 dta->desc = unescapeEntryData(text).latin1();
325 } else if (name == ENTRY_NAME_NEW || 326 } else if (name == ENTRY_NAME_NEW ||
326 name == ENTRY_NAME_OLD) { 327 name == ENTRY_NAME_OLD) {
327 dta->name = unescapeEntryData(text).latin1(); 328 dta->name = unescapeEntryData(text).latin1();
328 } else if (name == ENTRY_PW_NEW || 329 } else if (name == ENTRY_PW_NEW ||
329 name == ENTRY_PW_OLD) { 330 name == ENTRY_PW_OLD) {
330 dta->pw = unescapeEntryData(text).latin1(); 331 dta->pw = unescapeEntryData(text).latin1();
331 } else if (name == ENTRY_COMMENT_NEW || 332 } else if (name == ENTRY_COMMENT_NEW ||
332 name == ENTRY_COMMENT_OLD) { 333 name == ENTRY_COMMENT_OLD) {
333 dta->comment = unescapeEntryData(text).latin1(); 334 dta->comment = unescapeEntryData(text).latin1();
334 } else if (name == ENTRY_URL_NEW || 335 } else if (name == ENTRY_URL_NEW ||
335 name == ENTRY_URL_OLD) { 336 name == ENTRY_URL_OLD) {
336 dta->url = unescapeEntryData(text).latin1(); 337 dta->url = unescapeEntryData(text).latin1();
337 } else if (name == ENTRY_LAUNCHER_NEW || 338 } else if (name == ENTRY_LAUNCHER_NEW ||
338 name == ENTRY_LAUNCHER_OLD) { 339 name == ENTRY_LAUNCHER_OLD) {
339 dta->launcher = unescapeEntryData(text).latin1(); 340 dta->launcher = unescapeEntryData(text).latin1();
340 } else if (name == ENTRY_LVP_NEW || 341 } else if (name == ENTRY_LVP_NEW ||
341 name == ENTRY_LVP_OLD) { 342 name == ENTRY_LVP_OLD) {
342 dta->listViewPos = strtol(text.latin1(), 0, 10); 343 dta->listViewPos = strtol(text.latin1(), 0, 10);
343 } else if (name == ENTRY_BIN_NEW) { 344 } else if (name == ENTRY_BIN_NEW) {
344 // ENTRY_BIN_NEW == ENTRY_BIN_OLD 345 // ENTRY_BIN_NEW == ENTRY_BIN_OLD
345 if (text == "0") { 346 if (text == "0") {
346 dta->binary = false; 347 dta->binary = false;
347 } else { 348 } else {
348 dta->binary = true; 349 dta->binary = true;
349 } 350 }
350 } else if (name == ENTRY_META_NEW) { 351 } else if (name == ENTRY_META_NEW) {
351 // ENTRY_META_NEW == ENTRY_META_OLD 352 // ENTRY_META_NEW == ENTRY_META_OLD
352 if (!extractMeta(cur, &dta->meta)) 353 if (!extractMeta(cur, &dta->meta))
353 return false; 354 return false;
354 } else { 355 } else {
355 printDebug(string("Serializer::extractEntry(): invalid: ") 356 printDebug(string("Serializer::extractEntry(): invalid: ")
356 + name.latin1()); 357 + name.latin1());
357 } 358 }
358 } 359 }
359 dta->lockStat = defaultLockStat; 360 dta->lockStat = defaultLockStat;
360 return true; 361 return true;
361} 362}
362 363
363bool Serializer::extractMeta(const QDomNode &n, 364bool Serializer::extractMeta(const QDomNode &n,
364 PwMMetaData *dta) 365 PwMMetaData *dta)
365{ 366{
366 QDomNode cur(n.firstChild()); 367 QDomNode cur(n.firstChild());
367 QString name, val; 368 QString name, val;
368 while (!cur.isNull()) { 369 while (!cur.isNull()) {
369 name = cur.nodeName(); 370 name = cur.nodeName();
370 val = cur.toElement().text(); 371 val = cur.toElement().text();
371 if (val == "") { 372 if (val == "") {
372 cur = cur.nextSibling(); 373 cur = cur.nextSibling();
373 continue; 374 continue;
374 } 375 }
375#ifndef PWM_EMBEDDED 376#ifndef PWM_EMBEDDED
376 if (name == META_CREATE_DATE) { 377 if (name == META_CREATE_DATE) {
377 dta->create = QDateTime::fromString(val, Qt::ISODate); 378 dta->create = QDateTime::fromString(val, Qt::ISODate);
378 } else if (name == META_VALID_DATE) { 379 } else if (name == META_VALID_DATE) {
379 dta->valid = QDateTime::fromString(val, Qt::ISODate); 380 dta->valid = QDateTime::fromString(val, Qt::ISODate);
380 } else if (name == META_EXPIRE_DATE) { 381 } else if (name == META_EXPIRE_DATE) {
381 dta->expire = QDateTime::fromString(val, Qt::ISODate); 382 dta->expire = QDateTime::fromString(val, Qt::ISODate);
382 } else if (name == META_UPDATE_DATE) { 383 } else if (name == META_UPDATE_DATE) {
383 dta->update = QDateTime::fromString(val, Qt::ISODate); 384 dta->update = QDateTime::fromString(val, Qt::ISODate);
384 } else if (name == META_UPDATE_INT) { 385 } else if (name == META_UPDATE_INT) {
385 dta->updateInt = strtoul(val.latin1(), 0, 10); 386 dta->updateInt = strtoul(val.latin1(), 0, 10);
386 } else if (name == META_UNIQUEID) { 387 } else if (name == META_UNIQUEID) {
387 dta->uniqueid = unescapeEntryData(val).latin1(); 388 dta->uniqueid = unescapeEntryData(val).latin1();
388 } else { 389 } else {
389 printDebug(string("extractMeta(): invalid: ") 390 printDebug(string("extractMeta(): invalid: ")
390 + name.latin1()); 391 + name.latin1());
391 } 392 }
392#else 393#else
393 394
394 QDateTime m_dt; 395 QDateTime m_dt;
395 396
396 if ((name == META_CREATE_DATE) || 397 if ((name == META_CREATE_DATE) ||
397 (name == META_VALID_DATE) || 398 (name == META_VALID_DATE) ||
398 (name == META_EXPIRE_DATE) || 399 (name == META_EXPIRE_DATE) ||
399 (name == META_UPDATE_DATE)) 400 (name == META_UPDATE_DATE))
400 { 401 {
401 int pos = val.find("T"); 402 int pos = val.find("T");
402 QString date = val.left(pos); 403 QString date = val.left(pos);
403 QString time = val.mid(pos+1); 404 QString time = val.mid(pos+1);
404 qDebug("Serializer::extractMeta : date=%s ,time=%s",date.latin1(), time.latin1() ); 405 qDebug("Serializer::extractMeta : date=%s ,time=%s",date.latin1(), time.latin1() );
405 bool ok1, ok2; 406 bool ok1, ok2;
406 407
407 QDate m_date = KGlobal::locale()->readDate(date, &ok1); 408 QDate m_date = KGlobal::locale()->readDate(date, &ok1);
408 QTime m_time = KGlobal::locale()->readTime(time, &ok2); 409 QTime m_time = KGlobal::locale()->readTime(time, &ok2);
409 if ((ok1 == false) || (ok2 == false)) 410 if ((ok1 == false) || (ok2 == false))
410 qDebug("Serializer::extractMeta invalid date or time !!!!!!!!!!!!!"); 411 qDebug("Serializer::extractMeta invalid date or time !!!!!!!!!!!!!");
411 m_dt.setDate(m_date); 412 m_dt.setDate(m_date);
412 m_dt.setTime(m_time); 413 m_dt.setTime(m_time);
413 } 414 }
414 415
415 416
416 if (name == META_CREATE_DATE) { 417 if (name == META_CREATE_DATE) {
417 dta->create = m_dt; 418 dta->create = m_dt;
418 } else if (name == META_VALID_DATE) { 419 } else if (name == META_VALID_DATE) {
419 dta->valid = m_dt; 420 dta->valid = m_dt;
420 } else if (name == META_EXPIRE_DATE) { 421 } else if (name == META_EXPIRE_DATE) {
421 dta->expire = m_dt; 422 dta->expire = m_dt;
422 } else if (name == META_UPDATE_DATE) { 423 } else if (name == META_UPDATE_DATE) {
423 dta->update = m_dt; 424 dta->update = m_dt;
424 } else if (name == META_UPDATE_INT) { 425 } else if (name == META_UPDATE_INT) {
425 dta->updateInt = strtoul(val.latin1(), 0, 10); 426 dta->updateInt = strtoul(val.latin1(), 0, 10);
426 } else if (name == META_UNIQUEID) { 427 } else if (name == META_UNIQUEID) {
427 dta->uniqueid = unescapeEntryData(val).latin1(); 428 dta->uniqueid = unescapeEntryData(val).latin1();
428 } else { 429 } else {
429 printDebug(string("extractMeta(): invalid: ") 430 printDebug(string("extractMeta(): invalid: ")
430 + name.latin1()); 431 + name.latin1());
431 } 432 }
432#endif 433#endif
433 cur = cur.nextSibling(); 434 cur = cur.nextSibling();
434 } 435 }
435 return true; 436 return true;
436} 437}
437 438
438bool Serializer::checkValid() 439bool Serializer::checkValid()
439{ 440{
440 PWM_ASSERT(domDoc); 441 PWM_ASSERT(domDoc);
441 QDomElement root(domDoc->documentElement()); 442 QDomElement root(domDoc->documentElement());
442 if (root.nodeName() != ROOT_MAGIC_NEW && 443 if (root.nodeName() != ROOT_MAGIC_NEW &&
443 root.nodeName() != ROOT_MAGIC_OLD) { 444 root.nodeName() != ROOT_MAGIC_OLD) {
444 printDebug("Serializer: wrong magic"); 445 printDebug("Serializer: wrong magic");
445 return false; 446 return false;
446 } 447 }
447 if (root.attribute(VER_STR_NEW) != COMPAT_VER_NEW && 448 if (root.attribute(VER_STR_NEW) != COMPAT_VER_NEW &&
448 root.attribute(VER_STR_OLD) != COMPAT_VER_OLD) { 449 root.attribute(VER_STR_OLD) != COMPAT_VER_OLD) {
449 printDebug("Serializer: wrong version"); 450 printDebug("Serializer: wrong version");
450 return false; 451 return false;
451 } 452 }
452 return true; 453 return true;
453} 454}
454 455
455QDomElement Serializer::genNewRoot() 456QDomElement Serializer::genNewRoot()
456{ 457{
457 PWM_ASSERT(domDoc); 458 PWM_ASSERT(domDoc);
458 QDomElement root(domDoc->createElement(ROOT_MAGIC_WR)); 459 QDomElement root(domDoc->createElement(ROOT_MAGIC_WR));
459 root.setAttribute(VER_STR_WR, COMPAT_VER_WR); 460 root.setAttribute(VER_STR_WR, COMPAT_VER_WR);
460 domDoc->appendChild(root); 461 domDoc->appendChild(root);
461 return root; 462 return root;
462} 463}
463 464
464bool Serializer::addCategories(QDomElement *e, 465bool Serializer::addCategories(QDomElement *e,
465 const vector<PwMCategoryItem> &dta) 466 const vector<PwMCategoryItem> &dta)
466{ 467{
467 unsigned int numCat = dta.size(), i; 468 unsigned int numCat = dta.size(), i;
468 QString curId, curName; 469 QString curId, curName;
469 QDomElement curCat; 470 QDomElement curCat;
470 471
471 for (i = 0; i < numCat; ++i) { 472 for (i = 0; i < numCat; ++i) {
472 curId = CAT_PREFIX_WR; 473 curId = CAT_PREFIX_WR;
473 curId += tostr(i).c_str(); 474 curId += tostr(i).c_str();
474 curName = dta[i].name.c_str(); 475 curName = dta[i].name.c_str();
475 curCat = domDoc->createElement(curId); 476 curCat = domDoc->createElement(curId);
476 curCat.setAttribute(CAT_NAME_WR, curName); 477 curCat.setAttribute(CAT_NAME_WR, curName);
477 if (!addEntries(&curCat, dta[i].d)) { 478 if (!addEntries(&curCat, dta[i].d)) {
478 return false; 479 return false;
479 } 480 }
480 e->appendChild(curCat); 481 e->appendChild(curCat);
481 } 482 }
482 return true; 483 return true;
483} 484}
484 485
485bool Serializer::addEntries(QDomElement *e, 486bool Serializer::addEntries(QDomElement *e,
486 const vector<PwMDataItem> &dta) 487 const vector<PwMDataItem> &dta)
487{ 488{
488 unsigned int numEntr = dta.size(), i; 489 unsigned int numEntr = dta.size(), i;
489 QString curId; 490 QString curId;
490 QDomElement curEntr; 491 QDomElement curEntr;
491 492
492 for (i = 0; i < numEntr; ++i) { 493 for (i = 0; i < numEntr; ++i) {
493 curId = ENTRY_PREFIX_WR; 494 curId = ENTRY_PREFIX_WR;
494 curId += tostr(i).c_str(); 495 curId += tostr(i).c_str();
495 curEntr = domDoc->createElement(curId); 496 curEntr = domDoc->createElement(curId);
496 if (!writeEntry(&curEntr, dta[i])) { 497 if (!writeEntry(&curEntr, dta[i])) {
497 return false; 498 return false;
498 } 499 }
499 e->appendChild(curEntr); 500 e->appendChild(curEntr);
500 } 501 }
501 return true; 502 return true;
502} 503}
503 504
504bool Serializer::writeEntry(QDomElement *e, 505bool Serializer::writeEntry(QDomElement *e,
505 const PwMDataItem &_dta) 506 const PwMDataItem &_dta)
506{ 507{
507#if WRITE_CDATA_SEC != 0 508#if WRITE_CDATA_SEC != 0
508 # define new_text(x)domDoc->createCDATASection(x) 509 # define new_text(x)domDoc->createCDATASection(x)
509 QDomCDATASection curText; 510 QDomCDATASection curText;
510#else 511#else
511 # define new_text(x)domDoc->createTextNode(x) 512 # define new_text(x)domDoc->createTextNode(x)
512 QDomText curText; 513 QDomText curText;
513#endif 514#endif
514 515
515 QDomText plainText; 516 QDomText plainText;
516 QDomElement tag; 517 QDomElement tag;
517 518
518 // begin -- This is for compatibility with the old serializer 519 // begin -- This is for compatibility with the old serializer
519 PwMDataItem dta = _dta; 520 PwMDataItem dta = _dta;
520 if (!dta.desc.size()) 521 if (!dta.desc.size())
521 dta.desc = " "; 522 dta.desc = " ";
522 if (!dta.name.size()) 523 if (!dta.name.size())
523 dta.name = " "; 524 dta.name = " ";
524 if (!dta.pw.size()) 525 if (!dta.pw.size())
525 dta.pw = " "; 526 dta.pw = " ";
526 if (!dta.comment.size()) 527 if (!dta.comment.size())
527 dta.comment = " "; 528 dta.comment = " ";
528 if (!dta.url.size()) 529 if (!dta.url.size())
529 dta.url = " "; 530 dta.url = " ";
530 if (!dta.launcher.size()) 531 if (!dta.launcher.size())
531 dta.launcher = " "; 532 dta.launcher = " ";
532 // end -- This is for compatibility with the old serializer 533 // end -- This is for compatibility with the old serializer
533 534
534 tag = domDoc->createElement(ENTRY_DESC_WR); 535 tag = domDoc->createElement(ENTRY_DESC_WR);
535 curText = new_text(escapeEntryData(dta.desc.c_str())); 536 curText = new_text(escapeEntryData(dta.desc.c_str()));
536 tag.appendChild(curText); 537 tag.appendChild(curText);
537 e->appendChild(tag); 538 e->appendChild(tag);
538 539
539 tag = domDoc->createElement(ENTRY_NAME_WR); 540 tag = domDoc->createElement(ENTRY_NAME_WR);
540 curText = new_text(escapeEntryData(dta.name.c_str())); 541 curText = new_text(escapeEntryData(dta.name.c_str()));
541 tag.appendChild(curText); 542 tag.appendChild(curText);
542 e->appendChild(tag); 543 e->appendChild(tag);
543 544
544 tag = domDoc->createElement(ENTRY_PW_WR); 545 tag = domDoc->createElement(ENTRY_PW_WR);
545 curText = new_text(escapeEntryData(dta.pw.c_str())); 546 curText = new_text(escapeEntryData(dta.pw.c_str()));
546 tag.appendChild(curText); 547 tag.appendChild(curText);
547 e->appendChild(tag); 548 e->appendChild(tag);
548 549
549 tag = domDoc->createElement(ENTRY_COMMENT_WR); 550 tag = domDoc->createElement(ENTRY_COMMENT_WR);
550 curText = new_text(escapeEntryData(dta.comment.c_str())); 551 curText = new_text(escapeEntryData(dta.comment.c_str()));
551 tag.appendChild(curText); 552 tag.appendChild(curText);
552 e->appendChild(tag); 553 e->appendChild(tag);
553 554
554 tag = domDoc->createElement(ENTRY_URL_WR); 555 tag = domDoc->createElement(ENTRY_URL_WR);
555 curText = new_text(escapeEntryData(dta.url.c_str())); 556 curText = new_text(escapeEntryData(dta.url.c_str()));
556 tag.appendChild(curText); 557 tag.appendChild(curText);
557 e->appendChild(tag); 558 e->appendChild(tag);
558 559
559 tag = domDoc->createElement(ENTRY_LAUNCHER_WR); 560 tag = domDoc->createElement(ENTRY_LAUNCHER_WR);
560 curText = new_text(escapeEntryData(dta.launcher.c_str())); 561 curText = new_text(escapeEntryData(dta.launcher.c_str()));
561 tag.appendChild(curText); 562 tag.appendChild(curText);
562 e->appendChild(tag); 563 e->appendChild(tag);
563 564
564 tag = domDoc->createElement(ENTRY_LVP_WR); 565 tag = domDoc->createElement(ENTRY_LVP_WR);
565 plainText = domDoc->createTextNode(tostr(dta.listViewPos).c_str()); 566 plainText = domDoc->createTextNode(tostr(dta.listViewPos).c_str());
566 tag.appendChild(plainText); 567 tag.appendChild(plainText);
567 e->appendChild(tag); 568 e->appendChild(tag);
568 569
569 tag = domDoc->createElement(ENTRY_BIN_WR); 570 tag = domDoc->createElement(ENTRY_BIN_WR);
570 if (dta.binary) 571 if (dta.binary)
571 plainText = domDoc->createTextNode("1"); 572 plainText = domDoc->createTextNode("1");
572 else 573 else
573 plainText = domDoc->createTextNode("0"); 574 plainText = domDoc->createTextNode("0");
574 tag.appendChild(plainText); 575 tag.appendChild(plainText);
575 e->appendChild(tag); 576 e->appendChild(tag);
576 577
577 tag = domDoc->createElement(ENTRY_META_WR); 578 tag = domDoc->createElement(ENTRY_META_WR);
578 if (!writeMeta(&tag, dta.meta)) 579 if (!writeMeta(&tag, dta.meta))
579 return false; 580 return false;
580 e->appendChild(tag); 581 e->appendChild(tag);
581 582
582#undef new_text 583#undef new_text
583 return true; 584 return true;
584} 585}
585 586
586bool Serializer::writeMeta(QDomElement *e, 587bool Serializer::writeMeta(QDomElement *e,
587 const PwMMetaData &dta) 588 const PwMMetaData &dta)
588{ 589{
589 QDomText text; 590 QDomText text;
590 QDomElement tag; 591 QDomElement tag;
591 592
592 tag = domDoc->createElement(META_CREATE_DATE); 593 tag = domDoc->createElement(META_CREATE_DATE);
593#ifndef PWM_EMBEDDED 594#ifndef PWM_EMBEDDED
594 text = domDoc->createTextNode(dta.create.toString(Qt::ISODate)); 595 text = domDoc->createTextNode(dta.create.toString(Qt::ISODate));
595#else 596#else
596 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.create, KLocale::ISODate)); 597 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.create, KLocale::ISODate));
597#endif 598#endif
598 tag.appendChild(text); 599 tag.appendChild(text);
599 e->appendChild(tag); 600 e->appendChild(tag);
600 601
601 tag = domDoc->createElement(META_VALID_DATE); 602 tag = domDoc->createElement(META_VALID_DATE);
602#ifndef PWM_EMBEDDED 603#ifndef PWM_EMBEDDED
603 text = domDoc->createTextNode(dta.valid.toString(Qt::ISODate)); 604 text = domDoc->createTextNode(dta.valid.toString(Qt::ISODate));
604#else 605#else
605 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.valid, KLocale::ISODate)); 606 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.valid, KLocale::ISODate));
606#endif 607#endif
607 tag.appendChild(text); 608 tag.appendChild(text);
608 e->appendChild(tag); 609 e->appendChild(tag);
609 610
610 tag = domDoc->createElement(META_EXPIRE_DATE); 611 tag = domDoc->createElement(META_EXPIRE_DATE);
611#ifndef PWM_EMBEDDED 612#ifndef PWM_EMBEDDED
612 text = domDoc->createTextNode(dta.expire.toString(Qt::ISODate)); 613 text = domDoc->createTextNode(dta.expire.toString(Qt::ISODate));
613#else 614#else
614 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.expire, KLocale::ISODate)); 615 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.expire, KLocale::ISODate));
615#endif 616#endif
616 tag.appendChild(text); 617 tag.appendChild(text);
617 e->appendChild(tag); 618 e->appendChild(tag);
618 619
619 tag = domDoc->createElement(META_UPDATE_DATE); 620 tag = domDoc->createElement(META_UPDATE_DATE);
620#ifndef PWM_EMBEDDED 621#ifndef PWM_EMBEDDED
621 text = domDoc->createTextNode(dta.update.toString(Qt::ISODate)); 622 text = domDoc->createTextNode(dta.update.toString(Qt::ISODate));
622#else 623#else
623 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.update, KLocale::ISODate)); 624 text = domDoc->createTextNode(KGlobal::locale()->formatDateTime(dta.update, KLocale::ISODate));
624#endif 625#endif
625 tag.appendChild(text); 626 tag.appendChild(text);
626 e->appendChild(tag); 627 e->appendChild(tag);
627 628
628 tag = domDoc->createElement(META_UPDATE_INT); 629 tag = domDoc->createElement(META_UPDATE_INT);
629 text = domDoc->createTextNode(tostr(dta.updateInt).c_str()); 630 text = domDoc->createTextNode(tostr(dta.updateInt).c_str());
630 tag.appendChild(text); 631 tag.appendChild(text);
631 e->appendChild(tag); 632 e->appendChild(tag);
632 633
633 tag = domDoc->createElement(META_UNIQUEID); 634 tag = domDoc->createElement(META_UNIQUEID);
634 text = domDoc->createTextNode(escapeEntryData(dta.uniqueid)); 635 text = domDoc->createTextNode(escapeEntryData(dta.uniqueid));
635 tag.appendChild(text); 636 tag.appendChild(text);
636 e->appendChild(tag); 637 e->appendChild(tag);
637 638
638#undef new_text 639#undef new_text
639 return true; 640 return true;
640} 641}
641 642
642QString Serializer::escapeEntryData(QString dta) 643QString Serializer::escapeEntryData(QString dta)
643{ 644{
644#ifndef PWM_EMBEDDED 645#ifndef PWM_EMBEDDED
645 dta.replace('\n', "$>--endl--<$"); 646 dta.replace('\n', "$>--endl--<$");
646 dta.replace("]]>", "||>"); 647 dta.replace("]]>", "||>");
647#else 648#else
648 dta.replace(QRegExp("\n"), "$>--endl--<$"); 649 dta.replace(QRegExp("\n"), "$>--endl--<$");
649 dta.replace(QRegExp("]]>"), "||>"); 650 dta.replace(QRegExp("]]>"), "||>");
650#endif 651#endif
651 return dta; 652 return dta;
652} 653}
653 654
654QString Serializer::unescapeEntryData(QString dta) 655QString Serializer::unescapeEntryData(QString dta)
655{ 656{
656#ifndef PWM_EMBEDDED 657#ifndef PWM_EMBEDDED
657 dta.replace("$>--endl--<$", "\n"); 658 dta.replace("$>--endl--<$", "\n");
658 dta.replace("||>", "]]>"); 659 dta.replace("||>", "]]>");
659#else 660#else
660 dta.replace(QRegExp("$>--endl--<$"), "\n"); 661 dta.replace(QRegExp("$>--endl--<$"), "\n");
661 dta.replace(QRegExp("||>"), "]]>"); 662 dta.replace(QRegExp("||>"), "]]>");
662#endif 663#endif
663 return dta; 664 return dta;
664} 665}