summaryrefslogtreecommitdiff
path: root/libopie/pim
authorzecke <zecke>2003-05-07 18:02:46 (UTC)
committer zecke <zecke>2003-05-07 18:02:46 (UTC)
commit94371938792c70a40cdb75e37c69020438d450c9 (patch) (unidiff)
tree10b97f156e1b4eee2ec1706e315a87a16b0af3b9 /libopie/pim
parentc13ada0f5e418b25b177e132ff2e1dfe7821577f (diff)
downloadopie-94371938792c70a40cdb75e37c69020438d450c9.zip
opie-94371938792c70a40cdb75e37c69020438d450c9.tar.gz
opie-94371938792c70a40cdb75e37c69020438d450c9.tar.bz2
save and restore CompletedDate and StartDate
Diffstat (limited to 'libopie/pim') (more/less context) (show whitespace changes)
-rw-r--r--libopie/pim/otodoaccessxml.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/libopie/pim/otodoaccessxml.cpp b/libopie/pim/otodoaccessxml.cpp
index 71b6a7e..a8e1503 100644
--- a/libopie/pim/otodoaccessxml.cpp
+++ b/libopie/pim/otodoaccessxml.cpp
@@ -1,41 +1,42 @@
1#include <errno.h> 1#include <errno.h>
2#include <fcntl.h> 2#include <fcntl.h>
3 3
4#include <sys/mman.h> 4#include <sys/mman.h>
5#include <sys/stat.h> 5#include <sys/stat.h>
6#include <sys/types.h> 6#include <sys/types.h>
7 7
8#include <unistd.h> 8#include <unistd.h>
9 9
10 10
11#include <qfile.h> 11#include <qfile.h>
12#include <qvector.h> 12#include <qvector.h>
13 13
14#include <qpe/global.h> 14#include <qpe/global.h>
15#include <qpe/stringutil.h> 15#include <qpe/stringutil.h>
16#include <qpe/timeconversion.h> 16#include <qpe/timeconversion.h>
17 17
18#include "oconversion.h"
18#include "otimezone.h" 19#include "otimezone.h"
19#include "orecur.h" 20#include "orecur.h"
20#include "otodoaccessxml.h" 21#include "otodoaccessxml.h"
21 22
22namespace { 23namespace {
23 time_t rp_end; 24 time_t rp_end;
24 ORecur* rec; 25 ORecur* rec;
25 ORecur *recur() { 26 ORecur *recur() {
26 if (!rec ) rec = new ORecur; 27 if (!rec ) rec = new ORecur;
27 return rec; 28 return rec;
28 } 29 }
29 int snd; 30 int snd;
30 enum MoreAttributes { 31 enum MoreAttributes {
31 FRType = OTodo::CompletedDate + 2, 32 FRType = OTodo::CompletedDate + 2,
32 FRWeekdays, 33 FRWeekdays,
33 FRPosition, 34 FRPosition,
34 FRFreq, 35 FRFreq,
35 FRHasEndDate, 36 FRHasEndDate,
36 FREndDate, 37 FREndDate,
37 FRStart, 38 FRStart,
38 FREnd 39 FREnd
39 }; 40 };
40 // FROM TT again 41 // FROM TT again
41char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) 42char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen)
@@ -77,48 +78,49 @@ OTodoAccessXML::~OTodoAccessXML() {
77 78
78} 79}
79bool OTodoAccessXML::load() { 80bool OTodoAccessXML::load() {
80 rec = 0; 81 rec = 0;
81 m_opened = true; 82 m_opened = true;
82 m_changed = false; 83 m_changed = false;
83 /* initialize dict */ 84 /* initialize dict */
84 /* 85 /*
85 * UPDATE dict if you change anything!!! 86 * UPDATE dict if you change anything!!!
86 */ 87 */
87 QAsciiDict<int> dict(21); 88 QAsciiDict<int> dict(21);
88 dict.setAutoDelete( TRUE ); 89 dict.setAutoDelete( TRUE );
89 dict.insert("Categories" , new int(OTodo::Category) ); 90 dict.insert("Categories" , new int(OTodo::Category) );
90 dict.insert("Uid" , new int(OTodo::Uid) ); 91 dict.insert("Uid" , new int(OTodo::Uid) );
91 dict.insert("HasDate" , new int(OTodo::HasDate) ); 92 dict.insert("HasDate" , new int(OTodo::HasDate) );
92 dict.insert("Completed" , new int(OTodo::Completed) ); 93 dict.insert("Completed" , new int(OTodo::Completed) );
93 dict.insert("Description" , new int(OTodo::Description) ); 94 dict.insert("Description" , new int(OTodo::Description) );
94 dict.insert("Summary" , new int(OTodo::Summary) ); 95 dict.insert("Summary" , new int(OTodo::Summary) );
95 dict.insert("Priority" , new int(OTodo::Priority) ); 96 dict.insert("Priority" , new int(OTodo::Priority) );
96 dict.insert("DateDay" , new int(OTodo::DateDay) ); 97 dict.insert("DateDay" , new int(OTodo::DateDay) );
97 dict.insert("DateMonth" , new int(OTodo::DateMonth) ); 98 dict.insert("DateMonth" , new int(OTodo::DateMonth) );
98 dict.insert("DateYear" , new int(OTodo::DateYear) ); 99 dict.insert("DateYear" , new int(OTodo::DateYear) );
99 dict.insert("Progress" , new int(OTodo::Progress) ); 100 dict.insert("Progress" , new int(OTodo::Progress) );
100 dict.insert("CompletedDate", new int(OTodo::CompletedDate) ); 101 dict.insert("CompletedDate", new int(OTodo::CompletedDate) );
102 dict.insert("StartDate", new int(OTodo::StartDate) );
101 dict.insert("CrossReference", new int(OTodo::CrossReference) ); 103 dict.insert("CrossReference", new int(OTodo::CrossReference) );
102 dict.insert("State", new int(OTodo::State) ); 104 dict.insert("State", new int(OTodo::State) );
103 dict.insert("Alarms", new int(OTodo::Alarms) ); 105 dict.insert("Alarms", new int(OTodo::Alarms) );
104 dict.insert("Reminders", new int(OTodo::Reminders) ); 106 dict.insert("Reminders", new int(OTodo::Reminders) );
105 dict.insert("Notifiers", new int(OTodo::Notifiers) ); 107 dict.insert("Notifiers", new int(OTodo::Notifiers) );
106 dict.insert("Maintainer", new int(OTodo::Maintainer) ); 108 dict.insert("Maintainer", new int(OTodo::Maintainer) );
107 dict.insert("rtype", new int(FRType) ); 109 dict.insert("rtype", new int(FRType) );
108 dict.insert("rweekdays", new int(FRWeekdays) ); 110 dict.insert("rweekdays", new int(FRWeekdays) );
109 dict.insert("rposition", new int(FRPosition) ); 111 dict.insert("rposition", new int(FRPosition) );
110 dict.insert("rfreq", new int(FRFreq) ); 112 dict.insert("rfreq", new int(FRFreq) );
111 dict.insert("start", new int(FRStart) ); 113 dict.insert("start", new int(FRStart) );
112 dict.insert("rhasenddate", new int(FRHasEndDate) ); 114 dict.insert("rhasenddate", new int(FRHasEndDate) );
113 dict.insert("enddt", new int(FREndDate) ); 115 dict.insert("enddt", new int(FREndDate) );
114 116
115 // here the custom XML parser from TT it's GPL 117 // here the custom XML parser from TT it's GPL
116 // but we want to push OpiePIM... to TT..... 118 // but we want to push OpiePIM... to TT.....
117 // mmap part from zecke :) 119 // mmap part from zecke :)
118 int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY ); 120 int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY );
119 struct stat attribut; 121 struct stat attribut;
120 if ( fd < 0 ) return false; 122 if ( fd < 0 ) return false;
121 123
122 if ( fstat(fd, &attribut ) == -1 ) { 124 if ( fstat(fd, &attribut ) == -1 ) {
123 ::close( fd ); 125 ::close( fd );
124 return false; 126 return false;
@@ -393,48 +395,54 @@ void OTodoAccessXML::todo( QAsciiDict<int>* dict, OTodo& ev,
393 case OTodo::Completed: 395 case OTodo::Completed:
394 ev.setCompleted( val.toInt() ); 396 ev.setCompleted( val.toInt() );
395 break; 397 break;
396 case OTodo::Description: 398 case OTodo::Description:
397 ev.setDescription( val ); 399 ev.setDescription( val );
398 break; 400 break;
399 case OTodo::Summary: 401 case OTodo::Summary:
400 ev.setSummary( val ); 402 ev.setSummary( val );
401 break; 403 break;
402 case OTodo::Priority: 404 case OTodo::Priority:
403 ev.setPriority( val.toInt() ); 405 ev.setPriority( val.toInt() );
404 break; 406 break;
405 case OTodo::DateDay: 407 case OTodo::DateDay:
406 m_day = val.toInt(); 408 m_day = val.toInt();
407 break; 409 break;
408 case OTodo::DateMonth: 410 case OTodo::DateMonth:
409 m_month = val.toInt(); 411 m_month = val.toInt();
410 break; 412 break;
411 case OTodo::DateYear: 413 case OTodo::DateYear:
412 m_year = val.toInt(); 414 m_year = val.toInt();
413 break; 415 break;
414 case OTodo::Progress: 416 case OTodo::Progress:
415 ev.setProgress( val.toInt() ); 417 ev.setProgress( val.toInt() );
416 break; 418 break;
419 case OTodo::CompletedDate:
420 ev.setCompletedDate( OConversion::dateFromString( val ) );
421 break;
422 case OTodo::StartDate:
423 ev.setStartDate( OConversion::dateFromString( val ) );
424 break;
417 case OTodo::CrossReference: 425 case OTodo::CrossReference:
418 { 426 {
419 /* 427 /*
420 * A cross refernce looks like 428 * A cross refernce looks like
421 * appname,id;appname,id 429 * appname,id;appname,id
422 * we need to split it up 430 * we need to split it up
423 */ 431 */
424 QStringList refs = QStringList::split(';', val ); 432 QStringList refs = QStringList::split(';', val );
425 QStringList::Iterator strIt; 433 QStringList::Iterator strIt;
426 for (strIt = refs.begin(); strIt != refs.end(); ++strIt ) { 434 for (strIt = refs.begin(); strIt != refs.end(); ++strIt ) {
427 int pos = (*strIt).find(','); 435 int pos = (*strIt).find(',');
428 if ( pos > -1 ) 436 if ( pos > -1 )
429 ; // ev.addRelation( (*strIt).left(pos), (*strIt).mid(pos+1).toInt() ); 437 ; // ev.addRelation( (*strIt).left(pos), (*strIt).mid(pos+1).toInt() );
430 438
431 } 439 }
432 break; 440 break;
433 } 441 }
434 /* Recurrence stuff below + post processing later */ 442 /* Recurrence stuff below + post processing later */
435 case FRType: 443 case FRType:
436 if ( val == "Daily" ) 444 if ( val == "Daily" )
437 recur()->setType( ORecur::Daily ); 445 recur()->setType( ORecur::Daily );
438 else if ( val == "Weekly" ) 446 else if ( val == "Weekly" )
439 recur()->setType( ORecur::Weekly); 447 recur()->setType( ORecur::Weekly);
440 else if ( val == "MonthlyDay" ) 448 else if ( val == "MonthlyDay" )
@@ -482,48 +490,53 @@ QString OTodoAccessXML::toString( const OTodo& ev )const {
482 str += "DateYear=\"" + QString::number( ev.dueDate().year() ) + "\" "; 490 str += "DateYear=\"" + QString::number( ev.dueDate().year() ) + "\" ";
483 str += "DateMonth=\"" + QString::number( ev.dueDate().month() ) + "\" "; 491 str += "DateMonth=\"" + QString::number( ev.dueDate().month() ) + "\" ";
484 str += "DateDay=\"" + QString::number( ev.dueDate().day() ) + "\" "; 492 str += "DateDay=\"" + QString::number( ev.dueDate().day() ) + "\" ";
485 } 493 }
486// qWarning( "Uid %d", ev.uid() ); 494// qWarning( "Uid %d", ev.uid() );
487 str += "Uid=\"" + QString::number( ev.uid() ) + "\" "; 495 str += "Uid=\"" + QString::number( ev.uid() ) + "\" ";
488 496
489// append the extra options 497// append the extra options
490 /* FIXME Qtopia::Record this is currently not 498 /* FIXME Qtopia::Record this is currently not
491 * possible you can set custom fields 499 * possible you can set custom fields
492 * but don' iterate over the list 500 * but don' iterate over the list
493 * I may do #define private protected 501 * I may do #define private protected
494 * for this case - cough --zecke 502 * for this case - cough --zecke
495 */ 503 */
496 /* 504 /*
497 QMap<QString, QString> extras = ev.extras(); 505 QMap<QString, QString> extras = ev.extras();
498 QMap<QString, QString>::Iterator extIt; 506 QMap<QString, QString>::Iterator extIt;
499 for (extIt = extras.begin(); extIt != extras.end(); ++extIt ) 507 for (extIt = extras.begin(); extIt != extras.end(); ++extIt )
500 str += extIt.key() + "=\"" + extIt.data() + "\" "; 508 str += extIt.key() + "=\"" + extIt.data() + "\" ";
501 */ 509 */
502 // cross refernce 510 // cross refernce
503 if ( ev.hasRecurrence() ) { 511 if ( ev.hasRecurrence() ) {
504 str += ev.recurrence().toString(); 512 str += ev.recurrence().toString();
505 } 513 }
514 if ( ev.hasStartDate() )
515 str += "StartDate=\""+ OConversion::dateToString( ev.startDate() ) +"\" ";
516 if ( ev.hasCompletedDate() )
517 str += "CompletedDate=\""+ OConversion::dateToString( ev.completedDate() ) +"\" ";
518
506 519
507 return str; 520 return str;
508} 521}
509QString OTodoAccessXML::toString( const QArray<int>& ints ) const { 522QString OTodoAccessXML::toString( const QArray<int>& ints ) const {
510 return Qtopia::Record::idsToString( ints ); 523 return Qtopia::Record::idsToString( ints );
511} 524}
512 525
513/* internal class for sorting 526/* internal class for sorting
514 * 527 *
515 * Inspired by todoxmlio.cpp from TT 528 * Inspired by todoxmlio.cpp from TT
516 */ 529 */
517 530
518struct OTodoXMLContainer { 531struct OTodoXMLContainer {
519 OTodo todo; 532 OTodo todo;
520}; 533};
521 534
522namespace { 535namespace {
523 inline QString string( const OTodo& todo) { 536 inline QString string( const OTodo& todo) {
524 return todo.summary().isEmpty() ? 537 return todo.summary().isEmpty() ?
525 todo.description().left(20 ) : 538 todo.description().left(20 ) :
526 todo.summary(); 539 todo.summary();
527 } 540 }
528 inline int completed( const OTodo& todo1, const OTodo& todo2) { 541 inline int completed( const OTodo& todo1, const OTodo& todo2) {
529 int ret = 0; 542 int ret = 0;