summaryrefslogtreecommitdiff
path: root/libopie2/opiepim
authorar <ar>2004-06-01 21:38:07 (UTC)
committer ar <ar>2004-06-01 21:38:07 (UTC)
commitbaed1d5ab8589aef14440009bc4e7380bcc5a741 (patch) (unidiff)
treec636e892c5eec0df2b36d16cb601a7da41a2ef0f /libopie2/opiepim
parent4438393d8eef624565e840b798429071829adea8 (diff)
downloadopie-baed1d5ab8589aef14440009bc4e7380bcc5a741.zip
opie-baed1d5ab8589aef14440009bc4e7380bcc5a741.tar.gz
opie-baed1d5ab8589aef14440009bc4e7380bcc5a741.tar.bz2
- convert to odebug framework
Diffstat (limited to 'libopie2/opiepim') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp1326
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp894
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp1182
-rw-r--r--libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp579
-rw-r--r--libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp170
-rw-r--r--libopie2/opiepim/backend/otodoaccesssql.cpp444
-rw-r--r--libopie2/opiepim/backend/otodoaccessvcal.cpp20
-rw-r--r--libopie2/opiepim/backend/otodoaccessxml.cpp191
-rw-r--r--libopie2/opiepim/core/opimcontact.cpp20
-rw-r--r--libopie2/opiepim/core/opimcontactfields.cpp22
-rw-r--r--libopie2/opiepim/core/opimdateconversion.cpp12
-rw-r--r--libopie2/opiepim/core/opimevent.cpp24
-rw-r--r--libopie2/opiepim/core/opimnotifymanager.cpp7
-rw-r--r--libopie2/opiepim/core/opimrecord.cpp2
-rw-r--r--libopie2/opiepim/core/opimtimezone.cpp5
-rw-r--r--libopie2/opiepim/core/opimtodo.cpp22
-rw-r--r--libopie2/opiepim/core/otodoaccess.cpp2
-rw-r--r--libopie2/opiepim/ui/opimmainwindow.cpp19
18 files changed, 2498 insertions, 2443 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
@@ -27,826 +27,830 @@
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
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
50using namespace Opie; 54using namespace Opie;
51using namespace Opie::DB; 55using namespace Opie::DB;
52 56
53 57
54/* 58/*
55 * Implementation of used query types * CREATE query 59 * Implementation of used query types * CREATE query
56 * LOAD query 60 * LOAD query
57 * INSERT 61 * INSERT
58 * REMOVE 62 * REMOVE
59 * CLEAR 63 * CLEAR
60 */ 64 */
61namespace { 65namespace {
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
347namespace Opie { 351namespace Opie {
348 352
349OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */, 353OPimContactAccessBackend_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
373OPimContactAccessBackend_SQL::~OPimContactAccessBackend_SQL () 377OPimContactAccessBackend_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
379bool OPimContactAccessBackend_SQL::load () 383bool 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
396bool OPimContactAccessBackend_SQL::reload() 400bool OPimContactAccessBackend_SQL::reload()
397{ 401{
398 return load(); 402 return load();
399} 403}
400 404
401bool OPimContactAccessBackend_SQL::save() 405bool 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
407void OPimContactAccessBackend_SQL::clear () 411void 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
415bool OPimContactAccessBackend_SQL::wasChangedExternally() 419bool OPimContactAccessBackend_SQL::wasChangedExternally()
416{ 420{
417 return false; 421 return false;
418} 422}
419 423
420QArray<int> OPimContactAccessBackend_SQL::allRecords() const 424QArray<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
431bool OPimContactAccessBackend_SQL::add ( const OPimContact &newcontact ) 435bool 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
448bool OPimContactAccessBackend_SQL::remove ( int uid ) 452bool 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
461bool OPimContactAccessBackend_SQL::replace ( const OPimContact &contact ) 465bool 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
470OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const 474OPimContact 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
485QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd ) 489QArray<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
603QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const 607QArray<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
634const uint OPimContactAccessBackend_SQL::querySettings() 638const 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
645bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const 649bool 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
693QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) 697QArray<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
720void OPimContactAccessBackend_SQL::update() 724void 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
741QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const 745QArray<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
762QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const 766QMap<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
826QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const 830QMap<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
@@ -30,567 +30,569 @@
30 * VCard Backend for the OPIE-Contact Database. 30 * VCard Backend for the OPIE-Contact Database.
31 */ 31 */
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
45namespace Opie { 47namespace Opie {
46 48
47OPimContactAccessBackend_VCard::OPimContactAccessBackend_VCard ( const QString& , const QString& filename ): 49OPimContactAccessBackend_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
55bool OPimContactAccessBackend_VCard::load () 57bool 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}
93bool OPimContactAccessBackend_VCard::reload() 95bool OPimContactAccessBackend_VCard::reload()
94{ 96{
95 return load(); 97 return load();
96} 98}
97bool OPimContactAccessBackend_VCard::save() 99bool 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}
124void OPimContactAccessBackend_VCard::clear () 126void 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
130bool OPimContactAccessBackend_VCard::add ( const OPimContact& newcontact ) 132bool 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
137bool OPimContactAccessBackend_VCard::remove ( int uid ) 139bool 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
144bool OPimContactAccessBackend_VCard::replace ( const OPimContact &contact ) 146bool 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
151OPimContact OPimContactAccessBackend_VCard::find ( int uid ) const 153OPimContact OPimContactAccessBackend_VCard::find ( int uid ) const
152{ 154{
153 return m_map[uid]; 155 return m_map[uid];
154} 156}
155 157
156QArray<int> OPimContactAccessBackend_VCard::allRecords() const 158QArray<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
169QArray<int> OPimContactAccessBackend_VCard::queryByExample ( const OPimContact&, int, const QDateTime& ) 171QArray<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
176QArray<int> OPimContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const 178QArray<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
182const uint OPimContactAccessBackend_VCard::querySettings() 184const uint OPimContactAccessBackend_VCard::querySettings()
183{ 185{
184 return 0; // No search possible 186 return 0; // No search possible
185} 187}
186 188
187bool OPimContactAccessBackend_VCard::hasQuerySettings (uint ) const 189bool 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
192bool OPimContactAccessBackend_VCard::wasChangedExternally() 194bool 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
198QArray<int> OPimContactAccessBackend_VCard::sorted( bool , int, int, int ) 200QArray<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
207OPimContact OPimContactAccessBackend_VCard::parseVObject( VObject *obj ) 209OPimContact 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
435VObject* OPimContactAccessBackend_VCard::createVObject( const OPimContact &c ) 437VObject* 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
541QString OPimContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const 543QString 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
555QDate OPimContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) 557QDate 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
580VObject* OPimContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) 582VObject* 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
588VObject* OPimContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) 590VObject* 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
@@ -25,726 +25,730 @@
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 * 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
51using namespace Opie::Core; 55using namespace Opie::Core;
52 56
53 57
54namespace Opie { 58namespace Opie {
55OPimContactAccessBackend_XML::OPimContactAccessBackend_XML ( const QString& appname, const QString& filename ): 59OPimContactAccessBackend_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
79bool OPimContactAccessBackend_XML::save() 83bool 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
149bool OPimContactAccessBackend_XML::load () 153bool 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
168void OPimContactAccessBackend_XML::clear () 172void 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
176bool OPimContactAccessBackend_XML::wasChangedExternally() 180bool 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
185QArray<int> OPimContactAccessBackend_XML::allRecords() const 189QArray<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
198OPimContact OPimContactAccessBackend_XML::find ( int uid ) const 202OPimContact 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
211QArray<int> OPimContactAccessBackend_XML::queryByExample ( const OPimContact &query, int settings, 215QArray<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
353QArray<int> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const 357QArray<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
371const uint OPimContactAccessBackend_XML::querySettings() 375const 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
384bool OPimContactAccessBackend_XML::hasQuerySettings (uint querySettings) const 388bool 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..
432QArray<int> OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) 436QArray<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
460bool OPimContactAccessBackend_XML::add ( const OPimContact &newcontact ) 464bool 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
471bool OPimContactAccessBackend_XML::replace ( const OPimContact &contact ) 475bool 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
493bool OPimContactAccessBackend_XML::remove ( int uid ) 497bool 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
509bool OPimContactAccessBackend_XML::reload(){ 513bool 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
514void OPimContactAccessBackend_XML::addContact_p( const OPimContact &newcontact ) 518void 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 */
523bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal ) 527bool 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
715void OPimContactAccessBackend_XML::updateJournal( const OPimContact& cnt, 719void 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
743void OPimContactAccessBackend_XML::removeJournal() 747void 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
@@ -26,429 +26,434 @@
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 * 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
49using namespace Opie::DB; 54using namespace Opie::DB;
50 55
51namespace { 56namespace {
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
88namespace Opie { 93namespace Opie {
89 94
90 95
91ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& , 96ODateBookAccessBackend_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
107ODateBookAccessBackend_SQL::~ODateBookAccessBackend_SQL() { 112ODateBookAccessBackend_SQL::~ODateBookAccessBackend_SQL() {
108 if( m_driver ) 113 if( m_driver )
109 delete m_driver; 114 delete m_driver;
110} 115}
111 116
112void ODateBookAccessBackend_SQL::initFields() 117void 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
147bool ODateBookAccessBackend_SQL::load() 152bool 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
177void ODateBookAccessBackend_SQL::update() 182void 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
192bool ODateBookAccessBackend_SQL::reload() 197bool ODateBookAccessBackend_SQL::reload()
193{ 198{
194 return load(); 199 return load();
195} 200}
196 201
197bool ODateBookAccessBackend_SQL::save() 202bool 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
202QArray<int> ODateBookAccessBackend_SQL::allRecords()const 207QArray<int> ODateBookAccessBackend_SQL::allRecords()const
203{ 208{
204 return m_uids; 209 return m_uids;
205} 210}
206 211
207QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OPimEvent&, int, const QDateTime& ) { 212QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OPimEvent&, int, const QDateTime& ) {
208 return QArray<int>(); 213 return QArray<int>();
209} 214}
210 215
211void ODateBookAccessBackend_SQL::clear() 216void 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
223OPimEvent ODateBookAccessBackend_SQL::find( int uid ) const{ 228OPimEvent 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..
255bool ODateBookAccessBackend_SQL::add( const OPimEvent& ev ) 260bool 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..
301bool ODateBookAccessBackend_SQL::remove( int uid ) 306bool 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
320bool ODateBookAccessBackend_SQL::replace( const OPimEvent& ev ) 325bool 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
326QArray<int> ODateBookAccessBackend_SQL::rawEvents()const 331QArray<int> ODateBookAccessBackend_SQL::rawEvents()const
327{ 332{
328 return allRecords(); 333 return allRecords();
329} 334}
330 335
331QArray<int> ODateBookAccessBackend_SQL::rawRepeats()const 336QArray<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
344QArray<int> ODateBookAccessBackend_SQL::nonRepeats()const 349QArray<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
357OPimEvent::ValueList ODateBookAccessBackend_SQL::directNonRepeats() 362OPimEvent::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}
369OPimEvent::ValueList ODateBookAccessBackend_SQL::directRawRepeats() 374OPimEvent::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
382QArray<int> ODateBookAccessBackend_SQL::matchRegexp( const QRegExp &r ) const 387QArray<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
406QArray<int> ODateBookAccessBackend_SQL::extractUids( OSQLResult& res ) const 411QArray<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
427QMap<QString, QString> ODateBookAccessBackend_SQL::requestCustom( int uid ) const 432QMap<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
@@ -21,64 +21,70 @@
21 : = ...= . :.=- 21 : = ...= . :.=-
22 -. .:....=;==+<; You should have received a copy of the GNU 22 -. .:....=;==+<; You should have received a copy of the GNU
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
53using namespace Opie; 59using namespace Opie;
54 60
55namespace { 61namespace {
56 // FROM TT again 62 // FROM TT again
57char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) 63char *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
82namespace { 88namespace {
83 time_t start, end, created, rp_end; 89 time_t start, end, created, rp_end;
84 OPimRecurrence* rec; 90 OPimRecurrence* rec;
@@ -91,46 +97,46 @@ namespace {
91 int alarmTime; 97 int alarmTime;
92 int snd; 98 int snd;
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 )
135 buf += "loud"; 141 buf += "loud";
136 else 142 else
@@ -414,56 +420,56 @@ bool ODateBookAccessBackend_XML::loadFile() {
414 alarmTime = -1; 420 alarmTime = -1;
415 snd = 0; // silent 421 snd = 0; // silent
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)
468 ev.setCustomField( attr, str ); 474 ev.setCustomField( attr, str );
469 else { 475 else {
@@ -485,20 +491,20 @@ void ODateBookAccessBackend_XML::finalizeRecord( OPimEvent& ev ) {
485 /* AllDay is alway in UTC */ 491 /* AllDay is alway in UTC */
486 if ( ev.isAllDay() ) { 492 if ( ev.isAllDay() ) {
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() ) {
503 OPimTimeZone utc = OPimTimeZone::utc(); 509 OPimTimeZone utc = OPimTimeZone::utc();
504 OPimRecurrence recu( *rec ); // call copy c'tor; 510 OPimRecurrence recu( *rec ); // call copy c'tor;
@@ -509,28 +515,28 @@ void ODateBookAccessBackend_XML::finalizeRecord( OPimEvent& ev ) {
509 } 515 }
510 516
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}
527void ODateBookAccessBackend_XML::setField( OPimEvent& e, int id, const QString& value) { 533void 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 );
535 break; 541 break;
536 case FCategories: 542 case FCategories:
@@ -605,17 +611,17 @@ void ODateBookAccessBackend_XML::setField( OPimEvent& e, int id, const QString&
605 e.addChild( (*it).toInt() ); 611 e.addChild( (*it).toInt() );
606 } 612 }
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" )
620 e.setTimeZone( value ); 626 e.setTimeZone( value );
621 break; 627 break;
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
@@ -23,31 +23,35 @@
23 -. .:....=;==+<; You should have received a copy of the GNU 23 -. .:....=;==+<; You should have received a copy of the GNU
24 -_. . . )=. = Library General Public License along with 24 -_. . . )=. = Library General Public License along with
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
47using namespace Opie::DB; 51using namespace Opie::DB;
48 52
49using namespace Opie; 53using namespace Opie;
50/* 54/*
51 * first some query 55 * first some query
52 * CREATE query 56 * CREATE query
53 * LOAD query 57 * LOAD query
@@ -146,52 +150,52 @@ namespace {
146 QString with()const; 150 QString with()const;
147 QString out()const; 151 QString out()const;
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
196 InsertQuery::InsertQuery( const OPimTodo& todo ) 200 InsertQuery::InsertQuery( const OPimTodo& todo )
197 : OSQLQuery(), m_todo( todo ) { 201 : OSQLQuery(), m_todo( todo ) {
@@ -208,104 +212,104 @@ namespace {
208 212
209 int year, month, day; 213 int year, month, day;
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() {}
310 ClearQuery::~ClearQuery() {} 314 ClearQuery::~ClearQuery() {}
311 QString ClearQuery::query()const { 315 QString ClearQuery::query()const {
@@ -340,90 +344,90 @@ namespace {
340 } 344 }
341 345
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 )
357 : OSQLQuery(), m_start( start ), m_end( end ),m_inc(inc) {} 361 : OSQLQuery(), m_start( start ), m_end( end ),m_inc(inc) {}
358 EffQuery::~EffQuery() {} 362 EffQuery::~EffQuery() {}
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
406namespace Opie { 410namespace Opie {
407OPimTodoAccessBackendSQL::OPimTodoAccessBackendSQL( const QString& file ) 411OPimTodoAccessBackendSQL::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
419OPimTodoAccessBackendSQL::~OPimTodoAccessBackendSQL(){ 423OPimTodoAccessBackendSQL::~OPimTodoAccessBackendSQL(){
420 if( m_driver ) 424 if( m_driver )
421 delete m_driver; 425 delete m_driver;
422} 426}
423 427
424bool OPimTodoAccessBackendSQL::load(){ 428bool OPimTodoAccessBackendSQL::load(){
425 if (!m_driver->open() ) 429 if (!m_driver->open() )
426 return false; 430 return false;
427 431
428 CreateQuery creat; 432 CreateQuery creat;
429 OSQLResult res = m_driver->query(&creat ); 433 OSQLResult res = m_driver->query(&creat );
@@ -451,27 +455,27 @@ QArray<int> OPimTodoAccessBackendSQL::queryByExample( const OPimTodo& , int, con
451OPimTodo OPimTodoAccessBackendSQL::find(int uid ) const{ 455OPimTodo OPimTodoAccessBackendSQL::find(int uid ) const{
452 FindQuery query( uid ); 456 FindQuery query( uid );
453 return todo( m_driver->query(&query) ); 457 return todo( m_driver->query(&query) );
454 458
455} 459}
456OPimTodo OPimTodoAccessBackendSQL::find( int uid, const QArray<int>& ints, 460OPimTodo 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)
476 for (uint i = cur; i != 0 && size < CACHE; i-- ) { 480 for (uint i = cur; i != 0 && size < CACHE; i-- ) {
477 search[size] = ints[i]; 481 search[size] = ints[i];
@@ -536,17 +540,17 @@ QArray<int> OPimTodoAccessBackendSQL::effectiveToDos( const QDate& s,
536 EffQuery ef(s, t, u ); 540 EffQuery ef(s, t, u );
537 return uids (m_driver->query(&ef) ); 541 return uids (m_driver->query(&ef) );
538} 542}
539/* 543/*
540 * 544 *
541 */ 545 */
542QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder, 546QArray<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
551 * FIXME: Replace magic numbers 555 * FIXME: Replace magic numbers
552 * 556 *
@@ -558,19 +562,19 @@ QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder,
558 query += " categories like '%" +str+"%' AND"; 562 query += " categories like '%" +str+"%' AND";
559 } 563 }
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{
575 query += " ( completed = 1 OR completed = 0) AND"; 579 query += " ( completed = 1 OR completed = 0) AND";
576 } 580 }
@@ -595,21 +599,21 @@ QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder,
595 query += "summary"; 599 query += "summary";
596 break; 600 break;
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}
611bool OPimTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ 615bool 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;
614 else{ 618 else{
615 int day, year, month; 619 int day, year, month;
@@ -624,57 +628,57 @@ bool OPimTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{
624OPimTodo OPimTodoAccessBackendSQL::todo( const OSQLResult& res ) const{ 628OPimTodo OPimTodoAccessBackendSQL::todo( const OSQLResult& res ) const{
625 if ( res.state() == OSQLResult::Failure ) { 629 if ( res.state() == OSQLResult::Failure ) {
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}
643OPimTodo OPimTodoAccessBackendSQL::todo( OSQLResultItem& item )const { 647OPimTodo 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;
679 pimState.setState( QString( item.data("state") ).toInt() ); 683 pimState.setState( QString( item.data("state") ).toInt() );
680 to.setState( pimState ); 684 to.setState( pimState );
@@ -745,136 +749,136 @@ void OPimTodoAccessBackendSQL::update()const {
745 749
746 ((OPimTodoAccessBackendSQL*)this)->m_uids = uids( res ); 750 ((OPimTodoAccessBackendSQL*)this)->m_uids = uids( res );
747} 751}
748QArray<int> OPimTodoAccessBackendSQL::uids( const OSQLResult& res) const{ 752QArray<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 }
760 return ints; 764 return ints;
761} 765}
762 766
763QArray<int> OPimTodoAccessBackendSQL::matchRegexp( const QRegExp &r ) const 767QArray<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}
790QBitArray OPimTodoAccessBackendSQL::supports()const { 794QBitArray OPimTodoAccessBackendSQL::supports()const {
791 795
792 return sup(); 796 return sup();
793} 797}
794 798
795QBitArray OPimTodoAccessBackendSQL::sup() const{ 799QBitArray 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
808void OPimTodoAccessBackendSQL::removeAllCompleted(){ 812void 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
855QMap<QString, QString> OPimTodoAccessBackendSQL::requestCustom( int uid ) const 859QMap<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
@@ -22,21 +22,25 @@
22 -. .:....=;==+<; You should have received a copy of the GNU 22 -. .:....=;==+<; You should have received a copy of the GNU
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 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
40using namespace Opie; 44using namespace Opie;
41 45
42namespace { 46namespace {
@@ -83,17 +87,17 @@ namespace {
83 if((ob = isAPropertyOf(obj, VCDueProp)) ){ 87 if((ob = isAPropertyOf(obj, VCDueProp)) ){
84 event.setHasDueDate( true ); 88 event.setHasDueDate( true );
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 ) {
98 VObject *task = newVObject( VCTodoProp ); 102 VObject *task = newVObject( VCTodoProp );
99 if( task == 0 ) 103 if( task == 0 )
@@ -112,35 +116,35 @@ namespace {
112 QString string = QString::number(event.priority() ); 116 QString string = QString::number(event.priority() );
113 addPropValue( task, VCPriorityProp, string.local8Bit() ); 117 addPropValue( task, VCPriorityProp, string.local8Bit() );
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,
130 event.summary().local8Bit() ); 134 event.summary().local8Bit() );
131 135
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
143namespace Opie { 147namespace Opie {
144OPimTodoAccessVCal::OPimTodoAccessVCal( const QString& path ) 148OPimTodoAccessVCal::OPimTodoAccessVCal( const QString& path )
145 : m_dirty(false), m_file( path ) 149 : m_dirty(false), m_file( path )
146{ 150{
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
@@ -21,40 +21,45 @@
21 : = ...= . :.=- 21 : = ...= . :.=-
22 -. .:....=;==+<; You should have received a copy of the GNU 22 -. .:....=;==+<; You should have received a copy of the GNU
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
53using namespace Opie; 58using namespace Opie;
54 59
55namespace { 60namespace {
56 time_t rp_end; 61 time_t rp_end;
57 OPimRecurrence* rec; 62 OPimRecurrence* rec;
58 OPimRecurrence *recur() { 63 OPimRecurrence *recur() {
59 if (!rec ) rec = new OPimRecurrence; 64 if (!rec ) rec = new OPimRecurrence;
60 return rec; 65 return rec;
@@ -71,31 +76,31 @@ namespace {
71 FREnd 76 FREnd
72 }; 77 };
73 // FROM TT again 78 // FROM TT again
74char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) 79char *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
99namespace Opie { 104namespace Opie {
100 105
101OPimTodoAccessXML::OPimTodoAccessXML( const QString& appName, 106OPimTodoAccessXML::OPimTodoAccessXML( const QString& appName,
@@ -172,73 +177,73 @@ bool OPimTodoAccessXML::load() {
172 int len = attribut.st_size; 177 int len = attribut.st_size;
173 int i = 0; 178 int i = 0;
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) );
243 } 248 }
244 if ( rec && rec->doesRecur() ) { 249 if ( rec && rec->doesRecur() ) {
@@ -251,27 +256,27 @@ bool OPimTodoAccessXML::load() {
251 m_events.insert(ev.uid(), ev ); 256 m_events.insert(ev.uid(), ev );
252 m_year = m_month = m_day = -1; 257 m_year = m_month = m_day = -1;
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}
262bool OPimTodoAccessXML::reload() { 267bool OPimTodoAccessXML::reload() {
263 m_events.clear(); 268 m_events.clear();
264 return load(); 269 return load();
265} 270}
266bool OPimTodoAccessXML::save() { 271bool 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;
276 281
277 int written; 282 int written;
@@ -302,17 +307,17 @@ bool OPimTodoAccessXML::save() {
302 f.close(); 307 f.close();
303 QFile::remove( strNewFile ); 308 QFile::remove( strNewFile );
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}
317QArray<int> OPimTodoAccessXML::allRecords()const { 322QArray<int> OPimTodoAccessXML::allRecords()const {
318 QArray<int> ids( m_events.count() ); 323 QArray<int> ids( m_events.count() );
@@ -340,17 +345,17 @@ OPimTodo OPimTodoAccessXML::find( int uid )const {
340} 345}
341void OPimTodoAccessXML::clear() { 346void 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}
347bool OPimTodoAccessXML::add( const OPimTodo& todo ) { 352bool 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}
354bool OPimTodoAccessXML::remove( int uid ) { 359bool OPimTodoAccessXML::remove( int uid ) {
355 m_changed = true; 360 m_changed = true;
356 m_events.remove( uid ); 361 m_events.remove( uid );
@@ -399,23 +404,23 @@ QArray<int> OPimTodoAccessXML::overDue() {
399 ids.resize( i ); 404 ids.resize( i );
400 return ids; 405 return ids;
401} 406}
402 407
403 408
404/* private */ 409/* private */
405void OPimTodoAccessXML::todo( QAsciiDict<int>* dict, OPimTodo& ev, 410void 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:
420 ev.setUid( val.toInt() ); 425 ev.setUid( val.toInt() );
421 break; 426 break;
@@ -458,18 +463,18 @@ void OPimTodoAccessXML::todo( QAsciiDict<int>* dict, OPimTodo& ev,
458 case OPimTodo::State: 463 case OPimTodo::State:
459 ev.setState( val.toInt() ); 464 ev.setState( val.toInt() );
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:{
474 OPimNotifyManager &manager = ev.notifiers(); 479 OPimNotifyManager &manager = ev.notifiers();
475 QStringList rems = QStringList::split(";", val ); 480 QStringList rems = QStringList::split(";", val );
@@ -532,25 +537,25 @@ void OPimTodoAccessXML::todo( QAsciiDict<int>* dict, OPimTodo& ev,
532 break; 537 break;
533 } 538 }
534} 539}
535 540
536// from PalmtopRecord... GPL ### FIXME 541// from PalmtopRecord... GPL ### FIXME
537namespace { 542namespace {
538QString customToXml(const QMap<QString, QString>& customMap ) 543QString 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}
555 560
556QString OPimTodoAccessXML::toString( const OPimTodo& ev )const { 561QString OPimTodoAccessXML::toString( const OPimTodo& ev )const {
@@ -565,17 +570,17 @@ QString OPimTodoAccessXML::toString( const OPimTodo& ev )const {
565 str += "Description=\"" + Qtopia::escapeString( ev.description() ) + "\" "; 570 str += "Description=\"" + Qtopia::escapeString( ev.description() ) + "\" ";
566 str += "Summary=\"" + Qtopia::escapeString( ev.summary() ) + "\" "; 571 str += "Summary=\"" + Qtopia::escapeString( ev.summary() ) + "\" ";
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
580 * I may do #define private protected 585 * I may do #define private protected
581 * for this case - cough --zecke 586 * for this case - cough --zecke
@@ -612,17 +617,17 @@ QString OPimTodoAccessXML::toString( const OPimTodo& ev )const {
612 if ( (*it).dateTime().isValid() ) { 617 if ( (*it).dateTime().isValid() ) {
613 als << OPimDateConversion::dateTimeToString( (*it).dateTime() ) 618 als << OPimDateConversion::dateTimeToString( (*it).dateTime() )
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 */
627 OPimNotifyManager::Reminders reminders = manager.reminders(); 632 OPimNotifyManager::Reminders reminders = manager.reminders();
628 if (!reminders.isEmpty() ) { 633 if (!reminders.isEmpty() ) {
@@ -833,17 +838,17 @@ QArray<int> OPimTodoAccessXML::sorted( bool asc, int sortOrder,
833 if(!(*it).categories().isEmpty() ) 838 if(!(*it).categories().isEmpty() )
834 continue; 839 continue;
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 }
848 853
849 if ((*it).isCompleted() && comp ) { 854 if ((*it).isCompleted() && comp ) {
@@ -886,24 +891,24 @@ QBitArray OPimTodoAccessXML::sup() {
886 ar[OPimTodo::Reminders] = false; 891 ar[OPimTodo::Reminders] = false;
887 ar[OPimTodo::Notifiers] = false; 892 ar[OPimTodo::Notifiers] = false;
888 ar[OPimTodo::Maintainer] = false; 893 ar[OPimTodo::Maintainer] = false;
889 894
890 return ar; 895 return ar;
891} 896}
892QArray<int> OPimTodoAccessXML::matchRegexp( const QRegExp &r ) const 897QArray<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}
diff --git a/libopie2/opiepim/core/opimcontact.cpp b/libopie2/opiepim/core/opimcontact.cpp
index c1e06c8..48a74d0 100644
--- a/libopie2/opiepim/core/opimcontact.cpp
+++ b/libopie2/opiepim/core/opimcontact.cpp
@@ -29,16 +29,18 @@
29 29
30#define QTOPIA_INTERNAL_CONTACT_MRE 30#define QTOPIA_INTERNAL_CONTACT_MRE
31 31
32#include "opimcontact.h" 32#include "opimcontact.h"
33 33
34/* OPIE */ 34/* OPIE */
35#include <opie2/opimresolver.h> 35#include <opie2/opimresolver.h>
36#include <opie2/opimdateconversion.h> 36#include <opie2/opimdateconversion.h>
37#include <opie2/odebug.h>
38
37#include <qpe/stringutil.h> 39#include <qpe/stringutil.h>
38#include <qpe/timestring.h> 40#include <qpe/timestring.h>
39#include <qpe/config.h> 41#include <qpe/config.h>
40 42
41/* QT */ 43/* QT */
42#include <qstylesheet.h> 44#include <qstylesheet.h>
43 45
44/* STD */ 46/* STD */
@@ -74,24 +76,24 @@ OPimContact::OPimContact( const QMap<int, QString> &fromMap ):OPimRecord(), mMap
74 QString cats = mMap[ Qtopia::AddressCategory ]; 76 QString cats = mMap[ Qtopia::AddressCategory ];
75 if ( !cats.isEmpty() ) 77 if ( !cats.isEmpty() )
76 setCategories( idsFromString( cats ) ); 78 setCategories( idsFromString( cats ) );
77 79
78 QString uidStr = find( Qtopia::AddressUid ); 80 QString uidStr = find( Qtopia::AddressUid );
79 81
80 if ( uidStr.isEmpty() || ( uidStr.toInt() == 0 ) ) 82 if ( uidStr.isEmpty() || ( uidStr.toInt() == 0 ) )
81 { 83 {
82 qWarning( "Invalid UID found. Generate new one.." ); 84 owarn << "Invalid UID found. Generate new one.." << oendl;
83 setUid( uidGen().generate() ); 85 setUid( uidGen().generate() );
84 } 86 }
85 else 87 else
86 setUid( uidStr.toInt() ); 88 setUid( uidStr.toInt() );
87 89
88 // if ( !uidStr.isEmpty() ) 90 // if ( !uidStr.isEmpty() )
89 // setUid( uidStr.toInt() ); 91 // setUid( uidStr.toInt() );
90} 92}
91 93
92/*! 94/*!
93 Destroys a contact. 95 Destroys a contact.
94*/ 96*/
95OPimContact::~OPimContact() 97OPimContact::~OPimContact()
96{} 98{}
97 99
@@ -926,17 +928,17 @@ QStringList OPimContact::childrenList() const
926*/ 928*/
927QStringList OPimContact::emailList() const 929QStringList OPimContact::emailList() const
928{ 930{
929 QString emailStr = emails(); 931 QString emailStr = emails();
930 932
931 QStringList r; 933 QStringList r;
932 if ( !emailStr.isEmpty() ) 934 if ( !emailStr.isEmpty() )
933 { 935 {
934 qDebug( " emailstr " ); 936 odebug << " emailstr " << oendl;
935 QStringList l = QStringList::split( emailSeparator(), emailStr ); 937 QStringList l = QStringList::split( emailSeparator(), emailStr );
936 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) 938 for ( QStringList::ConstIterator it = l.begin();it != l.end();++it )
937 r += ( *it ).simplifyWhiteSpace(); 939 r += ( *it ).simplifyWhiteSpace();
938 } 940 }
939 941
940 return r; 942 return r;
941} 943}
942 944
@@ -1131,17 +1133,17 @@ class QString OPimContact::recordField( int pos ) const
1131/*! \fn void OPimContact::setBirthday( const QDate& date ) 1133/*! \fn void OPimContact::setBirthday( const QDate& date )
1132 Sets the birthday for the contact to \a date. If date is null 1134 Sets the birthday for the contact to \a date. If date is null
1133 the current stored date will be removed. 1135 the current stored date will be removed.
1134*/ 1136*/
1135void OPimContact::setBirthday( const QDate &v ) 1137void OPimContact::setBirthday( const QDate &v )
1136{ 1138{
1137 if ( v.isNull() ) 1139 if ( v.isNull() )
1138 { 1140 {
1139 qWarning( "Remove Birthday" ); 1141 owarn << "Remove Birthday" << oendl;
1140 replace( Qtopia::Birthday, QString::null ); 1142 replace( Qtopia::Birthday, QString::null );
1141 return ; 1143 return ;
1142 } 1144 }
1143 1145
1144 if ( v.isValid() ) 1146 if ( v.isValid() )
1145 replace( Qtopia::Birthday, OPimDateConversion::dateToString( v ) ); 1147 replace( Qtopia::Birthday, OPimDateConversion::dateToString( v ) );
1146 1148
1147} 1149}
@@ -1150,17 +1152,17 @@ void OPimContact::setBirthday( const QDate &v )
1150/*! \fn void OPimContact::setAnniversary( const QDate &date ) 1152/*! \fn void OPimContact::setAnniversary( const QDate &date )
1151 Sets the anniversary of the contact to \a date. If date is 1153 Sets the anniversary of the contact to \a date. If date is
1152 null, the current stored date will be removed. 1154 null, the current stored date will be removed.
1153*/ 1155*/
1154void OPimContact::setAnniversary( const QDate &v ) 1156void OPimContact::setAnniversary( const QDate &v )
1155{ 1157{
1156 if ( v.isNull() ) 1158 if ( v.isNull() )
1157 { 1159 {
1158 qWarning( "Remove Anniversary" ); 1160 owarn << "Remove Anniversary" << oendl;
1159 replace( Qtopia::Anniversary, QString::null ); 1161 replace( Qtopia::Anniversary, QString::null );
1160 return ; 1162 return ;
1161 } 1163 }
1162 1164
1163 if ( v.isValid() ) 1165 if ( v.isValid() )
1164 replace( Qtopia::Anniversary, OPimDateConversion::dateToString( v ) ); 1166 replace( Qtopia::Anniversary, OPimDateConversion::dateToString( v ) );
1165} 1167}
1166 1168
@@ -1191,17 +1193,17 @@ QDate OPimContact::anniversary() const
1191 return OPimDateConversion::dateFromString ( str ); 1193 return OPimDateConversion::dateFromString ( str );
1192 else 1194 else
1193 return empty; 1195 return empty;
1194} 1196}
1195 1197
1196 1198
1197void OPimContact::insertEmail( const QString &v ) 1199void OPimContact::insertEmail( const QString &v )
1198{ 1200{
1199 //qDebug("insertEmail %s", v.latin1()); 1201 //odebug << "insertEmail " << v << "" << oendl;
1200 QString e = v.simplifyWhiteSpace(); 1202 QString e = v.simplifyWhiteSpace();
1201 QString def = defaultEmail(); 1203 QString def = defaultEmail();
1202 1204
1203 // if no default, set it as the default email and don't insert 1205 // if no default, set it as the default email and don't insert
1204 if ( def.isEmpty() ) 1206 if ( def.isEmpty() )
1205 { 1207 {
1206 setDefaultEmail( e ); // will insert into the list for us 1208 setDefaultEmail( e ); // will insert into the list for us
1207 return ; 1209 return ;
@@ -1225,26 +1227,26 @@ void OPimContact::insertEmail( const QString &v )
1225 QString emailsStr = find( Qtopia::Emails ); 1227 QString emailsStr = find( Qtopia::Emails );
1226 QStringList emails = emailList(); 1228 QStringList emails = emailList();
1227 1229
1228 // otherwise, must first contain it 1230 // otherwise, must first contain it
1229 if ( !emailsStr.contains( e ) ) 1231 if ( !emailsStr.contains( e ) )
1230 return ; 1232 return ;
1231 1233
1232 // remove it 1234 // remove it
1233 //qDebug(" removing email from list %s", e.latin1()); 1235 //odebug << " removing email from list " << e << "" << oendl;
1234 emails.remove( e ); 1236 emails.remove( e );
1235 // reset the string 1237 // reset the string
1236 emailsStr = emails.join( emailSeparator() ); // Sharp's brain dead separator 1238 emailsStr = emails.join( emailSeparator() ); // Sharp's brain dead separator
1237 replace( Qtopia::Emails, emailsStr ); 1239 replace( Qtopia::Emails, emailsStr );
1238 1240
1239 // if default, then replace the default email with the first one 1241 // if default, then replace the default email with the first one
1240 if ( def == e ) 1242 if ( def == e )
1241 { 1243 {
1242 //qDebug("removeEmail is default; setting new default"); 1244 //odebug << "removeEmail is default; setting new default" << oendl;
1243 if ( !emails.count() ) 1245 if ( !emails.count() )
1244 clearEmails(); 1246 clearEmails();
1245 else // setDefaultEmail will remove e from the list 1247 else // setDefaultEmail will remove e from the list
1246 setDefaultEmail( emails.first() ); 1248 setDefaultEmail( emails.first() );
1247 } 1249 }
1248} 1250}
1249 1251
1250 1252
@@ -1254,17 +1256,17 @@ void OPimContact::clearEmails()
1254 mMap.remove( Qtopia::Emails ); 1256 mMap.remove( Qtopia::Emails );
1255} 1257}
1256 1258
1257 1259
1258void OPimContact::setDefaultEmail( const QString &v ) 1260void OPimContact::setDefaultEmail( const QString &v )
1259{ 1261{
1260 QString e = v.simplifyWhiteSpace(); 1262 QString e = v.simplifyWhiteSpace();
1261 1263
1262 //qDebug("OPimContact::setDefaultEmail %s", e.latin1()); 1264 //odebug << "OPimContact::setDefaultEmail " << e << "" << oendl;
1263 replace( Qtopia::DefaultEmail, e ); 1265 replace( Qtopia::DefaultEmail, e );
1264 1266
1265 if ( !e.isEmpty() ) 1267 if ( !e.isEmpty() )
1266 insertEmail( e ); 1268 insertEmail( e );
1267 1269
1268} 1270}
1269 1271
1270 1272
diff --git a/libopie2/opiepim/core/opimcontactfields.cpp b/libopie2/opiepim/core/opimcontactfields.cpp
index 120beb6..5d45d1f 100644
--- a/libopie2/opiepim/core/opimcontactfields.cpp
+++ b/libopie2/opiepim/core/opimcontactfields.cpp
@@ -26,16 +26,18 @@
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#include "opimcontactfields.h" 30#include "opimcontactfields.h"
31 31
32/* OPIE */ 32/* OPIE */
33#include <opie2/opimcontact.h> 33#include <opie2/opimcontact.h>
34#include <opie2/odebug.h>
35
34#include <qpe/config.h> 36#include <qpe/config.h>
35 37
36/* QT */ 38/* QT */
37#include <qobject.h> 39#include <qobject.h>
38 40
39 41
40namespace Opie 42namespace Opie
41{ 43{
@@ -437,80 +439,80 @@ OPimContactFields::~OPimContactFields()
437 } 439 }
438} 440}
439 441
440 442
441 443
442void OPimContactFields::saveToRecord( OPimContact &cnt ) 444void OPimContactFields::saveToRecord( OPimContact &cnt )
443{ 445{
444 446
445 qDebug( "ocontactfields saveToRecord: >%s<", fieldOrder.latin1() ); 447 odebug << "ocontactfields saveToRecord: >" << fieldOrder << "<" << oendl;
446 448
447 // Store fieldorder into this contact. 449 // Store fieldorder into this contact.
448 cnt.setCustomField( CONTACT_FIELD_ORDER_NAME, fieldOrder ); 450 cnt.setCustomField( CONTACT_FIELD_ORDER_NAME, fieldOrder );
449 451
450 globalFieldOrder = fieldOrder; 452 globalFieldOrder = fieldOrder;
451 changedFieldOrder = true; 453 changedFieldOrder = true;
452 454
453} 455}
454 456
455void OPimContactFields::loadFromRecord( const OPimContact &cnt ) 457void OPimContactFields::loadFromRecord( const OPimContact &cnt )
456{ 458{
457 qDebug( "ocontactfields loadFromRecord" ); 459 odebug << "ocontactfields loadFromRecord" << oendl;
458 qDebug( "loading >%s<", cnt.fullName().latin1() ); 460 odebug << "loading >" << cnt.fullName() << "<" << oendl;
459 461
460 // Get fieldorder for this contact. If none is defined, 462 // Get fieldorder for this contact. If none is defined,
461 // we will use the global one from the config file.. 463 // we will use the global one from the config file..
462 464
463 fieldOrder = cnt.customField( CONTACT_FIELD_ORDER_NAME ); 465 fieldOrder = cnt.customField( CONTACT_FIELD_ORDER_NAME );
464 466
465 qDebug( "fieldOrder from contact>%s<", fieldOrder.latin1() ); 467 odebug << "fieldOrder from contact>" << fieldOrder << "<" << oendl;
466 468
467 if ( fieldOrder.isEmpty() ) 469 if ( fieldOrder.isEmpty() )
468 { 470 {
469 fieldOrder = globalFieldOrder; 471 fieldOrder = globalFieldOrder;
470 } 472 }
471 473
472 474
473 qDebug( "effective fieldOrder in loadFromRecord >%s<", fieldOrder.latin1() ); 475 odebug << "effective fieldOrder in loadFromRecord >" << fieldOrder << "<" << oendl;
474} 476}
475 477
476void OPimContactFields::setFieldOrder( int num, int index ) 478void OPimContactFields::setFieldOrder( int num, int index )
477{ 479{
478 qDebug( "qcontactfields setfieldorder pos %i -> %i", num, index ); 480 odebug << "qcontactfields setfieldorder pos " << num << " -> " << index << "" << oendl;
479 481
480 fieldOrder[ num ] = QString::number( index, 16 ) [ 0 ]; 482 fieldOrder[ num ] = QString::number( index, 16 ) [ 0 ];
481 483
482 // We will store this new fieldorder globally to 484 // We will store this new fieldorder globally to
483 // remember it for contacts which have none 485 // remember it for contacts which have none
484 globalFieldOrder = fieldOrder; 486 globalFieldOrder = fieldOrder;
485 changedFieldOrder = true; 487 changedFieldOrder = true;
486 488
487 qDebug( "fieldOrder >%s<", fieldOrder.latin1() ); 489 odebug << "fieldOrder >" << fieldOrder << "<" << oendl;
488} 490}
489 491
490int OPimContactFields::getFieldOrder( int num, int defIndex ) 492int OPimContactFields::getFieldOrder( int num, int defIndex )
491{ 493{
492 qDebug( "ocontactfields getFieldOrder" ); 494 odebug << "ocontactfields getFieldOrder" << oendl;
493 qDebug( "fieldOrder >%s<", fieldOrder.latin1() ); 495 odebug << "fieldOrder >" << fieldOrder << "<" << oendl;
494 496
495 // Get index of combo as char.. 497 // Get index of combo as char..
496 QChar poschar = fieldOrder[ num ]; 498 QChar poschar = fieldOrder[ num ];
497 499
498 bool ok; 500 bool ok;
499 int ret = 0; 501 int ret = 0;
500 // Convert char to number.. 502 // Convert char to number..
501 if ( !( poschar == QChar::null ) ) 503 if ( !( poschar == QChar::null ) )
502 ret = QString( poschar ).toInt( &ok, 16 ); 504 ret = QString( poschar ).toInt( &ok, 16 );
503 else 505 else
504 ok = false; 506 ok = false;
505 507
506 // Return default value if index for 508 // Return default value if index for
507 // num was not set or if anything else happened.. 509 // num was not set or if anything else happened..
508 if ( !ok ) ret = defIndex; 510 if ( !ok ) ret = defIndex;
509 511
510 qDebug( "returning >%i<", ret ); 512 odebug << "returning >" << ret << "<" << oendl;
511 513
512 return ret; 514 return ret;
513 515
514} 516}
515 517
516} 518}
diff --git a/libopie2/opiepim/core/opimdateconversion.cpp b/libopie2/opiepim/core/opimdateconversion.cpp
index 8bf891b..c93e178 100644
--- a/libopie2/opiepim/core/opimdateconversion.cpp
+++ b/libopie2/opiepim/core/opimdateconversion.cpp
@@ -23,16 +23,18 @@ _;:, .> :=|. This program is free software; you can
23 -- :-=` this library; see the file COPYING.LIB. 23 -- :-=` this library; see the file COPYING.LIB.
24 If not, write to the Free Software Foundation, 24 If not, write to the Free Software Foundation,
25 Inc., 59 Temple Place - Suite 330, 25 Inc., 59 Temple Place - Suite 330,
26 Boston, MA 02111-1307, USA. 26 Boston, MA 02111-1307, USA.
27*/ 27*/
28 28
29/* OPIE */ 29/* OPIE */
30#include <opie2/opimdateconversion.h> 30#include <opie2/opimdateconversion.h>
31#include <opie2/odebug.h>
32
31#include <qpe/timeconversion.h> 33#include <qpe/timeconversion.h>
32 34
33namespace Opie 35namespace Opie
34{ 36{
35 37
36QString OPimDateConversion::dateToString( const QDate &d ) 38QString OPimDateConversion::dateToString( const QDate &d )
37{ 39{
38 if ( d.isNull() || !d.isValid() ) 40 if ( d.isNull() || !d.isValid() )
@@ -41,17 +43,17 @@ QString OPimDateConversion::dateToString( const QDate &d )
41 // ISO format in year, month, day (YYYYMMDD); e.g. 20021231 43 // ISO format in year, month, day (YYYYMMDD); e.g. 20021231
42 QString year = QString::number( d.year() ); 44 QString year = QString::number( d.year() );
43 QString month = QString::number( d.month() ); 45 QString month = QString::number( d.month() );
44 month = month.rightJustify( 2, '0' ); 46 month = month.rightJustify( 2, '0' );
45 QString day = QString::number( d.day() ); 47 QString day = QString::number( d.day() );
46 day = day.rightJustify( 2, '0' ); 48 day = day.rightJustify( 2, '0' );
47 49
48 QString str = year + month + day; 50 QString str = year + month + day;
49 //qDebug( "\tPimContact dateToStr = %s", str.latin1() ); 51 //odebug << "\tPimContact dateToStr = " << str << "" << oendl;
50 52
51 return str; 53 return str;
52} 54}
53 55
54 56
55QDate OPimDateConversion::dateFromString( const QString& s ) 57QDate OPimDateConversion::dateFromString( const QString& s )
56{ 58{
57 QDate date; 59 QDate date;
@@ -69,34 +71,34 @@ QDate OPimDateConversion::dateFromString( const QString& s )
69 int year = s.mid( 0, 4 ).toInt(); 71 int year = s.mid( 0, 4 ).toInt();
70 int month = s.mid( 4, 2 ).toInt(); 72 int month = s.mid( 4, 2 ).toInt();
71 int day = s.mid( 6, 2 ).toInt(); 73 int day = s.mid( 6, 2 ).toInt();
72 74
73 // do some quick sanity checking -eilers 75 // do some quick sanity checking -eilers
74 // but we isValid() again? -zecke 76 // but we isValid() again? -zecke
75 if ( year < 1900 || year > 3000 ) 77 if ( year < 1900 || year > 3000 )
76 { 78 {
77 qWarning( "PimContact year is not in range" ); 79 owarn << "PimContact year is not in range" << oendl;
78 return date; 80 return date;
79 } 81 }
80 if ( month < 0 || month > 12 ) 82 if ( month < 0 || month > 12 )
81 { 83 {
82 qWarning( "PimContact month is not in range" ); 84 owarn << "PimContact month is not in range" << oendl;
83 return date; 85 return date;
84 } 86 }
85 if ( day < 0 || day > 31 ) 87 if ( day < 0 || day > 31 )
86 { 88 {
87 qWarning( "PimContact day is not in range" ); 89 owarn << "PimContact day is not in range" << oendl;
88 return date; 90 return date;
89 } 91 }
90 92
91 date.setYMD( year, month, day ); 93 date.setYMD( year, month, day );
92 if ( !date.isValid() ) 94 if ( !date.isValid() )
93 { 95 {
94 qWarning( "PimContact date is not valid" ); 96 owarn << "PimContact date is not valid" << oendl;
95 return date; 97 return date;
96 } 98 }
97 99
98 return date; 100 return date;
99} 101}
100 102
101 103
102QString OPimDateConversion::dateTimeToString( const QDateTime& dt ) 104QString OPimDateConversion::dateTimeToString( const QDateTime& dt )
diff --git a/libopie2/opiepim/core/opimevent.cpp b/libopie2/opiepim/core/opimevent.cpp
index 9d46651..8752fce 100644
--- a/libopie2/opiepim/core/opimevent.cpp
+++ b/libopie2/opiepim/core/opimevent.cpp
@@ -28,16 +28,18 @@
28*/ 28*/
29 29
30#include "opimevent.h" 30#include "opimevent.h"
31 31
32/* OPIE */ 32/* OPIE */
33#include <opie2/opimrecurrence.h> 33#include <opie2/opimrecurrence.h>
34#include <opie2/opimresolver.h> 34#include <opie2/opimresolver.h>
35#include <opie2/opimnotifymanager.h> 35#include <opie2/opimnotifymanager.h>
36#include <opie2/odebug.h>
37
36#include <qpe/categories.h> 38#include <qpe/categories.h>
37#include <qpe/stringutil.h> 39#include <qpe/stringutil.h>
38 40
39/* QT */ 41/* QT */
40 42
41namespace Opie 43namespace Opie
42{ 44{
43 45
@@ -550,21 +552,21 @@ QMap<int, QString> OPimEvent::toMap() const
550{ 552{
551 QMap<int, QString> retMap; 553 QMap<int, QString> retMap;
552 554
553 retMap.insert( OPimEvent::FUid, QString::number( uid() ) ); 555 retMap.insert( OPimEvent::FUid, QString::number( uid() ) );
554 retMap.insert( OPimEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) ) ); 556 retMap.insert( OPimEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) ) );
555 retMap.insert( OPimEvent::FDescription, Qtopia::escapeString( description() ) ); 557 retMap.insert( OPimEvent::FDescription, Qtopia::escapeString( description() ) );
556 retMap.insert( OPimEvent::FLocation, Qtopia::escapeString( location() ) ); 558 retMap.insert( OPimEvent::FLocation, Qtopia::escapeString( location() ) );
557 retMap.insert( OPimEvent::FType, isAllDay() ? "AllDay" : "" ); 559 retMap.insert( OPimEvent::FType, isAllDay() ? "AllDay" : "" );
558 if ( notifiers().alarms().count() ){ 560 if ( notifiers().alarms().count() ){
559 // Currently we just support one alarm.. (eilers) 561 // Currently we just support one alarm.. (eilers)
560 OPimAlarm alarm = notifiers().alarms() [ 0 ]; 562 OPimAlarm alarm = notifiers().alarms() [ 0 ];
561 retMap.insert( OPimEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) ); 563 retMap.insert( OPimEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) );
562 retMap.insert( OPimEvent::FSound, ( alarm.sound() == OPimAlarm::Loud ) ? "loud" : "silent" ); 564 retMap.insert( OPimEvent::FSound, ( alarm.sound() == OPimAlarm::Loud ) ? "loud" : "silent" );
563 } 565 }
564 566
565 OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); 567 OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() );
566 retMap.insert( OPimEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OPimTimeZone::utc() ) ) ) ); 568 retMap.insert( OPimEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OPimTimeZone::utc() ) ) ) );
567 retMap.insert( OPimEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OPimTimeZone::utc() ) ) ) ); 569 retMap.insert( OPimEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OPimTimeZone::utc() ) ) ) );
568 retMap.insert( OPimEvent::FNote, Qtopia::escapeString( note() ) ); 570 retMap.insert( OPimEvent::FNote, Qtopia::escapeString( note() ) );
569 retMap.insert( OPimEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() ); 571 retMap.insert( OPimEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() );
570 if ( parent() ) 572 if ( parent() )
@@ -636,41 +638,41 @@ void OPimEvent::fromMap( const QMap<int, QString>& map )
636 OPimTimeZone utc = OPimTimeZone::utc(); 638 OPimTimeZone utc = OPimTimeZone::utc();
637 setStartDateTime( utc.fromUTCDateTime( start ) ); 639 setStartDateTime( utc.fromUTCDateTime( start ) );
638 setEndDateTime ( utc.fromUTCDateTime( end ) ); 640 setEndDateTime ( utc.fromUTCDateTime( end ) );
639 setTimeZone( "UTC" ); // make sure it is really utc 641 setTimeZone( "UTC" ); // make sure it is really utc
640 } 642 }
641 else 643 else
642 { 644 {
643 /* to current date time */ 645 /* to current date time */
644 // qWarning(" Start is %d", start ); 646 // owarn << " Start is " << start << "" << oendl;
645 OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() ); 647 OPimTimeZone zone( timeZone().isEmpty() ? OPimTimeZone::current() : timeZone() );
646 QDateTime date = zone.toDateTime( start ); 648 QDateTime date = zone.toDateTime( start );
647 qWarning( " Start is %s", date.toString().latin1() ); 649 owarn << " Start is " << date.toString() << "" << oendl;
648 setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) ); 650 setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) );
649 651
650 date = zone.toDateTime( end ); 652 date = zone.toDateTime( end );
651 setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) ); 653 setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) );
652 } 654 }
653 655
654 int alarmTime = -1; 656 int alarmTime = -1;
655 if ( !map[ OPimEvent::FAlarm ].isEmpty() ) 657 if ( !map[ OPimEvent::FAlarm ].isEmpty() )
656 alarmTime = map[ OPimEvent::FAlarm ].toInt(); 658 alarmTime = map[ OPimEvent::FAlarm ].toInt();
657 659
658 int sound = ( ( map[ OPimEvent::FSound ] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent ); 660 int sound = ( ( map[ OPimEvent::FSound ] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent );
659 if ( ( alarmTime != -1 ) ) 661 if ( ( alarmTime != -1 ) )
660 { 662 {
661 QDateTime dt = startDateTime().addSecs( -1 * alarmTime * 60 ); 663 QDateTime dt = startDateTime().addSecs( -1 * alarmTime * 60 );
662 OPimAlarm al( sound , dt ); 664 OPimAlarm al( sound , dt );
663 notifiers().add( al ); 665 notifiers().add( al );
664 } 666 }
665 667
666 668
667 if ( !map[ OPimEvent::FNote ].isEmpty() ) 669 if ( !map[ OPimEvent::FNote ].isEmpty() )
668 setNote( map[ OPimEvent::FNote ] ); 670 setNote( map[ OPimEvent::FNote ] );
669 671
670 if ( !map[ OPimEvent::FRecParent ].isEmpty() ) 672 if ( !map[ OPimEvent::FRecParent ].isEmpty() )
671 setParent( map[ OPimEvent::FRecParent ].toInt() ); 673 setParent( map[ OPimEvent::FRecParent ].toInt() );
672 674
673 if ( !map[ OPimEvent::FRecChildren ].isEmpty() ) 675 if ( !map[ OPimEvent::FRecChildren ].isEmpty() )
674 { 676 {
675 QStringList list = QStringList::split( ' ', map[ OPimEvent::FRecChildren ] ); 677 QStringList list = QStringList::split( ' ', map[ OPimEvent::FRecChildren ] );
676 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) 678 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
diff --git a/libopie2/opiepim/core/opimnotifymanager.cpp b/libopie2/opiepim/core/opimnotifymanager.cpp
index 573340a..0f863aa 100644
--- a/libopie2/opiepim/core/opimnotifymanager.cpp
+++ b/libopie2/opiepim/core/opimnotifymanager.cpp
@@ -26,16 +26,17 @@
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#include "opimnotifymanager.h" 30#include "opimnotifymanager.h"
31 31
32/* OPIE */ 32/* OPIE */
33#include <opie2/opimdateconversion.h> 33#include <opie2/opimdateconversion.h>
34#include <opie2/odebug.h>
34 35
35/* QT */ 36/* QT */
36#include <qstringlist.h> 37#include <qstringlist.h>
37 38
38namespace Opie 39namespace Opie
39{ 40{
40 41
41OPimNotifyManager::OPimNotifyManager( const Reminders& rem, const Alarms& al ) 42OPimNotifyManager::OPimNotifyManager( const Reminders& rem, const Alarms& al )
@@ -158,17 +159,17 @@ void OPimNotifyManager::registerNotify( const OPimNotify& )
158 */ 159 */
159void OPimNotifyManager::deregister( const OPimNotify& ) 160void OPimNotifyManager::deregister( const OPimNotify& )
160{ 161{
161} 162}
162 163
163 164
164bool OPimNotifyManager::isEmpty() const 165bool OPimNotifyManager::isEmpty() const
165{ 166{
166 qWarning( "is Empty called on OPimNotifyManager %d %d", m_rem.count(), m_al.count() ); 167 owarn << "is Empty called on OPimNotifyManager " << m_rem.count() << " " << m_al.count() << "" << oendl;
167 if ( m_rem.isEmpty() && m_al.isEmpty() ) return true; 168 if ( m_rem.isEmpty() && m_al.isEmpty() ) return true;
168 else return false; 169 else return false;
169} 170}
170 171
171 172
172// Taken from otodoaccessxml.. code duplication bad. any alternative? 173// Taken from otodoaccessxml.. code duplication bad. any alternative?
173QString OPimNotifyManager::alarmsToString() const 174QString OPimNotifyManager::alarmsToString() const
174{ 175{
@@ -186,17 +187,17 @@ QString OPimNotifyManager::alarmsToString() const
186 { 187 {
187 als << OPimDateConversion::dateTimeToString( ( *it ).dateTime() ) 188 als << OPimDateConversion::dateTimeToString( ( *it ).dateTime() )
188 + ":" + QString::number( ( *it ).duration() ) 189 + ":" + QString::number( ( *it ).duration() )
189 + ":" + QString::number( ( *it ).sound() ) 190 + ":" + QString::number( ( *it ).sound() )
190 + ":"; 191 + ":";
191 } 192 }
192 } 193 }
193 // now write the list 194 // now write the list
194 qWarning( "als: %s", als.join( "____________" ).latin1() ); 195 owarn << "als: " << als.join( "____________" ) << "" << oendl;
195 str = als.join( ";" ); 196 str = als.join( ";" );
196 } 197 }
197 198
198 return str; 199 return str;
199} 200}
200 201
201 202
202QString OPimNotifyManager::remindersToString() const 203QString OPimNotifyManager::remindersToString() const
@@ -220,17 +221,17 @@ QString OPimNotifyManager::remindersToString() const
220 221
221 222
222void OPimNotifyManager::alarmsFromString( const QString& str ) 223void OPimNotifyManager::alarmsFromString( const QString& str )
223{ 224{
224 QStringList als = QStringList::split( ";", str ); 225 QStringList als = QStringList::split( ";", str );
225 for ( QStringList::Iterator it = als.begin(); it != als.end(); ++it ) 226 for ( QStringList::Iterator it = als.begin(); it != als.end(); ++it )
226 { 227 {
227 QStringList alarm = QStringList::split( ":", ( *it ), TRUE ); // allow empty 228 QStringList alarm = QStringList::split( ":", ( *it ), TRUE ); // allow empty
228 qWarning( "alarm: %s", alarm.join( "___" ).latin1() ); 229 owarn << "alarm: " << alarm.join( "___" ) << "" << oendl;
229 qWarning( "alarm[0]: %s %s", alarm[ 0 ].latin1(), 230 qWarning( "alarm[0]: %s %s", alarm[ 0 ].latin1(),
230 OPimDateConversion::dateTimeFromString( alarm[ 0 ] ).toString().latin1() ); 231 OPimDateConversion::dateTimeFromString( alarm[ 0 ] ).toString().latin1() );
231 OPimAlarm al( alarm[ 2 ].toInt(), OPimDateConversion::dateTimeFromString( alarm[ 0 ] ), 232 OPimAlarm al( alarm[ 2 ].toInt(), OPimDateConversion::dateTimeFromString( alarm[ 0 ] ),
232 alarm[ 1 ].toInt() ); 233 alarm[ 1 ].toInt() );
233 add( al ); 234 add( al );
234 } 235 }
235} 236}
236 237
diff --git a/libopie2/opiepim/core/opimrecord.cpp b/libopie2/opiepim/core/opimrecord.cpp
index c783092..6546d99 100644
--- a/libopie2/opiepim/core/opimrecord.cpp
+++ b/libopie2/opiepim/core/opimrecord.cpp
@@ -116,17 +116,17 @@ bool OPimRecord::isEmpty() const
116 QMap<QString, QArray<int> >::ConstIterator it; 116 QMap<QString, QArray<int> >::ConstIterator it;
117 for (it = m_relations.begin(); it != m_relations.end(); ++it ) { 117 for (it = m_relations.begin(); it != m_relations.end(); ++it ) {
118 QArray<int> id = it.data(); 118 QArray<int> id = it.data();
119 for ( uint i = 0; i < id.size(); ++i ) { 119 for ( uint i = 0; i < id.size(); ++i ) {
120 str += it.key() + "," + QString::number( i ) + ";"; 120 str += it.key() + "," + QString::number( i ) + ";";
121 } 121 }
122 } 122 }
123 str = str.remove( str.length()-1, 1); // strip the ; 123 str = str.remove( str.length()-1, 1); // strip the ;
124 //qWarning("IDS " + str ); 124 //owarn << "IDS " + str << oendl;
125 125
126 return str; 126 return str;
127 }*/ 127 }*/
128/* if uid = 1 assign a new one */ 128/* if uid = 1 assign a new one */
129void OPimRecord::setUid( int uid ) 129void OPimRecord::setUid( int uid )
130{ 130{
131 if ( uid == 1 ) 131 if ( uid == 1 )
132 uid = uidGen().generate(); 132 uid = uidGen().generate();
diff --git a/libopie2/opiepim/core/opimtimezone.cpp b/libopie2/opiepim/core/opimtimezone.cpp
index be21b1b..fefceb5 100644
--- a/libopie2/opiepim/core/opimtimezone.cpp
+++ b/libopie2/opiepim/core/opimtimezone.cpp
@@ -24,16 +24,19 @@
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#include "opimtimezone.h" 30#include "opimtimezone.h"
31 31
32/* OPIE */
33#include <opie2/odebug.h>
34
32/* STD */ 35/* STD */
33#include <stdio.h> 36#include <stdio.h>
34#include <stdlib.h> 37#include <stdlib.h>
35#include <sys/types.h> 38#include <sys/types.h>
36 39
37namespace Opie 40namespace Opie
38{ 41{
39 42
@@ -144,17 +147,17 @@ QDateTime OPimTimeZone::toDateTime( time_t t )
144 147
145/* 148/*
146 * convert dt to utc using zone.m_name 149 * convert dt to utc using zone.m_name
147 * convert utc -> timeZoneDT using this->m_name 150 * convert utc -> timeZoneDT using this->m_name
148 */ 151 */
149QDateTime OPimTimeZone::toDateTime( const QDateTime& dt, const OPimTimeZone& zone ) 152QDateTime OPimTimeZone::toDateTime( const QDateTime& dt, const OPimTimeZone& zone )
150{ 153{
151 time_t utc = to_Time_t( dt, zone.m_name ); 154 time_t utc = to_Time_t( dt, zone.m_name );
152 qWarning( "%d %s", utc, zone.m_name.latin1() ); 155 owarn << "" << utc << " " << zone.m_name << "" << oendl;
153 return utcTime( utc, m_name ); 156 return utcTime( utc, m_name );
154} 157}
155 158
156 159
157time_t OPimTimeZone::fromDateTime( const QDateTime& time ) 160time_t OPimTimeZone::fromDateTime( const QDateTime& time )
158{ 161{
159 return to_Time_t( time, m_name ); 162 return to_Time_t( time, m_name );
160} 163}
diff --git a/libopie2/opiepim/core/opimtodo.cpp b/libopie2/opiepim/core/opimtodo.cpp
index 47433e0..27b36a6 100644
--- a/libopie2/opiepim/core/opimtodo.cpp
+++ b/libopie2/opiepim/core/opimtodo.cpp
@@ -30,16 +30,18 @@
30#include "opimtodo.h" 30#include "opimtodo.h"
31 31
32/* OPIE */ 32/* OPIE */
33#include <opie2/opimstate.h> 33#include <opie2/opimstate.h>
34#include <opie2/opimrecurrence.h> 34#include <opie2/opimrecurrence.h>
35#include <opie2/opimmaintainer.h> 35#include <opie2/opimmaintainer.h>
36#include <opie2/opimnotifymanager.h> 36#include <opie2/opimnotifymanager.h>
37#include <opie2/opimresolver.h> 37#include <opie2/opimresolver.h>
38#include <opie2/odebug.h>
39
38#include <qpe/palmtopuidgen.h> 40#include <qpe/palmtopuidgen.h>
39#include <qpe/palmtoprecord.h> 41#include <qpe/palmtoprecord.h>
40#include <qpe/categories.h> 42#include <qpe/categories.h>
41#include <qpe/categoryselect.h> 43#include <qpe/categoryselect.h>
42#include <qpe/stringutil.h> 44#include <qpe/stringutil.h>
43 45
44/* QT */ 46/* QT */
45#include <qobject.h> 47#include <qobject.h>
@@ -80,42 +82,42 @@ struct OPimTodo::OPimTodoData : public QShared
80 OPimNotifyManager *notifiers; 82 OPimNotifyManager *notifiers;
81}; 83};
82 84
83 85
84OPimTodo::OPimTodo( const OPimTodo &event ) 86OPimTodo::OPimTodo( const OPimTodo &event )
85 : OPimRecord( event ), data( event.data ) 87 : OPimRecord( event ), data( event.data )
86{ 88{
87 data->ref(); 89 data->ref();
88 // qWarning("ref up"); 90 // owarn << "ref up" << oendl;
89} 91}
90 92
91 93
92OPimTodo::~OPimTodo() 94OPimTodo::~OPimTodo()
93{ 95{
94 96
95 // qWarning("~OPimTodo " ); 97 // owarn << "~OPimTodo " << oendl;
96 if ( data->deref() ) 98 if ( data->deref() )
97 { 99 {
98 // qWarning("OPimTodo::dereffing"); 100 // owarn << "OPimTodo::dereffing" << oendl;
99 delete data; 101 delete data;
100 data = 0l; 102 data = 0l;
101 } 103 }
102} 104}
103 105
104 106
105OPimTodo::OPimTodo( bool completed, int priority, 107OPimTodo::OPimTodo( bool completed, int priority,
106 const QArray<int> &category, 108 const QArray<int> &category,
107 const QString& summary, 109 const QString& summary,
108 const QString &description, 110 const QString &description,
109 ushort progress, 111 ushort progress,
110 bool hasDate, QDate date, int uid ) 112 bool hasDate, QDate date, int uid )
111 : OPimRecord( uid ) 113 : OPimRecord( uid )
112{ 114{
113 // qWarning("OPimTodoData " + summary); 115 // owarn << "OPimTodoData " + summary << oendl;
114 setCategories( category ); 116 setCategories( category );
115 117
116 data = new OPimTodoData; 118 data = new OPimTodoData;
117 119
118 data->date = date; 120 data->date = date;
119 data->isCompleted = completed; 121 data->isCompleted = completed;
120 data->hasDate = hasDate; 122 data->hasDate = hasDate;
121 data->priority = priority; 123 data->priority = priority;
@@ -128,17 +130,17 @@ OPimTodo::OPimTodo( bool completed, int priority,
128OPimTodo::OPimTodo( bool completed, int priority, 130OPimTodo::OPimTodo( bool completed, int priority,
129 const QStringList &category, 131 const QStringList &category,
130 const QString& summary, 132 const QString& summary,
131 const QString &description, 133 const QString &description,
132 ushort progress, 134 ushort progress,
133 bool hasDate, QDate date, int uid ) 135 bool hasDate, QDate date, int uid )
134 : OPimRecord( uid ) 136 : OPimRecord( uid )
135{ 137{
136 // qWarning("OPimTodoData" + summary); 138 // owarn << "OPimTodoData" + summary << oendl;
137 setCategories( idsFromString( category.join( ";" ) ) ); 139 setCategories( idsFromString( category.join( ";" ) ) );
138 140
139 data = new OPimTodoData; 141 data = new OPimTodoData;
140 142
141 data->date = date; 143 data->date = date;
142 data->isCompleted = completed; 144 data->isCompleted = completed;
143 data->hasDate = hasDate; 145 data->hasDate = hasDate;
144 data->priority = priority; 146 data->priority = priority;
@@ -301,17 +303,17 @@ void OPimTodo::setHasDueDate( bool hasDate )
301{ 303{
302 changeOrModify(); 304 changeOrModify();
303 data->hasDate = hasDate; 305 data->hasDate = hasDate;
304} 306}
305 307
306 308
307void OPimTodo::setDescription( const QString &desc ) 309void OPimTodo::setDescription( const QString &desc )
308{ 310{
309 // qWarning( "desc " + desc ); 311 // owarn << "desc " + desc << oendl;
310 changeOrModify(); 312 changeOrModify();
311 data->desc = Qtopia::simplifyMultiLineSpace( desc ); 313 data->desc = Qtopia::simplifyMultiLineSpace( desc );
312} 314}
313 315
314 316
315void OPimTodo::setSummary( const QString& sum ) 317void OPimTodo::setSummary( const QString& sum )
316{ 318{
317 changeOrModify(); 319 changeOrModify();
@@ -586,32 +588,32 @@ bool OPimTodo::operator==( const OPimTodo &toDoEvent ) const
586 588
587 return OPimRecord::operator==( toDoEvent ); 589 return OPimRecord::operator==( toDoEvent );
588} 590}
589 591
590 592
591void OPimTodo::deref() 593void OPimTodo::deref()
592{ 594{
593 595
594 // qWarning("deref in ToDoEvent"); 596 // owarn << "deref in ToDoEvent" << oendl;
595 if ( data->deref() ) 597 if ( data->deref() )
596 { 598 {
597 // qWarning("deleting"); 599 // owarn << "deleting" << oendl;
598 delete data; 600 delete data;
599 data = 0; 601 data = 0;
600 } 602 }
601} 603}
602 604
603 605
604OPimTodo &OPimTodo::operator=( const OPimTodo &item ) 606OPimTodo &OPimTodo::operator=( const OPimTodo &item )
605{ 607{
606 if ( this == &item ) return * this; 608 if ( this == &item ) return * this;
607 609
608 OPimRecord::operator=( item ); 610 OPimRecord::operator=( item );
609 //qWarning("operator= ref "); 611 //owarn << "operator= ref " << oendl;
610 item.data->ref(); 612 item.data->ref();
611 deref(); 613 deref();
612 data = item.data; 614 data = item.data;
613 615
614 return *this; 616 return *this;
615} 617}
616 618
617 619
@@ -644,17 +646,17 @@ QMap<int, QString> OPimTodo::toMap() const
644 * change or modify looks at the ref count and either 646 * change or modify looks at the ref count and either
645 * creates a new QShared Object or it can modify it 647 * creates a new QShared Object or it can modify it
646 * right in place 648 * right in place
647 */ 649 */
648void OPimTodo::changeOrModify() 650void OPimTodo::changeOrModify()
649{ 651{
650 if ( data->count != 1 ) 652 if ( data->count != 1 )
651 { 653 {
652 qWarning( "changeOrModify" ); 654 owarn << "changeOrModify" << oendl;
653 data->deref(); 655 data->deref();
654 OPimTodoData* d2 = new OPimTodoData(); 656 OPimTodoData* d2 = new OPimTodoData();
655 copy( data, d2 ); 657 copy( data, d2 );
656 data = d2; 658 data = d2;
657 } 659 }
658} 660}
659 661
660 662
diff --git a/libopie2/opiepim/core/otodoaccess.cpp b/libopie2/opiepim/core/otodoaccess.cpp
index c4adbbd..26a68a0 100644
--- a/libopie2/opiepim/core/otodoaccess.cpp
+++ b/libopie2/opiepim/core/otodoaccess.cpp
@@ -45,17 +45,17 @@ OPimTodoAccess::OPimTodoAccess( OPimTodoAccessBackend* end, enum Access )
45 45
46 // Zecke: Du musst hier noch fr das XML-Backend einen Appnamen bergeben ! 46 // Zecke: Du musst hier noch fr das XML-Backend einen Appnamen bergeben !
47 if (end == 0l ) 47 if (end == 0l )
48 m_todoBackEnd = OBackendFactory<OPimTodoAccessBackend>::defaultBackend (OPimGlobal::TODOLIST, QString::null); 48 m_todoBackEnd = OBackendFactory<OPimTodoAccessBackend>::defaultBackend (OPimGlobal::TODOLIST, QString::null);
49 49
50 setBackEnd( m_todoBackEnd ); 50 setBackEnd( m_todoBackEnd );
51} 51}
52OPimTodoAccess::~OPimTodoAccess() { 52OPimTodoAccess::~OPimTodoAccess() {
53// qWarning("~OPimTodoAccess"); 53// owarn << "~OPimTodoAccess" << oendl;
54} 54}
55void OPimTodoAccess::mergeWith( const QValueList<OPimTodo>& list ) { 55void OPimTodoAccess::mergeWith( const QValueList<OPimTodo>& list ) {
56 QValueList<OPimTodo>::ConstIterator it; 56 QValueList<OPimTodo>::ConstIterator it;
57 for ( it = list.begin(); it != list.end(); ++it ) { 57 for ( it = list.begin(); it != list.end(); ++it ) {
58 replace( (*it) ); 58 replace( (*it) );
59 } 59 }
60} 60}
61OPimTodoAccess::List OPimTodoAccess::effectiveToDos( const QDate& start, 61OPimTodoAccess::List OPimTodoAccess::effectiveToDos( const QDate& start,
diff --git a/libopie2/opiepim/ui/opimmainwindow.cpp b/libopie2/opiepim/ui/opimmainwindow.cpp
index 40dc297..8ce2062 100644
--- a/libopie2/opiepim/ui/opimmainwindow.cpp
+++ b/libopie2/opiepim/ui/opimmainwindow.cpp
@@ -21,26 +21,33 @@
21 : = ...= . :.=- 21 : = ...= . :.=-
22 -. .:....=;==+<; You should have received a copy of the GNU 22 -. .:....=;==+<; You should have received a copy of the GNU
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#include <qapplication.h> 29
30#include <qdatetime.h> 30#include "opimmainwindow.h"
31#include <qcopchannel_qws.h> 31
32/* OPIE */
33#include <opie2/opimresolver.h>
34#include <opie2/odebug.h>
32 35
33#include <qpe/sound.h> 36#include <qpe/sound.h>
34#include <qpe/qcopenvelope_qws.h> 37#include <qpe/qcopenvelope_qws.h>
35#include <qpe/qpeapplication.h> 38#include <qpe/qpeapplication.h>
36 39
37#include <opie2/opimresolver.h> 40/* QT */
38#include "opimmainwindow.h" 41#include <qapplication.h>
42#include <qdatetime.h>
43#include <qcopchannel_qws.h>
44
45
39 46
40namespace Opie { 47namespace Opie {
41OPimMainWindow::OPimMainWindow( const QString& service, QWidget* parent, 48OPimMainWindow::OPimMainWindow( const QString& service, QWidget* parent,
42 const char* name, WFlags flag ) 49 const char* name, WFlags flag )
43 : QMainWindow( parent, name, flag ), m_rtti(-1), m_service( service ), m_fallBack(0l) { 50 : QMainWindow( parent, name, flag ), m_rtti(-1), m_service( service ), m_fallBack(0l) {
44 51
45 /* 52 /*
46 * let's generate our QCopChannel 53 * let's generate our QCopChannel
@@ -111,17 +118,17 @@ void OPimMainWindow::appMessage( const QCString& cmd, const QByteArray& array )
111 if (!m_fallBack) return; 118 if (!m_fallBack) return;
112 add( *m_fallBack ); 119 add( *m_fallBack );
113 delete m_fallBack; 120 delete m_fallBack;
114 }else if ( cmd == "alarm(QDateTime,int)" ) { 121 }else if ( cmd == "alarm(QDateTime,int)" ) {
115 raise(); 122 raise();
116 QDateTime dt; int uid; 123 QDateTime dt; int uid;
117 stream >> dt; 124 stream >> dt;
118 stream >> uid; 125 stream >> uid;
119 qWarning(" Date: %s Uid: %d", dt.toString().latin1(), uid ); 126 owarn << " Date: " << dt.toString() << " Uid: " << uid << "" << oendl;
120 QDateTime current = QDateTime::currentDateTime(); 127 QDateTime current = QDateTime::currentDateTime();
121 if ( current.time().hour() != dt.time().hour() && current.time().minute() != dt.time().minute() ) 128 if ( current.time().hour() != dt.time().hour() && current.time().minute() != dt.time().minute() )
122 return; 129 return;
123 doAlarm( dt, uid ); 130 doAlarm( dt, uid );
124 needShow = true; 131 needShow = true;
125 } 132 }
126 133
127 if (needShow ) 134 if (needShow )