-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 1326 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp | 894 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp | 1182 | ||||
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp | 579 | ||||
-rw-r--r-- | libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp | 170 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccesssql.cpp | 444 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccessvcal.cpp | 20 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccessxml.cpp | 191 |
8 files changed, 2420 insertions, 2386 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index 14207be..dda23cc 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | |||
@@ -29,26 +29,30 @@ | |||
29 | /* | 29 | /* |
30 | * SQL Backend for the OPIE-Contact Database. | 30 | * SQL Backend for the OPIE-Contact Database. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #include "ocontactaccessbackend_sql.h" | 33 | #include "ocontactaccessbackend_sql.h" |
34 | 34 | ||
35 | #include <qarray.h> | 35 | /* OPIE */ |
36 | #include <qdatetime.h> | ||
37 | #include <qstringlist.h> | ||
38 | |||
39 | #include <qpe/global.h> | ||
40 | #include <qpe/recordfields.h> | ||
41 | |||
42 | #include <opie2/opimcontact.h> | 36 | #include <opie2/opimcontact.h> |
43 | #include <opie2/opimcontactfields.h> | 37 | #include <opie2/opimcontactfields.h> |
44 | #include <opie2/opimdateconversion.h> | 38 | #include <opie2/opimdateconversion.h> |
45 | #include <opie2/osqldriver.h> | 39 | #include <opie2/osqldriver.h> |
46 | #include <opie2/osqlresult.h> | 40 | #include <opie2/osqlresult.h> |
47 | #include <opie2/osqlmanager.h> | 41 | #include <opie2/osqlmanager.h> |
48 | #include <opie2/osqlquery.h> | 42 | #include <opie2/osqlquery.h> |
43 | #include <opie2/odebug.h> | ||
44 | |||
45 | #include <qpe/global.h> | ||
46 | #include <qpe/recordfields.h> | ||
47 | |||
48 | /* QT */ | ||
49 | #include <qarray.h> | ||
50 | #include <qdatetime.h> | ||
51 | #include <qstringlist.h> | ||
52 | |||
49 | 53 | ||
50 | using namespace Opie; | 54 | using namespace Opie; |
51 | using namespace Opie::DB; | 55 | using namespace Opie::DB; |
52 | 56 | ||
53 | 57 | ||
54 | /* | 58 | /* |
@@ -56,797 +60,797 @@ using namespace Opie::DB; | |||
56 | * LOAD query | 60 | * LOAD query |
57 | * INSERT | 61 | * INSERT |
58 | * REMOVE | 62 | * REMOVE |
59 | * CLEAR | 63 | * CLEAR |
60 | */ | 64 | */ |
61 | namespace { | 65 | namespace { |
62 | /** | 66 | /** |
63 | * CreateQuery for the Todolist Table | 67 | * CreateQuery for the Todolist Table |
64 | */ | 68 | */ |
65 | class CreateQuery : public OSQLQuery { | 69 | class CreateQuery : public OSQLQuery { |
66 | public: | 70 | public: |
67 | CreateQuery(); | 71 | CreateQuery(); |
68 | ~CreateQuery(); | 72 | ~CreateQuery(); |
69 | QString query()const; | 73 | QString query()const; |
70 | }; | 74 | }; |
71 | 75 | ||
72 | /** | 76 | /** |
73 | * Clears (delete) a Table | 77 | * Clears (delete) a Table |
74 | */ | 78 | */ |
75 | class ClearQuery : public OSQLQuery { | 79 | class ClearQuery : public OSQLQuery { |
76 | public: | 80 | public: |
77 | ClearQuery(); | 81 | ClearQuery(); |
78 | ~ClearQuery(); | 82 | ~ClearQuery(); |
79 | QString query()const; | 83 | QString query()const; |
80 | 84 | ||
81 | }; | 85 | }; |
82 | 86 | ||
83 | 87 | ||
84 | /** | 88 | /** |
85 | * LoadQuery | 89 | * LoadQuery |
86 | * this one queries for all uids | 90 | * this one queries for all uids |
87 | */ | 91 | */ |
88 | class LoadQuery : public OSQLQuery { | 92 | class LoadQuery : public OSQLQuery { |
89 | public: | 93 | public: |
90 | LoadQuery(); | 94 | LoadQuery(); |
91 | ~LoadQuery(); | 95 | ~LoadQuery(); |
92 | QString query()const; | 96 | QString query()const; |
93 | }; | 97 | }; |
94 | 98 | ||
95 | /** | 99 | /** |
96 | * inserts/adds a OPimContact to the table | 100 | * inserts/adds a OPimContact to the table |
97 | */ | 101 | */ |
98 | class InsertQuery : public OSQLQuery { | 102 | class InsertQuery : public OSQLQuery { |
99 | public: | 103 | public: |
100 | InsertQuery(const OPimContact& ); | 104 | InsertQuery(const OPimContact& ); |
101 | ~InsertQuery(); | 105 | ~InsertQuery(); |
102 | QString query()const; | 106 | QString query()const; |
103 | private: | 107 | private: |
104 | OPimContact m_contact; | 108 | OPimContact m_contact; |
105 | }; | 109 | }; |
106 | 110 | ||
107 | 111 | ||
108 | /** | 112 | /** |
109 | * removes one from the table | 113 | * removes one from the table |
110 | */ | 114 | */ |
111 | class RemoveQuery : public OSQLQuery { | 115 | class RemoveQuery : public OSQLQuery { |
112 | public: | 116 | public: |
113 | RemoveQuery(int uid ); | 117 | RemoveQuery(int uid ); |
114 | ~RemoveQuery(); | 118 | ~RemoveQuery(); |
115 | QString query()const; | 119 | QString query()const; |
116 | private: | 120 | private: |
117 | int m_uid; | 121 | int m_uid; |
118 | }; | 122 | }; |
119 | 123 | ||
120 | /** | 124 | /** |
121 | * a find query for noncustom elements | 125 | * a find query for noncustom elements |
122 | */ | 126 | */ |
123 | class FindQuery : public OSQLQuery { | 127 | class FindQuery : public OSQLQuery { |
124 | public: | 128 | public: |
125 | FindQuery(int uid); | 129 | FindQuery(int uid); |
126 | FindQuery(const QArray<int>& ); | 130 | FindQuery(const QArray<int>& ); |
127 | ~FindQuery(); | 131 | ~FindQuery(); |
128 | QString query()const; | 132 | QString query()const; |
129 | private: | 133 | private: |
130 | QString single()const; | 134 | QString single()const; |
131 | QString multi()const; | 135 | QString multi()const; |
132 | QArray<int> m_uids; | 136 | QArray<int> m_uids; |
133 | int m_uid; | 137 | int m_uid; |
134 | }; | 138 | }; |
135 | 139 | ||
136 | /** | 140 | /** |
137 | * a find query for custom elements | 141 | * a find query for custom elements |
138 | */ | 142 | */ |
139 | class FindCustomQuery : public OSQLQuery { | 143 | class FindCustomQuery : public OSQLQuery { |
140 | public: | 144 | public: |
141 | FindCustomQuery(int uid); | 145 | FindCustomQuery(int uid); |
142 | FindCustomQuery(const QArray<int>& ); | 146 | FindCustomQuery(const QArray<int>& ); |
143 | ~FindCustomQuery(); | 147 | ~FindCustomQuery(); |
144 | QString query()const; | 148 | QString query()const; |
145 | private: | 149 | private: |
146 | QString single()const; | 150 | QString single()const; |
147 | QString multi()const; | 151 | QString multi()const; |
148 | QArray<int> m_uids; | 152 | QArray<int> m_uids; |
149 | int m_uid; | 153 | int m_uid; |
150 | }; | 154 | }; |
151 | 155 | ||
152 | 156 | ||
153 | 157 | ||
154 | // We using two tables to store the information: | 158 | // We using two tables to store the information: |
155 | // 1. addressbook : It contains General information about the contact (non custom) | 159 | // 1. addressbook : It contains General information about the contact (non custom) |
156 | // 2. custom_data : Not official supported entries | 160 | // 2. custom_data : Not official supported entries |
157 | // All tables are connected by the uid of the contact. | 161 | // All tables are connected by the uid of the contact. |
158 | // Maybe I should add a table for meta-information ? | 162 | // Maybe I should add a table for meta-information ? |
159 | CreateQuery::CreateQuery() : OSQLQuery() {} | 163 | CreateQuery::CreateQuery() : OSQLQuery() {} |
160 | CreateQuery::~CreateQuery() {} | 164 | CreateQuery::~CreateQuery() {} |
161 | QString CreateQuery::query()const { | 165 | QString CreateQuery::query()const { |
162 | QString qu; | 166 | QString qu; |
163 | 167 | ||
164 | qu += "create table addressbook( uid PRIMARY KEY "; | 168 | qu += "create table addressbook( uid PRIMARY KEY "; |
165 | 169 | ||
166 | QStringList fieldList = OPimContactFields::untrfields( false ); | 170 | QStringList fieldList = OPimContactFields::untrfields( false ); |
167 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ | 171 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ |
168 | qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it ); | 172 | qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it ); |
169 | } | 173 | } |
170 | qu += " );"; | 174 | qu += " );"; |
171 | 175 | ||
172 | qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; | 176 | qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; |
173 | 177 | ||
174 | return qu; | 178 | return qu; |
175 | } | 179 | } |
176 | 180 | ||
177 | ClearQuery::ClearQuery() | 181 | ClearQuery::ClearQuery() |
178 | : OSQLQuery() {} | 182 | : OSQLQuery() {} |
179 | ClearQuery::~ClearQuery() {} | 183 | ClearQuery::~ClearQuery() {} |
180 | QString ClearQuery::query()const { | 184 | QString ClearQuery::query()const { |
181 | QString qu = "drop table addressbook;"; | 185 | QString qu = "drop table addressbook;"; |
182 | qu += "drop table custom_data;"; | 186 | qu += "drop table custom_data;"; |
183 | // qu += "drop table dates;"; | 187 | // qu += "drop table dates;"; |
184 | return qu; | 188 | return qu; |
185 | } | 189 | } |
186 | 190 | ||
187 | 191 | ||
188 | LoadQuery::LoadQuery() : OSQLQuery() {} | 192 | LoadQuery::LoadQuery() : OSQLQuery() {} |
189 | LoadQuery::~LoadQuery() {} | 193 | LoadQuery::~LoadQuery() {} |
190 | QString LoadQuery::query()const { | 194 | QString LoadQuery::query()const { |
191 | QString qu; | 195 | QString qu; |
192 | qu += "select uid from addressbook"; | 196 | qu += "select uid from addressbook"; |
193 | 197 | ||
194 | return qu; | 198 | return qu; |
195 | } | 199 | } |
196 | 200 | ||
197 | 201 | ||
198 | InsertQuery::InsertQuery( const OPimContact& contact ) | 202 | InsertQuery::InsertQuery( const OPimContact& contact ) |
199 | : OSQLQuery(), m_contact( contact ) { | 203 | : OSQLQuery(), m_contact( contact ) { |
200 | } | 204 | } |
201 | 205 | ||
202 | InsertQuery::~InsertQuery() { | 206 | InsertQuery::~InsertQuery() { |
203 | } | 207 | } |
204 | 208 | ||
205 | /* | 209 | /* |
206 | * converts from a OPimContact to a query | 210 | * converts from a OPimContact to a query |
207 | */ | 211 | */ |
208 | QString InsertQuery::query()const{ | 212 | QString InsertQuery::query()const{ |
209 | 213 | ||
210 | QString qu; | 214 | QString qu; |
211 | qu += "insert into addressbook VALUES( " + | 215 | qu += "insert into addressbook VALUES( " + |
212 | QString::number( m_contact.uid() ); | 216 | QString::number( m_contact.uid() ); |
213 | 217 | ||
214 | // Get all information out of the contact-class | 218 | // Get all information out of the contact-class |
215 | // Remember: The category is stored in contactMap, too ! | 219 | // Remember: The category is stored in contactMap, too ! |
216 | QMap<int, QString> contactMap = m_contact.toMap(); | 220 | QMap<int, QString> contactMap = m_contact.toMap(); |
217 | 221 | ||
218 | QStringList fieldList = OPimContactFields::untrfields( false ); | 222 | QStringList fieldList = OPimContactFields::untrfields( false ); |
219 | QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); | 223 | QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); |
220 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ | 224 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ |
221 | // Convert Column-String to Id and get value for this id.. | 225 | // Convert Column-String to Id and get value for this id.. |
222 | // Hmmm.. Maybe not very cute solution.. | 226 | // Hmmm.. Maybe not very cute solution.. |
223 | int id = translate[*it]; | 227 | int id = translate[*it]; |
224 | switch ( id ){ | 228 | switch ( id ){ |
225 | case Qtopia::Birthday: | 229 | case Qtopia::Birthday: |
226 | case Qtopia::Anniversary:{ | 230 | case Qtopia::Anniversary:{ |
227 | QDate day; | 231 | QDate day; |
228 | if ( id == Qtopia::Birthday ){ | 232 | if ( id == Qtopia::Birthday ){ |
229 | day = m_contact.birthday(); | 233 | day = m_contact.birthday(); |
230 | } else { | 234 | } else { |
231 | day = m_contact.anniversary(); | 235 | day = m_contact.anniversary(); |
232 | } | 236 | } |
233 | // These entries should stored in a special format | 237 | // These entries should stored in a special format |
234 | // year-month-day | 238 | // year-month-day |
235 | if ( day.isValid() ){ | 239 | if ( day.isValid() ){ |
236 | qu += QString(",\"%1-%2-%3\"") | 240 | qu += QString(",\"%1-%2-%3\"") |
237 | .arg( QString::number( day.year() ).rightJustify( 4, '0' ) ) | 241 | .arg( QString::number( day.year() ).rightJustify( 4, '0' ) ) |
238 | .arg( QString::number( day.month() ).rightJustify( 2, '0' ) ) | 242 | .arg( QString::number( day.month() ).rightJustify( 2, '0' ) ) |
239 | .arg( QString::number( day.day() ).rightJustify( 2, '0' ) ); | 243 | .arg( QString::number( day.day() ).rightJustify( 2, '0' ) ); |
240 | } else { | 244 | } else { |
241 | qu += ",\"\""; | 245 | qu += ",\"\""; |
242 | } | 246 | } |
243 | } | 247 | } |
244 | break; | 248 | break; |
245 | default: | 249 | default: |
246 | qu += QString( ",\"%1\"" ).arg( contactMap[id] ); | 250 | qu += QString( ",\"%1\"" ).arg( contactMap[id] ); |
247 | } | 251 | } |
248 | } | 252 | } |
249 | qu += " );"; | 253 | qu += " );"; |
250 | 254 | ||
251 | 255 | ||
252 | // Now add custom data.. | 256 | // Now add custom data.. |
253 | int id = 0; | 257 | int id = 0; |
254 | id = 0; | 258 | id = 0; |
255 | QMap<QString, QString> customMap = m_contact.toExtraMap(); | 259 | QMap<QString, QString> customMap = m_contact.toExtraMap(); |
256 | for( QMap<QString, QString>::Iterator it = customMap.begin(); | 260 | for( QMap<QString, QString>::Iterator it = customMap.begin(); |
257 | it != customMap.end(); ++it ){ | 261 | it != customMap.end(); ++it ){ |
258 | qu += "insert into custom_data VALUES(" | 262 | qu += "insert into custom_data VALUES(" |
259 | + QString::number( m_contact.uid() ) | 263 | + QString::number( m_contact.uid() ) |
260 | + "," | 264 | + "," |
261 | + QString::number( id++ ) | 265 | + QString::number( id++ ) |
262 | + ",'" | 266 | + ",'" |
263 | + it.key() | 267 | + it.key() |
264 | + "'," | 268 | + "'," |
265 | + "0" // Priority for future enhancements | 269 | + "0" // Priority for future enhancements |
266 | + ",'" | 270 | + ",'" |
267 | + it.data() | 271 | + it.data() |
268 | + "');"; | 272 | + "');"; |
269 | } | 273 | } |
270 | // qu += "commit;"; | 274 | // qu += "commit;"; |
271 | qDebug("add %s", qu.latin1() ); | 275 | odebug << "add " << qu << "" << oendl; |
272 | return qu; | 276 | return qu; |
273 | } | 277 | } |
274 | 278 | ||
275 | 279 | ||
276 | RemoveQuery::RemoveQuery(int uid ) | 280 | RemoveQuery::RemoveQuery(int uid ) |
277 | : OSQLQuery(), m_uid( uid ) {} | 281 | : OSQLQuery(), m_uid( uid ) {} |
278 | RemoveQuery::~RemoveQuery() {} | 282 | RemoveQuery::~RemoveQuery() {} |
279 | QString RemoveQuery::query()const { | 283 | QString RemoveQuery::query()const { |
280 | QString qu = "DELETE from addressbook where uid = " | 284 | QString qu = "DELETE from addressbook where uid = " |
281 | + QString::number(m_uid) + ";"; | 285 | + QString::number(m_uid) + ";"; |
282 | qu += "DELETE from custom_data where uid = " | 286 | qu += "DELETE from custom_data where uid = " |
283 | + QString::number(m_uid) + ";"; | 287 | + QString::number(m_uid) + ";"; |
284 | return qu; | 288 | return qu; |
285 | } | 289 | } |
286 | 290 | ||
287 | 291 | ||
288 | 292 | ||
289 | 293 | ||
290 | FindQuery::FindQuery(int uid) | 294 | FindQuery::FindQuery(int uid) |
291 | : OSQLQuery(), m_uid( uid ) { | 295 | : OSQLQuery(), m_uid( uid ) { |
292 | } | 296 | } |
293 | FindQuery::FindQuery(const QArray<int>& ints) | 297 | FindQuery::FindQuery(const QArray<int>& ints) |
294 | : OSQLQuery(), m_uids( ints ){ | 298 | : OSQLQuery(), m_uids( ints ){ |
295 | } | 299 | } |
296 | FindQuery::~FindQuery() { | 300 | FindQuery::~FindQuery() { |
297 | } | 301 | } |
298 | QString FindQuery::query()const{ | 302 | QString FindQuery::query()const{ |
299 | // if ( m_uids.count() == 0 ) | 303 | // if ( m_uids.count() == 0 ) |
300 | return single(); | 304 | return single(); |
301 | } | 305 | } |
302 | /* | 306 | /* |
303 | else | 307 | else |
304 | return multi(); | 308 | return multi(); |
305 | } | 309 | } |
306 | QString FindQuery::multi()const { | 310 | QString FindQuery::multi()const { |
307 | QString qu = "select uid, type, value from addressbook where"; | 311 | QString qu = "select uid, type, value from addressbook where"; |
308 | for (uint i = 0; i < m_uids.count(); i++ ) { | 312 | for (uint i = 0; i < m_uids.count(); i++ ) { |
309 | qu += " UID = " + QString::number( m_uids[i] ) + " OR"; | 313 | qu += " UID = " + QString::number( m_uids[i] ) + " OR"; |
310 | } | 314 | } |
311 | qu.remove( qu.length()-2, 2 ); // Hmmmm.. | 315 | qu.remove( qu.length()-2, 2 ); // Hmmmm.. |
312 | return qu; | 316 | return qu; |
313 | } | 317 | } |
314 | */ | 318 | */ |
315 | QString FindQuery::single()const{ | 319 | QString FindQuery::single()const{ |
316 | QString qu = "select *"; | 320 | QString qu = "select *"; |
317 | qu += " from addressbook where uid = " + QString::number(m_uid); | 321 | qu += " from addressbook where uid = " + QString::number(m_uid); |
318 | 322 | ||
319 | // qWarning("find query: %s", qu.latin1() ); | 323 | // owarn << "find query: " << qu << "" << oendl; |
320 | return qu; | 324 | return qu; |
321 | } | 325 | } |
322 | 326 | ||
323 | 327 | ||
324 | FindCustomQuery::FindCustomQuery(int uid) | 328 | FindCustomQuery::FindCustomQuery(int uid) |
325 | : OSQLQuery(), m_uid( uid ) { | 329 | : OSQLQuery(), m_uid( uid ) { |
326 | } | 330 | } |
327 | FindCustomQuery::FindCustomQuery(const QArray<int>& ints) | 331 | FindCustomQuery::FindCustomQuery(const QArray<int>& ints) |
328 | : OSQLQuery(), m_uids( ints ){ | 332 | : OSQLQuery(), m_uids( ints ){ |
329 | } | 333 | } |
330 | FindCustomQuery::~FindCustomQuery() { | 334 | FindCustomQuery::~FindCustomQuery() { |
331 | } | 335 | } |
332 | QString FindCustomQuery::query()const{ | 336 | QString FindCustomQuery::query()const{ |
333 | // if ( m_uids.count() == 0 ) | 337 | // if ( m_uids.count() == 0 ) |
334 | return single(); | 338 | return single(); |
335 | } | 339 | } |
336 | QString FindCustomQuery::single()const{ | 340 | QString FindCustomQuery::single()const{ |
337 | QString qu = "select uid, type, value from custom_data where uid = "; | 341 | QString qu = "select uid, type, value from custom_data where uid = "; |
338 | qu += QString::number(m_uid); | 342 | qu += QString::number(m_uid); |
339 | return qu; | 343 | return qu; |
340 | } | 344 | } |
341 | 345 | ||
342 | }; | 346 | }; |
343 | 347 | ||
344 | 348 | ||
345 | /* --------------------------------------------------------------------------- */ | 349 | /* --------------------------------------------------------------------------- */ |
346 | 350 | ||
347 | namespace Opie { | 351 | namespace Opie { |
348 | 352 | ||
349 | OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */, | 353 | OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */, |
350 | const QString& filename ): | 354 | const QString& filename ): |
351 | OPimContactAccessBackend(), m_changed(false), m_driver( NULL ) | 355 | OPimContactAccessBackend(), m_changed(false), m_driver( NULL ) |
352 | { | 356 | { |
353 | qDebug("C'tor OPimContactAccessBackend_SQL starts"); | 357 | odebug << "C'tor OPimContactAccessBackend_SQL starts" << oendl; |
354 | QTime t; | 358 | QTime t; |
355 | t.start(); | 359 | t.start(); |
356 | 360 | ||
357 | /* Expecting to access the default filename if nothing else is set */ | 361 | /* Expecting to access the default filename if nothing else is set */ |
358 | if ( filename.isEmpty() ){ | 362 | if ( filename.isEmpty() ){ |
359 | m_fileName = Global::applicationFileName( "addressbook","addressbook.db" ); | 363 | m_fileName = Global::applicationFileName( "addressbook","addressbook.db" ); |
360 | } else | 364 | } else |
361 | m_fileName = filename; | 365 | m_fileName = filename; |
362 | 366 | ||
363 | // Get the standart sql-driver from the OSQLManager.. | 367 | // Get the standart sql-driver from the OSQLManager.. |
364 | OSQLManager man; | 368 | OSQLManager man; |
365 | m_driver = man.standard(); | 369 | m_driver = man.standard(); |
366 | m_driver->setUrl( m_fileName ); | 370 | m_driver->setUrl( m_fileName ); |
367 | 371 | ||
368 | load(); | 372 | load(); |
369 | 373 | ||
370 | qDebug("C'tor OPimContactAccessBackend_SQL ends: %d ms", t.elapsed() ); | 374 | odebug << "C'tor OPimContactAccessBackend_SQL ends: " << t.elapsed() << " ms" << oendl; |
371 | } | 375 | } |
372 | 376 | ||
373 | OPimContactAccessBackend_SQL::~OPimContactAccessBackend_SQL () | 377 | OPimContactAccessBackend_SQL::~OPimContactAccessBackend_SQL () |
374 | { | 378 | { |
375 | if( m_driver ) | 379 | if( m_driver ) |
376 | delete m_driver; | 380 | delete m_driver; |
377 | } | 381 | } |
378 | 382 | ||
379 | bool OPimContactAccessBackend_SQL::load () | 383 | bool OPimContactAccessBackend_SQL::load () |
380 | { | 384 | { |
381 | if (!m_driver->open() ) | 385 | if (!m_driver->open() ) |
382 | return false; | 386 | return false; |
383 | 387 | ||
384 | // Don't expect that the database exists. | 388 | // Don't expect that the database exists. |
385 | // It is save here to create the table, even if it | 389 | // It is save here to create the table, even if it |
386 | // do exist. ( Is that correct for all databases ?? ) | 390 | // do exist. ( Is that correct for all databases ?? ) |
387 | CreateQuery creat; | 391 | CreateQuery creat; |
388 | OSQLResult res = m_driver->query( &creat ); | 392 | OSQLResult res = m_driver->query( &creat ); |
389 | 393 | ||
390 | update(); | 394 | update(); |
391 | 395 | ||
392 | return true; | 396 | return true; |
393 | 397 | ||
394 | } | 398 | } |
395 | 399 | ||
396 | bool OPimContactAccessBackend_SQL::reload() | 400 | bool OPimContactAccessBackend_SQL::reload() |
397 | { | 401 | { |
398 | return load(); | 402 | return load(); |
399 | } | 403 | } |
400 | 404 | ||
401 | bool OPimContactAccessBackend_SQL::save() | 405 | bool OPimContactAccessBackend_SQL::save() |
402 | { | 406 | { |
403 | return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) | 407 | return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) |
404 | } | 408 | } |
405 | 409 | ||
406 | 410 | ||
407 | void OPimContactAccessBackend_SQL::clear () | 411 | void OPimContactAccessBackend_SQL::clear () |
408 | { | 412 | { |
409 | ClearQuery cle; | 413 | ClearQuery cle; |
410 | OSQLResult res = m_driver->query( &cle ); | 414 | OSQLResult res = m_driver->query( &cle ); |
411 | 415 | ||
412 | reload(); | 416 | reload(); |
413 | } | 417 | } |
414 | 418 | ||
415 | bool OPimContactAccessBackend_SQL::wasChangedExternally() | 419 | bool OPimContactAccessBackend_SQL::wasChangedExternally() |
416 | { | 420 | { |
417 | return false; | 421 | return false; |
418 | } | 422 | } |
419 | 423 | ||
420 | QArray<int> OPimContactAccessBackend_SQL::allRecords() const | 424 | QArray<int> OPimContactAccessBackend_SQL::allRecords() const |
421 | { | 425 | { |
422 | 426 | ||
423 | // FIXME: Think about cute handling of changed tables.. | 427 | // FIXME: Think about cute handling of changed tables.. |
424 | // Thus, we don't have to call update here... | 428 | // Thus, we don't have to call update here... |
425 | if ( m_changed ) | 429 | if ( m_changed ) |
426 | ((OPimContactAccessBackend_SQL*)this)->update(); | 430 | ((OPimContactAccessBackend_SQL*)this)->update(); |
427 | 431 | ||
428 | return m_uids; | 432 | return m_uids; |
429 | } | 433 | } |
430 | 434 | ||
431 | bool OPimContactAccessBackend_SQL::add ( const OPimContact &newcontact ) | 435 | bool OPimContactAccessBackend_SQL::add ( const OPimContact &newcontact ) |
432 | { | 436 | { |
433 | qDebug("add in contact SQL-Backend"); | 437 | odebug << "add in contact SQL-Backend" << oendl; |
434 | InsertQuery ins( newcontact ); | 438 | InsertQuery ins( newcontact ); |
435 | OSQLResult res = m_driver->query( &ins ); | 439 | OSQLResult res = m_driver->query( &ins ); |
436 | 440 | ||
437 | if ( res.state() == OSQLResult::Failure ) | 441 | if ( res.state() == OSQLResult::Failure ) |
438 | return false; | 442 | return false; |
439 | 443 | ||
440 | int c = m_uids.count(); | 444 | int c = m_uids.count(); |
441 | m_uids.resize( c+1 ); | 445 | m_uids.resize( c+1 ); |
442 | m_uids[c] = newcontact.uid(); | 446 | m_uids[c] = newcontact.uid(); |
443 | 447 | ||
444 | return true; | 448 | return true; |
445 | } | 449 | } |
446 | 450 | ||
447 | 451 | ||
448 | bool OPimContactAccessBackend_SQL::remove ( int uid ) | 452 | bool OPimContactAccessBackend_SQL::remove ( int uid ) |
449 | { | 453 | { |
450 | RemoveQuery rem( uid ); | 454 | RemoveQuery rem( uid ); |
451 | OSQLResult res = m_driver->query(&rem ); | 455 | OSQLResult res = m_driver->query(&rem ); |
452 | 456 | ||
453 | if ( res.state() == OSQLResult::Failure ) | 457 | if ( res.state() == OSQLResult::Failure ) |
454 | return false; | 458 | return false; |
455 | 459 | ||
456 | m_changed = true; | 460 | m_changed = true; |
457 | 461 | ||
458 | return true; | 462 | return true; |
459 | } | 463 | } |
460 | 464 | ||
461 | bool OPimContactAccessBackend_SQL::replace ( const OPimContact &contact ) | 465 | bool OPimContactAccessBackend_SQL::replace ( const OPimContact &contact ) |
462 | { | 466 | { |
463 | if ( !remove( contact.uid() ) ) | 467 | if ( !remove( contact.uid() ) ) |
464 | return false; | 468 | return false; |
465 | 469 | ||
466 | return add( contact ); | 470 | return add( contact ); |
467 | } | 471 | } |
468 | 472 | ||
469 | 473 | ||
470 | OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const | 474 | OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const |
471 | { | 475 | { |
472 | qDebug("OPimContactAccessBackend_SQL::find()"); | 476 | odebug << "OPimContactAccessBackend_SQL::find()" << oendl; |
473 | QTime t; | 477 | QTime t; |
474 | t.start(); | 478 | t.start(); |
475 | 479 | ||
476 | OPimContact retContact( requestNonCustom( uid ) ); | 480 | OPimContact retContact( requestNonCustom( uid ) ); |
477 | retContact.setExtraMap( requestCustom( uid ) ); | 481 | retContact.setExtraMap( requestCustom( uid ) ); |
478 | 482 | ||
479 | qDebug("OPimContactAccessBackend_SQL::find() needed: %d ms", t.elapsed() ); | 483 | odebug << "OPimContactAccessBackend_SQL::find() needed: " << t.elapsed() << " ms" << oendl; |
480 | return retContact; | 484 | return retContact; |
481 | } | 485 | } |
482 | 486 | ||
483 | 487 | ||
484 | 488 | ||
485 | QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd ) | 489 | QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd ) |
486 | { | 490 | { |
487 | QString qu = "SELECT uid FROM addressbook WHERE"; | 491 | QString qu = "SELECT uid FROM addressbook WHERE"; |
488 | QString searchQuery =""; | 492 | QString searchQuery =""; |
489 | 493 | ||
490 | QDate startDate; | 494 | QDate startDate; |
491 | 495 | ||
492 | if ( qd.isValid() ) | 496 | if ( qd.isValid() ) |
493 | startDate = qd.date(); | 497 | startDate = qd.date(); |
494 | else | 498 | else |
495 | startDate = QDate::currentDate(); | 499 | startDate = QDate::currentDate(); |
496 | 500 | ||
497 | 501 | ||
498 | QMap<int, QString> queryFields = query.toMap(); | 502 | QMap<int, QString> queryFields = query.toMap(); |
499 | QStringList fieldList = OPimContactFields::untrfields( false ); | 503 | QStringList fieldList = OPimContactFields::untrfields( false ); |
500 | QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); | 504 | QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); |
501 | 505 | ||
502 | // Convert every filled field to a SQL-Query | 506 | // Convert every filled field to a SQL-Query |
503 | // bool isAnyFieldSelected = false; | 507 | // bool isAnyFieldSelected = false; |
504 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ | 508 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ |
505 | 509 | ||
506 | int id = translate[*it]; | 510 | int id = translate[*it]; |
507 | QString queryStr = queryFields[id]; | 511 | QString queryStr = queryFields[id]; |
508 | QDate* endDate = 0l; | 512 | QDate* endDate = 0l; |
509 | 513 | ||
510 | if ( !queryStr.isEmpty() ){ | 514 | if ( !queryStr.isEmpty() ){ |
511 | // If something is alredy stored in the query, add an "AND" | 515 | // If something is alredy stored in the query, add an "AND" |
512 | // to the end of the string to prepare for the next .. | 516 | // to the end of the string to prepare for the next .. |
513 | if ( !searchQuery.isEmpty() ) | 517 | if ( !searchQuery.isEmpty() ) |
514 | searchQuery += " AND"; | 518 | searchQuery += " AND"; |
515 | 519 | ||
516 | // isAnyFieldSelected = true; | 520 | // isAnyFieldSelected = true; |
517 | switch( id ){ | 521 | switch( id ){ |
518 | case Qtopia::Birthday: | 522 | case Qtopia::Birthday: |
519 | endDate = new QDate( query.birthday() ); | 523 | endDate = new QDate( query.birthday() ); |
520 | // Fall through ! | 524 | // Fall through ! |
521 | case Qtopia::Anniversary: | 525 | case Qtopia::Anniversary: |
522 | if ( endDate == 0l ) | 526 | if ( endDate == 0l ) |
523 | endDate = new QDate( query.anniversary() ); | 527 | endDate = new QDate( query.anniversary() ); |
524 | 528 | ||
525 | if ( settings & OPimContactAccess::DateDiff ) { | 529 | if ( settings & OPimContactAccess::DateDiff ) { |
526 | searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" ) | 530 | searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" ) |
527 | .arg( *it ) | 531 | .arg( *it ) |
528 | .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ) | 532 | .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ) |
529 | .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ) | 533 | .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ) |
530 | .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ) | 534 | .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ) |
531 | .arg( *it ) | 535 | .arg( *it ) |
532 | .arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) ) | 536 | .arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) ) |
533 | .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) ) | 537 | .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) ) |
534 | .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ; | 538 | .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ; |
535 | } | 539 | } |
536 | 540 | ||
537 | if ( settings & OPimContactAccess::DateYear ){ | 541 | if ( settings & OPimContactAccess::DateYear ){ |
538 | if ( settings & OPimContactAccess::DateDiff ) | 542 | if ( settings & OPimContactAccess::DateDiff ) |
539 | searchQuery += " AND"; | 543 | searchQuery += " AND"; |
540 | 544 | ||
541 | searchQuery += QString( " (\"%1\" LIKE '%2-%')" ) | 545 | searchQuery += QString( " (\"%1\" LIKE '%2-%')" ) |
542 | .arg( *it ) | 546 | .arg( *it ) |
543 | .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ); | 547 | .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ); |
544 | } | 548 | } |
545 | 549 | ||
546 | if ( settings & OPimContactAccess::DateMonth ){ | 550 | if ( settings & OPimContactAccess::DateMonth ){ |
547 | if ( ( settings & OPimContactAccess::DateDiff ) | 551 | if ( ( settings & OPimContactAccess::DateDiff ) |
548 | || ( settings & OPimContactAccess::DateYear ) ) | 552 | || ( settings & OPimContactAccess::DateYear ) ) |
549 | searchQuery += " AND"; | 553 | searchQuery += " AND"; |
550 | 554 | ||
551 | searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" ) | 555 | searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" ) |
552 | .arg( *it ) | 556 | .arg( *it ) |
553 | .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ); | 557 | .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ); |
554 | } | 558 | } |
555 | 559 | ||
556 | if ( settings & OPimContactAccess::DateDay ){ | 560 | if ( settings & OPimContactAccess::DateDay ){ |
557 | if ( ( settings & OPimContactAccess::DateDiff ) | 561 | if ( ( settings & OPimContactAccess::DateDiff ) |
558 | || ( settings & OPimContactAccess::DateYear ) | 562 | || ( settings & OPimContactAccess::DateYear ) |
559 | || ( settings & OPimContactAccess::DateMonth ) ) | 563 | || ( settings & OPimContactAccess::DateMonth ) ) |
560 | searchQuery += " AND"; | 564 | searchQuery += " AND"; |
561 | 565 | ||
562 | searchQuery += QString( " (\"%1\" LIKE '%-%-%2')" ) | 566 | searchQuery += QString( " (\"%1\" LIKE '%-%-%2')" ) |
563 | .arg( *it ) | 567 | .arg( *it ) |
564 | .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ); | 568 | .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ); |
565 | } | 569 | } |
566 | 570 | ||
567 | break; | 571 | break; |
568 | default: | 572 | default: |
569 | // Switching between case sensitive and insensitive... | 573 | // Switching between case sensitive and insensitive... |
570 | // LIKE is not case sensitive, GLOB is case sensitive | 574 | // LIKE is not case sensitive, GLOB is case sensitive |
571 | // Do exist a better solution to switch this ? | 575 | // Do exist a better solution to switch this ? |
572 | if ( settings & OPimContactAccess::IgnoreCase ) | 576 | if ( settings & OPimContactAccess::IgnoreCase ) |
573 | searchQuery += "(\"" + *it + "\"" + " LIKE " + "'" | 577 | searchQuery += "(\"" + *it + "\"" + " LIKE " + "'" |
574 | + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")"; | 578 | + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")"; |
575 | else | 579 | else |
576 | searchQuery += "(\"" + *it + "\"" + " GLOB " + "'" | 580 | searchQuery += "(\"" + *it + "\"" + " GLOB " + "'" |
577 | + queryStr + "'" + ")"; | 581 | + queryStr + "'" + ")"; |
578 | 582 | ||
579 | } | 583 | } |
580 | } | 584 | } |
581 | } | 585 | } |
582 | // Skip trailing "AND" | 586 | // Skip trailing "AND" |
583 | // if ( isAnyFieldSelected ) | 587 | // if ( isAnyFieldSelected ) |
584 | // qu = qu.left( qu.length() - 4 ); | 588 | // qu = qu.left( qu.length() - 4 ); |
585 | 589 | ||
586 | qu += searchQuery; | 590 | qu += searchQuery; |
587 | 591 | ||
588 | qDebug( "queryByExample query: %s", qu.latin1() ); | 592 | odebug << "queryByExample query: " << qu << "" << oendl; |
589 | 593 | ||
590 | // Execute query and return the received uid's | 594 | // Execute query and return the received uid's |
591 | OSQLRawQuery raw( qu ); | 595 | OSQLRawQuery raw( qu ); |
592 | OSQLResult res = m_driver->query( &raw ); | 596 | OSQLResult res = m_driver->query( &raw ); |
593 | if ( res.state() != OSQLResult::Success ){ | 597 | if ( res.state() != OSQLResult::Success ){ |
594 | QArray<int> empty; | 598 | QArray<int> empty; |
595 | return empty; | 599 | return empty; |
596 | } | 600 | } |
597 | 601 | ||
598 | QArray<int> list = extractUids( res ); | 602 | QArray<int> list = extractUids( res ); |
599 | 603 | ||
600 | return list; | 604 | return list; |
601 | } | 605 | } |
602 | 606 | ||
603 | QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const | 607 | QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const |
604 | { | 608 | { |
605 | #if 0 | 609 | #if 0 |
606 | QArray<int> nix(0); | 610 | QArray<int> nix(0); |
607 | return nix; | 611 | return nix; |
608 | 612 | ||
609 | #else | 613 | #else |
610 | QString qu = "SELECT uid FROM addressbook WHERE ("; | 614 | QString qu = "SELECT uid FROM addressbook WHERE ("; |
611 | QString searchlist; | 615 | QString searchlist; |
612 | 616 | ||
613 | QStringList fieldList = OPimContactFields::untrfields( false ); | 617 | QStringList fieldList = OPimContactFields::untrfields( false ); |
614 | // QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); | 618 | // QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); |
615 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ | 619 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ |
616 | if ( !searchlist.isEmpty() ) | 620 | if ( !searchlist.isEmpty() ) |
617 | searchlist += " OR "; | 621 | searchlist += " OR "; |
618 | searchlist += " rlike(\""+ r.pattern() + "\",\"" + *it + "\") "; | 622 | searchlist += " rlike(\""+ r.pattern() + "\",\"" + *it + "\") "; |
619 | } | 623 | } |
620 | |||
621 | qu = qu + searchlist + ")"; | ||
622 | 624 | ||
623 | qDebug( "query: %s", qu.latin1() ); | 625 | qu = qu + searchlist + ")"; |
624 | 626 | ||
625 | OSQLRawQuery raw( qu ); | 627 | odebug << "query: " << qu << "" << oendl; |
626 | OSQLResult res = m_driver->query( &raw ); | ||
627 | 628 | ||
628 | return extractUids( res ); | 629 | OSQLRawQuery raw( qu ); |
630 | OSQLResult res = m_driver->query( &raw ); | ||
631 | |||
632 | return extractUids( res ); | ||
629 | 633 | ||
630 | 634 | ||
631 | #endif | 635 | #endif |
632 | } | 636 | } |
633 | 637 | ||
634 | const uint OPimContactAccessBackend_SQL::querySettings() | 638 | const uint OPimContactAccessBackend_SQL::querySettings() |
635 | { | 639 | { |
636 | return OPimContactAccess::IgnoreCase | 640 | return OPimContactAccess::IgnoreCase |
637 | | OPimContactAccess::WildCards | 641 | | OPimContactAccess::WildCards |
638 | | OPimContactAccess::DateDiff | 642 | | OPimContactAccess::DateDiff |
639 | | OPimContactAccess::DateYear | 643 | | OPimContactAccess::DateYear |
640 | | OPimContactAccess::DateMonth | 644 | | OPimContactAccess::DateMonth |
641 | | OPimContactAccess::DateDay | 645 | | OPimContactAccess::DateDay |
642 | ; | 646 | ; |
643 | } | 647 | } |
644 | 648 | ||
645 | bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const | 649 | bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const |
646 | { | 650 | { |
647 | /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay | 651 | /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay |
648 | * may be added with any of the other settings. IgnoreCase should never used alone. | 652 | * may be added with any of the other settings. IgnoreCase should never used alone. |
649 | * Wildcards, RegExp, ExactMatch should never used at the same time... | 653 | * Wildcards, RegExp, ExactMatch should never used at the same time... |
650 | */ | 654 | */ |
651 | 655 | ||
652 | // Step 1: Check whether the given settings are supported by this backend | 656 | // Step 1: Check whether the given settings are supported by this backend |
653 | if ( ( querySettings & ( | 657 | if ( ( querySettings & ( |
654 | OPimContactAccess::IgnoreCase | 658 | OPimContactAccess::IgnoreCase |
655 | | OPimContactAccess::WildCards | 659 | | OPimContactAccess::WildCards |
656 | | OPimContactAccess::DateDiff | 660 | | OPimContactAccess::DateDiff |
657 | | OPimContactAccess::DateYear | 661 | | OPimContactAccess::DateYear |
658 | | OPimContactAccess::DateMonth | 662 | | OPimContactAccess::DateMonth |
659 | | OPimContactAccess::DateDay | 663 | | OPimContactAccess::DateDay |
660 | // | OPimContactAccess::RegExp | 664 | // | OPimContactAccess::RegExp |
661 | // | OPimContactAccess::ExactMatch | 665 | // | OPimContactAccess::ExactMatch |
662 | ) ) != querySettings ) | 666 | ) ) != querySettings ) |
663 | return false; | 667 | return false; |
664 | 668 | ||
665 | // Step 2: Check whether the given combinations are ok.. | 669 | // Step 2: Check whether the given combinations are ok.. |
666 | 670 | ||
667 | // IngoreCase alone is invalid | 671 | // IngoreCase alone is invalid |
668 | if ( querySettings == OPimContactAccess::IgnoreCase ) | 672 | if ( querySettings == OPimContactAccess::IgnoreCase ) |
669 | return false; | 673 | return false; |
670 | 674 | ||
671 | // WildCards, RegExp and ExactMatch should never used at the same time | 675 | // WildCards, RegExp and ExactMatch should never used at the same time |
672 | switch ( querySettings & ~( OPimContactAccess::IgnoreCase | 676 | switch ( querySettings & ~( OPimContactAccess::IgnoreCase |
673 | | OPimContactAccess::DateDiff | 677 | | OPimContactAccess::DateDiff |
674 | | OPimContactAccess::DateYear | 678 | | OPimContactAccess::DateYear |
675 | | OPimContactAccess::DateMonth | 679 | | OPimContactAccess::DateMonth |
676 | | OPimContactAccess::DateDay | 680 | | OPimContactAccess::DateDay |
677 | ) | 681 | ) |
678 | ){ | 682 | ){ |
679 | case OPimContactAccess::RegExp: | 683 | case OPimContactAccess::RegExp: |
680 | return ( true ); | 684 | return ( true ); |
681 | case OPimContactAccess::WildCards: | 685 | case OPimContactAccess::WildCards: |
682 | return ( true ); | 686 | return ( true ); |
683 | case OPimContactAccess::ExactMatch: | 687 | case OPimContactAccess::ExactMatch: |
684 | return ( true ); | 688 | return ( true ); |
685 | case 0: // one of the upper removed bits were set.. | 689 | case 0: // one of the upper removed bits were set.. |
686 | return ( true ); | 690 | return ( true ); |
687 | default: | 691 | default: |
688 | return ( false ); | 692 | return ( false ); |
689 | } | 693 | } |
690 | 694 | ||
691 | } | 695 | } |
692 | 696 | ||
693 | QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) | 697 | QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) |
694 | { | 698 | { |
695 | QTime t; | 699 | QTime t; |
696 | t.start(); | 700 | t.start(); |
697 | 701 | ||
698 | QString query = "SELECT uid FROM addressbook "; | 702 | QString query = "SELECT uid FROM addressbook "; |
699 | query += "ORDER BY \"Last Name\" "; | 703 | query += "ORDER BY \"Last Name\" "; |
700 | 704 | ||
701 | if ( !asc ) | 705 | if ( !asc ) |
702 | query += "DESC"; | 706 | query += "DESC"; |
703 | 707 | ||
704 | // qDebug("sorted query is: %s", query.latin1() ); | 708 | // odebug << "sorted query is: " << query << "" << oendl; |
705 | 709 | ||
706 | OSQLRawQuery raw( query ); | 710 | OSQLRawQuery raw( query ); |
707 | OSQLResult res = m_driver->query( &raw ); | 711 | OSQLResult res = m_driver->query( &raw ); |
708 | if ( res.state() != OSQLResult::Success ){ | 712 | if ( res.state() != OSQLResult::Success ){ |
709 | QArray<int> empty; | 713 | QArray<int> empty; |
710 | return empty; | 714 | return empty; |
711 | } | 715 | } |
712 | 716 | ||
713 | QArray<int> list = extractUids( res ); | 717 | QArray<int> list = extractUids( res ); |
714 | 718 | ||
715 | qDebug("sorted needed %d ms!", t.elapsed() ); | 719 | odebug << "sorted needed " << t.elapsed() << " ms!" << oendl; |
716 | return list; | 720 | return list; |
717 | } | 721 | } |
718 | 722 | ||
719 | 723 | ||
720 | void OPimContactAccessBackend_SQL::update() | 724 | void OPimContactAccessBackend_SQL::update() |
721 | { | 725 | { |
722 | qDebug("Update starts"); | 726 | odebug << "Update starts" << oendl; |
723 | QTime t; | 727 | QTime t; |
724 | t.start(); | 728 | t.start(); |
725 | 729 | ||
726 | // Now load the database set and extract the uid's | 730 | // Now load the database set and extract the uid's |
727 | // which will be held locally | 731 | // which will be held locally |
728 | 732 | ||
729 | LoadQuery lo; | 733 | LoadQuery lo; |
730 | OSQLResult res = m_driver->query(&lo); | 734 | OSQLResult res = m_driver->query(&lo); |
731 | if ( res.state() != OSQLResult::Success ) | 735 | if ( res.state() != OSQLResult::Success ) |
732 | return; | 736 | return; |
733 | 737 | ||
734 | m_uids = extractUids( res ); | 738 | m_uids = extractUids( res ); |
735 | 739 | ||
736 | m_changed = false; | 740 | m_changed = false; |
737 | 741 | ||
738 | qDebug("Update ends %d ms", t.elapsed() ); | 742 | odebug << "Update ends " << t.elapsed() << " ms" << oendl; |
739 | } | 743 | } |
740 | 744 | ||
741 | QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const | 745 | QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const |
742 | { | 746 | { |
743 | qDebug("extractUids"); | 747 | odebug << "extractUids" << oendl; |
744 | QTime t; | 748 | QTime t; |
745 | t.start(); | 749 | t.start(); |
746 | OSQLResultItem::ValueList list = res.results(); | 750 | OSQLResultItem::ValueList list = res.results(); |
747 | OSQLResultItem::ValueList::Iterator it; | 751 | OSQLResultItem::ValueList::Iterator it; |
748 | QArray<int> ints(list.count() ); | 752 | QArray<int> ints(list.count() ); |
749 | qDebug(" count = %d", list.count() ); | 753 | odebug << " count = " << list.count() << "" << oendl; |
750 | 754 | ||
751 | int i = 0; | 755 | int i = 0; |
752 | for (it = list.begin(); it != list.end(); ++it ) { | 756 | for (it = list.begin(); it != list.end(); ++it ) { |
753 | ints[i] = (*it).data("uid").toInt(); | 757 | ints[i] = (*it).data("uid").toInt(); |
754 | i++; | 758 | i++; |
755 | } | 759 | } |
756 | qDebug("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() ); | 760 | odebug << "extractUids ready: count2 = " << i << " needs " << t.elapsed() << " ms" << oendl; |
757 | 761 | ||
758 | return ints; | 762 | return ints; |
759 | 763 | ||
760 | } | 764 | } |
761 | 765 | ||
762 | QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const | 766 | QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const |
763 | { | 767 | { |
764 | QTime t; | 768 | QTime t; |
765 | t.start(); | 769 | t.start(); |
766 | 770 | ||
767 | QMap<int, QString> nonCustomMap; | 771 | QMap<int, QString> nonCustomMap; |
768 | 772 | ||
769 | int t2needed = 0; | 773 | int t2needed = 0; |
770 | int t3needed = 0; | 774 | int t3needed = 0; |
771 | QTime t2; | 775 | QTime t2; |
772 | t2.start(); | 776 | t2.start(); |
773 | FindQuery query( uid ); | 777 | FindQuery query( uid ); |
774 | OSQLResult res_noncustom = m_driver->query( &query ); | 778 | OSQLResult res_noncustom = m_driver->query( &query ); |
775 | t2needed = t2.elapsed(); | 779 | t2needed = t2.elapsed(); |
776 | 780 | ||
777 | OSQLResultItem resItem = res_noncustom.first(); | 781 | OSQLResultItem resItem = res_noncustom.first(); |
778 | 782 | ||
779 | QTime t3; | 783 | QTime t3; |
780 | t3.start(); | 784 | t3.start(); |
781 | // Now loop through all columns | 785 | // Now loop through all columns |
782 | QStringList fieldList = OPimContactFields::untrfields( false ); | 786 | QStringList fieldList = OPimContactFields::untrfields( false ); |
783 | QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); | 787 | QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); |
784 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ | 788 | for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ |
785 | // Get data for the selected column and store it with the | 789 | // Get data for the selected column and store it with the |
786 | // corresponding id into the map.. | 790 | // corresponding id into the map.. |
787 | 791 | ||
788 | int id = translate[*it]; | 792 | int id = translate[*it]; |
789 | QString value = resItem.data( (*it) ); | 793 | QString value = resItem.data( (*it) ); |
790 | 794 | ||
791 | // qDebug("Reading %s... found: %s", (*it).latin1(), value.latin1() ); | 795 | // odebug << "Reading " << (*it) << "... found: " << value << "" << oendl; |
792 | 796 | ||
793 | switch( id ){ | 797 | switch( id ){ |
794 | case Qtopia::Birthday: | 798 | case Qtopia::Birthday: |
795 | case Qtopia::Anniversary:{ | 799 | case Qtopia::Anniversary:{ |
796 | // Birthday and Anniversary are encoded special ( yyyy-mm-dd ) | 800 | // Birthday and Anniversary are encoded special ( yyyy-mm-dd ) |
797 | QStringList list = QStringList::split( '-', value ); | 801 | QStringList list = QStringList::split( '-', value ); |
798 | QStringList::Iterator lit = list.begin(); | 802 | QStringList::Iterator lit = list.begin(); |
799 | int year = (*lit).toInt(); | 803 | int year = (*lit).toInt(); |
800 | int month = (*(++lit)).toInt(); | 804 | int month = (*(++lit)).toInt(); |
801 | int day = (*(++lit)).toInt(); | 805 | int day = (*(++lit)).toInt(); |
802 | if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){ | 806 | if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){ |
803 | QDate date( year, month, day ); | 807 | QDate date( year, month, day ); |
804 | nonCustomMap.insert( id, OPimDateConversion::dateToString( date ) ); | 808 | nonCustomMap.insert( id, OPimDateConversion::dateToString( date ) ); |
805 | } | 809 | } |
806 | } | 810 | } |
807 | break; | 811 | break; |
808 | case Qtopia::AddressCategory: | 812 | case Qtopia::AddressCategory: |
809 | qDebug("Category is: %s", value.latin1() ); | 813 | odebug << "Category is: " << value << "" << oendl; |
810 | default: | 814 | default: |
811 | nonCustomMap.insert( id, value ); | 815 | nonCustomMap.insert( id, value ); |
812 | } | 816 | } |
813 | } | 817 | } |
814 | 818 | ||
815 | // First insert uid | 819 | // First insert uid |
816 | nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) ); | 820 | nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) ); |
817 | t3needed = t3.elapsed(); | 821 | t3needed = t3.elapsed(); |
818 | 822 | ||
819 | // qDebug("Adding UID: %s", resItem.data( "uid" ).latin1() ); | 823 | // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; |
820 | qDebug("RequestNonCustom needed: insg.:%d ms, query: %d ms, mapping: %d ms", | 824 | odebug << "RequestNonCustom needed: insg.:" << t.elapsed() << " ms, query: " << t2needed |
821 | t.elapsed(), t2needed, t3needed ); | 825 | << " ms, mapping: " << t3needed << " ms" << oendl; |
822 | 826 | ||
823 | return nonCustomMap; | 827 | return nonCustomMap; |
824 | } | 828 | } |
825 | 829 | ||
826 | QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const | 830 | QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const |
827 | { | 831 | { |
828 | QTime t; | 832 | QTime t; |
829 | t.start(); | 833 | t.start(); |
830 | 834 | ||
831 | QMap<QString, QString> customMap; | 835 | QMap<QString, QString> customMap; |
832 | 836 | ||
833 | FindCustomQuery query( uid ); | 837 | FindCustomQuery query( uid ); |
834 | OSQLResult res_custom = m_driver->query( &query ); | 838 | OSQLResult res_custom = m_driver->query( &query ); |
835 | 839 | ||
836 | if ( res_custom.state() == OSQLResult::Failure ) { | 840 | if ( res_custom.state() == OSQLResult::Failure ) { |
837 | qWarning("OSQLResult::Failure in find query !!"); | 841 | owarn << "OSQLResult::Failure in find query !!" << oendl; |
838 | QMap<QString, QString> empty; | 842 | QMap<QString, QString> empty; |
839 | return empty; | 843 | return empty; |
840 | } | 844 | } |
841 | 845 | ||
842 | OSQLResultItem::ValueList list = res_custom.results(); | 846 | OSQLResultItem::ValueList list = res_custom.results(); |
843 | OSQLResultItem::ValueList::Iterator it = list.begin(); | 847 | OSQLResultItem::ValueList::Iterator it = list.begin(); |
844 | for ( ; it != list.end(); ++it ) { | 848 | for ( ; it != list.end(); ++it ) { |
845 | customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); | 849 | customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); |
846 | } | 850 | } |
847 | 851 | ||
848 | qDebug("RequestCustom needed: %d ms", t.elapsed() ); | 852 | odebug << "RequestCustom needed: " << t.elapsed() << " ms" << oendl; |
849 | return customMap; | 853 | return customMap; |
850 | } | 854 | } |
851 | 855 | ||
852 | } | 856 | } |
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp index ffa6a7d..b6ea461 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp | |||
@@ -32,565 +32,567 @@ | |||
32 | 32 | ||
33 | 33 | ||
34 | #include "vobject_p.h" | 34 | #include "vobject_p.h" |
35 | 35 | ||
36 | /* OPIE */ | 36 | /* OPIE */ |
37 | #include <opie2/ocontactaccessbackend_vcard.h> | 37 | #include <opie2/ocontactaccessbackend_vcard.h> |
38 | #include <opie2/odebug.h> | ||
39 | |||
38 | #include <qpe/timeconversion.h> | 40 | #include <qpe/timeconversion.h> |
39 | 41 | ||
40 | //FIXME: Hack to allow direct access to FILE* fh. Rewrite this! | 42 | //FIXME: Hack to allow direct access to FILE* fh. Rewrite this! |
41 | #define protected public | 43 | #define protected public |
42 | #include <qfile.h> | 44 | #include <qfile.h> |
43 | #undef protected | 45 | #undef protected |
44 | 46 | ||
45 | namespace Opie { | 47 | namespace Opie { |
46 | 48 | ||
47 | OPimContactAccessBackend_VCard::OPimContactAccessBackend_VCard ( const QString& , const QString& filename ): | 49 | OPimContactAccessBackend_VCard::OPimContactAccessBackend_VCard ( const QString& , const QString& filename ): |
48 | m_dirty( false ), | 50 | m_dirty( false ), |
49 | m_file( filename ) | 51 | m_file( filename ) |
50 | { | 52 | { |
51 | load(); | 53 | load(); |
52 | } | 54 | } |
53 | 55 | ||
54 | 56 | ||
55 | bool OPimContactAccessBackend_VCard::load () | 57 | bool OPimContactAccessBackend_VCard::load () |
56 | { | 58 | { |
57 | m_map.clear(); | 59 | m_map.clear(); |
58 | m_dirty = false; | 60 | m_dirty = false; |
59 | 61 | ||
60 | VObject* obj = 0l; | 62 | VObject* obj = 0l; |
61 | 63 | ||
62 | if ( QFile::exists(m_file) ){ | 64 | if ( QFile::exists(m_file) ){ |
63 | obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); | 65 | obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); |
64 | if ( !obj ) | 66 | if ( !obj ) |
65 | return false; | 67 | return false; |
66 | }else{ | 68 | }else{ |
67 | qWarning("File \"%s\" not found !", m_file.latin1() ); | 69 | owarn << "File \"" << m_file << "\" not found !" << oendl; |
68 | return false; | 70 | return false; |
69 | } | 71 | } |
70 | 72 | ||
71 | while ( obj ) { | 73 | while ( obj ) { |
72 | OPimContact con = parseVObject( obj ); | 74 | OPimContact con = parseVObject( obj ); |
73 | /* | 75 | /* |
74 | * if uid is 0 assign a new one | 76 | * if uid is 0 assign a new one |
75 | * this at least happens on | 77 | * this at least happens on |
76 | * Nokia6210 | 78 | * Nokia6210 |
77 | */ | 79 | */ |
78 | if ( con.uid() == 0 ){ | 80 | if ( con.uid() == 0 ){ |
79 | con.setUid( 1 ); | 81 | con.setUid( 1 ); |
80 | qWarning("assigned new uid %d",con.uid() ); | 82 | owarn << "assigned new uid " << con.uid() << "" << oendl; |
81 | } | 83 | } |
82 | 84 | ||
83 | m_map.insert( con.uid(), con ); | 85 | m_map.insert( con.uid(), con ); |
84 | 86 | ||
85 | VObject *t = obj; | 87 | VObject *t = obj; |
86 | obj = nextVObjectInList(obj); | 88 | obj = nextVObjectInList(obj); |
87 | cleanVObject( t ); | 89 | cleanVObject( t ); |
88 | } | 90 | } |
89 | 91 | ||
90 | return true; | 92 | return true; |
91 | 93 | ||
92 | } | 94 | } |
93 | bool OPimContactAccessBackend_VCard::reload() | 95 | bool OPimContactAccessBackend_VCard::reload() |
94 | { | 96 | { |
95 | return load(); | 97 | return load(); |
96 | } | 98 | } |
97 | bool OPimContactAccessBackend_VCard::save() | 99 | bool OPimContactAccessBackend_VCard::save() |
98 | { | 100 | { |
99 | if (!m_dirty ) | 101 | if (!m_dirty ) |
100 | return true; | 102 | return true; |
101 | 103 | ||
102 | QFile file( m_file ); | 104 | QFile file( m_file ); |
103 | if (!file.open(IO_WriteOnly ) ) | 105 | if (!file.open(IO_WriteOnly ) ) |
104 | return false; | 106 | return false; |
105 | 107 | ||
106 | VObject *obj; | 108 | VObject *obj; |
107 | obj = newVObject( VCCalProp ); | 109 | obj = newVObject( VCCalProp ); |
108 | addPropValue( obj, VCVersionProp, "1.0" ); | 110 | addPropValue( obj, VCVersionProp, "1.0" ); |
109 | 111 | ||
110 | VObject *vo; | 112 | VObject *vo; |
111 | for(QMap<int, OPimContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ | 113 | for(QMap<int, OPimContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ |
112 | vo = createVObject( *it ); | 114 | vo = createVObject( *it ); |
113 | writeVObject( file.fh, vo ); //FIXME: HACK!!! | 115 | writeVObject( file.fh, vo ); //FIXME: HACK!!! |
114 | cleanVObject( vo ); | 116 | cleanVObject( vo ); |
115 | } | 117 | } |
116 | cleanStrTbl(); | 118 | cleanStrTbl(); |
117 | deleteVObject( obj ); | 119 | deleteVObject( obj ); |
118 | 120 | ||
119 | m_dirty = false; | 121 | m_dirty = false; |
120 | return true; | 122 | return true; |
121 | 123 | ||
122 | 124 | ||
123 | } | 125 | } |
124 | void OPimContactAccessBackend_VCard::clear () | 126 | void OPimContactAccessBackend_VCard::clear () |
125 | { | 127 | { |
126 | m_map.clear(); | 128 | m_map.clear(); |
127 | m_dirty = true; // ??? sure ? (se) | 129 | m_dirty = true; // ??? sure ? (se) |
128 | } | 130 | } |
129 | 131 | ||
130 | bool OPimContactAccessBackend_VCard::add ( const OPimContact& newcontact ) | 132 | bool OPimContactAccessBackend_VCard::add ( const OPimContact& newcontact ) |
131 | { | 133 | { |
132 | m_map.insert( newcontact.uid(), newcontact ); | 134 | m_map.insert( newcontact.uid(), newcontact ); |
133 | m_dirty = true; | 135 | m_dirty = true; |
134 | return true; | 136 | return true; |
135 | } | 137 | } |
136 | 138 | ||
137 | bool OPimContactAccessBackend_VCard::remove ( int uid ) | 139 | bool OPimContactAccessBackend_VCard::remove ( int uid ) |
138 | { | 140 | { |
139 | m_map.remove( uid ); | 141 | m_map.remove( uid ); |
140 | m_dirty = true; | 142 | m_dirty = true; |
141 | return true; | 143 | return true; |
142 | } | 144 | } |
143 | 145 | ||
144 | bool OPimContactAccessBackend_VCard::replace ( const OPimContact &contact ) | 146 | bool OPimContactAccessBackend_VCard::replace ( const OPimContact &contact ) |
145 | { | 147 | { |
146 | m_map.replace( contact.uid(), contact ); | 148 | m_map.replace( contact.uid(), contact ); |
147 | m_dirty = true; | 149 | m_dirty = true; |
148 | return true; | 150 | return true; |
149 | } | 151 | } |
150 | 152 | ||
151 | OPimContact OPimContactAccessBackend_VCard::find ( int uid ) const | 153 | OPimContact OPimContactAccessBackend_VCard::find ( int uid ) const |
152 | { | 154 | { |
153 | return m_map[uid]; | 155 | return m_map[uid]; |
154 | } | 156 | } |
155 | 157 | ||
156 | QArray<int> OPimContactAccessBackend_VCard::allRecords() const | 158 | QArray<int> OPimContactAccessBackend_VCard::allRecords() const |
157 | { | 159 | { |
158 | QArray<int> ar( m_map.count() ); | 160 | QArray<int> ar( m_map.count() ); |
159 | QMap<int, OPimContact>::ConstIterator it; | 161 | QMap<int, OPimContact>::ConstIterator it; |
160 | int i = 0; | 162 | int i = 0; |
161 | for ( it = m_map.begin(); it != m_map.end(); ++it ) { | 163 | for ( it = m_map.begin(); it != m_map.end(); ++it ) { |
162 | ar[i] = it.key(); | 164 | ar[i] = it.key(); |
163 | i++; | 165 | i++; |
164 | } | 166 | } |
165 | return ar; | 167 | return ar; |
166 | } | 168 | } |
167 | 169 | ||
168 | // Not implemented | 170 | // Not implemented |
169 | QArray<int> OPimContactAccessBackend_VCard::queryByExample ( const OPimContact&, int, const QDateTime& ) | 171 | QArray<int> OPimContactAccessBackend_VCard::queryByExample ( const OPimContact&, int, const QDateTime& ) |
170 | { | 172 | { |
171 | QArray<int> ar(0); | 173 | QArray<int> ar(0); |
172 | return ar; | 174 | return ar; |
173 | } | 175 | } |
174 | 176 | ||
175 | // Not implemented | 177 | // Not implemented |
176 | QArray<int> OPimContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const | 178 | QArray<int> OPimContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const |
177 | { | 179 | { |
178 | QArray<int> ar(0); | 180 | QArray<int> ar(0); |
179 | return ar; | 181 | return ar; |
180 | } | 182 | } |
181 | 183 | ||
182 | const uint OPimContactAccessBackend_VCard::querySettings() | 184 | const uint OPimContactAccessBackend_VCard::querySettings() |
183 | { | 185 | { |
184 | return 0; // No search possible | 186 | return 0; // No search possible |
185 | } | 187 | } |
186 | 188 | ||
187 | bool OPimContactAccessBackend_VCard::hasQuerySettings (uint ) const | 189 | bool OPimContactAccessBackend_VCard::hasQuerySettings (uint ) const |
188 | { | 190 | { |
189 | return false; // No search possible, therefore all settings invalid ;) | 191 | return false; // No search possible, therefore all settings invalid ;) |
190 | } | 192 | } |
191 | 193 | ||
192 | bool OPimContactAccessBackend_VCard::wasChangedExternally() | 194 | bool OPimContactAccessBackend_VCard::wasChangedExternally() |
193 | { | 195 | { |
194 | return false; // Don't expect concurrent access | 196 | return false; // Don't expect concurrent access |
195 | } | 197 | } |
196 | 198 | ||
197 | // Not implemented | 199 | // Not implemented |
198 | QArray<int> OPimContactAccessBackend_VCard::sorted( bool , int, int, int ) | 200 | QArray<int> OPimContactAccessBackend_VCard::sorted( bool , int, int, int ) |
199 | { | 201 | { |
200 | QArray<int> ar(0); | 202 | QArray<int> ar(0); |
201 | return ar; | 203 | return ar; |
202 | } | 204 | } |
203 | 205 | ||
204 | // *** Private stuff *** | 206 | // *** Private stuff *** |
205 | 207 | ||
206 | 208 | ||
207 | OPimContact OPimContactAccessBackend_VCard::parseVObject( VObject *obj ) | 209 | OPimContact OPimContactAccessBackend_VCard::parseVObject( VObject *obj ) |
208 | { | 210 | { |
209 | OPimContact c; | 211 | OPimContact c; |
210 | 212 | ||
211 | VObjectIterator it; | 213 | VObjectIterator it; |
212 | initPropIterator( &it, obj ); | 214 | initPropIterator( &it, obj ); |
213 | while( moreIteration( &it ) ) { | 215 | while( moreIteration( &it ) ) { |
214 | VObject *o = nextVObject( &it ); | 216 | VObject *o = nextVObject( &it ); |
215 | QCString name = vObjectName( o ); | 217 | QCString name = vObjectName( o ); |
216 | QCString value = vObjectStringZValue( o ); | 218 | QCString value = vObjectStringZValue( o ); |
217 | if ( name == VCNameProp ) { | 219 | if ( name == VCNameProp ) { |
218 | VObjectIterator nit; | 220 | VObjectIterator nit; |
219 | initPropIterator( &nit, o ); | 221 | initPropIterator( &nit, o ); |
220 | while( moreIteration( &nit ) ) { | 222 | while( moreIteration( &nit ) ) { |
221 | VObject *o = nextVObject( &nit ); | 223 | VObject *o = nextVObject( &nit ); |
222 | QCString name = vObjectTypeInfo( o ); | 224 | QCString name = vObjectTypeInfo( o ); |
223 | QString value = vObjectStringZValue( o ); | 225 | QString value = vObjectStringZValue( o ); |
224 | if ( name == VCNamePrefixesProp ) | 226 | if ( name == VCNamePrefixesProp ) |
225 | c.setTitle( value ); | 227 | c.setTitle( value ); |
226 | else if ( name == VCNameSuffixesProp ) | 228 | else if ( name == VCNameSuffixesProp ) |
227 | c.setSuffix( value ); | 229 | c.setSuffix( value ); |
228 | else if ( name == VCFamilyNameProp ) | 230 | else if ( name == VCFamilyNameProp ) |
229 | c.setLastName( value ); | 231 | c.setLastName( value ); |
230 | else if ( name == VCGivenNameProp ) | 232 | else if ( name == VCGivenNameProp ) |
231 | c.setFirstName( value ); | 233 | c.setFirstName( value ); |
232 | else if ( name == VCAdditionalNamesProp ) | 234 | else if ( name == VCAdditionalNamesProp ) |
233 | c.setMiddleName( value ); | 235 | c.setMiddleName( value ); |
234 | } | 236 | } |
235 | } | 237 | } |
236 | else if ( name == VCAdrProp ) { | 238 | else if ( name == VCAdrProp ) { |
237 | bool work = TRUE; // default address is work address | 239 | bool work = TRUE; // default address is work address |
238 | QString street; | 240 | QString street; |
239 | QString city; | 241 | QString city; |
240 | QString region; | 242 | QString region; |
241 | QString postal; | 243 | QString postal; |
242 | QString country; | 244 | QString country; |
243 | 245 | ||
244 | VObjectIterator nit; | 246 | VObjectIterator nit; |
245 | initPropIterator( &nit, o ); | 247 | initPropIterator( &nit, o ); |
246 | while( moreIteration( &nit ) ) { | 248 | while( moreIteration( &nit ) ) { |
247 | VObject *o = nextVObject( &nit ); | 249 | VObject *o = nextVObject( &nit ); |
248 | QCString name = vObjectName( o ); | 250 | QCString name = vObjectName( o ); |
249 | QString value = vObjectStringZValue( o ); | 251 | QString value = vObjectStringZValue( o ); |
250 | if ( name == VCHomeProp ) | 252 | if ( name == VCHomeProp ) |
251 | work = FALSE; | 253 | work = FALSE; |
252 | else if ( name == VCWorkProp ) | 254 | else if ( name == VCWorkProp ) |
253 | work = TRUE; | 255 | work = TRUE; |
254 | else if ( name == VCStreetAddressProp ) | 256 | else if ( name == VCStreetAddressProp ) |
255 | street = value; | 257 | street = value; |
256 | else if ( name == VCCityProp ) | 258 | else if ( name == VCCityProp ) |
257 | city = value; | 259 | city = value; |
258 | else if ( name == VCRegionProp ) | 260 | else if ( name == VCRegionProp ) |
259 | region = value; | 261 | region = value; |
260 | else if ( name == VCPostalCodeProp ) | 262 | else if ( name == VCPostalCodeProp ) |
261 | postal = value; | 263 | postal = value; |
262 | else if ( name == VCCountryNameProp ) | 264 | else if ( name == VCCountryNameProp ) |
263 | country = value; | 265 | country = value; |
264 | } | 266 | } |
265 | if ( work ) { | 267 | if ( work ) { |
266 | c.setBusinessStreet( street ); | 268 | c.setBusinessStreet( street ); |
267 | c.setBusinessCity( city ); | 269 | c.setBusinessCity( city ); |
268 | c.setBusinessCountry( country ); | 270 | c.setBusinessCountry( country ); |
269 | c.setBusinessZip( postal ); | 271 | c.setBusinessZip( postal ); |
270 | c.setBusinessState( region ); | 272 | c.setBusinessState( region ); |
271 | } else { | 273 | } else { |
272 | c.setHomeStreet( street ); | 274 | c.setHomeStreet( street ); |
273 | c.setHomeCity( city ); | 275 | c.setHomeCity( city ); |
274 | c.setHomeCountry( country ); | 276 | c.setHomeCountry( country ); |
275 | c.setHomeZip( postal ); | 277 | c.setHomeZip( postal ); |
276 | c.setHomeState( region ); | 278 | c.setHomeState( region ); |
277 | } | 279 | } |
278 | } | 280 | } |
279 | else if ( name == VCTelephoneProp ) { | 281 | else if ( name == VCTelephoneProp ) { |
280 | enum { | 282 | enum { |
281 | HOME = 0x01, | 283 | HOME = 0x01, |
282 | WORK = 0x02, | 284 | WORK = 0x02, |
283 | VOICE = 0x04, | 285 | VOICE = 0x04, |
284 | CELL = 0x08, | 286 | CELL = 0x08, |
285 | FAX = 0x10, | 287 | FAX = 0x10, |
286 | PAGER = 0x20, | 288 | PAGER = 0x20, |
287 | UNKNOWN = 0x80 | 289 | UNKNOWN = 0x80 |
288 | }; | 290 | }; |
289 | int type = 0; | 291 | int type = 0; |
290 | 292 | ||
291 | VObjectIterator nit; | 293 | VObjectIterator nit; |
292 | initPropIterator( &nit, o ); | 294 | initPropIterator( &nit, o ); |
293 | while( moreIteration( &nit ) ) { | 295 | while( moreIteration( &nit ) ) { |
294 | VObject *o = nextVObject( &nit ); | 296 | VObject *o = nextVObject( &nit ); |
295 | QCString name = vObjectTypeInfo( o ); | 297 | QCString name = vObjectTypeInfo( o ); |
296 | if ( name == VCHomeProp ) | 298 | if ( name == VCHomeProp ) |
297 | type |= HOME; | 299 | type |= HOME; |
298 | else if ( name == VCWorkProp ) | 300 | else if ( name == VCWorkProp ) |
299 | type |= WORK; | 301 | type |= WORK; |
300 | else if ( name == VCVoiceProp ) | 302 | else if ( name == VCVoiceProp ) |
301 | type |= VOICE; | 303 | type |= VOICE; |
302 | else if ( name == VCCellularProp ) | 304 | else if ( name == VCCellularProp ) |
303 | type |= CELL; | 305 | type |= CELL; |
304 | else if ( name == VCFaxProp ) | 306 | else if ( name == VCFaxProp ) |
305 | type |= FAX; | 307 | type |= FAX; |
306 | else if ( name == VCPagerProp ) | 308 | else if ( name == VCPagerProp ) |
307 | type |= PAGER; | 309 | type |= PAGER; |
308 | else if ( name == VCPreferredProp ) | 310 | else if ( name == VCPreferredProp ) |
309 | ; | 311 | ; |
310 | else | 312 | else |
311 | type |= UNKNOWN; | 313 | type |= UNKNOWN; |
312 | } | 314 | } |
313 | if ( (type & UNKNOWN) != UNKNOWN ) { | 315 | if ( (type & UNKNOWN) != UNKNOWN ) { |
314 | if ( ( type & (HOME|WORK) ) == 0 ) // default | 316 | if ( ( type & (HOME|WORK) ) == 0 ) // default |
315 | type |= HOME; | 317 | type |= HOME; |
316 | if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default | 318 | if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default |
317 | type |= VOICE; | 319 | type |= VOICE; |
318 | 320 | ||
319 | qWarning("value %s %d", value.data(), type ); | 321 | owarn << "value " << value.data() << " " << type << "" << oendl; |
320 | if ( (type & (VOICE|HOME) ) == (VOICE|HOME) && (type & (CELL|HOME) ) != (CELL|HOME) ) | 322 | if ( (type & (VOICE|HOME) ) == (VOICE|HOME) && (type & (CELL|HOME) ) != (CELL|HOME) ) |
321 | c.setHomePhone( value ); | 323 | c.setHomePhone( value ); |
322 | if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) | 324 | if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) |
323 | c.setHomeFax( value ); | 325 | c.setHomeFax( value ); |
324 | if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) | 326 | if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) |
325 | c.setHomeMobile( value ); | 327 | c.setHomeMobile( value ); |
326 | if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) && (type & (CELL|WORK) ) != (CELL|WORK) ) | 328 | if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) && (type & (CELL|WORK) ) != (CELL|WORK) ) |
327 | c.setBusinessPhone( value ); | 329 | c.setBusinessPhone( value ); |
328 | if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) | 330 | if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) |
329 | c.setBusinessFax( value ); | 331 | c.setBusinessFax( value ); |
330 | if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) | 332 | if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) |
331 | c.setBusinessMobile( value ); | 333 | c.setBusinessMobile( value ); |
332 | if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) | 334 | if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) |
333 | c.setBusinessPager( value ); | 335 | c.setBusinessPager( value ); |
334 | } | 336 | } |
335 | } | 337 | } |
336 | else if ( name == VCEmailAddressProp ) { | 338 | else if ( name == VCEmailAddressProp ) { |
337 | QString email = vObjectStringZValue( o ); | 339 | QString email = vObjectStringZValue( o ); |
338 | bool valid = TRUE; | 340 | bool valid = TRUE; |
339 | VObjectIterator nit; | 341 | VObjectIterator nit; |
340 | initPropIterator( &nit, o ); | 342 | initPropIterator( &nit, o ); |
341 | while( moreIteration( &nit ) ) { | 343 | while( moreIteration( &nit ) ) { |
342 | VObject *o = nextVObject( &nit ); | 344 | VObject *o = nextVObject( &nit ); |
343 | QCString name = vObjectTypeInfo( o ); | 345 | QCString name = vObjectTypeInfo( o ); |
344 | if ( name != VCInternetProp && name != VCHomeProp && | 346 | if ( name != VCInternetProp && name != VCHomeProp && |
345 | name != VCWorkProp && | 347 | name != VCWorkProp && |
346 | name != VCPreferredProp ) | 348 | name != VCPreferredProp ) |
347 | // ### preffered should map to default email | 349 | // ### preffered should map to default email |
348 | valid = FALSE; | 350 | valid = FALSE; |
349 | } | 351 | } |
350 | if ( valid ) { | 352 | if ( valid ) { |
351 | c.insertEmail( email ); | 353 | c.insertEmail( email ); |
352 | } | 354 | } |
353 | } | 355 | } |
354 | else if ( name == VCURLProp ) { | 356 | else if ( name == VCURLProp ) { |
355 | VObjectIterator nit; | 357 | VObjectIterator nit; |
356 | initPropIterator( &nit, o ); | 358 | initPropIterator( &nit, o ); |
357 | while( moreIteration( &nit ) ) { | 359 | while( moreIteration( &nit ) ) { |
358 | VObject *o = nextVObject( &nit ); | 360 | VObject *o = nextVObject( &nit ); |
359 | QCString name = vObjectTypeInfo( o ); | 361 | QCString name = vObjectTypeInfo( o ); |
360 | if ( name == VCHomeProp ) | 362 | if ( name == VCHomeProp ) |
361 | c.setHomeWebpage( value ); | 363 | c.setHomeWebpage( value ); |
362 | else if ( name == VCWorkProp ) | 364 | else if ( name == VCWorkProp ) |
363 | c.setBusinessWebpage( value ); | 365 | c.setBusinessWebpage( value ); |
364 | } | 366 | } |
365 | } | 367 | } |
366 | else if ( name == VCOrgProp ) { | 368 | else if ( name == VCOrgProp ) { |
367 | VObjectIterator nit; | 369 | VObjectIterator nit; |
368 | initPropIterator( &nit, o ); | 370 | initPropIterator( &nit, o ); |
369 | while( moreIteration( &nit ) ) { | 371 | while( moreIteration( &nit ) ) { |
370 | VObject *o = nextVObject( &nit ); | 372 | VObject *o = nextVObject( &nit ); |
371 | QCString name = vObjectName( o ); | 373 | QCString name = vObjectName( o ); |
372 | QString value = vObjectStringZValue( o ); | 374 | QString value = vObjectStringZValue( o ); |
373 | if ( name == VCOrgNameProp ) | 375 | if ( name == VCOrgNameProp ) |
374 | c.setCompany( value ); | 376 | c.setCompany( value ); |
375 | else if ( name == VCOrgUnitProp ) | 377 | else if ( name == VCOrgUnitProp ) |
376 | c.setDepartment( value ); | 378 | c.setDepartment( value ); |
377 | else if ( name == VCOrgUnit2Prop ) | 379 | else if ( name == VCOrgUnit2Prop ) |
378 | c.setOffice( value ); | 380 | c.setOffice( value ); |
379 | } | 381 | } |
380 | } | 382 | } |
381 | else if ( name == VCTitleProp ) { | 383 | else if ( name == VCTitleProp ) { |
382 | c.setJobTitle( value ); | 384 | c.setJobTitle( value ); |
383 | } | 385 | } |
384 | else if ( name == "X-Qtopia-Profession" ) { | 386 | else if ( name == "X-Qtopia-Profession" ) { |
385 | c.setProfession( value ); | 387 | c.setProfession( value ); |
386 | } | 388 | } |
387 | else if ( name == "X-Qtopia-Manager" ) { | 389 | else if ( name == "X-Qtopia-Manager" ) { |
388 | c.setManager( value ); | 390 | c.setManager( value ); |
389 | } | 391 | } |
390 | else if ( name == "X-Qtopia-Assistant" ) { | 392 | else if ( name == "X-Qtopia-Assistant" ) { |
391 | c.setAssistant( value ); | 393 | c.setAssistant( value ); |
392 | } | 394 | } |
393 | else if ( name == "X-Qtopia-Spouse" ) { | 395 | else if ( name == "X-Qtopia-Spouse" ) { |
394 | c.setSpouse( value ); | 396 | c.setSpouse( value ); |
395 | } | 397 | } |
396 | else if ( name == "X-Qtopia-Gender" ) { | 398 | else if ( name == "X-Qtopia-Gender" ) { |
397 | c.setGender( value ); | 399 | c.setGender( value ); |
398 | } | 400 | } |
399 | else if ( name == "X-Qtopia-Anniversary" ) { | 401 | else if ( name == "X-Qtopia-Anniversary" ) { |
400 | c.setAnniversary( convVCardDateToDate( value ) ); | 402 | c.setAnniversary( convVCardDateToDate( value ) ); |
401 | } | 403 | } |
402 | else if ( name == "X-Qtopia-Nickname" ) { | 404 | else if ( name == "X-Qtopia-Nickname" ) { |
403 | c.setNickname( value ); | 405 | c.setNickname( value ); |
404 | } | 406 | } |
405 | else if ( name == "X-Qtopia-Children" ) { | 407 | else if ( name == "X-Qtopia-Children" ) { |
406 | c.setChildren( value ); | 408 | c.setChildren( value ); |
407 | } | 409 | } |
408 | else if ( name == VCBirthDateProp ) { | 410 | else if ( name == VCBirthDateProp ) { |
409 | // Reading Birthdate regarding RFC 2425 (5.8.4) | 411 | // Reading Birthdate regarding RFC 2425 (5.8.4) |
410 | c.setBirthday( convVCardDateToDate( value ) ); | 412 | c.setBirthday( convVCardDateToDate( value ) ); |
411 | 413 | ||
412 | } | 414 | } |
413 | else if ( name == VCCommentProp ) { | 415 | else if ( name == VCCommentProp ) { |
414 | c.setNotes( value ); | 416 | c.setNotes( value ); |
415 | } | 417 | } |
416 | #if 0 | 418 | #if 0 |
417 | else { | 419 | else { |
418 | printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); | 420 | printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); |
419 | VObjectIterator nit; | 421 | VObjectIterator nit; |
420 | initPropIterator( &nit, o ); | 422 | initPropIterator( &nit, o ); |
421 | while( moreIteration( &nit ) ) { | 423 | while( moreIteration( &nit ) ) { |
422 | VObject *o = nextVObject( &nit ); | 424 | VObject *o = nextVObject( &nit ); |
423 | QCString name = vObjectName( o ); | 425 | QCString name = vObjectName( o ); |
424 | QString value = vObjectStringZValue( o ); | 426 | QString value = vObjectStringZValue( o ); |
425 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); | 427 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); |
426 | } | 428 | } |
427 | } | 429 | } |
428 | #endif | 430 | #endif |
429 | } | 431 | } |
430 | c.setFileAs(); | 432 | c.setFileAs(); |
431 | return c; | 433 | return c; |
432 | } | 434 | } |
433 | 435 | ||
434 | 436 | ||
435 | VObject* OPimContactAccessBackend_VCard::createVObject( const OPimContact &c ) | 437 | VObject* OPimContactAccessBackend_VCard::createVObject( const OPimContact &c ) |
436 | { | 438 | { |
437 | VObject *vcard = newVObject( VCCardProp ); | 439 | VObject *vcard = newVObject( VCCardProp ); |
438 | safeAddPropValue( vcard, VCVersionProp, "2.1" ); | 440 | safeAddPropValue( vcard, VCVersionProp, "2.1" ); |
439 | safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); | 441 | safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); |
440 | safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); | 442 | safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); |
441 | 443 | ||
442 | // full name | 444 | // full name |
443 | safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); | 445 | safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); |
444 | 446 | ||
445 | // name properties | 447 | // name properties |
446 | VObject *name = safeAddProp( vcard, VCNameProp ); | 448 | VObject *name = safeAddProp( vcard, VCNameProp ); |
447 | safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); | 449 | safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); |
448 | safeAddPropValue( name, VCGivenNameProp, c.firstName() ); | 450 | safeAddPropValue( name, VCGivenNameProp, c.firstName() ); |
449 | safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); | 451 | safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); |
450 | safeAddPropValue( name, VCNamePrefixesProp, c.title() ); | 452 | safeAddPropValue( name, VCNamePrefixesProp, c.title() ); |
451 | safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); | 453 | safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); |
452 | 454 | ||
453 | // home properties | 455 | // home properties |
454 | VObject *home_adr= safeAddProp( vcard, VCAdrProp ); | 456 | VObject *home_adr= safeAddProp( vcard, VCAdrProp ); |
455 | safeAddProp( home_adr, VCHomeProp ); | 457 | safeAddProp( home_adr, VCHomeProp ); |
456 | safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); | 458 | safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); |
457 | safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); | 459 | safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); |
458 | safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); | 460 | safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); |
459 | safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); | 461 | safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); |
460 | safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); | 462 | safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); |
461 | 463 | ||
462 | VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); | 464 | VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); |
463 | safeAddProp( home_phone, VCHomeProp ); | 465 | safeAddProp( home_phone, VCHomeProp ); |
464 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); | 466 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); |
465 | safeAddProp( home_phone, VCHomeProp ); | 467 | safeAddProp( home_phone, VCHomeProp ); |
466 | safeAddProp( home_phone, VCCellularProp ); | 468 | safeAddProp( home_phone, VCCellularProp ); |
467 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); | 469 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); |
468 | safeAddProp( home_phone, VCHomeProp ); | 470 | safeAddProp( home_phone, VCHomeProp ); |
469 | safeAddProp( home_phone, VCFaxProp ); | 471 | safeAddProp( home_phone, VCFaxProp ); |
470 | 472 | ||
471 | VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); | 473 | VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); |
472 | safeAddProp( url, VCHomeProp ); | 474 | safeAddProp( url, VCHomeProp ); |
473 | 475 | ||
474 | // work properties | 476 | // work properties |
475 | VObject *work_adr= safeAddProp( vcard, VCAdrProp ); | 477 | VObject *work_adr= safeAddProp( vcard, VCAdrProp ); |
476 | safeAddProp( work_adr, VCWorkProp ); | 478 | safeAddProp( work_adr, VCWorkProp ); |
477 | safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); | 479 | safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); |
478 | safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); | 480 | safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); |
479 | safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); | 481 | safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); |
480 | safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); | 482 | safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); |
481 | safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); | 483 | safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); |
482 | 484 | ||
483 | VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); | 485 | VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); |
484 | safeAddProp( work_phone, VCWorkProp ); | 486 | safeAddProp( work_phone, VCWorkProp ); |
485 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); | 487 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); |
486 | safeAddProp( work_phone, VCWorkProp ); | 488 | safeAddProp( work_phone, VCWorkProp ); |
487 | safeAddProp( work_phone, VCCellularProp ); | 489 | safeAddProp( work_phone, VCCellularProp ); |
488 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); | 490 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); |
489 | safeAddProp( work_phone, VCWorkProp ); | 491 | safeAddProp( work_phone, VCWorkProp ); |
490 | safeAddProp( work_phone, VCFaxProp ); | 492 | safeAddProp( work_phone, VCFaxProp ); |
491 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); | 493 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); |
492 | safeAddProp( work_phone, VCWorkProp ); | 494 | safeAddProp( work_phone, VCWorkProp ); |
493 | safeAddProp( work_phone, VCPagerProp ); | 495 | safeAddProp( work_phone, VCPagerProp ); |
494 | 496 | ||
495 | url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); | 497 | url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); |
496 | safeAddProp( url, VCWorkProp ); | 498 | safeAddProp( url, VCWorkProp ); |
497 | 499 | ||
498 | VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); | 500 | VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); |
499 | safeAddProp( title, VCWorkProp ); | 501 | safeAddProp( title, VCWorkProp ); |
500 | 502 | ||
501 | 503 | ||
502 | QStringList emails = c.emailList(); | 504 | QStringList emails = c.emailList(); |
503 | // emails.prepend( c.defaultEmail() ); Fix for bugreport #1045 | 505 | // emails.prepend( c.defaultEmail() ); Fix for bugreport #1045 |
504 | for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { | 506 | for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { |
505 | VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); | 507 | VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); |
506 | safeAddProp( email, VCInternetProp ); | 508 | safeAddProp( email, VCInternetProp ); |
507 | } | 509 | } |
508 | 510 | ||
509 | safeAddPropValue( vcard, VCNoteProp, c.notes() ); | 511 | safeAddPropValue( vcard, VCNoteProp, c.notes() ); |
510 | 512 | ||
511 | // Exporting Birthday regarding RFC 2425 (5.8.4) | 513 | // Exporting Birthday regarding RFC 2425 (5.8.4) |
512 | if ( c.birthday().isValid() ){ | 514 | if ( c.birthday().isValid() ){ |
513 | qWarning("Exporting birthday as: %s", convDateToVCardDate( c.birthday() ).latin1() ); | 515 | owarn << "Exporting birthday as: " << convDateToVCardDate( c.birthday() ) << "" << oendl; |
514 | safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) ); | 516 | safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) ); |
515 | } | 517 | } |
516 | 518 | ||
517 | if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { | 519 | if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { |
518 | VObject *org = safeAddProp( vcard, VCOrgProp ); | 520 | VObject *org = safeAddProp( vcard, VCOrgProp ); |
519 | safeAddPropValue( org, VCOrgNameProp, c.company() ); | 521 | safeAddPropValue( org, VCOrgNameProp, c.company() ); |
520 | safeAddPropValue( org, VCOrgUnitProp, c.department() ); | 522 | safeAddPropValue( org, VCOrgUnitProp, c.department() ); |
521 | safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); | 523 | safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); |
522 | } | 524 | } |
523 | 525 | ||
524 | // some values we have to export as custom fields | 526 | // some values we have to export as custom fields |
525 | safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); | 527 | safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); |
526 | safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); | 528 | safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); |
527 | safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); | 529 | safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); |
528 | 530 | ||
529 | safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); | 531 | safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); |
530 | safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); | 532 | safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); |
531 | if ( c.anniversary().isValid() ){ | 533 | if ( c.anniversary().isValid() ){ |
532 | qWarning("Exporting anniversary as: %s", convDateToVCardDate( c.anniversary() ).latin1() ); | 534 | owarn << "Exporting anniversary as: " << convDateToVCardDate( c.anniversary() ) << "" << oendl; |
533 | safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) ); | 535 | safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) ); |
534 | } | 536 | } |
535 | safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); | 537 | safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); |
536 | safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); | 538 | safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); |
537 | 539 | ||
538 | return vcard; | 540 | return vcard; |
539 | } | 541 | } |
540 | 542 | ||
541 | QString OPimContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const | 543 | QString OPimContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const |
542 | { | 544 | { |
543 | QString str_rfc2425 = QString("%1-%2-%3") | 545 | QString str_rfc2425 = QString("%1-%2-%3") |
544 | .arg( d.year() ) | 546 | .arg( d.year() ) |
545 | .arg( d.month(), 2 ) | 547 | .arg( d.month(), 2 ) |
546 | .arg( d.day(), 2 ); | 548 | .arg( d.day(), 2 ); |
547 | // Now replace spaces with "0"... | 549 | // Now replace spaces with "0"... |
548 | int pos = 0; | 550 | int pos = 0; |
549 | while ( ( pos = str_rfc2425.find (' ') ) > 0 ) | 551 | while ( ( pos = str_rfc2425.find (' ') ) > 0 ) |
550 | str_rfc2425.replace( pos, 1, "0" ); | 552 | str_rfc2425.replace( pos, 1, "0" ); |
551 | 553 | ||
552 | return str_rfc2425; | 554 | return str_rfc2425; |
553 | } | 555 | } |
554 | 556 | ||
555 | QDate OPimContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) | 557 | QDate OPimContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) |
556 | { | 558 | { |
557 | int monthPos = datestr.find('-'); | 559 | int monthPos = datestr.find('-'); |
558 | int dayPos = datestr.find('-', monthPos+1 ); | 560 | int dayPos = datestr.find('-', monthPos+1 ); |
559 | int sep_ignore = 1; | 561 | int sep_ignore = 1; |
560 | if ( monthPos == -1 || dayPos == -1 ) { | 562 | if ( monthPos == -1 || dayPos == -1 ) { |
561 | qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); | 563 | odebug << "fromString didn't find - in str = " << datestr << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; |
562 | // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) | 564 | // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) |
563 | if ( datestr.length() == 8 ){ | 565 | if ( datestr.length() == 8 ){ |
564 | monthPos = 4; | 566 | monthPos = 4; |
565 | dayPos = 6; | 567 | dayPos = 6; |
566 | sep_ignore = 0; | 568 | sep_ignore = 0; |
567 | qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); | 569 | odebug << "Try with follwing positions str = " << datestr << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; |
568 | } else { | 570 | } else { |
569 | return QDate(); | 571 | return QDate(); |
570 | } | 572 | } |
571 | } | 573 | } |
572 | int y = datestr.left( monthPos ).toInt(); | 574 | int y = datestr.left( monthPos ).toInt(); |
573 | int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); | 575 | int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); |
574 | int d = datestr.mid( dayPos + sep_ignore ).toInt(); | 576 | int d = datestr.mid( dayPos + sep_ignore ).toInt(); |
575 | qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); | 577 | odebug << "TimeConversion::fromString ymd = " << datestr << " => " << y << " " << m << " " << d << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl; |
576 | QDate date ( y,m,d ); | 578 | QDate date ( y,m,d ); |
577 | return date; | 579 | return date; |
578 | } | 580 | } |
579 | 581 | ||
580 | VObject* OPimContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) | 582 | VObject* OPimContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) |
581 | { | 583 | { |
582 | VObject *ret = 0; | 584 | VObject *ret = 0; |
583 | if ( o && !value.isEmpty() ) | 585 | if ( o && !value.isEmpty() ) |
584 | ret = addPropValue( o, prop, value.latin1() ); | 586 | ret = addPropValue( o, prop, value.latin1() ); |
585 | return ret; | 587 | return ret; |
586 | } | 588 | } |
587 | 589 | ||
588 | VObject* OPimContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) | 590 | VObject* OPimContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) |
589 | { | 591 | { |
590 | VObject *ret = 0; | 592 | VObject *ret = 0; |
591 | if ( o ) | 593 | if ( o ) |
592 | ret = addProp( o, prop ); | 594 | ret = addProp( o, prop ); |
593 | return ret; | 595 | return ret; |
594 | } | 596 | } |
595 | 597 | ||
596 | } | 598 | } |
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp index 7b4d81f..5ffcb11 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp | |||
@@ -27,724 +27,728 @@ | |||
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | /* | 29 | /* |
30 | * XML Backend for the OPIE-Contact Database. | 30 | * XML Backend for the OPIE-Contact Database. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | |||
34 | /* OPIE */ | ||
33 | #include <opie2/ocontactaccessbackend_xml.h> | 35 | #include <opie2/ocontactaccessbackend_xml.h> |
36 | #include <opie2/xmltree.h> | ||
37 | #include <opie2/ocontactaccessbackend.h> | ||
38 | #include <opie2/ocontactaccess.h> | ||
39 | #include <opie2/odebug.h> | ||
40 | |||
41 | #include <qpe/global.h> | ||
34 | 42 | ||
43 | /* QT */ | ||
35 | #include <qasciidict.h> | 44 | #include <qasciidict.h> |
36 | #include <qfile.h> | 45 | #include <qfile.h> |
37 | #include <qfileinfo.h> | 46 | #include <qfileinfo.h> |
38 | #include <qregexp.h> | 47 | #include <qregexp.h> |
39 | #include <qarray.h> | 48 | #include <qarray.h> |
40 | #include <qmap.h> | 49 | #include <qmap.h> |
41 | 50 | ||
42 | #include <qpe/global.h> | 51 | /* STD */ |
43 | |||
44 | #include <opie2/xmltree.h> | ||
45 | #include <opie2/ocontactaccessbackend.h> | ||
46 | #include <opie2/ocontactaccess.h> | ||
47 | |||
48 | #include <stdlib.h> | 52 | #include <stdlib.h> |
49 | #include <errno.h> | 53 | #include <errno.h> |
50 | 54 | ||
51 | using namespace Opie::Core; | 55 | using namespace Opie::Core; |
52 | 56 | ||
53 | 57 | ||
54 | namespace Opie { | 58 | namespace Opie { |
55 | OPimContactAccessBackend_XML::OPimContactAccessBackend_XML ( const QString& appname, const QString& filename ): | 59 | OPimContactAccessBackend_XML::OPimContactAccessBackend_XML ( const QString& appname, const QString& filename ): |
56 | m_changed( false ) | 60 | m_changed( false ) |
57 | { | 61 | { |
58 | // Just m_contactlist should call delete if an entry | 62 | // Just m_contactlist should call delete if an entry |
59 | // is removed. | 63 | // is removed. |
60 | m_contactList.setAutoDelete( true ); | 64 | m_contactList.setAutoDelete( true ); |
61 | m_uidToContact.setAutoDelete( false ); | 65 | m_uidToContact.setAutoDelete( false ); |
62 | 66 | ||
63 | m_appName = appname; | 67 | m_appName = appname; |
64 | 68 | ||
65 | /* Set journalfile name ... */ | 69 | /* Set journalfile name ... */ |
66 | m_journalName = getenv("HOME"); | 70 | m_journalName = getenv("HOME"); |
67 | m_journalName +="/.abjournal" + appname; | 71 | m_journalName +="/.abjournal" + appname; |
68 | 72 | ||
69 | /* Expecting to access the default filename if nothing else is set */ | 73 | /* Expecting to access the default filename if nothing else is set */ |
70 | if ( filename.isEmpty() ){ | 74 | if ( filename.isEmpty() ){ |
71 | m_fileName = Global::applicationFileName( "addressbook","addressbook.xml" ); | 75 | m_fileName = Global::applicationFileName( "addressbook","addressbook.xml" ); |
72 | } else | 76 | } else |
73 | m_fileName = filename; | 77 | m_fileName = filename; |
74 | 78 | ||
75 | /* Load Database now */ | 79 | /* Load Database now */ |
76 | load (); | 80 | load (); |
77 | } | 81 | } |
78 | 82 | ||
79 | bool OPimContactAccessBackend_XML::save() | 83 | bool OPimContactAccessBackend_XML::save() |
80 | { | 84 | { |
81 | 85 | ||
82 | if ( !m_changed ) | 86 | if ( !m_changed ) |
83 | return true; | 87 | return true; |
84 | 88 | ||
85 | QString strNewFile = m_fileName + ".new"; | 89 | QString strNewFile = m_fileName + ".new"; |
86 | QFile f( strNewFile ); | 90 | QFile f( strNewFile ); |
87 | if ( !f.open( IO_WriteOnly|IO_Raw ) ) | 91 | if ( !f.open( IO_WriteOnly|IO_Raw ) ) |
88 | return false; | 92 | return false; |
89 | 93 | ||
90 | int total_written; | 94 | int total_written; |
91 | int idx_offset = 0; | 95 | int idx_offset = 0; |
92 | QString out; | 96 | QString out; |
93 | 97 | ||
94 | // Write Header | 98 | // Write Header |
95 | out = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Addressbook ><AddressBook>\n" | 99 | out = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Addressbook ><AddressBook>\n" |
96 | " <Groups>\n" | 100 | " <Groups>\n" |
97 | " </Groups>\n" | 101 | " </Groups>\n" |
98 | " <Contacts>\n"; | 102 | " <Contacts>\n"; |
99 | QCString cstr = out.utf8(); | 103 | QCString cstr = out.utf8(); |
100 | f.writeBlock( cstr.data(), cstr.length() ); | 104 | f.writeBlock( cstr.data(), cstr.length() ); |
101 | idx_offset += cstr.length(); | 105 | idx_offset += cstr.length(); |
102 | out = ""; | 106 | out = ""; |
103 | 107 | ||
104 | // Write all contacts | 108 | // Write all contacts |
105 | QListIterator<OPimContact> it( m_contactList ); | 109 | QListIterator<OPimContact> it( m_contactList ); |
106 | for ( ; it.current(); ++it ) { | 110 | for ( ; it.current(); ++it ) { |
107 | // qWarning(" Uid %d at Offset: %x", (*it)->uid(), idx_offset ); | 111 | // owarn << " Uid " << (*it)->uid() << " at Offset: " << idx_offset << "" << oendl; |
108 | out += "<Contact "; | 112 | out += "<Contact "; |
109 | (*it)->save( out ); | 113 | (*it)->save( out ); |
110 | out += "/>\n"; | 114 | out += "/>\n"; |
111 | cstr = out.utf8(); | 115 | cstr = out.utf8(); |
112 | total_written = f.writeBlock( cstr.data(), cstr.length() ); | 116 | total_written = f.writeBlock( cstr.data(), cstr.length() ); |
113 | idx_offset += cstr.length(); | 117 | idx_offset += cstr.length(); |
114 | if ( total_written != int(cstr.length()) ) { | 118 | if ( total_written != int(cstr.length()) ) { |
115 | f.close(); | 119 | f.close(); |
116 | QFile::remove( strNewFile ); | 120 | QFile::remove( strNewFile ); |
117 | return false; | 121 | return false; |
118 | } | 122 | } |
119 | out = ""; | 123 | out = ""; |
120 | } | 124 | } |
121 | out += " </Contacts>\n</AddressBook>\n"; | 125 | out += " </Contacts>\n</AddressBook>\n"; |
122 | 126 | ||
123 | // Write Footer | 127 | // Write Footer |
124 | cstr = out.utf8(); | 128 | cstr = out.utf8(); |
125 | total_written = f.writeBlock( cstr.data(), cstr.length() ); | 129 | total_written = f.writeBlock( cstr.data(), cstr.length() ); |
126 | if ( total_written != int( cstr.length() ) ) { | 130 | if ( total_written != int( cstr.length() ) ) { |
127 | f.close(); | 131 | f.close(); |
128 | QFile::remove( strNewFile ); | 132 | QFile::remove( strNewFile ); |
129 | return false; | 133 | return false; |
130 | } | 134 | } |
131 | f.close(); | 135 | f.close(); |
132 | 136 | ||
133 | // move the file over, I'm just going to use the system call | 137 | // move the file over, I'm just going to use the system call |
134 | // because, I don't feel like using QDir. | 138 | // because, I don't feel like using QDir. |
135 | if ( ::rename( strNewFile.latin1(), m_fileName.latin1() ) < 0 ) { | 139 | if ( ::rename( strNewFile.latin1(), m_fileName.latin1() ) < 0 ) { |
136 | qWarning( "problem renaming file %s to %s, errno: %d", | 140 | qWarning( "problem renaming file %s to %s, errno: %d", |
137 | strNewFile.latin1(), m_journalName.latin1(), errno ); | 141 | strNewFile.latin1(), m_journalName.latin1(), errno ); |
138 | // remove the tmp file... | 142 | // remove the tmp file... |
139 | QFile::remove( strNewFile ); | 143 | QFile::remove( strNewFile ); |
140 | } | 144 | } |
141 | 145 | ||
142 | /* The journalfile should be removed now... */ | 146 | /* The journalfile should be removed now... */ |
143 | removeJournal(); | 147 | removeJournal(); |
144 | 148 | ||
145 | m_changed = false; | 149 | m_changed = false; |
146 | return true; | 150 | return true; |
147 | } | 151 | } |
148 | 152 | ||
149 | bool OPimContactAccessBackend_XML::load () | 153 | bool OPimContactAccessBackend_XML::load () |
150 | { | 154 | { |
151 | m_contactList.clear(); | 155 | m_contactList.clear(); |
152 | m_uidToContact.clear(); | 156 | m_uidToContact.clear(); |
153 | 157 | ||
154 | /* Load XML-File and journal if it exists */ | 158 | /* Load XML-File and journal if it exists */ |
155 | if ( !load ( m_fileName, false ) ) | 159 | if ( !load ( m_fileName, false ) ) |
156 | return false; | 160 | return false; |
157 | /* The returncode of the journalfile is ignored due to the | 161 | /* The returncode of the journalfile is ignored due to the |
158 | * fact that it does not exist when this class is instantiated ! | 162 | * fact that it does not exist when this class is instantiated ! |
159 | * But there may such a file exist, if the application crashed. | 163 | * But there may such a file exist, if the application crashed. |
160 | * Therefore we try to load it to get the changes before the # | 164 | * Therefore we try to load it to get the changes before the # |
161 | * crash happened... | 165 | * crash happened... |
162 | */ | 166 | */ |
163 | load (m_journalName, true); | 167 | load (m_journalName, true); |
164 | 168 | ||
165 | return true; | 169 | return true; |
166 | } | 170 | } |
167 | 171 | ||
168 | void OPimContactAccessBackend_XML::clear () | 172 | void OPimContactAccessBackend_XML::clear () |
169 | { | 173 | { |
170 | m_contactList.clear(); | 174 | m_contactList.clear(); |
171 | m_uidToContact.clear(); | 175 | m_uidToContact.clear(); |
172 | 176 | ||
173 | m_changed = false; | 177 | m_changed = false; |
174 | } | 178 | } |
175 | 179 | ||
176 | bool OPimContactAccessBackend_XML::wasChangedExternally() | 180 | bool OPimContactAccessBackend_XML::wasChangedExternally() |
177 | { | 181 | { |
178 | QFileInfo fi( m_fileName ); | 182 | QFileInfo fi( m_fileName ); |
179 | 183 | ||
180 | QDateTime lastmod = fi.lastModified (); | 184 | QDateTime lastmod = fi.lastModified (); |
181 | 185 | ||
182 | return (lastmod != m_readtime); | 186 | return (lastmod != m_readtime); |
183 | } | 187 | } |
184 | 188 | ||
185 | QArray<int> OPimContactAccessBackend_XML::allRecords() const | 189 | QArray<int> OPimContactAccessBackend_XML::allRecords() const |
186 | { | 190 | { |
187 | QArray<int> uid_list( m_contactList.count() ); | 191 | QArray<int> uid_list( m_contactList.count() ); |
188 | 192 | ||
189 | uint counter = 0; | 193 | uint counter = 0; |
190 | QListIterator<OPimContact> it( m_contactList ); | 194 | QListIterator<OPimContact> it( m_contactList ); |
191 | for( ; it.current(); ++it ){ | 195 | for( ; it.current(); ++it ){ |
192 | uid_list[counter++] = (*it)->uid(); | 196 | uid_list[counter++] = (*it)->uid(); |
193 | } | 197 | } |
194 | 198 | ||
195 | return ( uid_list ); | 199 | return ( uid_list ); |
196 | } | 200 | } |
197 | 201 | ||
198 | OPimContact OPimContactAccessBackend_XML::find ( int uid ) const | 202 | OPimContact OPimContactAccessBackend_XML::find ( int uid ) const |
199 | { | 203 | { |
200 | OPimContact foundContact; //Create empty contact | 204 | OPimContact foundContact; //Create empty contact |
201 | 205 | ||
202 | OPimContact* found = m_uidToContact.find( QString().setNum( uid ) ); | 206 | OPimContact* found = m_uidToContact.find( QString().setNum( uid ) ); |
203 | 207 | ||
204 | if ( found ){ | 208 | if ( found ){ |
205 | foundContact = *found; | 209 | foundContact = *found; |
206 | } | 210 | } |
207 | 211 | ||
208 | return ( foundContact ); | 212 | return ( foundContact ); |
209 | } | 213 | } |
210 | 214 | ||
211 | QArray<int> OPimContactAccessBackend_XML::queryByExample ( const OPimContact &query, int settings, | 215 | QArray<int> OPimContactAccessBackend_XML::queryByExample ( const OPimContact &query, int settings, |
212 | const QDateTime& d ) | 216 | const QDateTime& d ) |
213 | { | 217 | { |
214 | 218 | ||
215 | QArray<int> m_currentQuery( m_contactList.count() ); | 219 | QArray<int> m_currentQuery( m_contactList.count() ); |
216 | QListIterator<OPimContact> it( m_contactList ); | 220 | QListIterator<OPimContact> it( m_contactList ); |
217 | uint arraycounter = 0; | 221 | uint arraycounter = 0; |
218 | 222 | ||
219 | for( ; it.current(); ++it ){ | 223 | for( ; it.current(); ++it ){ |
220 | /* Search all fields and compare them with query object. Store them into list | 224 | /* Search all fields and compare them with query object. Store them into list |
221 | * if all fields matches. | 225 | * if all fields matches. |
222 | */ | 226 | */ |
223 | QDate* queryDate = 0l; | 227 | QDate* queryDate = 0l; |
224 | QDate* checkDate = 0l; | 228 | QDate* checkDate = 0l; |
225 | bool allcorrect = true; | 229 | bool allcorrect = true; |
226 | for ( int i = 0; i < Qtopia::Groups; i++ ) { | 230 | for ( int i = 0; i < Qtopia::Groups; i++ ) { |
227 | // Birthday and anniversary are special nonstring fields and should | 231 | // Birthday and anniversary are special nonstring fields and should |
228 | // be handled specially | 232 | // be handled specially |
229 | switch ( i ){ | 233 | switch ( i ){ |
230 | case Qtopia::Birthday: | 234 | case Qtopia::Birthday: |
231 | queryDate = new QDate( query.birthday() ); | 235 | queryDate = new QDate( query.birthday() ); |
232 | checkDate = new QDate( (*it)->birthday() ); | 236 | checkDate = new QDate( (*it)->birthday() ); |
233 | // fall through | 237 | // fall through |
234 | case Qtopia::Anniversary: | 238 | case Qtopia::Anniversary: |
235 | if ( queryDate == 0l ){ | 239 | if ( queryDate == 0l ){ |
236 | queryDate = new QDate( query.anniversary() ); | 240 | queryDate = new QDate( query.anniversary() ); |
237 | checkDate = new QDate( (*it)->anniversary() ); | 241 | checkDate = new QDate( (*it)->anniversary() ); |
238 | } | 242 | } |
239 | 243 | ||
240 | if ( queryDate->isValid() ){ | 244 | if ( queryDate->isValid() ){ |
241 | if( checkDate->isValid() ){ | 245 | if( checkDate->isValid() ){ |
242 | if ( settings & OPimContactAccess::DateYear ){ | 246 | if ( settings & OPimContactAccess::DateYear ){ |
243 | if ( queryDate->year() != checkDate->year() ) | 247 | if ( queryDate->year() != checkDate->year() ) |
244 | allcorrect = false; | 248 | allcorrect = false; |
245 | } | 249 | } |
246 | if ( settings & OPimContactAccess::DateMonth ){ | 250 | if ( settings & OPimContactAccess::DateMonth ){ |
247 | if ( queryDate->month() != checkDate->month() ) | 251 | if ( queryDate->month() != checkDate->month() ) |
248 | allcorrect = false; | 252 | allcorrect = false; |
249 | } | 253 | } |
250 | if ( settings & OPimContactAccess::DateDay ){ | 254 | if ( settings & OPimContactAccess::DateDay ){ |
251 | if ( queryDate->day() != checkDate->day() ) | 255 | if ( queryDate->day() != checkDate->day() ) |
252 | allcorrect = false; | 256 | allcorrect = false; |
253 | } | 257 | } |
254 | if ( settings & OPimContactAccess::DateDiff ) { | 258 | if ( settings & OPimContactAccess::DateDiff ) { |
255 | QDate current; | 259 | QDate current; |
256 | // If we get an additional date, we | 260 | // If we get an additional date, we |
257 | // will take this date instead of | 261 | // will take this date instead of |
258 | // the current one.. | 262 | // the current one.. |
259 | if ( !d.date().isValid() ) | 263 | if ( !d.date().isValid() ) |
260 | current = QDate::currentDate(); | 264 | current = QDate::currentDate(); |
261 | else | 265 | else |
262 | current = d.date(); | 266 | current = d.date(); |
263 | 267 | ||
264 | // We have to equalize the year, otherwise | 268 | // We have to equalize the year, otherwise |
265 | // the search will fail.. | 269 | // the search will fail.. |
266 | checkDate->setYMD( current.year(), | 270 | checkDate->setYMD( current.year(), |
267 | checkDate->month(), | 271 | checkDate->month(), |
268 | checkDate->day() ); | 272 | checkDate->day() ); |
269 | if ( *checkDate < current ) | 273 | if ( *checkDate < current ) |
270 | checkDate->setYMD( current.year()+1, | 274 | checkDate->setYMD( current.year()+1, |
271 | checkDate->month(), | 275 | checkDate->month(), |
272 | checkDate->day() ); | 276 | checkDate->day() ); |
273 | 277 | ||
274 | // Check whether the birthday/anniversary date is between | 278 | // Check whether the birthday/anniversary date is between |
275 | // the current/given date and the maximum date | 279 | // the current/given date and the maximum date |
276 | // ( maximum time range ) ! | 280 | // ( maximum time range ) ! |
277 | qWarning("Checking if %s is between %s and %s ! ", | 281 | qWarning("Checking if %s is between %s and %s ! ", |
278 | checkDate->toString().latin1(), | 282 | checkDate->toString().latin1(), |
279 | current.toString().latin1(), | 283 | current.toString().latin1(), |
280 | queryDate->toString().latin1() ); | 284 | queryDate->toString().latin1() ); |
281 | if ( current.daysTo( *queryDate ) >= 0 ){ | 285 | if ( current.daysTo( *queryDate ) >= 0 ){ |
282 | if ( !( ( *checkDate >= current ) && | 286 | if ( !( ( *checkDate >= current ) && |
283 | ( *checkDate <= *queryDate ) ) ){ | 287 | ( *checkDate <= *queryDate ) ) ){ |
284 | allcorrect = false; | 288 | allcorrect = false; |
285 | qWarning (" Nope!.."); | 289 | qWarning (" Nope!.."); |
286 | } | 290 | } |
287 | } | 291 | } |
288 | } | 292 | } |
289 | } else{ | 293 | } else{ |
290 | // checkDate is invalid. Therefore this entry is always rejected | 294 | // checkDate is invalid. Therefore this entry is always rejected |
291 | allcorrect = false; | 295 | allcorrect = false; |
292 | } | 296 | } |
293 | } | 297 | } |
294 | 298 | ||
295 | delete queryDate; | 299 | delete queryDate; |
296 | queryDate = 0l; | 300 | queryDate = 0l; |
297 | delete checkDate; | 301 | delete checkDate; |
298 | checkDate = 0l; | 302 | checkDate = 0l; |
299 | break; | 303 | break; |
300 | default: | 304 | default: |
301 | /* Just compare fields which are not empty in the query object */ | 305 | /* Just compare fields which are not empty in the query object */ |
302 | if ( !query.field(i).isEmpty() ){ | 306 | if ( !query.field(i).isEmpty() ){ |
303 | switch ( settings & ~( OPimContactAccess::IgnoreCase | 307 | switch ( settings & ~( OPimContactAccess::IgnoreCase |
304 | | OPimContactAccess::DateDiff | 308 | | OPimContactAccess::DateDiff |
305 | | OPimContactAccess::DateYear | 309 | | OPimContactAccess::DateYear |
306 | | OPimContactAccess::DateMonth | 310 | | OPimContactAccess::DateMonth |
307 | | OPimContactAccess::DateDay | 311 | | OPimContactAccess::DateDay |
308 | | OPimContactAccess::MatchOne | 312 | | OPimContactAccess::MatchOne |
309 | ) ){ | 313 | ) ){ |
310 | 314 | ||
311 | case OPimContactAccess::RegExp:{ | 315 | case OPimContactAccess::RegExp:{ |
312 | QRegExp expr ( query.field(i), | 316 | QRegExp expr ( query.field(i), |
313 | !(settings & OPimContactAccess::IgnoreCase), | 317 | !(settings & OPimContactAccess::IgnoreCase), |
314 | false ); | 318 | false ); |
315 | if ( expr.find ( (*it)->field(i), 0 ) == -1 ) | 319 | if ( expr.find ( (*it)->field(i), 0 ) == -1 ) |
316 | allcorrect = false; | 320 | allcorrect = false; |
317 | } | 321 | } |
318 | break; | 322 | break; |
319 | case OPimContactAccess::WildCards:{ | 323 | case OPimContactAccess::WildCards:{ |
320 | QRegExp expr ( query.field(i), | 324 | QRegExp expr ( query.field(i), |
321 | !(settings & OPimContactAccess::IgnoreCase), | 325 | !(settings & OPimContactAccess::IgnoreCase), |
322 | true ); | 326 | true ); |
323 | if ( expr.find ( (*it)->field(i), 0 ) == -1 ) | 327 | if ( expr.find ( (*it)->field(i), 0 ) == -1 ) |
324 | allcorrect = false; | 328 | allcorrect = false; |
325 | } | 329 | } |
326 | break; | 330 | break; |
327 | case OPimContactAccess::ExactMatch:{ | 331 | case OPimContactAccess::ExactMatch:{ |
328 | if (settings & OPimContactAccess::IgnoreCase){ | 332 | if (settings & OPimContactAccess::IgnoreCase){ |
329 | if ( query.field(i).upper() != | 333 | if ( query.field(i).upper() != |
330 | (*it)->field(i).upper() ) | 334 | (*it)->field(i).upper() ) |
331 | allcorrect = false; | 335 | allcorrect = false; |
332 | }else{ | 336 | }else{ |
333 | if ( query.field(i) != (*it)->field(i) ) | 337 | if ( query.field(i) != (*it)->field(i) ) |
334 | allcorrect = false; | 338 | allcorrect = false; |
335 | } | 339 | } |
336 | } | 340 | } |
337 | break; | 341 | break; |
338 | } | 342 | } |
339 | } | 343 | } |
340 | } | 344 | } |
341 | } | 345 | } |
342 | if ( allcorrect ){ | 346 | if ( allcorrect ){ |
343 | m_currentQuery[arraycounter++] = (*it)->uid(); | 347 | m_currentQuery[arraycounter++] = (*it)->uid(); |
344 | } | 348 | } |
345 | } | 349 | } |
346 | 350 | ||
347 | // Shrink to fit.. | 351 | // Shrink to fit.. |
348 | m_currentQuery.resize(arraycounter); | 352 | m_currentQuery.resize(arraycounter); |
349 | 353 | ||
350 | return m_currentQuery; | 354 | return m_currentQuery; |
351 | } | 355 | } |
352 | 356 | ||
353 | QArray<int> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const | 357 | QArray<int> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const |
354 | { | 358 | { |
355 | QArray<int> m_currentQuery( m_contactList.count() ); | 359 | QArray<int> m_currentQuery( m_contactList.count() ); |
356 | QListIterator<OPimContact> it( m_contactList ); | 360 | QListIterator<OPimContact> it( m_contactList ); |
357 | uint arraycounter = 0; | 361 | uint arraycounter = 0; |
358 | 362 | ||
359 | for( ; it.current(); ++it ){ | 363 | for( ; it.current(); ++it ){ |
360 | if ( (*it)->match( r ) ){ | 364 | if ( (*it)->match( r ) ){ |
361 | m_currentQuery[arraycounter++] = (*it)->uid(); | 365 | m_currentQuery[arraycounter++] = (*it)->uid(); |
362 | } | 366 | } |
363 | 367 | ||
364 | } | 368 | } |
365 | // Shrink to fit.. | 369 | // Shrink to fit.. |
366 | m_currentQuery.resize(arraycounter); | 370 | m_currentQuery.resize(arraycounter); |
367 | 371 | ||
368 | return m_currentQuery; | 372 | return m_currentQuery; |
369 | } | 373 | } |
370 | 374 | ||
371 | const uint OPimContactAccessBackend_XML::querySettings() | 375 | const uint OPimContactAccessBackend_XML::querySettings() |
372 | { | 376 | { |
373 | return ( OPimContactAccess::WildCards | 377 | return ( OPimContactAccess::WildCards |
374 | | OPimContactAccess::IgnoreCase | 378 | | OPimContactAccess::IgnoreCase |
375 | | OPimContactAccess::RegExp | 379 | | OPimContactAccess::RegExp |
376 | | OPimContactAccess::ExactMatch | 380 | | OPimContactAccess::ExactMatch |
377 | | OPimContactAccess::DateDiff | 381 | | OPimContactAccess::DateDiff |
378 | | OPimContactAccess::DateYear | 382 | | OPimContactAccess::DateYear |
379 | | OPimContactAccess::DateMonth | 383 | | OPimContactAccess::DateMonth |
380 | | OPimContactAccess::DateDay | 384 | | OPimContactAccess::DateDay |
381 | ); | 385 | ); |
382 | } | 386 | } |
383 | 387 | ||
384 | bool OPimContactAccessBackend_XML::hasQuerySettings (uint querySettings) const | 388 | bool OPimContactAccessBackend_XML::hasQuerySettings (uint querySettings) const |
385 | { | 389 | { |
386 | /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay | 390 | /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay |
387 | * may be added with any of the other settings. IgnoreCase should never used alone. | 391 | * may be added with any of the other settings. IgnoreCase should never used alone. |
388 | * Wildcards, RegExp, ExactMatch should never used at the same time... | 392 | * Wildcards, RegExp, ExactMatch should never used at the same time... |
389 | */ | 393 | */ |
390 | 394 | ||
391 | // Step 1: Check whether the given settings are supported by this backend | 395 | // Step 1: Check whether the given settings are supported by this backend |
392 | if ( ( querySettings & ( | 396 | if ( ( querySettings & ( |
393 | OPimContactAccess::IgnoreCase | 397 | OPimContactAccess::IgnoreCase |
394 | | OPimContactAccess::WildCards | 398 | | OPimContactAccess::WildCards |
395 | | OPimContactAccess::DateDiff | 399 | | OPimContactAccess::DateDiff |
396 | | OPimContactAccess::DateYear | 400 | | OPimContactAccess::DateYear |
397 | | OPimContactAccess::DateMonth | 401 | | OPimContactAccess::DateMonth |
398 | | OPimContactAccess::DateDay | 402 | | OPimContactAccess::DateDay |
399 | | OPimContactAccess::RegExp | 403 | | OPimContactAccess::RegExp |
400 | | OPimContactAccess::ExactMatch | 404 | | OPimContactAccess::ExactMatch |
401 | ) ) != querySettings ) | 405 | ) ) != querySettings ) |
402 | return false; | 406 | return false; |
403 | 407 | ||
404 | // Step 2: Check whether the given combinations are ok.. | 408 | // Step 2: Check whether the given combinations are ok.. |
405 | 409 | ||
406 | // IngoreCase alone is invalid | 410 | // IngoreCase alone is invalid |
407 | if ( querySettings == OPimContactAccess::IgnoreCase ) | 411 | if ( querySettings == OPimContactAccess::IgnoreCase ) |
408 | return false; | 412 | return false; |
409 | 413 | ||
410 | // WildCards, RegExp and ExactMatch should never used at the same time | 414 | // WildCards, RegExp and ExactMatch should never used at the same time |
411 | switch ( querySettings & ~( OPimContactAccess::IgnoreCase | 415 | switch ( querySettings & ~( OPimContactAccess::IgnoreCase |
412 | | OPimContactAccess::DateDiff | 416 | | OPimContactAccess::DateDiff |
413 | | OPimContactAccess::DateYear | 417 | | OPimContactAccess::DateYear |
414 | | OPimContactAccess::DateMonth | 418 | | OPimContactAccess::DateMonth |
415 | | OPimContactAccess::DateDay | 419 | | OPimContactAccess::DateDay |
416 | ) | 420 | ) |
417 | ){ | 421 | ){ |
418 | case OPimContactAccess::RegExp: | 422 | case OPimContactAccess::RegExp: |
419 | return ( true ); | 423 | return ( true ); |
420 | case OPimContactAccess::WildCards: | 424 | case OPimContactAccess::WildCards: |
421 | return ( true ); | 425 | return ( true ); |
422 | case OPimContactAccess::ExactMatch: | 426 | case OPimContactAccess::ExactMatch: |
423 | return ( true ); | 427 | return ( true ); |
424 | case 0: // one of the upper removed bits were set.. | 428 | case 0: // one of the upper removed bits were set.. |
425 | return ( true ); | 429 | return ( true ); |
426 | default: | 430 | default: |
427 | return ( false ); | 431 | return ( false ); |
428 | } | 432 | } |
429 | } | 433 | } |
430 | 434 | ||
431 | // Currently only asc implemented.. | 435 | // Currently only asc implemented.. |
432 | QArray<int> OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) | 436 | QArray<int> OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) |
433 | { | 437 | { |
434 | QMap<QString, int> nameToUid; | 438 | QMap<QString, int> nameToUid; |
435 | QStringList names; | 439 | QStringList names; |
436 | QArray<int> m_currentQuery( m_contactList.count() ); | 440 | QArray<int> m_currentQuery( m_contactList.count() ); |
437 | 441 | ||
438 | // First fill map and StringList with all Names | 442 | // First fill map and StringList with all Names |
439 | // Afterwards sort namelist and use map to fill array to return.. | 443 | // Afterwards sort namelist and use map to fill array to return.. |
440 | QListIterator<OPimContact> it( m_contactList ); | 444 | QListIterator<OPimContact> it( m_contactList ); |
441 | for( ; it.current(); ++it ){ | 445 | for( ; it.current(); ++it ){ |
442 | names.append( (*it)->fileAs() + QString::number( (*it)->uid() ) ); | 446 | names.append( (*it)->fileAs() + QString::number( (*it)->uid() ) ); |
443 | nameToUid.insert( (*it)->fileAs() + QString::number( (*it)->uid() ), (*it)->uid() ); | 447 | nameToUid.insert( (*it)->fileAs() + QString::number( (*it)->uid() ), (*it)->uid() ); |
444 | } | 448 | } |
445 | names.sort(); | 449 | names.sort(); |
446 | 450 | ||
447 | int i = 0; | 451 | int i = 0; |
448 | if ( asc ){ | 452 | if ( asc ){ |
449 | for ( QStringList::Iterator it = names.begin(); it != names.end(); ++it ) | 453 | for ( QStringList::Iterator it = names.begin(); it != names.end(); ++it ) |
450 | m_currentQuery[i++] = nameToUid[ (*it) ]; | 454 | m_currentQuery[i++] = nameToUid[ (*it) ]; |
451 | }else{ | 455 | }else{ |
452 | for ( QStringList::Iterator it = names.end(); it != names.begin(); --it ) | 456 | for ( QStringList::Iterator it = names.end(); it != names.begin(); --it ) |
453 | m_currentQuery[i++] = nameToUid[ (*it) ]; | 457 | m_currentQuery[i++] = nameToUid[ (*it) ]; |
454 | } | 458 | } |
455 | 459 | ||
456 | return m_currentQuery; | 460 | return m_currentQuery; |
457 | 461 | ||
458 | } | 462 | } |
459 | 463 | ||
460 | bool OPimContactAccessBackend_XML::add ( const OPimContact &newcontact ) | 464 | bool OPimContactAccessBackend_XML::add ( const OPimContact &newcontact ) |
461 | { | 465 | { |
462 | //qWarning("odefaultbackend: ACTION::ADD"); | 466 | //owarn << "odefaultbackend: ACTION::ADD" << oendl; |
463 | updateJournal (newcontact, ACTION_ADD); | 467 | updateJournal (newcontact, ACTION_ADD); |
464 | addContact_p( newcontact ); | 468 | addContact_p( newcontact ); |
465 | 469 | ||
466 | m_changed = true; | 470 | m_changed = true; |
467 | 471 | ||
468 | return true; | 472 | return true; |
469 | } | 473 | } |
470 | 474 | ||
471 | bool OPimContactAccessBackend_XML::replace ( const OPimContact &contact ) | 475 | bool OPimContactAccessBackend_XML::replace ( const OPimContact &contact ) |
472 | { | 476 | { |
473 | m_changed = true; | 477 | m_changed = true; |
474 | 478 | ||
475 | OPimContact* found = m_uidToContact.find ( QString().setNum( contact.uid() ) ); | 479 | OPimContact* found = m_uidToContact.find ( QString().setNum( contact.uid() ) ); |
476 | 480 | ||
477 | if ( found ) { | 481 | if ( found ) { |
478 | OPimContact* newCont = new OPimContact( contact ); | 482 | OPimContact* newCont = new OPimContact( contact ); |
479 | 483 | ||
480 | updateJournal ( *newCont, ACTION_REPLACE); | 484 | updateJournal ( *newCont, ACTION_REPLACE); |
481 | m_contactList.removeRef ( found ); | 485 | m_contactList.removeRef ( found ); |
482 | m_contactList.append ( newCont ); | 486 | m_contactList.append ( newCont ); |
483 | m_uidToContact.remove( QString().setNum( contact.uid() ) ); | 487 | m_uidToContact.remove( QString().setNum( contact.uid() ) ); |
484 | m_uidToContact.insert( QString().setNum( newCont->uid() ), newCont ); | 488 | m_uidToContact.insert( QString().setNum( newCont->uid() ), newCont ); |
485 | 489 | ||
486 | qWarning("Nur zur Sicherheit: %d == %d ?",contact.uid(), newCont->uid()); | 490 | owarn << "Nur zur Sicherheit: " << contact.uid() << " == " << newCont->uid() << " ?" << oendl; |
487 | 491 | ||
488 | return true; | 492 | return true; |
489 | } else | 493 | } else |
490 | return false; | 494 | return false; |
491 | } | 495 | } |
492 | 496 | ||
493 | bool OPimContactAccessBackend_XML::remove ( int uid ) | 497 | bool OPimContactAccessBackend_XML::remove ( int uid ) |
494 | { | 498 | { |
495 | m_changed = true; | 499 | m_changed = true; |
496 | 500 | ||
497 | OPimContact* found = m_uidToContact.find ( QString().setNum( uid ) ); | 501 | OPimContact* found = m_uidToContact.find ( QString().setNum( uid ) ); |
498 | 502 | ||
499 | if ( found ) { | 503 | if ( found ) { |
500 | updateJournal ( *found, ACTION_REMOVE); | 504 | updateJournal ( *found, ACTION_REMOVE); |
501 | m_contactList.removeRef ( found ); | 505 | m_contactList.removeRef ( found ); |
502 | m_uidToContact.remove( QString().setNum( uid ) ); | 506 | m_uidToContact.remove( QString().setNum( uid ) ); |
503 | 507 | ||
504 | return true; | 508 | return true; |
505 | } else | 509 | } else |
506 | return false; | 510 | return false; |
507 | } | 511 | } |
508 | 512 | ||
509 | bool OPimContactAccessBackend_XML::reload(){ | 513 | bool OPimContactAccessBackend_XML::reload(){ |
510 | /* Reload is the same as load in this implementation */ | 514 | /* Reload is the same as load in this implementation */ |
511 | return ( load() ); | 515 | return ( load() ); |
512 | } | 516 | } |
513 | 517 | ||
514 | void OPimContactAccessBackend_XML::addContact_p( const OPimContact &newcontact ) | 518 | void OPimContactAccessBackend_XML::addContact_p( const OPimContact &newcontact ) |
515 | { | 519 | { |
516 | OPimContact* contRef = new OPimContact( newcontact ); | 520 | OPimContact* contRef = new OPimContact( newcontact ); |
517 | 521 | ||
518 | m_contactList.append ( contRef ); | 522 | m_contactList.append ( contRef ); |
519 | m_uidToContact.insert( QString().setNum( newcontact.uid() ), contRef ); | 523 | m_uidToContact.insert( QString().setNum( newcontact.uid() ), contRef ); |
520 | } | 524 | } |
521 | 525 | ||
522 | /* This function loads the xml-database and the journalfile */ | 526 | /* This function loads the xml-database and the journalfile */ |
523 | bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal ) | 527 | bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal ) |
524 | { | 528 | { |
525 | 529 | ||
526 | /* We use the time of the last read to check if the file was | 530 | /* We use the time of the last read to check if the file was |
527 | * changed externally. | 531 | * changed externally. |
528 | */ | 532 | */ |
529 | if ( !isJournal ){ | 533 | if ( !isJournal ){ |
530 | QFileInfo fi( filename ); | 534 | QFileInfo fi( filename ); |
531 | m_readtime = fi.lastModified (); | 535 | m_readtime = fi.lastModified (); |
532 | } | 536 | } |
533 | 537 | ||
534 | const int JOURNALACTION = Qtopia::Notes + 1; | 538 | const int JOURNALACTION = Qtopia::Notes + 1; |
535 | const int JOURNALROW = JOURNALACTION + 1; | 539 | const int JOURNALROW = JOURNALACTION + 1; |
536 | 540 | ||
537 | bool foundAction = false; | 541 | bool foundAction = false; |
538 | journal_action action = ACTION_ADD; | 542 | journal_action action = ACTION_ADD; |
539 | int journalKey = 0; | 543 | int journalKey = 0; |
540 | QMap<int, QString> contactMap; | 544 | QMap<int, QString> contactMap; |
541 | QMap<QString, QString> customMap; | 545 | QMap<QString, QString> customMap; |
542 | QMap<QString, QString>::Iterator customIt; | 546 | QMap<QString, QString>::Iterator customIt; |
543 | QAsciiDict<int> dict( 47 ); | 547 | QAsciiDict<int> dict( 47 ); |
544 | 548 | ||
545 | dict.setAutoDelete( TRUE ); | 549 | dict.setAutoDelete( TRUE ); |
546 | dict.insert( "Uid", new int(Qtopia::AddressUid) ); | 550 | dict.insert( "Uid", new int(Qtopia::AddressUid) ); |
547 | dict.insert( "Title", new int(Qtopia::Title) ); | 551 | dict.insert( "Title", new int(Qtopia::Title) ); |
548 | dict.insert( "FirstName", new int(Qtopia::FirstName) ); | 552 | dict.insert( "FirstName", new int(Qtopia::FirstName) ); |
549 | dict.insert( "MiddleName", new int(Qtopia::MiddleName) ); | 553 | dict.insert( "MiddleName", new int(Qtopia::MiddleName) ); |
550 | dict.insert( "LastName", new int(Qtopia::LastName) ); | 554 | dict.insert( "LastName", new int(Qtopia::LastName) ); |
551 | dict.insert( "Suffix", new int(Qtopia::Suffix) ); | 555 | dict.insert( "Suffix", new int(Qtopia::Suffix) ); |
552 | dict.insert( "FileAs", new int(Qtopia::FileAs) ); | 556 | dict.insert( "FileAs", new int(Qtopia::FileAs) ); |
553 | dict.insert( "Categories", new int(Qtopia::AddressCategory) ); | 557 | dict.insert( "Categories", new int(Qtopia::AddressCategory) ); |
554 | dict.insert( "DefaultEmail", new int(Qtopia::DefaultEmail) ); | 558 | dict.insert( "DefaultEmail", new int(Qtopia::DefaultEmail) ); |
555 | dict.insert( "Emails", new int(Qtopia::Emails) ); | 559 | dict.insert( "Emails", new int(Qtopia::Emails) ); |
556 | dict.insert( "HomeStreet", new int(Qtopia::HomeStreet) ); | 560 | dict.insert( "HomeStreet", new int(Qtopia::HomeStreet) ); |
557 | dict.insert( "HomeCity", new int(Qtopia::HomeCity) ); | 561 | dict.insert( "HomeCity", new int(Qtopia::HomeCity) ); |
558 | dict.insert( "HomeState", new int(Qtopia::HomeState) ); | 562 | dict.insert( "HomeState", new int(Qtopia::HomeState) ); |
559 | dict.insert( "HomeZip", new int(Qtopia::HomeZip) ); | 563 | dict.insert( "HomeZip", new int(Qtopia::HomeZip) ); |
560 | dict.insert( "HomeCountry", new int(Qtopia::HomeCountry) ); | 564 | dict.insert( "HomeCountry", new int(Qtopia::HomeCountry) ); |
561 | dict.insert( "HomePhone", new int(Qtopia::HomePhone) ); | 565 | dict.insert( "HomePhone", new int(Qtopia::HomePhone) ); |
562 | dict.insert( "HomeFax", new int(Qtopia::HomeFax) ); | 566 | dict.insert( "HomeFax", new int(Qtopia::HomeFax) ); |
563 | dict.insert( "HomeMobile", new int(Qtopia::HomeMobile) ); | 567 | dict.insert( "HomeMobile", new int(Qtopia::HomeMobile) ); |
564 | dict.insert( "HomeWebPage", new int(Qtopia::HomeWebPage) ); | 568 | dict.insert( "HomeWebPage", new int(Qtopia::HomeWebPage) ); |
565 | dict.insert( "Company", new int(Qtopia::Company) ); | 569 | dict.insert( "Company", new int(Qtopia::Company) ); |
566 | dict.insert( "BusinessStreet", new int(Qtopia::BusinessStreet) ); | 570 | dict.insert( "BusinessStreet", new int(Qtopia::BusinessStreet) ); |
567 | dict.insert( "BusinessCity", new int(Qtopia::BusinessCity) ); | 571 | dict.insert( "BusinessCity", new int(Qtopia::BusinessCity) ); |
568 | dict.insert( "BusinessState", new int(Qtopia::BusinessState) ); | 572 | dict.insert( "BusinessState", new int(Qtopia::BusinessState) ); |
569 | dict.insert( "BusinessZip", new int(Qtopia::BusinessZip) ); | 573 | dict.insert( "BusinessZip", new int(Qtopia::BusinessZip) ); |
570 | dict.insert( "BusinessCountry", new int(Qtopia::BusinessCountry) ); | 574 | dict.insert( "BusinessCountry", new int(Qtopia::BusinessCountry) ); |
571 | dict.insert( "BusinessWebPage", new int(Qtopia::BusinessWebPage) ); | 575 | dict.insert( "BusinessWebPage", new int(Qtopia::BusinessWebPage) ); |
572 | dict.insert( "JobTitle", new int(Qtopia::JobTitle) ); | 576 | dict.insert( "JobTitle", new int(Qtopia::JobTitle) ); |
573 | dict.insert( "Department", new int(Qtopia::Department) ); | 577 | dict.insert( "Department", new int(Qtopia::Department) ); |
574 | dict.insert( "Office", new int(Qtopia::Office) ); | 578 | dict.insert( "Office", new int(Qtopia::Office) ); |
575 | dict.insert( "BusinessPhone", new int(Qtopia::BusinessPhone) ); | 579 | dict.insert( "BusinessPhone", new int(Qtopia::BusinessPhone) ); |
576 | dict.insert( "BusinessFax", new int(Qtopia::BusinessFax) ); | 580 | dict.insert( "BusinessFax", new int(Qtopia::BusinessFax) ); |
577 | dict.insert( "BusinessMobile", new int(Qtopia::BusinessMobile) ); | 581 | dict.insert( "BusinessMobile", new int(Qtopia::BusinessMobile) ); |
578 | dict.insert( "BusinessPager", new int(Qtopia::BusinessPager) ); | 582 | dict.insert( "BusinessPager", new int(Qtopia::BusinessPager) ); |
579 | dict.insert( "Profession", new int(Qtopia::Profession) ); | 583 | dict.insert( "Profession", new int(Qtopia::Profession) ); |
580 | dict.insert( "Assistant", new int(Qtopia::Assistant) ); | 584 | dict.insert( "Assistant", new int(Qtopia::Assistant) ); |
581 | dict.insert( "Manager", new int(Qtopia::Manager) ); | 585 | dict.insert( "Manager", new int(Qtopia::Manager) ); |
582 | dict.insert( "Spouse", new int(Qtopia::Spouse) ); | 586 | dict.insert( "Spouse", new int(Qtopia::Spouse) ); |
583 | dict.insert( "Children", new int(Qtopia::Children) ); | 587 | dict.insert( "Children", new int(Qtopia::Children) ); |
584 | dict.insert( "Gender", new int(Qtopia::Gender) ); | 588 | dict.insert( "Gender", new int(Qtopia::Gender) ); |
585 | dict.insert( "Birthday", new int(Qtopia::Birthday) ); | 589 | dict.insert( "Birthday", new int(Qtopia::Birthday) ); |
586 | dict.insert( "Anniversary", new int(Qtopia::Anniversary) ); | 590 | dict.insert( "Anniversary", new int(Qtopia::Anniversary) ); |
587 | dict.insert( "Nickname", new int(Qtopia::Nickname) ); | 591 | dict.insert( "Nickname", new int(Qtopia::Nickname) ); |
588 | dict.insert( "Notes", new int(Qtopia::Notes) ); | 592 | dict.insert( "Notes", new int(Qtopia::Notes) ); |
589 | dict.insert( "action", new int(JOURNALACTION) ); | 593 | dict.insert( "action", new int(JOURNALACTION) ); |
590 | dict.insert( "actionrow", new int(JOURNALROW) ); | 594 | dict.insert( "actionrow", new int(JOURNALROW) ); |
591 | 595 | ||
592 | //qWarning( "OPimContactDefaultBackEnd::loading %s", filename.latin1() ); | 596 | //owarn << "OPimContactDefaultBackEnd::loading " << filename << "" << oendl; |
593 | 597 | ||
594 | XMLElement *root = XMLElement::load( filename ); | 598 | XMLElement *root = XMLElement::load( filename ); |
595 | if(root != 0l ){ // start parsing | 599 | if(root != 0l ){ // start parsing |
596 | /* Parse all XML-Elements and put the data into the | 600 | /* Parse all XML-Elements and put the data into the |
597 | * Contact-Class | 601 | * Contact-Class |
598 | */ | 602 | */ |
599 | XMLElement *element = root->firstChild(); | 603 | XMLElement *element = root->firstChild(); |
600 | //qWarning("OPimContactAccess::load tagName(): %s", root->tagName().latin1() ); | 604 | //owarn << "OPimContactAccess::load tagName(): " << root->tagName() << "" << oendl; |
601 | element = element->firstChild(); | 605 | element = element->firstChild(); |
602 | 606 | ||
603 | /* Search Tag "Contacts" which is the parent of all Contacts */ | 607 | /* Search Tag "Contacts" which is the parent of all Contacts */ |
604 | while( element && !isJournal ){ | 608 | while( element && !isJournal ){ |
605 | if( element->tagName() != QString::fromLatin1("Contacts") ){ | 609 | if( element->tagName() != QString::fromLatin1("Contacts") ){ |
606 | //qWarning ("OPimContactDefBack::Searching for Tag \"Contacts\"! Found: %s", | 610 | //qWarning ("OPimContactDefBack::Searching for Tag \"Contacts\"! Found: %s", |
607 | // element->tagName().latin1()); | 611 | // element->tagName().latin1()); |
608 | element = element->nextChild(); | 612 | element = element->nextChild(); |
609 | } else { | 613 | } else { |
610 | element = element->firstChild(); | 614 | element = element->firstChild(); |
611 | break; | 615 | break; |
612 | } | 616 | } |
613 | } | 617 | } |
614 | /* Parse all Contacts and ignore unknown tags */ | 618 | /* Parse all Contacts and ignore unknown tags */ |
615 | while( element ){ | 619 | while( element ){ |
616 | if( element->tagName() != QString::fromLatin1("Contact") ){ | 620 | if( element->tagName() != QString::fromLatin1("Contact") ){ |
617 | //qWarning ("OPimContactDefBack::Searching for Tag \"Contact\"! Found: %s", | 621 | //qWarning ("OPimContactDefBack::Searching for Tag \"Contact\"! Found: %s", |
618 | // element->tagName().latin1()); | 622 | // element->tagName().latin1()); |
619 | element = element->nextChild(); | 623 | element = element->nextChild(); |
620 | continue; | 624 | continue; |
621 | } | 625 | } |
622 | /* Found alement with tagname "contact", now parse and store all | 626 | /* Found alement with tagname "contact", now parse and store all |
623 | * attributes contained | 627 | * attributes contained |
624 | */ | 628 | */ |
625 | //qWarning("OPimContactDefBack::load element tagName() : %s", | 629 | //qWarning("OPimContactDefBack::load element tagName() : %s", |
626 | // element->tagName().latin1() ); | 630 | // element->tagName().latin1() ); |
627 | QString dummy; | 631 | QString dummy; |
628 | foundAction = false; | 632 | foundAction = false; |
629 | 633 | ||
630 | XMLElement::AttributeMap aMap = element->attributes(); | 634 | XMLElement::AttributeMap aMap = element->attributes(); |
631 | XMLElement::AttributeMap::Iterator it; | 635 | XMLElement::AttributeMap::Iterator it; |
632 | contactMap.clear(); | 636 | contactMap.clear(); |
633 | customMap.clear(); | 637 | customMap.clear(); |
634 | for( it = aMap.begin(); it != aMap.end(); ++it ){ | 638 | for( it = aMap.begin(); it != aMap.end(); ++it ){ |
635 | // qWarning ("Read Attribute: %s=%s", it.key().latin1(),it.data().latin1()); | 639 | // qWarning ("Read Attribute: %s=%s", it.key().latin1(),it.data().latin1()); |
636 | 640 | ||
637 | int *find = dict[ it.key() ]; | 641 | int *find = dict[ it.key() ]; |
638 | /* Unknown attributes will be stored as "Custom" elements */ | 642 | /* Unknown attributes will be stored as "Custom" elements */ |
639 | if ( !find ) { | 643 | if ( !find ) { |
640 | // qWarning("Attribute %s not known.", it.key().latin1()); | 644 | // owarn << "Attribute " << it.key() << " not known." << oendl; |
641 | //contact.setCustomField(it.key(), it.data()); | 645 | //contact.setCustomField(it.key(), it.data()); |
642 | customMap.insert( it.key(), it.data() ); | 646 | customMap.insert( it.key(), it.data() ); |
643 | continue; | 647 | continue; |
644 | } | 648 | } |
645 | 649 | ||
646 | /* Check if special conversion is needed and add attribute | 650 | /* Check if special conversion is needed and add attribute |
647 | * into Contact class | 651 | * into Contact class |
648 | */ | 652 | */ |
649 | switch( *find ) { | 653 | switch( *find ) { |
650 | /* | 654 | /* |
651 | case Qtopia::AddressUid: | 655 | case Qtopia::AddressUid: |
652 | contact.setUid( it.data().toInt() ); | 656 | contact.setUid( it.data().toInt() ); |
653 | break; | 657 | break; |
654 | case Qtopia::AddressCategory: | 658 | case Qtopia::AddressCategory: |
655 | contact.setCategories( Qtopia::Record::idsFromString( it.data( ))); | 659 | contact.setCategories( Qtopia::Record::idsFromString( it.data( ))); |
656 | break; | 660 | break; |
657 | */ | 661 | */ |
658 | case JOURNALACTION: | 662 | case JOURNALACTION: |
659 | action = journal_action(it.data().toInt()); | 663 | action = journal_action(it.data().toInt()); |
660 | foundAction = true; | 664 | foundAction = true; |
661 | qWarning ("ODefBack(journal)::ACTION found: %d", action); | 665 | qWarning ("ODefBack(journal)::ACTION found: %d", action); |
662 | break; | 666 | break; |
663 | case JOURNALROW: | 667 | case JOURNALROW: |
664 | journalKey = it.data().toInt(); | 668 | journalKey = it.data().toInt(); |
665 | break; | 669 | break; |
666 | default: // no conversion needed add them to the map | 670 | default: // no conversion needed add them to the map |
667 | contactMap.insert( *find, it.data() ); | 671 | contactMap.insert( *find, it.data() ); |
668 | break; | 672 | break; |
669 | } | 673 | } |
670 | } | 674 | } |
671 | /* now generate the Contact contact */ | 675 | /* now generate the Contact contact */ |
672 | OPimContact contact( contactMap ); | 676 | OPimContact contact( contactMap ); |
673 | 677 | ||
674 | for (customIt = customMap.begin(); customIt != customMap.end(); ++customIt ) { | 678 | for (customIt = customMap.begin(); customIt != customMap.end(); ++customIt ) { |
675 | contact.setCustomField( customIt.key(), customIt.data() ); | 679 | contact.setCustomField( customIt.key(), customIt.data() ); |
676 | } | 680 | } |
677 | 681 | ||
678 | if (foundAction){ | 682 | if (foundAction){ |
679 | foundAction = false; | 683 | foundAction = false; |
680 | switch ( action ) { | 684 | switch ( action ) { |
681 | case ACTION_ADD: | 685 | case ACTION_ADD: |
682 | addContact_p (contact); | 686 | addContact_p (contact); |
683 | break; | 687 | break; |
684 | case ACTION_REMOVE: | 688 | case ACTION_REMOVE: |
685 | if ( !remove (contact.uid()) ) | 689 | if ( !remove (contact.uid()) ) |
686 | qWarning ("ODefBack(journal)::Unable to remove uid: %d", | 690 | qWarning ("ODefBack(journal)::Unable to remove uid: %d", |
687 | contact.uid() ); | 691 | contact.uid() ); |
688 | break; | 692 | break; |
689 | case ACTION_REPLACE: | 693 | case ACTION_REPLACE: |
690 | if ( !replace ( contact ) ) | 694 | if ( !replace ( contact ) ) |
691 | qWarning ("ODefBack(journal)::Unable to replace uid: %d", | 695 | qWarning ("ODefBack(journal)::Unable to replace uid: %d", |
692 | contact.uid() ); | 696 | contact.uid() ); |
693 | break; | 697 | break; |
694 | default: | 698 | default: |
695 | qWarning ("Unknown action: ignored !"); | 699 | qWarning ("Unknown action: ignored !"); |
696 | break; | 700 | break; |
697 | } | 701 | } |
698 | }else{ | 702 | }else{ |
699 | /* Add contact to list */ | 703 | /* Add contact to list */ |
700 | addContact_p (contact); | 704 | addContact_p (contact); |
701 | } | 705 | } |
702 | 706 | ||
703 | /* Move to next element */ | 707 | /* Move to next element */ |
704 | element = element->nextChild(); | 708 | element = element->nextChild(); |
705 | } | 709 | } |
706 | }else { | 710 | }else { |
707 | qWarning("ODefBack::could not load"); | 711 | owarn << "ODefBack::could not load" << oendl; |
708 | } | 712 | } |
709 | delete root; | 713 | delete root; |
710 | qWarning("returning from loading" ); | 714 | owarn << "returning from loading" << oendl; |
711 | return true; | 715 | return true; |
712 | } | 716 | } |
713 | 717 | ||
714 | 718 | ||
715 | void OPimContactAccessBackend_XML::updateJournal( const OPimContact& cnt, | 719 | void OPimContactAccessBackend_XML::updateJournal( const OPimContact& cnt, |
716 | journal_action action ) | 720 | journal_action action ) |
717 | { | 721 | { |
718 | QFile f( m_journalName ); | 722 | QFile f( m_journalName ); |
719 | bool created = !f.exists(); | 723 | bool created = !f.exists(); |
720 | if ( !f.open(IO_WriteOnly|IO_Append) ) | 724 | if ( !f.open(IO_WriteOnly|IO_Append) ) |
721 | return; | 725 | return; |
722 | 726 | ||
723 | QString buf; | 727 | QString buf; |
724 | QCString str; | 728 | QCString str; |
725 | 729 | ||
726 | // if the file was created, we have to set the Tag "<CONTACTS>" to | 730 | // if the file was created, we have to set the Tag "<CONTACTS>" to |
727 | // get a XML-File which is readable by our parser. | 731 | // get a XML-File which is readable by our parser. |
728 | // This is just a cheat, but better than rewrite the parser. | 732 | // This is just a cheat, but better than rewrite the parser. |
729 | if ( created ){ | 733 | if ( created ){ |
730 | buf = "<Contacts>"; | 734 | buf = "<Contacts>"; |
731 | QCString cstr = buf.utf8(); | 735 | QCString cstr = buf.utf8(); |
732 | f.writeBlock( cstr.data(), cstr.length() ); | 736 | f.writeBlock( cstr.data(), cstr.length() ); |
733 | } | 737 | } |
734 | 738 | ||
735 | buf = "<Contact "; | 739 | buf = "<Contact "; |
736 | cnt.save( buf ); | 740 | cnt.save( buf ); |
737 | buf += " action=\"" + QString::number( (int)action ) + "\" "; | 741 | buf += " action=\"" + QString::number( (int)action ) + "\" "; |
738 | buf += "/>\n"; | 742 | buf += "/>\n"; |
739 | QCString cstr = buf.utf8(); | 743 | QCString cstr = buf.utf8(); |
740 | f.writeBlock( cstr.data(), cstr.length() ); | 744 | f.writeBlock( cstr.data(), cstr.length() ); |
741 | } | 745 | } |
742 | 746 | ||
743 | void OPimContactAccessBackend_XML::removeJournal() | 747 | void OPimContactAccessBackend_XML::removeJournal() |
744 | { | 748 | { |
745 | QFile f ( m_journalName ); | 749 | QFile f ( m_journalName ); |
746 | if ( f.exists() ) | 750 | if ( f.exists() ) |
747 | f.remove(); | 751 | f.remove(); |
748 | } | 752 | } |
749 | 753 | ||
750 | } | 754 | } |
diff --git a/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp b/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp index f4f3c94..105c106 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp | |||
@@ -28,427 +28,432 @@ | |||
28 | */ | 28 | */ |
29 | /* | 29 | /* |
30 | * SQL Backend for the OPIE-Calender Database. | 30 | * SQL Backend for the OPIE-Calender Database. |
31 | * | 31 | * |
32 | */ | 32 | */ |
33 | 33 | ||
34 | #include <stdio.h> | 34 | /* OPIE */ |
35 | #include <stdlib.h> | ||
36 | |||
37 | #include <qarray.h> | ||
38 | #include <qstringlist.h> | ||
39 | |||
40 | #include <qpe/global.h> | ||
41 | |||
42 | #include <opie2/osqldriver.h> | 35 | #include <opie2/osqldriver.h> |
43 | #include <opie2/osqlmanager.h> | 36 | #include <opie2/osqlmanager.h> |
44 | #include <opie2/osqlquery.h> | 37 | #include <opie2/osqlquery.h> |
45 | 38 | ||
46 | #include <opie2/opimrecurrence.h> | 39 | #include <opie2/opimrecurrence.h> |
47 | #include <opie2/odatebookaccessbackend_sql.h> | 40 | #include <opie2/odatebookaccessbackend_sql.h> |
41 | #include <opie2/odebug.h> | ||
42 | |||
43 | #include <qpe/global.h> | ||
44 | |||
45 | /* QT */ | ||
46 | #include <qarray.h> | ||
47 | #include <qstringlist.h> | ||
48 | |||
49 | /* STD */ | ||
50 | #include <stdio.h> | ||
51 | #include <stdlib.h> | ||
52 | |||
48 | 53 | ||
49 | using namespace Opie::DB; | 54 | using namespace Opie::DB; |
50 | 55 | ||
51 | namespace { | 56 | namespace { |
52 | /** | 57 | /** |
53 | * a find query for custom elements | 58 | * a find query for custom elements |
54 | */ | 59 | */ |
55 | class FindCustomQuery : public OSQLQuery { | 60 | class FindCustomQuery : public OSQLQuery { |
56 | public: | 61 | public: |
57 | FindCustomQuery(int uid); | 62 | FindCustomQuery(int uid); |
58 | FindCustomQuery(const QArray<int>& ); | 63 | FindCustomQuery(const QArray<int>& ); |
59 | ~FindCustomQuery(); | 64 | ~FindCustomQuery(); |
60 | QString query()const; | 65 | QString query()const; |
61 | private: | 66 | private: |
62 | QString single()const; | 67 | QString single()const; |
63 | QString multi()const; | 68 | QString multi()const; |
64 | QArray<int> m_uids; | 69 | QArray<int> m_uids; |
65 | int m_uid; | 70 | int m_uid; |
66 | }; | 71 | }; |
67 | 72 | ||
68 | FindCustomQuery::FindCustomQuery(int uid) | 73 | FindCustomQuery::FindCustomQuery(int uid) |
69 | : OSQLQuery(), m_uid( uid ) { | 74 | : OSQLQuery(), m_uid( uid ) { |
70 | } | 75 | } |
71 | FindCustomQuery::FindCustomQuery(const QArray<int>& ints) | 76 | FindCustomQuery::FindCustomQuery(const QArray<int>& ints) |
72 | : OSQLQuery(), m_uids( ints ){ | 77 | : OSQLQuery(), m_uids( ints ){ |
73 | } | 78 | } |
74 | FindCustomQuery::~FindCustomQuery() { | 79 | FindCustomQuery::~FindCustomQuery() { |
75 | } | 80 | } |
76 | QString FindCustomQuery::query()const{ | 81 | QString FindCustomQuery::query()const{ |
77 | // if ( m_uids.count() == 0 ) | 82 | // if ( m_uids.count() == 0 ) |
78 | return single(); | 83 | return single(); |
79 | } | 84 | } |
80 | QString FindCustomQuery::single()const{ | 85 | QString FindCustomQuery::single()const{ |
81 | QString qu = "select uid, type, value from custom_data where uid = "; | 86 | QString qu = "select uid, type, value from custom_data where uid = "; |
82 | qu += QString::number(m_uid); | 87 | qu += QString::number(m_uid); |
83 | return qu; | 88 | return qu; |
84 | } | 89 | } |
85 | } | 90 | } |
86 | 91 | ||
87 | 92 | ||
88 | namespace Opie { | 93 | namespace Opie { |
89 | 94 | ||
90 | 95 | ||
91 | ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& , | 96 | ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& , |
92 | const QString& fileName ) | 97 | const QString& fileName ) |
93 | : ODateBookAccessBackend(), m_driver( NULL ) | 98 | : ODateBookAccessBackend(), m_driver( NULL ) |
94 | { | 99 | { |
95 | m_fileName = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.db" ) : fileName; | 100 | m_fileName = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.db" ) : fileName; |
96 | 101 | ||
97 | // Get the standart sql-driver from the OSQLManager.. | 102 | // Get the standart sql-driver from the OSQLManager.. |
98 | OSQLManager man; | 103 | OSQLManager man; |
99 | m_driver = man.standard(); | 104 | m_driver = man.standard(); |
100 | m_driver->setUrl( m_fileName ); | 105 | m_driver->setUrl( m_fileName ); |
101 | 106 | ||
102 | initFields(); | 107 | initFields(); |
103 | 108 | ||
104 | load(); | 109 | load(); |
105 | } | 110 | } |
106 | 111 | ||
107 | ODateBookAccessBackend_SQL::~ODateBookAccessBackend_SQL() { | 112 | ODateBookAccessBackend_SQL::~ODateBookAccessBackend_SQL() { |
108 | if( m_driver ) | 113 | if( m_driver ) |
109 | delete m_driver; | 114 | delete m_driver; |
110 | } | 115 | } |
111 | 116 | ||
112 | void ODateBookAccessBackend_SQL::initFields() | 117 | void ODateBookAccessBackend_SQL::initFields() |
113 | { | 118 | { |
114 | 119 | ||
115 | // This map contains the translation of the fieldtype id's to | 120 | // This map contains the translation of the fieldtype id's to |
116 | // the names of the table columns | 121 | // the names of the table columns |
117 | m_fieldMap.insert( OPimEvent::FUid, "uid" ); | 122 | m_fieldMap.insert( OPimEvent::FUid, "uid" ); |
118 | m_fieldMap.insert( OPimEvent::FCategories, "Categories" ); | 123 | m_fieldMap.insert( OPimEvent::FCategories, "Categories" ); |
119 | m_fieldMap.insert( OPimEvent::FDescription, "Description" ); | 124 | m_fieldMap.insert( OPimEvent::FDescription, "Description" ); |
120 | m_fieldMap.insert( OPimEvent::FLocation, "Location" ); | 125 | m_fieldMap.insert( OPimEvent::FLocation, "Location" ); |
121 | m_fieldMap.insert( OPimEvent::FType, "Type" ); | 126 | m_fieldMap.insert( OPimEvent::FType, "Type" ); |
122 | m_fieldMap.insert( OPimEvent::FAlarm, "Alarm" ); | 127 | m_fieldMap.insert( OPimEvent::FAlarm, "Alarm" ); |
123 | m_fieldMap.insert( OPimEvent::FSound, "Sound" ); | 128 | m_fieldMap.insert( OPimEvent::FSound, "Sound" ); |
124 | m_fieldMap.insert( OPimEvent::FRType, "RType" ); | 129 | m_fieldMap.insert( OPimEvent::FRType, "RType" ); |
125 | m_fieldMap.insert( OPimEvent::FRWeekdays, "RWeekdays" ); | 130 | m_fieldMap.insert( OPimEvent::FRWeekdays, "RWeekdays" ); |
126 | m_fieldMap.insert( OPimEvent::FRPosition, "RPosition" ); | 131 | m_fieldMap.insert( OPimEvent::FRPosition, "RPosition" ); |
127 | m_fieldMap.insert( OPimEvent::FRFreq, "RFreq" ); | 132 | m_fieldMap.insert( OPimEvent::FRFreq, "RFreq" ); |
128 | m_fieldMap.insert( OPimEvent::FRHasEndDate, "RHasEndDate" ); | 133 | m_fieldMap.insert( OPimEvent::FRHasEndDate, "RHasEndDate" ); |
129 | m_fieldMap.insert( OPimEvent::FREndDate, "REndDate" ); | 134 | m_fieldMap.insert( OPimEvent::FREndDate, "REndDate" ); |
130 | m_fieldMap.insert( OPimEvent::FRCreated, "RCreated" ); | 135 | m_fieldMap.insert( OPimEvent::FRCreated, "RCreated" ); |
131 | m_fieldMap.insert( OPimEvent::FRExceptions, "RExceptions" ); | 136 | m_fieldMap.insert( OPimEvent::FRExceptions, "RExceptions" ); |
132 | m_fieldMap.insert( OPimEvent::FStart, "Start" ); | 137 | m_fieldMap.insert( OPimEvent::FStart, "Start" ); |
133 | m_fieldMap.insert( OPimEvent::FEnd, "End" ); | 138 | m_fieldMap.insert( OPimEvent::FEnd, "End" ); |
134 | m_fieldMap.insert( OPimEvent::FNote, "Note" ); | 139 | m_fieldMap.insert( OPimEvent::FNote, "Note" ); |
135 | m_fieldMap.insert( OPimEvent::FTimeZone, "TimeZone" ); | 140 | m_fieldMap.insert( OPimEvent::FTimeZone, "TimeZone" ); |
136 | m_fieldMap.insert( OPimEvent::FRecParent, "RecParent" ); | 141 | m_fieldMap.insert( OPimEvent::FRecParent, "RecParent" ); |
137 | m_fieldMap.insert( OPimEvent::FRecChildren, "Recchildren" ); | 142 | m_fieldMap.insert( OPimEvent::FRecChildren, "Recchildren" ); |
138 | 143 | ||
139 | // Create a map that maps the column name to the id | 144 | // Create a map that maps the column name to the id |
140 | QMapConstIterator<int, QString> it; | 145 | QMapConstIterator<int, QString> it; |
141 | for ( it = m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ | 146 | for ( it = m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ |
142 | m_reverseFieldMap.insert( it.data(), it.key() ); | 147 | m_reverseFieldMap.insert( it.data(), it.key() ); |
143 | } | 148 | } |
144 | 149 | ||
145 | } | 150 | } |
146 | 151 | ||
147 | bool ODateBookAccessBackend_SQL::load() | 152 | bool ODateBookAccessBackend_SQL::load() |
148 | { | 153 | { |
149 | if (!m_driver->open() ) | 154 | if (!m_driver->open() ) |
150 | return false; | 155 | return false; |
151 | 156 | ||
152 | // Don't expect that the database exists. | 157 | // Don't expect that the database exists. |
153 | // It is save here to create the table, even if it | 158 | // It is save here to create the table, even if it |
154 | // do exist. ( Is that correct for all databases ?? ) | 159 | // do exist. ( Is that correct for all databases ?? ) |
155 | QStringqu = "create table datebook( uid INTEGER PRIMARY KEY "; | 160 | QString qu = "create table datebook( uid INTEGER PRIMARY KEY "; |
156 | 161 | ||
157 | QMap<int, QString>::Iterator it; | 162 | QMap<int, QString>::Iterator it; |
158 | for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ | 163 | for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ |
159 | qu += QString( ",%1 VARCHAR(10)" ).arg( it.data() ); | 164 | qu += QString( ",%1 VARCHAR(10)" ).arg( it.data() ); |
160 | } | 165 | } |
161 | qu += " );"; | 166 | qu += " );"; |
162 | 167 | ||
163 | qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; | 168 | qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; |
164 | 169 | ||
165 | qWarning( "command: %s", qu.latin1() ); | 170 | owarn << "command: " << qu << "" << oendl; |
166 | 171 | ||
167 | OSQLRawQuery raw( qu ); | 172 | OSQLRawQuery raw( qu ); |
168 | OSQLResult res = m_driver->query( &raw ); | 173 | OSQLResult res = m_driver->query( &raw ); |
169 | if ( res.state() != OSQLResult::Success ) | 174 | if ( res.state() != OSQLResult::Success ) |
170 | return false; | 175 | return false; |
171 | 176 | ||
172 | update(); | 177 | update(); |
173 | 178 | ||
174 | return true; | 179 | return true; |
175 | } | 180 | } |
176 | 181 | ||
177 | void ODateBookAccessBackend_SQL::update() | 182 | void ODateBookAccessBackend_SQL::update() |
178 | { | 183 | { |
179 | 184 | ||
180 | QString qu = "select uid from datebook"; | 185 | QString qu = "select uid from datebook"; |
181 | OSQLRawQuery raw( qu ); | 186 | OSQLRawQuery raw( qu ); |
182 | OSQLResult res = m_driver->query( &raw ); | 187 | OSQLResult res = m_driver->query( &raw ); |
183 | if ( res.state() != OSQLResult::Success ){ | 188 | if ( res.state() != OSQLResult::Success ){ |
184 | // m_uids.clear(); | 189 | // m_uids.clear(); |
185 | return; | 190 | return; |
186 | } | 191 | } |
187 | 192 | ||
188 | m_uids = extractUids( res ); | 193 | m_uids = extractUids( res ); |
189 | 194 | ||
190 | } | 195 | } |
191 | 196 | ||
192 | bool ODateBookAccessBackend_SQL::reload() | 197 | bool ODateBookAccessBackend_SQL::reload() |
193 | { | 198 | { |
194 | return load(); | 199 | return load(); |
195 | } | 200 | } |
196 | 201 | ||
197 | bool ODateBookAccessBackend_SQL::save() | 202 | bool ODateBookAccessBackend_SQL::save() |
198 | { | 203 | { |
199 | return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) | 204 | return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) |
200 | } | 205 | } |
201 | 206 | ||
202 | QArray<int> ODateBookAccessBackend_SQL::allRecords()const | 207 | QArray<int> ODateBookAccessBackend_SQL::allRecords()const |
203 | { | 208 | { |
204 | return m_uids; | 209 | return m_uids; |
205 | } | 210 | } |
206 | 211 | ||
207 | QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OPimEvent&, int, const QDateTime& ) { | 212 | QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OPimEvent&, int, const QDateTime& ) { |
208 | return QArray<int>(); | 213 | return QArray<int>(); |
209 | } | 214 | } |
210 | 215 | ||
211 | void ODateBookAccessBackend_SQL::clear() | 216 | void ODateBookAccessBackend_SQL::clear() |
212 | { | 217 | { |
213 | QString qu = "drop table datebook;"; | 218 | QString qu = "drop table datebook;"; |
214 | qu += "drop table custom_data;"; | 219 | qu += "drop table custom_data;"; |
215 | 220 | ||
216 | OSQLRawQuery raw( qu ); | 221 | OSQLRawQuery raw( qu ); |
217 | OSQLResult res = m_driver->query( &raw ); | 222 | OSQLResult res = m_driver->query( &raw ); |
218 | 223 | ||
219 | reload(); | 224 | reload(); |
220 | } | 225 | } |
221 | 226 | ||
222 | 227 | ||
223 | OPimEvent ODateBookAccessBackend_SQL::find( int uid ) const{ | 228 | OPimEvent ODateBookAccessBackend_SQL::find( int uid ) const{ |
224 | qDebug( "ODateBookAccessBackend_SQL::find( %d )", uid ); | 229 | odebug << "ODateBookAccessBackend_SQL::find( " << uid << " )" << oendl; |
225 | 230 | ||
226 | QString qu = "select *"; | 231 | QString qu = "select *"; |
227 | qu += "from datebook where uid = " + QString::number(uid); | 232 | qu += "from datebook where uid = " + QString::number(uid); |
228 | 233 | ||
229 | qDebug( "Query: %s", qu.latin1() ); | 234 | odebug << "Query: " << qu << "" << oendl; |
230 | 235 | ||
231 | OSQLRawQuery raw( qu ); | 236 | OSQLRawQuery raw( qu ); |
232 | OSQLResult res = m_driver->query( &raw ); | 237 | OSQLResult res = m_driver->query( &raw ); |
233 | 238 | ||
234 | OSQLResultItem resItem = res.first(); | 239 | OSQLResultItem resItem = res.first(); |
235 | 240 | ||
236 | // Create Map for date event and insert UID | 241 | // Create Map for date event and insert UID |
237 | QMap<int,QString> dateEventMap; | 242 | QMap<int,QString> dateEventMap; |
238 | dateEventMap.insert( OPimEvent::FUid, QString::number( uid ) ); | 243 | dateEventMap.insert( OPimEvent::FUid, QString::number( uid ) ); |
239 | 244 | ||
240 | // Now insert the data out of the columns into the map. | 245 | // Now insert the data out of the columns into the map. |
241 | QMapConstIterator<int, QString> it; | 246 | QMapConstIterator<int, QString> it; |
242 | for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ | 247 | for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ |
243 | dateEventMap.insert( m_reverseFieldMap[*it], resItem.data( *it ) ); | 248 | dateEventMap.insert( m_reverseFieldMap[*it], resItem.data( *it ) ); |
244 | } | 249 | } |
245 | 250 | ||
246 | // Last step: Put map into date event, add custom map and return it | 251 | // Last step: Put map into date event, add custom map and return it |
247 | OPimEvent retDate( dateEventMap ); | 252 | OPimEvent retDate( dateEventMap ); |
248 | retDate.setExtraMap( requestCustom( uid ) ); | 253 | retDate.setExtraMap( requestCustom( uid ) ); |
249 | 254 | ||
250 | qDebug( "ODateBookAccessBackend_SQL::find( %d ) end", uid ); | 255 | odebug << "ODateBookAccessBackend_SQL::find( " << uid << " ) end" << oendl; |
251 | return retDate; | 256 | return retDate; |
252 | } | 257 | } |
253 | 258 | ||
254 | // FIXME: Speed up update of uid's.. | 259 | // FIXME: Speed up update of uid's.. |
255 | bool ODateBookAccessBackend_SQL::add( const OPimEvent& ev ) | 260 | bool ODateBookAccessBackend_SQL::add( const OPimEvent& ev ) |
256 | { | 261 | { |
257 | QMap<int,QString> eventMap = ev.toMap(); | 262 | QMap<int,QString> eventMap = ev.toMap(); |
258 | 263 | ||
259 | QString qu = "insert into datebook VALUES( " + QString::number( ev.uid() ); | 264 | QString qu = "insert into datebook VALUES( " + QString::number( ev.uid() ); |
260 | QMap<int, QString>::Iterator it; | 265 | QMap<int, QString>::Iterator it; |
261 | for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ | 266 | for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ |
262 | if ( !eventMap[it.key()].isEmpty() ) | 267 | if ( !eventMap[it.key()].isEmpty() ) |
263 | qu += QString( ",\"%1\"" ).arg( eventMap[it.key()] ); | 268 | qu += QString( ",\"%1\"" ).arg( eventMap[it.key()] ); |
264 | else | 269 | else |
265 | qu += QString( ",\"\"" ); | 270 | qu += QString( ",\"\"" ); |
266 | } | 271 | } |
267 | qu += " );"; | 272 | qu += " );"; |
268 | 273 | ||
269 | // Add custom entries | 274 | // Add custom entries |
270 | int id = 0; | 275 | int id = 0; |
271 | QMap<QString, QString> customMap = ev.toExtraMap(); | 276 | QMap<QString, QString> customMap = ev.toExtraMap(); |
272 | for( QMap<QString, QString>::Iterator it = customMap.begin(); | 277 | for( QMap<QString, QString>::Iterator it = customMap.begin(); |
273 | it != customMap.end(); ++it ){ | 278 | it != customMap.end(); ++it ){ |
274 | qu += "insert into custom_data VALUES(" | 279 | qu += "insert into custom_data VALUES(" |
275 | + QString::number( ev.uid() ) | 280 | + QString::number( ev.uid() ) |
276 | + "," | 281 | + "," |
277 | + QString::number( id++ ) | 282 | + QString::number( id++ ) |
278 | + ",'" | 283 | + ",'" |
279 | + it.key() //.latin1() | 284 | + it.key() //.latin1() |
280 | + "'," | 285 | + "'," |
281 | + "0" // Priority for future enhancements | 286 | + "0" // Priority for future enhancements |
282 | + ",'" | 287 | + ",'" |
283 | + it.data() //.latin1() | 288 | + it.data() //.latin1() |
284 | + "');"; | 289 | + "');"; |
285 | } | 290 | } |
286 | qWarning("add %s", qu.latin1() ); | 291 | owarn << "add " << qu << "" << oendl; |
287 | 292 | ||
288 | OSQLRawQuery raw( qu ); | 293 | OSQLRawQuery raw( qu ); |
289 | OSQLResult res = m_driver->query( &raw ); | 294 | OSQLResult res = m_driver->query( &raw ); |
290 | if ( res.state() != OSQLResult::Success ){ | 295 | if ( res.state() != OSQLResult::Success ){ |
291 | return false; | 296 | return false; |
292 | } | 297 | } |
293 | 298 | ||
294 | // Update list of uid's | 299 | // Update list of uid's |
295 | update(); | 300 | update(); |
296 | 301 | ||
297 | return true; | 302 | return true; |
298 | } | 303 | } |
299 | 304 | ||
300 | // FIXME: Speed up update of uid's.. | 305 | // FIXME: Speed up update of uid's.. |
301 | bool ODateBookAccessBackend_SQL::remove( int uid ) | 306 | bool ODateBookAccessBackend_SQL::remove( int uid ) |
302 | { | 307 | { |
303 | QString qu = "DELETE from datebook where uid = " | 308 | QString qu = "DELETE from datebook where uid = " |
304 | + QString::number( uid ) + ";"; | 309 | + QString::number( uid ) + ";"; |
305 | qu += "DELETE from custom_data where uid = " | 310 | qu += "DELETE from custom_data where uid = " |
306 | + QString::number( uid ) + ";"; | 311 | + QString::number( uid ) + ";"; |
307 | 312 | ||
308 | OSQLRawQuery raw( qu ); | 313 | OSQLRawQuery raw( qu ); |
309 | OSQLResult res = m_driver->query( &raw ); | 314 | OSQLResult res = m_driver->query( &raw ); |
310 | if ( res.state() != OSQLResult::Success ){ | 315 | if ( res.state() != OSQLResult::Success ){ |
311 | return false; | 316 | return false; |
312 | } | 317 | } |
313 | 318 | ||
314 | // Update list of uid's | 319 | // Update list of uid's |
315 | update(); | 320 | update(); |
316 | 321 | ||
317 | return true; | 322 | return true; |
318 | } | 323 | } |
319 | 324 | ||
320 | bool ODateBookAccessBackend_SQL::replace( const OPimEvent& ev ) | 325 | bool ODateBookAccessBackend_SQL::replace( const OPimEvent& ev ) |
321 | { | 326 | { |
322 | remove( ev.uid() ); | 327 | remove( ev.uid() ); |
323 | return add( ev ); | 328 | return add( ev ); |
324 | } | 329 | } |
325 | 330 | ||
326 | QArray<int> ODateBookAccessBackend_SQL::rawEvents()const | 331 | QArray<int> ODateBookAccessBackend_SQL::rawEvents()const |
327 | { | 332 | { |
328 | return allRecords(); | 333 | return allRecords(); |
329 | } | 334 | } |
330 | 335 | ||
331 | QArray<int> ODateBookAccessBackend_SQL::rawRepeats()const | 336 | QArray<int> ODateBookAccessBackend_SQL::rawRepeats()const |
332 | { | 337 | { |
333 | QString qu = "select uid from datebook where RType!=\"\" AND RType!=\"NoRepeat\""; | 338 | QString qu = "select uid from datebook where RType!=\"\" AND RType!=\"NoRepeat\""; |
334 | OSQLRawQuery raw( qu ); | 339 | OSQLRawQuery raw( qu ); |
335 | OSQLResult res = m_driver->query( &raw ); | 340 | OSQLResult res = m_driver->query( &raw ); |
336 | if ( res.state() != OSQLResult::Success ){ | 341 | if ( res.state() != OSQLResult::Success ){ |
337 | QArray<int> nix; | 342 | QArray<int> nix; |
338 | return nix; | 343 | return nix; |
339 | } | 344 | } |
340 | 345 | ||
341 | return extractUids( res ); | 346 | return extractUids( res ); |
342 | } | 347 | } |
343 | 348 | ||
344 | QArray<int> ODateBookAccessBackend_SQL::nonRepeats()const | 349 | QArray<int> ODateBookAccessBackend_SQL::nonRepeats()const |
345 | { | 350 | { |
346 | QString qu = "select uid from datebook where RType=\"\" or RType=\"NoRepeat\""; | 351 | QString qu = "select uid from datebook where RType=\"\" or RType=\"NoRepeat\""; |
347 | OSQLRawQuery raw( qu ); | 352 | OSQLRawQuery raw( qu ); |
348 | OSQLResult res = m_driver->query( &raw ); | 353 | OSQLResult res = m_driver->query( &raw ); |
349 | if ( res.state() != OSQLResult::Success ){ | 354 | if ( res.state() != OSQLResult::Success ){ |
350 | QArray<int> nix; | 355 | QArray<int> nix; |
351 | return nix; | 356 | return nix; |
352 | } | 357 | } |
353 | 358 | ||
354 | return extractUids( res ); | 359 | return extractUids( res ); |
355 | } | 360 | } |
356 | 361 | ||
357 | OPimEvent::ValueList ODateBookAccessBackend_SQL::directNonRepeats() | 362 | OPimEvent::ValueList ODateBookAccessBackend_SQL::directNonRepeats() |
358 | { | 363 | { |
359 | QArray<int> nonRepUids = nonRepeats(); | 364 | QArray<int> nonRepUids = nonRepeats(); |
360 | OPimEvent::ValueList list; | 365 | OPimEvent::ValueList list; |
361 | 366 | ||
362 | for (uint i = 0; i < nonRepUids.count(); ++i ){ | 367 | for (uint i = 0; i < nonRepUids.count(); ++i ){ |
363 | list.append( find( nonRepUids[i] ) ); | 368 | list.append( find( nonRepUids[i] ) ); |
364 | } | 369 | } |
365 | 370 | ||
366 | return list; | 371 | return list; |
367 | 372 | ||
368 | } | 373 | } |
369 | OPimEvent::ValueList ODateBookAccessBackend_SQL::directRawRepeats() | 374 | OPimEvent::ValueList ODateBookAccessBackend_SQL::directRawRepeats() |
370 | { | 375 | { |
371 | QArray<int> rawRepUids = rawRepeats(); | 376 | QArray<int> rawRepUids = rawRepeats(); |
372 | OPimEvent::ValueList list; | 377 | OPimEvent::ValueList list; |
373 | 378 | ||
374 | for (uint i = 0; i < rawRepUids.count(); ++i ){ | 379 | for (uint i = 0; i < rawRepUids.count(); ++i ){ |
375 | list.append( find( rawRepUids[i] ) ); | 380 | list.append( find( rawRepUids[i] ) ); |
376 | } | 381 | } |
377 | 382 | ||
378 | return list; | 383 | return list; |
379 | } | 384 | } |
380 | 385 | ||
381 | 386 | ||
382 | QArray<int> ODateBookAccessBackend_SQL::matchRegexp( const QRegExp &r ) const | 387 | QArray<int> ODateBookAccessBackend_SQL::matchRegexp( const QRegExp &r ) const |
383 | { | 388 | { |
384 | 389 | ||
385 | QString qu = "SELECT uid FROM datebook WHERE ("; | 390 | QString qu = "SELECT uid FROM datebook WHERE ("; |
386 | 391 | ||
387 | // Do it make sense to search other fields, too ? | 392 | // Do it make sense to search other fields, too ? |
388 | qu += " rlike(\""+ r.pattern() + "\", Location ) OR"; | 393 | qu += " rlike(\""+ r.pattern() + "\", Location ) OR"; |
389 | qu += " rlike(\""+ r.pattern() + "\", Note )"; | 394 | qu += " rlike(\""+ r.pattern() + "\", Note )"; |
390 | |||
391 | qu += " )"; | ||
392 | 395 | ||
393 | qDebug( "query: %s", qu.latin1() ); | 396 | qu += " )"; |
394 | 397 | ||
395 | OSQLRawQuery raw( qu ); | 398 | odebug << "query: " << qu << "" << oendl; |
396 | OSQLResult res = m_driver->query( &raw ); | ||
397 | 399 | ||
398 | return extractUids( res ); | 400 | OSQLRawQuery raw( qu ); |
401 | OSQLResult res = m_driver->query( &raw ); | ||
402 | |||
403 | return extractUids( res ); | ||
399 | 404 | ||
400 | 405 | ||
401 | 406 | ||
402 | } | 407 | } |
403 | 408 | ||
404 | /* ===== Private Functions ========================================== */ | 409 | /* ===== Private Functions ========================================== */ |
405 | 410 | ||
406 | QArray<int> ODateBookAccessBackend_SQL::extractUids( OSQLResult& res ) const | 411 | QArray<int> ODateBookAccessBackend_SQL::extractUids( OSQLResult& res ) const |
407 | { | 412 | { |
408 | qWarning("extractUids"); | 413 | owarn << "extractUids" << oendl; |
409 | QTime t; | 414 | QTime t; |
410 | t.start(); | 415 | t.start(); |
411 | OSQLResultItem::ValueList list = res.results(); | 416 | OSQLResultItem::ValueList list = res.results(); |
412 | OSQLResultItem::ValueList::Iterator it; | 417 | OSQLResultItem::ValueList::Iterator it; |
413 | QArray<int> ints(list.count() ); | 418 | QArray<int> ints(list.count() ); |
414 | qWarning(" count = %d", list.count() ); | 419 | owarn << " count = " << list.count() << "" << oendl; |
415 | 420 | ||
416 | int i = 0; | 421 | int i = 0; |
417 | for (it = list.begin(); it != list.end(); ++it ) { | 422 | for (it = list.begin(); it != list.end(); ++it ) { |
418 | ints[i] = (*it).data("uid").toInt(); | 423 | ints[i] = (*it).data("uid").toInt(); |
419 | i++; | 424 | i++; |
420 | } | 425 | } |
421 | qWarning("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() ); | 426 | owarn << "extractUids ready: count2 = " << i << " needs " << t.elapsed() << " ms" << oendl; |
422 | 427 | ||
423 | return ints; | 428 | return ints; |
424 | 429 | ||
425 | } | 430 | } |
426 | 431 | ||
427 | QMap<QString, QString> ODateBookAccessBackend_SQL::requestCustom( int uid ) const | 432 | QMap<QString, QString> ODateBookAccessBackend_SQL::requestCustom( int uid ) const |
428 | { | 433 | { |
429 | QTime t; | 434 | QTime t; |
430 | t.start(); | 435 | t.start(); |
431 | 436 | ||
432 | QMap<QString, QString> customMap; | 437 | QMap<QString, QString> customMap; |
433 | 438 | ||
434 | FindCustomQuery query( uid ); | 439 | FindCustomQuery query( uid ); |
435 | OSQLResult res_custom = m_driver->query( &query ); | 440 | OSQLResult res_custom = m_driver->query( &query ); |
436 | 441 | ||
437 | if ( res_custom.state() == OSQLResult::Failure ) { | 442 | if ( res_custom.state() == OSQLResult::Failure ) { |
438 | qWarning("OSQLResult::Failure in find query !!"); | 443 | owarn << "OSQLResult::Failure in find query !!" << oendl; |
439 | QMap<QString, QString> empty; | 444 | QMap<QString, QString> empty; |
440 | return empty; | 445 | return empty; |
441 | } | 446 | } |
442 | 447 | ||
443 | OSQLResultItem::ValueList list = res_custom.results(); | 448 | OSQLResultItem::ValueList list = res_custom.results(); |
444 | OSQLResultItem::ValueList::Iterator it = list.begin(); | 449 | OSQLResultItem::ValueList::Iterator it = list.begin(); |
445 | for ( ; it != list.end(); ++it ) { | 450 | for ( ; it != list.end(); ++it ) { |
446 | customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); | 451 | customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); |
447 | } | 452 | } |
448 | 453 | ||
449 | qDebug("RequestCustom needed: %d ms", t.elapsed() ); | 454 | odebug << "RequestCustom needed: " << t.elapsed() << " ms" << oendl; |
450 | return customMap; | 455 | return customMap; |
451 | } | 456 | } |
452 | 457 | ||
453 | 458 | ||
454 | } | 459 | } |
diff --git a/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp b/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp index 77c0253..2ff36e3 100644 --- a/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp +++ b/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp | |||
@@ -23,60 +23,66 @@ | |||
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | |||
30 | /* OPIE */ | ||
31 | #include <opie2/opimnotifymanager.h> | ||
32 | #include <opie2/opimrecurrence.h> | ||
33 | #include <opie2/opimtimezone.h> | ||
34 | #include <opie2/odatebookaccessbackend_xml.h> | ||
35 | #include <opie2/odebug.h> | ||
36 | |||
37 | #include <qtopia/global.h> | ||
38 | #include <qtopia/stringutil.h> | ||
39 | #include <qtopia/timeconversion.h> | ||
40 | |||
41 | /* QT */ | ||
42 | #include <qasciidict.h> | ||
43 | #include <qfile.h> | ||
44 | |||
45 | /* STD */ | ||
29 | #include <errno.h> | 46 | #include <errno.h> |
30 | #include <fcntl.h> | 47 | #include <fcntl.h> |
31 | 48 | ||
32 | #include <stdio.h> | 49 | #include <stdio.h> |
33 | #include <stdlib.h> | 50 | #include <stdlib.h> |
34 | 51 | ||
35 | #include <sys/types.h> | 52 | #include <sys/types.h> |
36 | #include <sys/mman.h> | 53 | #include <sys/mman.h> |
37 | #include <sys/stat.h> | 54 | #include <sys/stat.h> |
38 | 55 | ||
39 | #include <unistd.h> | 56 | #include <unistd.h> |
40 | 57 | ||
41 | #include <qasciidict.h> | ||
42 | #include <qfile.h> | ||
43 | |||
44 | #include <qtopia/global.h> | ||
45 | #include <qtopia/stringutil.h> | ||
46 | #include <qtopia/timeconversion.h> | ||
47 | |||
48 | #include <opie2/opimnotifymanager.h> | ||
49 | #include <opie2/opimrecurrence.h> | ||
50 | #include <opie2/opimtimezone.h> | ||
51 | #include <opie2/odatebookaccessbackend_xml.h> | ||
52 | 58 | ||
53 | using namespace Opie; | 59 | using namespace Opie; |
54 | 60 | ||
55 | namespace { | 61 | namespace { |
56 | // FROM TT again | 62 | // FROM TT again |
57 | char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) | 63 | char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) |
58 | { | 64 | { |
59 | char needleChar; | 65 | char needleChar; |
60 | char haystackChar; | 66 | char haystackChar; |
61 | if (!needle || !haystack || !hLen || !nLen) | 67 | if (!needle || !haystack || !hLen || !nLen) |
62 | return 0; | 68 | return 0; |
63 | 69 | ||
64 | const char* hsearch = haystack; | 70 | const char* hsearch = haystack; |
65 | 71 | ||
66 | if ((needleChar = *needle++) != 0) { | 72 | if ((needleChar = *needle++) != 0) { |
67 | nLen--; //(to make up for needle++) | 73 | nLen--; //(to make up for needle++) |
68 | do { | 74 | do { |
69 | do { | 75 | do { |
70 | if ((haystackChar = *hsearch++) == 0) | 76 | if ((haystackChar = *hsearch++) == 0) |
71 | return (0); | 77 | return (0); |
72 | if (hsearch >= haystack + hLen) | 78 | if (hsearch >= haystack + hLen) |
73 | return (0); | 79 | return (0); |
74 | } while (haystackChar != needleChar); | 80 | } while (haystackChar != needleChar); |
75 | } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); | 81 | } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); |
76 | hsearch--; | 82 | hsearch--; |
77 | } | 83 | } |
78 | return ((char *)hsearch); | 84 | return ((char *)hsearch); |
79 | } | 85 | } |
80 | } | 86 | } |
81 | 87 | ||
82 | namespace { | 88 | namespace { |
@@ -93,42 +99,42 @@ namespace { | |||
93 | enum Attribute{ | 99 | enum Attribute{ |
94 | FDescription = 0, | 100 | FDescription = 0, |
95 | FLocation, | 101 | FLocation, |
96 | FCategories, | 102 | FCategories, |
97 | FUid, | 103 | FUid, |
98 | FType, | 104 | FType, |
99 | FAlarm, | 105 | FAlarm, |
100 | FSound, | 106 | FSound, |
101 | FRType, | 107 | FRType, |
102 | FRWeekdays, | 108 | FRWeekdays, |
103 | FRPosition, | 109 | FRPosition, |
104 | FRFreq, | 110 | FRFreq, |
105 | FRHasEndDate, | 111 | FRHasEndDate, |
106 | FREndDate, | 112 | FREndDate, |
107 | FRStart, | 113 | FRStart, |
108 | FREnd, | 114 | FREnd, |
109 | FNote, | 115 | FNote, |
110 | FCreated, // Should't this be called FRCreated ? | 116 | FCreated, // Should't this be called FRCreated ? |
111 | FTimeZone, | 117 | FTimeZone, |
112 | FRecParent, | 118 | FRecParent, |
113 | FRecChildren, | 119 | FRecChildren, |
114 | FExceptions | 120 | FExceptions |
115 | }; | 121 | }; |
116 | 122 | ||
117 | // FIXME: Use OPimEvent::toMap() here !! (eilers) | 123 | // FIXME: Use OPimEvent::toMap() here !! (eilers) |
118 | inline void save( const OPimEvent& ev, QString& buf ) { | 124 | inline void save( const OPimEvent& ev, QString& buf ) { |
119 | qWarning("Saving %d %s", ev.uid(), ev.description().latin1() ); | 125 | owarn << "Saving " << ev.uid() << " " << ev.description() << "" << oendl; |
120 | buf += " description=\"" + Qtopia::escapeString(ev.description() ) + "\""; | 126 | buf += " description=\"" + Qtopia::escapeString(ev.description() ) + "\""; |
121 | if (!ev.location().isEmpty() ) | 127 | if (!ev.location().isEmpty() ) |
122 | buf += " location=\"" + Qtopia::escapeString(ev.location() ) + "\""; | 128 | buf += " location=\"" + Qtopia::escapeString(ev.location() ) + "\""; |
123 | 129 | ||
124 | buf += " categories=\""+ Qtopia::escapeString( Qtopia::Record::idsToString( ev.categories() ) ) + "\""; | 130 | buf += " categories=\""+ Qtopia::escapeString( Qtopia::Record::idsToString( ev.categories() ) ) + "\""; |
125 | buf += " uid=\"" + QString::number( ev.uid() ) + "\""; | 131 | buf += " uid=\"" + QString::number( ev.uid() ) + "\""; |
126 | 132 | ||
127 | if (ev.isAllDay() ) | 133 | if (ev.isAllDay() ) |
128 | buf += " type=\"AllDay\""; // is that all ?? (eilers) | 134 | buf += " type=\"AllDay\""; // is that all ?? (eilers) |
129 | 135 | ||
130 | if (ev.hasNotifiers() ) { | 136 | if (ev.hasNotifiers() ) { |
131 | OPimAlarm alarm = ev.notifiers().alarms()[0]; // take only the first | 137 | OPimAlarm alarm = ev.notifiers().alarms()[0]; // take only the first |
132 | int minutes = alarm.dateTime().secsTo( ev.startDateTime() ) / 60; | 138 | int minutes = alarm.dateTime().secsTo( ev.startDateTime() ) / 60; |
133 | buf += " alarm=\"" + QString::number(minutes) + "\" sound=\""; | 139 | buf += " alarm=\"" + QString::number(minutes) + "\" sound=\""; |
134 | if ( alarm.sound() == OPimAlarm::Loud ) | 140 | if ( alarm.sound() == OPimAlarm::Loud ) |
@@ -416,52 +422,52 @@ bool ODateBookAccessBackend_XML::loadFile() { | |||
416 | 422 | ||
417 | OPimEvent ev; | 423 | OPimEvent ev; |
418 | rec = 0; | 424 | rec = 0; |
419 | 425 | ||
420 | while ( TRUE ) { | 426 | while ( TRUE ) { |
421 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) | 427 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) |
422 | ++i; | 428 | ++i; |
423 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) | 429 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) |
424 | break; | 430 | break; |
425 | 431 | ||
426 | 432 | ||
427 | // we have another attribute, read it. | 433 | // we have another attribute, read it. |
428 | int j = i; | 434 | int j = i; |
429 | while ( j < len && dt[j] != '=' ) | 435 | while ( j < len && dt[j] != '=' ) |
430 | ++j; | 436 | ++j; |
431 | QCString attr( dt+i, j-i+1); | 437 | QCString attr( dt+i, j-i+1); |
432 | 438 | ||
433 | i = ++j; // skip = | 439 | i = ++j; // skip = |
434 | 440 | ||
435 | // find the start of quotes | 441 | // find the start of quotes |
436 | while ( i < len && dt[i] != '"' ) | 442 | while ( i < len && dt[i] != '"' ) |
437 | ++i; | 443 | ++i; |
438 | j = ++i; | 444 | j = ++i; |
439 | 445 | ||
440 | bool haveUtf = FALSE; | 446 | bool haveUtf = FALSE; |
441 | bool haveEnt = FALSE; | 447 | bool haveEnt = FALSE; |
442 | while ( j < len && dt[j] != '"' ) { | 448 | while ( j < len && dt[j] != '"' ) { |
443 | if ( ((unsigned char)dt[j]) > 0x7f ) | 449 | if ( ((unsigned char)dt[j]) > 0x7f ) |
444 | haveUtf = TRUE; | 450 | haveUtf = TRUE; |
445 | if ( dt[j] == '&' ) | 451 | if ( dt[j] == '&' ) |
446 | haveEnt = TRUE; | 452 | haveEnt = TRUE; |
447 | ++j; | 453 | ++j; |
448 | } | 454 | } |
449 | if ( i == j ) { | 455 | if ( i == j ) { |
450 | // empty value | 456 | // empty value |
451 | i = j + 1; | 457 | i = j + 1; |
452 | continue; | 458 | continue; |
453 | } | 459 | } |
454 | 460 | ||
455 | QCString value( dt+i, j-i+1 ); | 461 | QCString value( dt+i, j-i+1 ); |
456 | i = j + 1; | 462 | i = j + 1; |
457 | 463 | ||
458 | QString str = (haveUtf ? QString::fromUtf8( value ) | 464 | QString str = (haveUtf ? QString::fromUtf8( value ) |
459 | : QString::fromLatin1( value ) ); | 465 | : QString::fromLatin1( value ) ); |
460 | if ( haveEnt ) | 466 | if ( haveEnt ) |
461 | str = Qtopia::plainString( str ); | 467 | str = Qtopia::plainString( str ); |
462 | 468 | ||
463 | /* | 469 | /* |
464 | * add key + value | 470 | * add key + value |
465 | */ | 471 | */ |
466 | find = dict[attr.data()]; | 472 | find = dict[attr.data()]; |
467 | if (!find) | 473 | if (!find) |
@@ -487,16 +493,16 @@ void ODateBookAccessBackend_XML::finalizeRecord( OPimEvent& ev ) { | |||
487 | OPimTimeZone utc = OPimTimeZone::utc(); | 493 | OPimTimeZone utc = OPimTimeZone::utc(); |
488 | ev.setStartDateTime( utc.fromUTCDateTime( start ) ); | 494 | ev.setStartDateTime( utc.fromUTCDateTime( start ) ); |
489 | ev.setEndDateTime ( utc.fromUTCDateTime( end ) ); | 495 | ev.setEndDateTime ( utc.fromUTCDateTime( end ) ); |
490 | ev.setTimeZone( "UTC"); // make sure it is really utc | 496 | ev.setTimeZone( "UTC"); // make sure it is really utc |
491 | }else { | 497 | }else { |
492 | /* to current date time */ | 498 | /* to current date time */ |
493 | // qWarning(" Start is %d", start ); | 499 | // owarn << " Start is " << start << "" << oendl; |
494 | OPimTimeZone zone( ev.timeZone().isEmpty() ? OPimTimeZone::current() : ev.timeZone() ); | 500 | OPimTimeZone zone( ev.timeZone().isEmpty() ? OPimTimeZone::current() : ev.timeZone() ); |
495 | QDateTime date = zone.toDateTime( start ); | 501 | QDateTime date = zone.toDateTime( start ); |
496 | qWarning(" Start is %s", date.toString().latin1() ); | 502 | owarn << " Start is " << date.toString() << "" << oendl; |
497 | ev.setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) ); | 503 | ev.setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) ); |
498 | 504 | ||
499 | date = zone.toDateTime( end ); | 505 | date = zone.toDateTime( end ); |
500 | ev.setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) ); | 506 | ev.setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) ); |
501 | } | 507 | } |
502 | if ( rec && rec->doesRecur() ) { | 508 | if ( rec && rec->doesRecur() ) { |
@@ -511,24 +517,24 @@ void ODateBookAccessBackend_XML::finalizeRecord( OPimEvent& ev ) { | |||
511 | if (alarmTime != -1 ) { | 517 | if (alarmTime != -1 ) { |
512 | QDateTime dt = ev.startDateTime().addSecs( -1*alarmTime*60 ); | 518 | QDateTime dt = ev.startDateTime().addSecs( -1*alarmTime*60 ); |
513 | OPimAlarm al( snd , dt ); | 519 | OPimAlarm al( snd , dt ); |
514 | ev.notifiers().add( al ); | 520 | ev.notifiers().add( al ); |
515 | } | 521 | } |
516 | if ( m_raw.contains( ev.uid() ) || m_rep.contains( ev.uid() ) ) { | 522 | if ( m_raw.contains( ev.uid() ) || m_rep.contains( ev.uid() ) ) { |
517 | qWarning("already contains assign uid"); | 523 | owarn << "already contains assign uid" << oendl; |
518 | ev.setUid( 1 ); | 524 | ev.setUid( 1 ); |
519 | } | 525 | } |
520 | qWarning("addind %d %s", ev.uid(), ev.description().latin1() ); | 526 | owarn << "addind " << ev.uid() << " " << ev.description() << "" << oendl; |
521 | if ( ev.hasRecurrence() ) | 527 | if ( ev.hasRecurrence() ) |
522 | m_rep.insert( ev.uid(), ev ); | 528 | m_rep.insert( ev.uid(), ev ); |
523 | else | 529 | else |
524 | m_raw.insert( ev.uid(), ev ); | 530 | m_raw.insert( ev.uid(), ev ); |
525 | 531 | ||
526 | } | 532 | } |
527 | void ODateBookAccessBackend_XML::setField( OPimEvent& e, int id, const QString& value) { | 533 | void ODateBookAccessBackend_XML::setField( OPimEvent& e, int id, const QString& value) { |
528 | // qWarning(" setting %s", value.latin1() ); | 534 | // owarn << " setting " << value << "" << oendl; |
529 | switch( id ) { | 535 | switch( id ) { |
530 | case FDescription: | 536 | case FDescription: |
531 | e.setDescription( value ); | 537 | e.setDescription( value ); |
532 | break; | 538 | break; |
533 | case FLocation: | 539 | case FLocation: |
534 | e.setLocation( value ); | 540 | e.setLocation( value ); |
@@ -607,13 +613,13 @@ void ODateBookAccessBackend_XML::setField( OPimEvent& e, int id, const QString& | |||
607 | } | 613 | } |
608 | break; | 614 | break; |
609 | case FExceptions:{ | 615 | case FExceptions:{ |
610 | QStringList list = QStringList::split(' ', value ); | 616 | QStringList list = QStringList::split(' ', value ); |
611 | for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { | 617 | for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { |
612 | QDate date( (*it).left(4).toInt(), (*it).mid(4, 2).toInt(), (*it).right(2).toInt() ); | 618 | QDate date( (*it).left(4).toInt(), (*it).mid(4, 2).toInt(), (*it).right(2).toInt() ); |
613 | qWarning("adding exception %s", date.toString().latin1() ); | 619 | owarn << "adding exception " << date.toString() << "" << oendl; |
614 | recur()->exceptions().append( date ); | 620 | recur()->exceptions().append( date ); |
615 | } | 621 | } |
616 | } | 622 | } |
617 | break; | 623 | break; |
618 | case FTimeZone: | 624 | case FTimeZone: |
619 | if ( value != "None" ) | 625 | if ( value != "None" ) |
diff --git a/libopie2/opiepim/backend/otodoaccesssql.cpp b/libopie2/opiepim/backend/otodoaccesssql.cpp index 132b5a6..6f65c48 100644 --- a/libopie2/opiepim/backend/otodoaccesssql.cpp +++ b/libopie2/opiepim/backend/otodoaccesssql.cpp | |||
@@ -25,27 +25,31 @@ | |||
25 | -- :-=` this library; see the file COPYING.LIB. | 25 | -- :-=` this library; see the file COPYING.LIB. |
26 | If not, write to the Free Software Foundation, | 26 | If not, write to the Free Software Foundation, |
27 | Inc., 59 Temple Place - Suite 330, | 27 | Inc., 59 Temple Place - Suite 330, |
28 | Boston, MA 02111-1307, USA. | 28 | Boston, MA 02111-1307, USA. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include <qdatetime.h> | 31 | /* OPIE */ |
32 | #include <qmap.h> | ||
33 | #include <qstring.h> | ||
34 | |||
35 | #include <qpe/global.h> | ||
36 | |||
37 | #include <opie2/osqldriver.h> | 32 | #include <opie2/osqldriver.h> |
38 | #include <opie2/osqlresult.h> | 33 | #include <opie2/osqlresult.h> |
39 | #include <opie2/osqlmanager.h> | 34 | #include <opie2/osqlmanager.h> |
40 | #include <opie2/osqlquery.h> | 35 | #include <opie2/osqlquery.h> |
41 | 36 | ||
42 | #include <opie2/otodoaccesssql.h> | 37 | #include <opie2/otodoaccesssql.h> |
43 | #include <opie2/opimstate.h> | 38 | #include <opie2/opimstate.h> |
44 | #include <opie2/opimnotifymanager.h> | 39 | #include <opie2/opimnotifymanager.h> |
45 | #include <opie2/opimrecurrence.h> | 40 | #include <opie2/opimrecurrence.h> |
41 | #include <opie2/odebug.h> | ||
42 | |||
43 | #include <qpe/global.h> | ||
44 | |||
45 | /* QT */ | ||
46 | #include <qdatetime.h> | ||
47 | #include <qmap.h> | ||
48 | #include <qstring.h> | ||
49 | |||
46 | 50 | ||
47 | using namespace Opie::DB; | 51 | using namespace Opie::DB; |
48 | 52 | ||
49 | using namespace Opie; | 53 | using namespace Opie; |
50 | /* | 54 | /* |
51 | * first some query | 55 | * first some query |
@@ -148,48 +152,48 @@ namespace { | |||
148 | QDate m_start; | 152 | QDate m_start; |
149 | QDate m_end; | 153 | QDate m_end; |
150 | bool m_inc :1; | 154 | bool m_inc :1; |
151 | }; | 155 | }; |
152 | 156 | ||
153 | 157 | ||
154 | /** | 158 | /** |
155 | * a find query for custom elements | 159 | * a find query for custom elements |
156 | */ | 160 | */ |
157 | class FindCustomQuery : public OSQLQuery { | 161 | class FindCustomQuery : public OSQLQuery { |
158 | public: | 162 | public: |
159 | FindCustomQuery(int uid); | 163 | FindCustomQuery(int uid); |
160 | FindCustomQuery(const QArray<int>& ); | 164 | FindCustomQuery(const QArray<int>& ); |
161 | ~FindCustomQuery(); | 165 | ~FindCustomQuery(); |
162 | QString query()const; | 166 | QString query()const; |
163 | private: | 167 | private: |
164 | QString single()const; | 168 | QString single()const; |
165 | QString multi()const; | 169 | QString multi()const; |
166 | QArray<int> m_uids; | 170 | QArray<int> m_uids; |
167 | int m_uid; | 171 | int m_uid; |
168 | }; | 172 | }; |
169 | 173 | ||
170 | 174 | ||
171 | 175 | ||
172 | CreateQuery::CreateQuery() : OSQLQuery() {} | 176 | CreateQuery::CreateQuery() : OSQLQuery() {} |
173 | CreateQuery::~CreateQuery() {} | 177 | CreateQuery::~CreateQuery() {} |
174 | QString CreateQuery::query()const { | 178 | QString CreateQuery::query()const { |
175 | QString qu; | 179 | QString qu; |
176 | qu += "create table todolist( uid PRIMARY KEY, categories, completed, "; | 180 | qu += "create table todolist( uid PRIMARY KEY, categories, completed, "; |
177 | qu += "description, summary, priority, DueDate, progress , state, "; | 181 | qu += "description, summary, priority, DueDate, progress , state, "; |
178 | // This is the recurrance-stuff .. Exceptions are currently not supported (see OPimRecurrence.cpp) ! (eilers) | 182 | // This is the recurrance-stuff .. Exceptions are currently not supported (see OPimRecurrence.cpp) ! (eilers) |
179 | qu += "RType, RWeekdays, RPosition, RFreq, RHasEndDate, EndDate, Created, Exceptions, "; | 183 | qu += "RType, RWeekdays, RPosition, RFreq, RHasEndDate, EndDate, Created, Exceptions, "; |
180 | qu += "reminders, alarms, maintainer, startdate, completeddate);"; | 184 | qu += "reminders, alarms, maintainer, startdate, completeddate);"; |
181 | qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; | 185 | qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; |
182 | return qu; | 186 | return qu; |
183 | } | 187 | } |
184 | 188 | ||
185 | LoadQuery::LoadQuery() : OSQLQuery() {} | 189 | LoadQuery::LoadQuery() : OSQLQuery() {} |
186 | LoadQuery::~LoadQuery() {} | 190 | LoadQuery::~LoadQuery() {} |
187 | QString LoadQuery::query()const { | 191 | QString LoadQuery::query()const { |
188 | QString qu; | 192 | QString qu; |
189 | // We do not need "distinct" here. The primary key is always unique.. | 193 | // We do not need "distinct" here. The primary key is always unique.. |
190 | //qu += "select distinct uid from todolist"; | 194 | //qu += "select distinct uid from todolist"; |
191 | qu += "select uid from todolist"; | 195 | qu += "select uid from todolist"; |
192 | 196 | ||
193 | return qu; | 197 | return qu; |
194 | } | 198 | } |
195 | 199 | ||
@@ -210,100 +214,100 @@ namespace { | |||
210 | year = month = day = 0; | 214 | year = month = day = 0; |
211 | if (m_todo.hasDueDate() ) { | 215 | if (m_todo.hasDueDate() ) { |
212 | QDate date = m_todo.dueDate(); | 216 | QDate date = m_todo.dueDate(); |
213 | year = date.year(); | 217 | year = date.year(); |
214 | month = date.month(); | 218 | month = date.month(); |
215 | day = date.day(); | 219 | day = date.day(); |
216 | } | 220 | } |
217 | int sYear = 0, sMonth = 0, sDay = 0; | 221 | int sYear = 0, sMonth = 0, sDay = 0; |
218 | if( m_todo.hasStartDate() ){ | 222 | if( m_todo.hasStartDate() ){ |
219 | QDate sDate = m_todo.startDate(); | 223 | QDate sDate = m_todo.startDate(); |
220 | sYear = sDate.year(); | 224 | sYear = sDate.year(); |
221 | sMonth= sDate.month(); | 225 | sMonth= sDate.month(); |
222 | sDay = sDate.day(); | 226 | sDay = sDate.day(); |
223 | } | 227 | } |
224 | 228 | ||
225 | int eYear = 0, eMonth = 0, eDay = 0; | 229 | int eYear = 0, eMonth = 0, eDay = 0; |
226 | if( m_todo.hasCompletedDate() ){ | 230 | if( m_todo.hasCompletedDate() ){ |
227 | QDate eDate = m_todo.completedDate(); | 231 | QDate eDate = m_todo.completedDate(); |
228 | eYear = eDate.year(); | 232 | eYear = eDate.year(); |
229 | eMonth= eDate.month(); | 233 | eMonth= eDate.month(); |
230 | eDay = eDate.day(); | 234 | eDay = eDate.day(); |
231 | } | 235 | } |
232 | QString qu; | 236 | QString qu; |
233 | QMap<int, QString> recMap = m_todo.recurrence().toMap(); | 237 | QMap<int, QString> recMap = m_todo.recurrence().toMap(); |
234 | qu = "insert into todolist VALUES(" | 238 | qu = "insert into todolist VALUES(" |
235 | + QString::number( m_todo.uid() ) + "," | 239 | + QString::number( m_todo.uid() ) + "," |
236 | + "'" + m_todo.idsToString( m_todo.categories() ) + "'" + "," | 240 | + "'" + m_todo.idsToString( m_todo.categories() ) + "'" + "," |
237 | + QString::number( m_todo.isCompleted() ) + "," | 241 | + QString::number( m_todo.isCompleted() ) + "," |
238 | + "'" + m_todo.description() + "'" + "," | 242 | + "'" + m_todo.description() + "'" + "," |
239 | + "'" + m_todo.summary() + "'" + "," | 243 | + "'" + m_todo.summary() + "'" + "," |
240 | + QString::number(m_todo.priority() ) + "," | 244 | + QString::number(m_todo.priority() ) + "," |
241 | + "'" + QString::number(year).rightJustify( 4, '0' ) + "-" | 245 | + "'" + QString::number(year).rightJustify( 4, '0' ) + "-" |
242 | + QString::number(month).rightJustify( 2, '0' ) | 246 | + QString::number(month).rightJustify( 2, '0' ) |
243 | + "-" + QString::number( day ).rightJustify( 2, '0' )+ "'" + "," | 247 | + "-" + QString::number( day ).rightJustify( 2, '0' )+ "'" + "," |
244 | + QString::number( m_todo.progress() ) + "," | 248 | + QString::number( m_todo.progress() ) + "," |
245 | + QString::number( m_todo.state().state() ) + "," | 249 | + QString::number( m_todo.state().state() ) + "," |
246 | + "'" + recMap[ OPimRecurrence::RType ] + "'" + "," | 250 | + "'" + recMap[ OPimRecurrence::RType ] + "'" + "," |
247 | + "'" + recMap[ OPimRecurrence::RWeekdays ] + "'" + "," | 251 | + "'" + recMap[ OPimRecurrence::RWeekdays ] + "'" + "," |
248 | + "'" + recMap[ OPimRecurrence::RPosition ] + "'" + "," | 252 | + "'" + recMap[ OPimRecurrence::RPosition ] + "'" + "," |
249 | + "'" + recMap[ OPimRecurrence::RFreq ] + "'" + "," | 253 | + "'" + recMap[ OPimRecurrence::RFreq ] + "'" + "," |
250 | + "'" + recMap[ OPimRecurrence::RHasEndDate ] + "'" + "," | 254 | + "'" + recMap[ OPimRecurrence::RHasEndDate ] + "'" + "," |
251 | + "'" + recMap[ OPimRecurrence::EndDate ] + "'" + "," | 255 | + "'" + recMap[ OPimRecurrence::EndDate ] + "'" + "," |
252 | + "'" + recMap[ OPimRecurrence::Created ] + "'" + "," | 256 | + "'" + recMap[ OPimRecurrence::Created ] + "'" + "," |
253 | + "'" + recMap[ OPimRecurrence::Exceptions ] + "'" + ","; | 257 | + "'" + recMap[ OPimRecurrence::Exceptions ] + "'" + ","; |
254 | 258 | ||
255 | if ( m_todo.hasNotifiers() ) { | 259 | if ( m_todo.hasNotifiers() ) { |
256 | OPimNotifyManager manager = m_todo.notifiers(); | 260 | OPimNotifyManager manager = m_todo.notifiers(); |
257 | qu += "'" + manager.remindersToString() + "'" + "," | 261 | qu += "'" + manager.remindersToString() + "'" + "," |
258 | + "'" + manager.alarmsToString() + "'" + ","; | 262 | + "'" + manager.alarmsToString() + "'" + ","; |
259 | } | 263 | } |
260 | else{ | 264 | else{ |
261 | qu += QString( "''" ) + "," | 265 | qu += QString( "''" ) + "," |
262 | + "''" + ","; | 266 | + "''" + ","; |
263 | } | 267 | } |
264 | 268 | ||
265 | qu += QString( "''" ) + QString( "," ) // Maintainers (cur. not supported !) | 269 | qu += QString( "''" ) + QString( "," ) // Maintainers (cur. not supported !) |
266 | + "'" + QString::number(sYear).rightJustify( 4, '0' ) + "-" | 270 | + "'" + QString::number(sYear).rightJustify( 4, '0' ) + "-" |
267 | + QString::number(sMonth).rightJustify( 2, '0' ) | 271 | + QString::number(sMonth).rightJustify( 2, '0' ) |
268 | + "-" + QString::number(sDay).rightJustify( 2, '0' )+ "'" + "," | 272 | + "-" + QString::number(sDay).rightJustify( 2, '0' )+ "'" + "," |
269 | + "'" + QString::number(eYear).rightJustify( 4, '0' ) + "-" | 273 | + "'" + QString::number(eYear).rightJustify( 4, '0' ) + "-" |
270 | + QString::number(eMonth).rightJustify( 2, '0' ) | 274 | + QString::number(eMonth).rightJustify( 2, '0' ) |
271 | + "-"+QString::number(eDay).rightJustify( 2, '0' ) + "'" | 275 | + "-"+QString::number(eDay).rightJustify( 2, '0' ) + "'" |
272 | + "); "; | 276 | + "); "; |
273 | 277 | ||
274 | // Save custom Entries: | 278 | // Save custom Entries: |
275 | int id = 0; | 279 | int id = 0; |
276 | id = 0; | 280 | id = 0; |
277 | QMap<QString, QString> customMap = m_todo.toExtraMap(); | 281 | QMap<QString, QString> customMap = m_todo.toExtraMap(); |
278 | for( QMap<QString, QString>::Iterator it = customMap.begin(); | 282 | for( QMap<QString, QString>::Iterator it = customMap.begin(); |
279 | it != customMap.end(); ++it ){ | 283 | it != customMap.end(); ++it ){ |
280 | qu += "insert into custom_data VALUES(" | 284 | qu += "insert into custom_data VALUES(" |
281 | + QString::number( m_todo.uid() ) | 285 | + QString::number( m_todo.uid() ) |
282 | + "," | 286 | + "," |
283 | + QString::number( id++ ) | 287 | + QString::number( id++ ) |
284 | + ",'" | 288 | + ",'" |
285 | + it.key() | 289 | + it.key() |
286 | + "'," | 290 | + "'," |
287 | + "0" // Priority for future enhancements | 291 | + "0" // Priority for future enhancements |
288 | + ",'" | 292 | + ",'" |
289 | + it.data() | 293 | + it.data() |
290 | + "');"; | 294 | + "');"; |
291 | } | 295 | } |
292 | 296 | ||
293 | 297 | ||
294 | qDebug("add %s", qu.latin1() ); | 298 | odebug << "add " << qu << "" << oendl; |
295 | return qu; | 299 | return qu; |
296 | } | 300 | } |
297 | 301 | ||
298 | RemoveQuery::RemoveQuery(int uid ) | 302 | RemoveQuery::RemoveQuery(int uid ) |
299 | : OSQLQuery(), m_uid( uid ) {} | 303 | : OSQLQuery(), m_uid( uid ) {} |
300 | RemoveQuery::~RemoveQuery() {} | 304 | RemoveQuery::~RemoveQuery() {} |
301 | QString RemoveQuery::query()const { | 305 | QString RemoveQuery::query()const { |
302 | QString qu = "DELETE FROM todolist WHERE uid = " + QString::number(m_uid) + " ;"; | 306 | QString qu = "DELETE FROM todolist WHERE uid = " + QString::number(m_uid) + " ;"; |
303 | qu += "DELETE FROM custom_data WHERE uid = " + QString::number(m_uid); | 307 | qu += "DELETE FROM custom_data WHERE uid = " + QString::number(m_uid); |
304 | return qu; | 308 | return qu; |
305 | } | 309 | } |
306 | 310 | ||
307 | 311 | ||
308 | ClearQuery::ClearQuery() | 312 | ClearQuery::ClearQuery() |
309 | : OSQLQuery() {} | 313 | : OSQLQuery() {} |
@@ -342,15 +346,15 @@ namespace { | |||
342 | OverDueQuery::OverDueQuery(): OSQLQuery() {} | 346 | OverDueQuery::OverDueQuery(): OSQLQuery() {} |
343 | OverDueQuery::~OverDueQuery() {} | 347 | OverDueQuery::~OverDueQuery() {} |
344 | QString OverDueQuery::query()const { | 348 | QString OverDueQuery::query()const { |
345 | QDate date = QDate::currentDate(); | 349 | QDate date = QDate::currentDate(); |
346 | QString str; | 350 | QString str; |
347 | str = QString("select uid from todolist where DueDate ='%1-%2-%3'") | 351 | str = QString("select uid from todolist where DueDate ='%1-%2-%3'") |
348 | .arg( QString::number( date.year() ).rightJustify( 4, '0' ) ) | 352 | .arg( QString::number( date.year() ).rightJustify( 4, '0' ) ) |
349 | .arg( QString::number( date.month() ).rightJustify( 2, '0' ) ) | 353 | .arg( QString::number( date.month() ).rightJustify( 2, '0' ) ) |
350 | .arg( QString::number( date.day() ) .rightJustify( 2, '0' ) ); | 354 | .arg( QString::number( date.day() ) .rightJustify( 2, '0' ) ); |
351 | 355 | ||
352 | return str; | 356 | return str; |
353 | } | 357 | } |
354 | 358 | ||
355 | 359 | ||
356 | EffQuery::EffQuery( const QDate& start, const QDate& end, bool inc ) | 360 | EffQuery::EffQuery( const QDate& start, const QDate& end, bool inc ) |
@@ -359,69 +363,69 @@ namespace { | |||
359 | QString EffQuery::query()const { | 363 | QString EffQuery::query()const { |
360 | return m_inc ? with() : out(); | 364 | return m_inc ? with() : out(); |
361 | } | 365 | } |
362 | QString EffQuery::with()const { | 366 | QString EffQuery::with()const { |
363 | QString str; | 367 | QString str; |
364 | str = QString("select uid from todolist where ( DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6' ) OR DueDate = '0-0-0' ") | 368 | str = QString("select uid from todolist where ( DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6' ) OR DueDate = '0-0-0' ") |
365 | .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) ) | 369 | .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) ) |
366 | .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) ) | 370 | .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) ) |
367 | .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) ) | 371 | .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) ) |
368 | .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) ) | 372 | .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) ) |
369 | .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) ) | 373 | .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) ) |
370 | .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) ); | 374 | .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) ); |
371 | return str; | 375 | return str; |
372 | } | 376 | } |
373 | QString EffQuery::out()const { | 377 | QString EffQuery::out()const { |
374 | QString str; | 378 | QString str; |
375 | str = QString("select uid from todolist where DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6'") | 379 | str = QString("select uid from todolist where DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6'") |
376 | .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) ) | 380 | .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) ) |
377 | .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) ) | 381 | .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) ) |
378 | .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) ) | 382 | .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) ) |
379 | .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) ) | 383 | .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) ) |
380 | .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) ) | 384 | .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) ) |
381 | .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) ); | 385 | .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) ); |
382 | 386 | ||
383 | return str; | 387 | return str; |
384 | } | 388 | } |
385 | 389 | ||
386 | FindCustomQuery::FindCustomQuery(int uid) | 390 | FindCustomQuery::FindCustomQuery(int uid) |
387 | : OSQLQuery(), m_uid( uid ) { | 391 | : OSQLQuery(), m_uid( uid ) { |
388 | } | 392 | } |
389 | FindCustomQuery::FindCustomQuery(const QArray<int>& ints) | 393 | FindCustomQuery::FindCustomQuery(const QArray<int>& ints) |
390 | : OSQLQuery(), m_uids( ints ){ | 394 | : OSQLQuery(), m_uids( ints ){ |
391 | } | 395 | } |
392 | FindCustomQuery::~FindCustomQuery() { | 396 | FindCustomQuery::~FindCustomQuery() { |
393 | } | 397 | } |
394 | QString FindCustomQuery::query()const{ | 398 | QString FindCustomQuery::query()const{ |
395 | return single(); // Multiple requests not supported ! | 399 | return single(); // Multiple requests not supported ! |
396 | } | 400 | } |
397 | QString FindCustomQuery::single()const{ | 401 | QString FindCustomQuery::single()const{ |
398 | QString qu = "select uid, type, value from custom_data where uid = "; | 402 | QString qu = "select uid, type, value from custom_data where uid = "; |
399 | qu += QString::number(m_uid); | 403 | qu += QString::number(m_uid); |
400 | return qu; | 404 | return qu; |
401 | } | 405 | } |
402 | 406 | ||
403 | }; | 407 | }; |
404 | 408 | ||
405 | 409 | ||
406 | namespace Opie { | 410 | namespace Opie { |
407 | OPimTodoAccessBackendSQL::OPimTodoAccessBackendSQL( const QString& file ) | 411 | OPimTodoAccessBackendSQL::OPimTodoAccessBackendSQL( const QString& file ) |
408 | : OPimTodoAccessBackend(),/* m_dict(15),*/ m_driver(NULL), m_dirty(true) | 412 | : OPimTodoAccessBackend(),/* m_dict(15),*/ m_driver(NULL), m_dirty(true) |
409 | { | 413 | { |
410 | QString fi = file; | 414 | QString fi = file; |
411 | if ( fi.isEmpty() ) | 415 | if ( fi.isEmpty() ) |
412 | fi = Global::applicationFileName( "todolist", "todolist.db" ); | 416 | fi = Global::applicationFileName( "todolist", "todolist.db" ); |
413 | OSQLManager man; | 417 | OSQLManager man; |
414 | m_driver = man.standard(); | 418 | m_driver = man.standard(); |
415 | m_driver->setUrl(fi); | 419 | m_driver->setUrl(fi); |
416 | // fillDict(); | 420 | // fillDict(); |
417 | } | 421 | } |
418 | 422 | ||
419 | OPimTodoAccessBackendSQL::~OPimTodoAccessBackendSQL(){ | 423 | OPimTodoAccessBackendSQL::~OPimTodoAccessBackendSQL(){ |
420 | if( m_driver ) | 424 | if( m_driver ) |
421 | delete m_driver; | 425 | delete m_driver; |
422 | } | 426 | } |
423 | 427 | ||
424 | bool OPimTodoAccessBackendSQL::load(){ | 428 | bool OPimTodoAccessBackendSQL::load(){ |
425 | if (!m_driver->open() ) | 429 | if (!m_driver->open() ) |
426 | return false; | 430 | return false; |
427 | 431 | ||
@@ -453,23 +457,23 @@ OPimTodo OPimTodoAccessBackendSQL::find(int uid ) const{ | |||
453 | return todo( m_driver->query(&query) ); | 457 | return todo( m_driver->query(&query) ); |
454 | 458 | ||
455 | } | 459 | } |
456 | OPimTodo OPimTodoAccessBackendSQL::find( int uid, const QArray<int>& ints, | 460 | OPimTodo OPimTodoAccessBackendSQL::find( int uid, const QArray<int>& ints, |
457 | uint cur, Frontend::CacheDirection dir ) const{ | 461 | uint cur, Frontend::CacheDirection dir ) const{ |
458 | uint CACHE = readAhead(); | 462 | uint CACHE = readAhead(); |
459 | qDebug("searching for %d", uid ); | 463 | odebug << "searching for " << uid << "" << oendl; |
460 | QArray<int> search( CACHE ); | 464 | QArray<int> search( CACHE ); |
461 | uint size =0; | 465 | uint size =0; |
462 | OPimTodo to; | 466 | OPimTodo to; |
463 | 467 | ||
464 | // we try to cache CACHE items | 468 | // we try to cache CACHE items |
465 | switch( dir ) { | 469 | switch( dir ) { |
466 | /* forward */ | 470 | /* forward */ |
467 | case 0: // FIXME: Not a good style to use magic numbers here (eilers) | 471 | case 0: // FIXME: Not a good style to use magic numbers here (eilers) |
468 | for (uint i = cur; i < ints.count() && size < CACHE; i++ ) { | 472 | for (uint i = cur; i < ints.count() && size < CACHE; i++ ) { |
469 | qDebug("size %d %d", size, ints[i] ); | 473 | odebug << "size " << size << " " << ints[i] << "" << oendl; |
470 | search[size] = ints[i]; | 474 | search[size] = ints[i]; |
471 | size++; | 475 | size++; |
472 | } | 476 | } |
473 | break; | 477 | break; |
474 | /* reverse */ | 478 | /* reverse */ |
475 | case 1: // FIXME: Not a good style to use magic numbers here (eilers) | 479 | case 1: // FIXME: Not a good style to use magic numbers here (eilers) |
@@ -538,13 +542,13 @@ QArray<int> OPimTodoAccessBackendSQL::effectiveToDos( const QDate& s, | |||
538 | } | 542 | } |
539 | /* | 543 | /* |
540 | * | 544 | * |
541 | */ | 545 | */ |
542 | QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder, | 546 | QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder, |
543 | int sortFilter, int cat ) { | 547 | int sortFilter, int cat ) { |
544 | qDebug("sorted %d, %d", asc, sortOrder ); | 548 | odebug << "sorted " << asc << ", " << sortOrder << "" << oendl; |
545 | QString query; | 549 | QString query; |
546 | query = "select uid from todolist WHERE "; | 550 | query = "select uid from todolist WHERE "; |
547 | 551 | ||
548 | /* | 552 | /* |
549 | * Sort Filter stuff | 553 | * Sort Filter stuff |
550 | * not that straight forward | 554 | * not that straight forward |
@@ -560,15 +564,15 @@ QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder, | |||
560 | /* Show only overdue */ | 564 | /* Show only overdue */ |
561 | if ( sortFilter & 2 ) { | 565 | if ( sortFilter & 2 ) { |
562 | QDate date = QDate::currentDate(); | 566 | QDate date = QDate::currentDate(); |
563 | QString due; | 567 | QString due; |
564 | QString base; | 568 | QString base; |
565 | base = QString("DueDate <= '%1-%2-%3' AND completed = 0") | 569 | base = QString("DueDate <= '%1-%2-%3' AND completed = 0") |
566 | .arg( QString::number( date.year() ).rightJustify( 4, '0' ) ) | 570 | .arg( QString::number( date.year() ).rightJustify( 4, '0' ) ) |
567 | .arg( QString::number( date.month() ).rightJustify( 2, '0' ) ) | 571 | .arg( QString::number( date.month() ).rightJustify( 2, '0' ) ) |
568 | .arg( QString::number( date.day() ).rightJustify( 2, '0' ) ); | 572 | .arg( QString::number( date.day() ).rightJustify( 2, '0' ) ); |
569 | query += " " + base + " AND"; | 573 | query += " " + base + " AND"; |
570 | } | 574 | } |
571 | /* not show completed */ | 575 | /* not show completed */ |
572 | if ( sortFilter & 4 ) { | 576 | if ( sortFilter & 4 ) { |
573 | query += " completed = 0 AND"; | 577 | query += " completed = 0 AND"; |
574 | }else{ | 578 | }else{ |
@@ -597,17 +601,17 @@ QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder, | |||
597 | case 3: | 601 | case 3: |
598 | query += "DueDate"; | 602 | query += "DueDate"; |
599 | break; | 603 | break; |
600 | } | 604 | } |
601 | 605 | ||
602 | if ( !asc ) { | 606 | if ( !asc ) { |
603 | qDebug("not ascending!"); | 607 | odebug << "not ascending!" << oendl; |
604 | query += " DESC"; | 608 | query += " DESC"; |
605 | } | 609 | } |
606 | 610 | ||
607 | qDebug( query ); | 611 | odebug << query << oendl; |
608 | OSQLRawQuery raw(query ); | 612 | OSQLRawQuery raw(query ); |
609 | return uids( m_driver->query(&raw) ); | 613 | return uids( m_driver->query(&raw) ); |
610 | } | 614 | } |
611 | bool OPimTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ | 615 | bool OPimTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ |
612 | if ( str == "0-0-0" ) | 616 | if ( str == "0-0-0" ) |
613 | return false; | 617 | return false; |
@@ -626,53 +630,53 @@ OPimTodo OPimTodoAccessBackendSQL::todo( const OSQLResult& res ) const{ | |||
626 | OPimTodo to; | 630 | OPimTodo to; |
627 | return to; | 631 | return to; |
628 | } | 632 | } |
629 | 633 | ||
630 | OSQLResultItem::ValueList list = res.results(); | 634 | OSQLResultItem::ValueList list = res.results(); |
631 | OSQLResultItem::ValueList::Iterator it = list.begin(); | 635 | OSQLResultItem::ValueList::Iterator it = list.begin(); |
632 | qDebug("todo1"); | 636 | odebug << "todo1" << oendl; |
633 | OPimTodo to = todo( (*it) ); | 637 | OPimTodo to = todo( (*it) ); |
634 | cache( to ); | 638 | cache( to ); |
635 | ++it; | 639 | ++it; |
636 | 640 | ||
637 | for ( ; it != list.end(); ++it ) { | 641 | for ( ; it != list.end(); ++it ) { |
638 | qDebug("caching"); | 642 | odebug << "caching" << oendl; |
639 | cache( todo( (*it) ) ); | 643 | cache( todo( (*it) ) ); |
640 | } | 644 | } |
641 | return to; | 645 | return to; |
642 | } | 646 | } |
643 | OPimTodo OPimTodoAccessBackendSQL::todo( OSQLResultItem& item )const { | 647 | OPimTodo OPimTodoAccessBackendSQL::todo( OSQLResultItem& item )const { |
644 | qDebug("todo(ResultItem)"); | 648 | odebug << "todo(ResultItem)" << oendl; |
645 | 649 | ||
646 | // Request information from addressbook table and create the OPimTodo-object. | 650 | // Request information from addressbook table and create the OPimTodo-object. |
647 | 651 | ||
648 | bool hasDueDate = false; QDate dueDate = QDate::currentDate(); | 652 | bool hasDueDate = false; QDate dueDate = QDate::currentDate(); |
649 | hasDueDate = date( dueDate, item.data("DueDate") ); | 653 | hasDueDate = date( dueDate, item.data("DueDate") ); |
650 | QStringList cats = QStringList::split(";", item.data("categories") ); | 654 | QStringList cats = QStringList::split(";", item.data("categories") ); |
651 | 655 | ||
652 | qDebug("Item is completed: %d", item.data("completed").toInt() ); | 656 | odebug << "Item is completed: " << item.data("completed").toInt() << "" << oendl; |
653 | 657 | ||
654 | OPimTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(), | 658 | OPimTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(), |
655 | cats, item.data("summary"), item.data("description"), | 659 | cats, item.data("summary"), item.data("description"), |
656 | item.data("progress").toUShort(), hasDueDate, dueDate, | 660 | item.data("progress").toUShort(), hasDueDate, dueDate, |
657 | item.data("uid").toInt() ); | 661 | item.data("uid").toInt() ); |
658 | 662 | ||
659 | bool isOk; | 663 | bool isOk; |
660 | int prioInt = QString( item.data("priority") ).toInt( &isOk ); | 664 | int prioInt = QString( item.data("priority") ).toInt( &isOk ); |
661 | if ( isOk ) | 665 | if ( isOk ) |
662 | to.setPriority( prioInt ); | 666 | to.setPriority( prioInt ); |
663 | 667 | ||
664 | bool hasStartDate = false; QDate startDate = QDate::currentDate(); | 668 | bool hasStartDate = false; QDate startDate = QDate::currentDate(); |
665 | hasStartDate = date( startDate, item.data("startdate") ); | 669 | hasStartDate = date( startDate, item.data("startdate") ); |
666 | bool hasCompletedDate = false; QDate completedDate = QDate::currentDate(); | 670 | bool hasCompletedDate = false; QDate completedDate = QDate::currentDate(); |
667 | hasCompletedDate = date( completedDate, item.data("completeddate") ); | 671 | hasCompletedDate = date( completedDate, item.data("completeddate") ); |
668 | 672 | ||
669 | if ( hasStartDate ) | 673 | if ( hasStartDate ) |
670 | to.setStartDate( startDate ); | 674 | to.setStartDate( startDate ); |
671 | if ( hasCompletedDate ) | 675 | if ( hasCompletedDate ) |
672 | to.setCompletedDate( completedDate ); | 676 | to.setCompletedDate( completedDate ); |
673 | 677 | ||
674 | OPimNotifyManager& manager = to.notifiers(); | 678 | OPimNotifyManager& manager = to.notifiers(); |
675 | manager.alarmsFromString( item.data("alarms") ); | 679 | manager.alarmsFromString( item.data("alarms") ); |
676 | manager.remindersFromString( item.data("reminders") ); | 680 | manager.remindersFromString( item.data("reminders") ); |
677 | 681 | ||
678 | OPimState pimState; | 682 | OPimState pimState; |
@@ -747,13 +751,13 @@ void OPimTodoAccessBackendSQL::update()const { | |||
747 | } | 751 | } |
748 | QArray<int> OPimTodoAccessBackendSQL::uids( const OSQLResult& res) const{ | 752 | QArray<int> OPimTodoAccessBackendSQL::uids( const OSQLResult& res) const{ |
749 | 753 | ||
750 | OSQLResultItem::ValueList list = res.results(); | 754 | OSQLResultItem::ValueList list = res.results(); |
751 | OSQLResultItem::ValueList::Iterator it; | 755 | OSQLResultItem::ValueList::Iterator it; |
752 | QArray<int> ints(list.count() ); | 756 | QArray<int> ints(list.count() ); |
753 | qDebug(" count = %d", list.count() ); | 757 | odebug << " count = " << list.count() << "" << oendl; |
754 | 758 | ||
755 | int i = 0; | 759 | int i = 0; |
756 | for (it = list.begin(); it != list.end(); ++it ) { | 760 | for (it = list.begin(); it != list.end(); ++it ) { |
757 | ints[i] = (*it).data("uid").toInt(); | 761 | ints[i] = (*it).data("uid").toInt(); |
758 | i++; | 762 | i++; |
759 | } | 763 | } |
@@ -761,120 +765,120 @@ QArray<int> OPimTodoAccessBackendSQL::uids( const OSQLResult& res) const{ | |||
761 | } | 765 | } |
762 | 766 | ||
763 | QArray<int> OPimTodoAccessBackendSQL::matchRegexp( const QRegExp &r ) const | 767 | QArray<int> OPimTodoAccessBackendSQL::matchRegexp( const QRegExp &r ) const |
764 | { | 768 | { |
765 | 769 | ||
766 | #if 0 | 770 | #if 0 |
767 | QArray<int> empty; | 771 | QArray<int> empty; |
768 | return empty; | 772 | return empty; |
769 | 773 | ||
770 | #else | 774 | #else |
771 | QString qu = "SELECT uid FROM todolist WHERE ("; | 775 | QString qu = "SELECT uid FROM todolist WHERE ("; |
772 | 776 | ||
773 | // Do it make sense to search other fields, too ? | 777 | // Do it make sense to search other fields, too ? |
774 | qu += " rlike(\""+ r.pattern() + "\",\"description\") OR"; | 778 | qu += " rlike(\""+ r.pattern() + "\",\"description\") OR"; |
775 | qu += " rlike(\""+ r.pattern() + "\",\"summary\")"; | 779 | qu += " rlike(\""+ r.pattern() + "\",\"summary\")"; |
776 | 780 | ||
777 | qu += ")"; | 781 | qu += ")"; |
778 | 782 | ||
779 | qDebug( "query: %s", qu.latin1() ); | 783 | odebug << "query: " << qu << "" << oendl; |
780 | 784 | ||
781 | OSQLRawQuery raw( qu ); | 785 | OSQLRawQuery raw( qu ); |
782 | OSQLResult res = m_driver->query( &raw ); | 786 | OSQLResult res = m_driver->query( &raw ); |
783 | 787 | ||
784 | return uids( res ); | 788 | return uids( res ); |
785 | 789 | ||
786 | 790 | ||
787 | #endif | 791 | #endif |
788 | 792 | ||
789 | } | 793 | } |
790 | QBitArray OPimTodoAccessBackendSQL::supports()const { | 794 | QBitArray OPimTodoAccessBackendSQL::supports()const { |
791 | 795 | ||
792 | return sup(); | 796 | return sup(); |
793 | } | 797 | } |
794 | 798 | ||
795 | QBitArray OPimTodoAccessBackendSQL::sup() const{ | 799 | QBitArray OPimTodoAccessBackendSQL::sup() const{ |
796 | 800 | ||
797 | QBitArray ar( OPimTodo::CompletedDate + 1 ); | 801 | QBitArray ar( OPimTodo::CompletedDate + 1 ); |
798 | ar.fill( true ); | 802 | ar.fill( true ); |
799 | ar[OPimTodo::CrossReference] = false; | 803 | ar[OPimTodo::CrossReference] = false; |
800 | ar[OPimTodo::State ] = false; | 804 | ar[OPimTodo::State ] = false; |
801 | ar[OPimTodo::Reminders] = false; | 805 | ar[OPimTodo::Reminders] = false; |
802 | ar[OPimTodo::Notifiers] = false; | 806 | ar[OPimTodo::Notifiers] = false; |
803 | ar[OPimTodo::Maintainer] = false; | 807 | ar[OPimTodo::Maintainer] = false; |
804 | 808 | ||
805 | return ar; | 809 | return ar; |
806 | } | 810 | } |
807 | 811 | ||
808 | void OPimTodoAccessBackendSQL::removeAllCompleted(){ | 812 | void OPimTodoAccessBackendSQL::removeAllCompleted(){ |
809 | // First we need the uids from all entries which are | 813 | // First we need the uids from all entries which are |
810 | // completed. Then, we just have to remove them... | 814 | // completed. Then, we just have to remove them... |
811 | 815 | ||
812 | QString qu = "SELECT uid FROM todolist WHERE completed = 1"; | 816 | QString qu = "SELECT uid FROM todolist WHERE completed = 1"; |
813 | 817 | ||
814 | OSQLRawQuery raw( qu ); | 818 | OSQLRawQuery raw( qu ); |
815 | OSQLResult res = m_driver->query( &raw ); | 819 | OSQLResult res = m_driver->query( &raw ); |
816 | 820 | ||
817 | QArray<int> completed_uids = uids( res ); | 821 | QArray<int> completed_uids = uids( res ); |
818 | 822 | ||
819 | qDebug( "Number of completed: %d", completed_uids.size() ); | 823 | odebug << "Number of completed: " << completed_uids.size() << "" << oendl; |
820 | 824 | ||
821 | if ( completed_uids.size() == 0 ) | 825 | if ( completed_uids.size() == 0 ) |
822 | return; | 826 | return; |
823 | 827 | ||
824 | qu = "DELETE FROM todolist WHERE ("; | 828 | qu = "DELETE FROM todolist WHERE ("; |
825 | QString query; | 829 | QString query; |
826 | 830 | ||
827 | for ( int i = 0; i < completed_uids.size(); i++ ){ | 831 | for ( int i = 0; i < completed_uids.size(); i++ ){ |
828 | if ( !query.isEmpty() ) | 832 | if ( !query.isEmpty() ) |
829 | query += " OR "; | 833 | query += " OR "; |
830 | query += QString( "uid = %1" ).arg( completed_uids[i] ); | 834 | query += QString( "uid = %1" ).arg( completed_uids[i] ); |
831 | } | 835 | } |
832 | qu += query + " );"; | 836 | qu += query + " );"; |
833 | 837 | ||
834 | // Put remove of custom entries in this query to speed up.. | 838 | // Put remove of custom entries in this query to speed up.. |
835 | qu += "DELETE FORM custom_data WHERE ("; | 839 | qu += "DELETE FORM custom_data WHERE ("; |
836 | query = ""; | 840 | query = ""; |
837 | 841 | ||
838 | for ( int i = 0; i < completed_uids.size(); i++ ){ | 842 | for ( int i = 0; i < completed_uids.size(); i++ ){ |
839 | if ( !query.isEmpty() ) | 843 | if ( !query.isEmpty() ) |
840 | query += " OR "; | 844 | query += " OR "; |
841 | query += QString( "uid = %1" ).arg( completed_uids[i] ); | 845 | query += QString( "uid = %1" ).arg( completed_uids[i] ); |
842 | } | 846 | } |
843 | qu += query + " );"; | 847 | qu += query + " );"; |
844 | 848 | ||
845 | qDebug( "query: %s", qu.latin1() ); | 849 | odebug << "query: " << qu << "" << oendl; |
846 | 850 | ||
847 | OSQLRawQuery raw2( qu ); | 851 | OSQLRawQuery raw2( qu ); |
848 | res = m_driver->query( &raw2 ); | 852 | res = m_driver->query( &raw2 ); |
849 | if ( res.state() == OSQLResult::Failure ) { | 853 | if ( res.state() == OSQLResult::Failure ) { |
850 | qWarning("OPimTodoAccessBackendSQL::removeAllCompleted():Failure in query: %s", qu.latin1() ); | 854 | owarn << "OPimTodoAccessBackendSQL::removeAllCompleted():Failure in query: " << qu << "" << oendl; |
851 | } | 855 | } |
852 | } | 856 | } |
853 | 857 | ||
854 | 858 | ||
855 | QMap<QString, QString> OPimTodoAccessBackendSQL::requestCustom( int uid ) const | 859 | QMap<QString, QString> OPimTodoAccessBackendSQL::requestCustom( int uid ) const |
856 | { | 860 | { |
857 | QMap<QString, QString> customMap; | 861 | QMap<QString, QString> customMap; |
858 | 862 | ||
859 | FindCustomQuery query( uid ); | 863 | FindCustomQuery query( uid ); |
860 | OSQLResult res_custom = m_driver->query( &query ); | 864 | OSQLResult res_custom = m_driver->query( &query ); |
861 | 865 | ||
862 | if ( res_custom.state() == OSQLResult::Failure ) { | 866 | if ( res_custom.state() == OSQLResult::Failure ) { |
863 | qWarning("OSQLResult::Failure in find query !!"); | 867 | owarn << "OSQLResult::Failure in find query !!" << oendl; |
864 | QMap<QString, QString> empty; | 868 | QMap<QString, QString> empty; |
865 | return empty; | 869 | return empty; |
866 | } | 870 | } |
867 | 871 | ||
868 | OSQLResultItem::ValueList list = res_custom.results(); | 872 | OSQLResultItem::ValueList list = res_custom.results(); |
869 | OSQLResultItem::ValueList::Iterator it = list.begin(); | 873 | OSQLResultItem::ValueList::Iterator it = list.begin(); |
870 | for ( ; it != list.end(); ++it ) { | 874 | for ( ; it != list.end(); ++it ) { |
871 | customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); | 875 | customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); |
872 | } | 876 | } |
873 | 877 | ||
874 | return customMap; | 878 | return customMap; |
875 | } | 879 | } |
876 | 880 | ||
877 | 881 | ||
878 | 882 | ||
879 | 883 | ||
880 | } | 884 | } |
diff --git a/libopie2/opiepim/backend/otodoaccessvcal.cpp b/libopie2/opiepim/backend/otodoaccessvcal.cpp index 03d4479..14a325e 100644 --- a/libopie2/opiepim/backend/otodoaccessvcal.cpp +++ b/libopie2/opiepim/backend/otodoaccessvcal.cpp | |||
@@ -24,17 +24,21 @@ | |||
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | /* OPIE */ | ||
31 | #include "vobject_p.h" | 30 | #include "vobject_p.h" |
32 | #include <qpe/timeconversion.h> | 31 | |
32 | /* OPIE */ | ||
33 | #include <opie2/otodoaccessvcal.h> | 33 | #include <opie2/otodoaccessvcal.h> |
34 | #include <opie2/odebug.h> | ||
34 | 35 | ||
36 | #include <qpe/timeconversion.h> | ||
37 | |||
38 | /* QT */ | ||
35 | //FIXME: Hack to allow direct access to FILE* fh. Rewrite this! | 39 | //FIXME: Hack to allow direct access to FILE* fh. Rewrite this! |
36 | #define protected public | 40 | #define protected public |
37 | #include <qfile.h> | 41 | #include <qfile.h> |
38 | #undef protected | 42 | #undef protected |
39 | 43 | ||
40 | using namespace Opie; | 44 | using namespace Opie; |
@@ -85,13 +89,13 @@ namespace { | |||
85 | name = vObjectStringZValue( ob ); | 89 | name = vObjectStringZValue( ob ); |
86 | event.setDueDate( TimeConversion::fromISO8601( name).date() ); | 90 | event.setDueDate( TimeConversion::fromISO8601( name).date() ); |
87 | } | 91 | } |
88 | // categories | 92 | // categories |
89 | if((ob = isAPropertyOf( obj, VCCategoriesProp )) != 0 ){ | 93 | if((ob = isAPropertyOf( obj, VCCategoriesProp )) != 0 ){ |
90 | name = vObjectStringZValue( ob ); | 94 | name = vObjectStringZValue( ob ); |
91 | qWarning("Categories:%s", name.data() ); | 95 | owarn << "Categories:" << name.data() << "" << oendl; |
92 | } | 96 | } |
93 | 97 | ||
94 | event.setUid( 1 ); | 98 | event.setUid( 1 ); |
95 | return event; | 99 | return event; |
96 | }; | 100 | }; |
97 | static VObject *vobjByEvent( const OPimTodo &event ) { | 101 | static VObject *vobjByEvent( const OPimTodo &event ) { |
@@ -114,16 +118,16 @@ namespace { | |||
114 | 118 | ||
115 | addPropValue( task, VCCategoriesProp, | 119 | addPropValue( task, VCCategoriesProp, |
116 | event.idsToString( event.categories() ).local8Bit() ); | 120 | event.idsToString( event.categories() ).local8Bit() ); |
117 | 121 | ||
118 | #if 0 | 122 | #if 0 |
119 | 123 | ||
120 | // There seems a misrepresentation between summary in otodoevent | 124 | // There seems a misrepresentation between summary in otodoevent |
121 | // and summary in vcard. | 125 | // and summary in vcard. |
122 | // The same with description.. | 126 | // The same with description.. |
123 | // Description is summary and vice versa.. Argh.. (eilers) | 127 | // Description is summary and vice versa.. Argh.. (eilers) |
124 | 128 | ||
125 | 129 | ||
126 | addPropValue( task, VCDescriptionProp, | 130 | addPropValue( task, VCDescriptionProp, |
127 | event.description().local8Bit() ); | 131 | event.description().local8Bit() ); |
128 | 132 | ||
129 | addPropValue( task, VCSummaryProp, | 133 | addPropValue( task, VCSummaryProp, |
@@ -132,13 +136,13 @@ namespace { | |||
132 | #else | 136 | #else |
133 | addPropValue( task, VCDescriptionProp, | 137 | addPropValue( task, VCDescriptionProp, |
134 | event.summary().local8Bit() ); | 138 | event.summary().local8Bit() ); |
135 | 139 | ||
136 | addPropValue( task, VCSummaryProp, | 140 | addPropValue( task, VCSummaryProp, |
137 | event.description().local8Bit() ); | 141 | event.description().local8Bit() ); |
138 | #endif | 142 | #endif |
139 | return task; | 143 | return task; |
140 | }; | 144 | }; |
141 | } | 145 | } |
142 | 146 | ||
143 | namespace Opie { | 147 | namespace Opie { |
144 | OPimTodoAccessVCal::OPimTodoAccessVCal( const QString& path ) | 148 | OPimTodoAccessVCal::OPimTodoAccessVCal( const QString& path ) |
diff --git a/libopie2/opiepim/backend/otodoaccessxml.cpp b/libopie2/opiepim/backend/otodoaccessxml.cpp index cce6111..3e06d88 100644 --- a/libopie2/opiepim/backend/otodoaccessxml.cpp +++ b/libopie2/opiepim/backend/otodoaccessxml.cpp | |||
@@ -23,36 +23,41 @@ | |||
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | |||
30 | /* OPIE */ | ||
31 | #include <opie2/opimdateconversion.h> | ||
32 | #include <opie2/opimstate.h> | ||
33 | #include <opie2/opimtimezone.h> | ||
34 | #include <opie2/opimnotifymanager.h> | ||
35 | #include <opie2/opimrecurrence.h> | ||
36 | #include <opie2/otodoaccessxml.h> | ||
37 | #include <opie2/odebug.h> | ||
38 | |||
39 | #include <qpe/global.h> | ||
40 | #include <qpe/stringutil.h> | ||
41 | #include <qpe/timeconversion.h> | ||
42 | |||
43 | /* QT */ | ||
44 | #include <qfile.h> | ||
45 | #include <qvector.h> | ||
46 | |||
47 | /* STD */ | ||
29 | #include <errno.h> | 48 | #include <errno.h> |
30 | #include <fcntl.h> | 49 | #include <fcntl.h> |
31 | 50 | ||
32 | #include <sys/mman.h> | 51 | #include <sys/mman.h> |
33 | #include <sys/stat.h> | 52 | #include <sys/stat.h> |
34 | #include <sys/types.h> | 53 | #include <sys/types.h> |
35 | 54 | ||
36 | #include <unistd.h> | 55 | #include <unistd.h> |
37 | 56 | ||
38 | 57 | ||
39 | #include <qfile.h> | ||
40 | #include <qvector.h> | ||
41 | |||
42 | #include <qpe/global.h> | ||
43 | #include <qpe/stringutil.h> | ||
44 | #include <qpe/timeconversion.h> | ||
45 | |||
46 | #include <opie2/opimdateconversion.h> | ||
47 | #include <opie2/opimstate.h> | ||
48 | #include <opie2/opimtimezone.h> | ||
49 | #include <opie2/opimnotifymanager.h> | ||
50 | #include <opie2/opimrecurrence.h> | ||
51 | #include <opie2/otodoaccessxml.h> | ||
52 | |||
53 | using namespace Opie; | 58 | using namespace Opie; |
54 | 59 | ||
55 | namespace { | 60 | namespace { |
56 | time_t rp_end; | 61 | time_t rp_end; |
57 | OPimRecurrence* rec; | 62 | OPimRecurrence* rec; |
58 | OPimRecurrence *recur() { | 63 | OPimRecurrence *recur() { |
@@ -73,27 +78,27 @@ namespace { | |||
73 | // FROM TT again | 78 | // FROM TT again |
74 | char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) | 79 | char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) |
75 | { | 80 | { |
76 | char needleChar; | 81 | char needleChar; |
77 | char haystackChar; | 82 | char haystackChar; |
78 | if (!needle || !haystack || !hLen || !nLen) | 83 | if (!needle || !haystack || !hLen || !nLen) |
79 | return 0; | 84 | return 0; |
80 | 85 | ||
81 | const char* hsearch = haystack; | 86 | const char* hsearch = haystack; |
82 | 87 | ||
83 | if ((needleChar = *needle++) != 0) { | 88 | if ((needleChar = *needle++) != 0) { |
84 | nLen--; //(to make up for needle++) | 89 | nLen--; //(to make up for needle++) |
85 | do { | 90 | do { |
86 | do { | 91 | do { |
87 | if ((haystackChar = *hsearch++) == 0) | 92 | if ((haystackChar = *hsearch++) == 0) |
88 | return (0); | 93 | return (0); |
89 | if (hsearch >= haystack + hLen) | 94 | if (hsearch >= haystack + hLen) |
90 | return (0); | 95 | return (0); |
91 | } while (haystackChar != needleChar); | 96 | } while (haystackChar != needleChar); |
92 | } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); | 97 | } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); |
93 | hsearch--; | 98 | hsearch--; |
94 | } | 99 | } |
95 | return ((char *)hsearch); | 100 | return ((char *)hsearch); |
96 | } | 101 | } |
97 | } | 102 | } |
98 | 103 | ||
99 | namespace Opie { | 104 | namespace Opie { |
@@ -174,69 +179,69 @@ bool OPimTodoAccessXML::load() { | |||
174 | char *point; | 179 | char *point; |
175 | const char* collectionString = "<Task "; | 180 | const char* collectionString = "<Task "; |
176 | int strLen = strlen(collectionString); | 181 | int strLen = strlen(collectionString); |
177 | while ( ( point = strstrlen( dt+i, len -i, collectionString, strLen ) ) != 0l ) { | 182 | while ( ( point = strstrlen( dt+i, len -i, collectionString, strLen ) ) != 0l ) { |
178 | i = point -dt; | 183 | i = point -dt; |
179 | i+= strLen; | 184 | i+= strLen; |
180 | qWarning("Found a start at %d %d", i, (point-dt) ); | 185 | owarn << "Found a start at " << i << " " << (point-dt) << "" << oendl; |
181 | 186 | ||
182 | OPimTodo ev; | 187 | OPimTodo ev; |
183 | m_year = m_month = m_day = 0; | 188 | m_year = m_month = m_day = 0; |
184 | 189 | ||
185 | while ( TRUE ) { | 190 | while ( TRUE ) { |
186 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) | 191 | while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) |
187 | ++i; | 192 | ++i; |
188 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) | 193 | if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) |
189 | break; | 194 | break; |
190 | 195 | ||
191 | // we have another attribute, read it. | 196 | // we have another attribute, read it. |
192 | int j = i; | 197 | int j = i; |
193 | while ( j < len && dt[j] != '=' ) | 198 | while ( j < len && dt[j] != '=' ) |
194 | ++j; | 199 | ++j; |
195 | QCString attr( dt+i, j-i+1); | 200 | QCString attr( dt+i, j-i+1); |
196 | 201 | ||
197 | i = ++j; // skip = | 202 | i = ++j; // skip = |
198 | 203 | ||
199 | // find the start of quotes | 204 | // find the start of quotes |
200 | while ( i < len && dt[i] != '"' ) | 205 | while ( i < len && dt[i] != '"' ) |
201 | ++i; | 206 | ++i; |
202 | j = ++i; | 207 | j = ++i; |
203 | 208 | ||
204 | bool haveUtf = FALSE; | 209 | bool haveUtf = FALSE; |
205 | bool haveEnt = FALSE; | 210 | bool haveEnt = FALSE; |
206 | while ( j < len && dt[j] != '"' ) { | 211 | while ( j < len && dt[j] != '"' ) { |
207 | if ( ((unsigned char)dt[j]) > 0x7f ) | 212 | if ( ((unsigned char)dt[j]) > 0x7f ) |
208 | haveUtf = TRUE; | 213 | haveUtf = TRUE; |
209 | if ( dt[j] == '&' ) | 214 | if ( dt[j] == '&' ) |
210 | haveEnt = TRUE; | 215 | haveEnt = TRUE; |
211 | ++j; | 216 | ++j; |
212 | } | 217 | } |
213 | if ( i == j ) { | 218 | if ( i == j ) { |
214 | // empty value | 219 | // empty value |
215 | i = j + 1; | 220 | i = j + 1; |
216 | continue; | 221 | continue; |
217 | } | 222 | } |
218 | 223 | ||
219 | QCString value( dt+i, j-i+1 ); | 224 | QCString value( dt+i, j-i+1 ); |
220 | i = j + 1; | 225 | i = j + 1; |
221 | 226 | ||
222 | QString str = (haveUtf ? QString::fromUtf8( value ) | 227 | QString str = (haveUtf ? QString::fromUtf8( value ) |
223 | : QString::fromLatin1( value ) ); | 228 | : QString::fromLatin1( value ) ); |
224 | if ( haveEnt ) | 229 | if ( haveEnt ) |
225 | str = Qtopia::plainString( str ); | 230 | str = Qtopia::plainString( str ); |
226 | 231 | ||
227 | /* | 232 | /* |
228 | * add key + value | 233 | * add key + value |
229 | */ | 234 | */ |
230 | todo( &dict, ev, attr, str ); | 235 | todo( &dict, ev, attr, str ); |
231 | 236 | ||
232 | } | 237 | } |
233 | /* | 238 | /* |
234 | * now add it | 239 | * now add it |
235 | */ | 240 | */ |
236 | qWarning("End at %d", i ); | 241 | owarn << "End at " << i << "" << oendl; |
237 | if (m_events.contains( ev.uid() ) || ev.uid() == 0) { | 242 | if (m_events.contains( ev.uid() ) || ev.uid() == 0) { |
238 | ev.setUid( 1 ); | 243 | ev.setUid( 1 ); |
239 | m_changed = true; | 244 | m_changed = true; |
240 | } | 245 | } |
241 | if ( ev.hasDueDate() ) { | 246 | if ( ev.hasDueDate() ) { |
242 | ev.setDueDate( QDate(m_year, m_month, m_day) ); | 247 | ev.setDueDate( QDate(m_year, m_month, m_day) ); |
@@ -253,23 +258,23 @@ bool OPimTodoAccessXML::load() { | |||
253 | delete rec; | 258 | delete rec; |
254 | rec = 0; | 259 | rec = 0; |
255 | } | 260 | } |
256 | 261 | ||
257 | munmap(map_addr, attribut.st_size ); | 262 | munmap(map_addr, attribut.st_size ); |
258 | 263 | ||
259 | qWarning("counts %d records loaded!", m_events.count() ); | 264 | owarn << "counts " << m_events.count() << " records loaded!" << oendl; |
260 | return true; | 265 | return true; |
261 | } | 266 | } |
262 | bool OPimTodoAccessXML::reload() { | 267 | bool OPimTodoAccessXML::reload() { |
263 | m_events.clear(); | 268 | m_events.clear(); |
264 | return load(); | 269 | return load(); |
265 | } | 270 | } |
266 | bool OPimTodoAccessXML::save() { | 271 | bool OPimTodoAccessXML::save() { |
267 | // qWarning("saving"); | 272 | // owarn << "saving" << oendl; |
268 | if (!m_opened || !m_changed ) { | 273 | if (!m_opened || !m_changed ) { |
269 | // qWarning("not saving"); | 274 | // owarn << "not saving" << oendl; |
270 | return true; | 275 | return true; |
271 | } | 276 | } |
272 | QString strNewFile = m_file + ".new"; | 277 | QString strNewFile = m_file + ".new"; |
273 | QFile f( strNewFile ); | 278 | QFile f( strNewFile ); |
274 | if (!f.open( IO_WriteOnly|IO_Raw ) ) | 279 | if (!f.open( IO_WriteOnly|IO_Raw ) ) |
275 | return false; | 280 | return false; |
@@ -304,13 +309,13 @@ bool OPimTodoAccessXML::save() { | |||
304 | return false; | 309 | return false; |
305 | } | 310 | } |
306 | /* flush before renaming */ | 311 | /* flush before renaming */ |
307 | f.close(); | 312 | f.close(); |
308 | 313 | ||
309 | if( ::rename( strNewFile.latin1(), m_file.latin1() ) < 0 ) { | 314 | if( ::rename( strNewFile.latin1(), m_file.latin1() ) < 0 ) { |
310 | // qWarning("error renaming"); | 315 | // owarn << "error renaming" << oendl; |
311 | QFile::remove( strNewFile ); | 316 | QFile::remove( strNewFile ); |
312 | } | 317 | } |
313 | 318 | ||
314 | m_changed = false; | 319 | m_changed = false; |
315 | return true; | 320 | return true; |
316 | } | 321 | } |
@@ -342,13 +347,13 @@ void OPimTodoAccessXML::clear() { | |||
342 | if (m_opened ) | 347 | if (m_opened ) |
343 | m_changed = true; | 348 | m_changed = true; |
344 | 349 | ||
345 | m_events.clear(); | 350 | m_events.clear(); |
346 | } | 351 | } |
347 | bool OPimTodoAccessXML::add( const OPimTodo& todo ) { | 352 | bool OPimTodoAccessXML::add( const OPimTodo& todo ) { |
348 | // qWarning("add"); | 353 | // owarn << "add" << oendl; |
349 | m_changed = true; | 354 | m_changed = true; |
350 | m_events.insert( todo.uid(), todo ); | 355 | m_events.insert( todo.uid(), todo ); |
351 | 356 | ||
352 | return true; | 357 | return true; |
353 | } | 358 | } |
354 | bool OPimTodoAccessXML::remove( int uid ) { | 359 | bool OPimTodoAccessXML::remove( int uid ) { |
@@ -401,19 +406,19 @@ QArray<int> OPimTodoAccessXML::overDue() { | |||
401 | } | 406 | } |
402 | 407 | ||
403 | 408 | ||
404 | /* private */ | 409 | /* private */ |
405 | void OPimTodoAccessXML::todo( QAsciiDict<int>* dict, OPimTodo& ev, | 410 | void OPimTodoAccessXML::todo( QAsciiDict<int>* dict, OPimTodo& ev, |
406 | const QCString& attr, const QString& val) { | 411 | const QCString& attr, const QString& val) { |
407 | // qWarning("parse to do from XMLElement" ); | 412 | // owarn << "parse to do from XMLElement" << oendl; |
408 | 413 | ||
409 | int *find=0; | 414 | int *find=0; |
410 | 415 | ||
411 | find = (*dict)[ attr.data() ]; | 416 | find = (*dict)[ attr.data() ]; |
412 | if (!find ) { | 417 | if (!find ) { |
413 | // qWarning("Unknown option" + it.key() ); | 418 | // owarn << "Unknown option" + it.key() << oendl; |
414 | ev.setCustomField( attr, val ); | 419 | ev.setCustomField( attr, val ); |
415 | return; | 420 | return; |
416 | } | 421 | } |
417 | 422 | ||
418 | switch( *find ) { | 423 | switch( *find ) { |
419 | case OPimTodo::Uid: | 424 | case OPimTodo::Uid: |
@@ -460,14 +465,14 @@ void OPimTodoAccessXML::todo( QAsciiDict<int>* dict, OPimTodo& ev, | |||
460 | break; | 465 | break; |
461 | case OPimTodo::Alarms:{ | 466 | case OPimTodo::Alarms:{ |
462 | OPimNotifyManager &manager = ev.notifiers(); | 467 | OPimNotifyManager &manager = ev.notifiers(); |
463 | QStringList als = QStringList::split(";", val ); | 468 | QStringList als = QStringList::split(";", val ); |
464 | for (QStringList::Iterator it = als.begin(); it != als.end(); ++it ) { | 469 | for (QStringList::Iterator it = als.begin(); it != als.end(); ++it ) { |
465 | QStringList alarm = QStringList::split(":", (*it), TRUE ); // allow empty | 470 | QStringList alarm = QStringList::split(":", (*it), TRUE ); // allow empty |
466 | qWarning("alarm: %s", alarm.join("___").latin1() ); | 471 | owarn << "alarm: " << alarm.join("___") << "" << oendl; |
467 | qWarning("alarm[0]: %s %s", alarm[0].latin1(), OPimDateConversion::dateTimeFromString( alarm[0] ).toString().latin1() ); | 472 | owarn << "alarm[0]: " << alarm[0] << " " << OPimDateConversion::dateTimeFromString( alarm[0] ).toString() << "" << oendl; |
468 | OPimAlarm al( alarm[2].toInt(), OPimDateConversion::dateTimeFromString( alarm[0] ), alarm[1].toInt() ); | 473 | OPimAlarm al( alarm[2].toInt(), OPimDateConversion::dateTimeFromString( alarm[0] ), alarm[1].toInt() ); |
469 | manager.add( al ); | 474 | manager.add( al ); |
470 | } | 475 | } |
471 | } | 476 | } |
472 | break; | 477 | break; |
473 | case OPimTodo::Reminders:{ | 478 | case OPimTodo::Reminders:{ |
@@ -534,21 +539,21 @@ void OPimTodoAccessXML::todo( QAsciiDict<int>* dict, OPimTodo& ev, | |||
534 | } | 539 | } |
535 | 540 | ||
536 | // from PalmtopRecord... GPL ### FIXME | 541 | // from PalmtopRecord... GPL ### FIXME |
537 | namespace { | 542 | namespace { |
538 | QString customToXml(const QMap<QString, QString>& customMap ) | 543 | QString customToXml(const QMap<QString, QString>& customMap ) |
539 | { | 544 | { |
540 | //qWarning(QString("writing custom %1").arg(customMap.count())); | 545 | //owarn << QString("writing custom %1").arg(customMap.count()) << oendl; |
541 | QString buf(" "); | 546 | QString buf(" "); |
542 | for ( QMap<QString, QString>::ConstIterator cit = customMap.begin(); | 547 | for ( QMap<QString, QString>::ConstIterator cit = customMap.begin(); |
543 | cit != customMap.end(); ++cit) { | 548 | cit != customMap.end(); ++cit) { |
544 | // qWarning(".ITEM."); | 549 | // owarn << ".ITEM." << oendl; |
545 | buf += cit.key(); | 550 | buf += cit.key(); |
546 | buf += "=\""; | 551 | buf += "=\""; |
547 | buf += Qtopia::escapeString(cit.data()); | 552 | buf += Qtopia::escapeString(cit.data()); |
548 | buf += "\" "; | 553 | buf += "\" "; |
549 | } | 554 | } |
550 | return buf; | 555 | return buf; |
551 | } | 556 | } |
552 | 557 | ||
553 | 558 | ||
554 | } | 559 | } |
@@ -567,13 +572,13 @@ QString OPimTodoAccessXML::toString( const OPimTodo& ev )const { | |||
567 | 572 | ||
568 | if ( ev.hasDueDate() ) { | 573 | if ( ev.hasDueDate() ) { |
569 | str += "DateYear=\"" + QString::number( ev.dueDate().year() ) + "\" "; | 574 | str += "DateYear=\"" + QString::number( ev.dueDate().year() ) + "\" "; |
570 | str += "DateMonth=\"" + QString::number( ev.dueDate().month() ) + "\" "; | 575 | str += "DateMonth=\"" + QString::number( ev.dueDate().month() ) + "\" "; |
571 | str += "DateDay=\"" + QString::number( ev.dueDate().day() ) + "\" "; | 576 | str += "DateDay=\"" + QString::number( ev.dueDate().day() ) + "\" "; |
572 | } | 577 | } |
573 | // qWarning( "Uid %d", ev.uid() ); | 578 | // owarn << "Uid " << ev.uid() << "" << oendl; |
574 | str += "Uid=\"" + QString::number( ev.uid() ) + "\" "; | 579 | str += "Uid=\"" + QString::number( ev.uid() ) + "\" "; |
575 | 580 | ||
576 | // append the extra options | 581 | // append the extra options |
577 | /* FIXME Qtopia::Record this is currently not | 582 | /* FIXME Qtopia::Record this is currently not |
578 | * possible you can set custom fields | 583 | * possible you can set custom fields |
579 | * but don' iterate over the list | 584 | * but don' iterate over the list |
@@ -614,13 +619,13 @@ QString OPimTodoAccessXML::toString( const OPimTodo& ev )const { | |||
614 | + ":" + QString::number( (*it).duration() ) | 619 | + ":" + QString::number( (*it).duration() ) |
615 | + ":" + QString::number( (*it).sound() ) | 620 | + ":" + QString::number( (*it).sound() ) |
616 | + ":"; | 621 | + ":"; |
617 | } | 622 | } |
618 | } | 623 | } |
619 | // now write the list | 624 | // now write the list |
620 | qWarning("als: %s", als.join("____________").latin1() ); | 625 | owarn << "als: " << als.join("____________") << "" << oendl; |
621 | str += "Alarms=\""+als.join(";") +"\" "; | 626 | str += "Alarms=\""+als.join(";") +"\" "; |
622 | } | 627 | } |
623 | 628 | ||
624 | /* | 629 | /* |
625 | * now the same for reminders but more easy. We just save the uid of the OPimEvent. | 630 | * now the same for reminders but more easy. We just save the uid of the OPimEvent. |
626 | */ | 631 | */ |
@@ -835,13 +840,13 @@ QArray<int> OPimTodoAccessXML::sorted( bool asc, int sortOrder, | |||
835 | }else if ( bCat && cat != 0) | 840 | }else if ( bCat && cat != 0) |
836 | if (!(*it).categories().contains( cat ) ) { | 841 | if (!(*it).categories().contains( cat ) ) { |
837 | continue; | 842 | continue; |
838 | } | 843 | } |
839 | /* isOverdue but we should not show overdue - why?*/ | 844 | /* isOverdue but we should not show overdue - why?*/ |
840 | /* if ( (*it).isOverdue() && !bOnly ) { | 845 | /* if ( (*it).isOverdue() && !bOnly ) { |
841 | qWarning("item is overdue but !bOnly"); | 846 | owarn << "item is overdue but !bOnly" << oendl; |
842 | continue; | 847 | continue; |
843 | } | 848 | } |
844 | */ | 849 | */ |
845 | if ( !(*it).isOverdue() && bOnly ) { | 850 | if ( !(*it).isOverdue() && bOnly ) { |
846 | continue; | 851 | continue; |
847 | } | 852 | } |
@@ -888,22 +893,22 @@ QBitArray OPimTodoAccessXML::sup() { | |||
888 | ar[OPimTodo::Maintainer] = false; | 893 | ar[OPimTodo::Maintainer] = false; |
889 | 894 | ||
890 | return ar; | 895 | return ar; |
891 | } | 896 | } |
892 | QArray<int> OPimTodoAccessXML::matchRegexp( const QRegExp &r ) const | 897 | QArray<int> OPimTodoAccessXML::matchRegexp( const QRegExp &r ) const |
893 | { | 898 | { |
894 | QArray<int> m_currentQuery( m_events.count() ); | 899 | QArray<int> m_currentQuery( m_events.count() ); |
895 | uint arraycounter = 0; | 900 | uint arraycounter = 0; |
896 | 901 | ||
897 | QMap<int, OPimTodo>::ConstIterator it; | 902 | QMap<int, OPimTodo>::ConstIterator it; |
898 | for (it = m_events.begin(); it != m_events.end(); ++it ) { | 903 | for (it = m_events.begin(); it != m_events.end(); ++it ) { |
899 | if ( it.data().match( r ) ) | 904 | if ( it.data().match( r ) ) |
900 | m_currentQuery[arraycounter++] = it.data().uid(); | 905 | m_currentQuery[arraycounter++] = it.data().uid(); |
901 | 906 | ||
902 | } | 907 | } |
903 | // Shrink to fit.. | 908 | // Shrink to fit.. |
904 | m_currentQuery.resize(arraycounter); | 909 | m_currentQuery.resize(arraycounter); |
905 | 910 | ||
906 | return m_currentQuery; | 911 | return m_currentQuery; |
907 | } | 912 | } |
908 | 913 | ||
909 | } | 914 | } |