-rw-r--r-- | libopie2/opiepim/backend/otodoaccesssql.cpp | 31 | ||||
-rw-r--r-- | libopie2/opiepim/core/orecur.cpp | 147 | ||||
-rw-r--r-- | libopie2/opiepim/core/orecur.h | 12 |
3 files changed, 149 insertions, 41 deletions
diff --git a/libopie2/opiepim/backend/otodoaccesssql.cpp b/libopie2/opiepim/backend/otodoaccesssql.cpp index ebd03bb..3913661 100644 --- a/libopie2/opiepim/backend/otodoaccesssql.cpp +++ b/libopie2/opiepim/backend/otodoaccesssql.cpp | |||
@@ -94,128 +94,138 @@ namespace { | |||
94 | int m_uid; | 94 | int m_uid; |
95 | }; | 95 | }; |
96 | 96 | ||
97 | /** | 97 | /** |
98 | * overdue query | 98 | * overdue query |
99 | */ | 99 | */ |
100 | class OverDueQuery : public OSQLQuery { | 100 | class OverDueQuery : public OSQLQuery { |
101 | public: | 101 | public: |
102 | OverDueQuery(); | 102 | OverDueQuery(); |
103 | ~OverDueQuery(); | 103 | ~OverDueQuery(); |
104 | QString query()const; | 104 | QString query()const; |
105 | }; | 105 | }; |
106 | class EffQuery : public OSQLQuery { | 106 | class EffQuery : public OSQLQuery { |
107 | public: | 107 | public: |
108 | EffQuery( const QDate&, const QDate&, bool inc ); | 108 | EffQuery( const QDate&, const QDate&, bool inc ); |
109 | ~EffQuery(); | 109 | ~EffQuery(); |
110 | QString query()const; | 110 | QString query()const; |
111 | private: | 111 | private: |
112 | QString with()const; | 112 | QString with()const; |
113 | QString out()const; | 113 | QString out()const; |
114 | QDate m_start; | 114 | QDate m_start; |
115 | QDate m_end; | 115 | QDate m_end; |
116 | bool m_inc :1; | 116 | bool m_inc :1; |
117 | }; | 117 | }; |
118 | 118 | ||
119 | 119 | ||
120 | CreateQuery::CreateQuery() : OSQLQuery() {} | 120 | CreateQuery::CreateQuery() : OSQLQuery() {} |
121 | CreateQuery::~CreateQuery() {} | 121 | CreateQuery::~CreateQuery() {} |
122 | QString CreateQuery::query()const { | 122 | QString CreateQuery::query()const { |
123 | QString qu; | 123 | QString qu; |
124 | qu += "create table todolist( uid PRIMARY KEY, categories, completed, "; | 124 | qu += "create table todolist( uid PRIMARY KEY, categories, completed, "; |
125 | qu += "description, summary, priority, DueDate, progress , state, "; | 125 | qu += "description, summary, priority, DueDate, progress , state, "; |
126 | qu += "Recurrence, reminders, alarms, maintainer, startdate, completeddate);"; | 126 | // This is the recurrance-stuff .. Exceptions are currently not supported (see ORecur.cpp) ! (eilers) |
127 | qu += "RType, RWeekdays, RPosition, RFreq, RHasEndDate, EndDate, Created, Exceptions, "; | ||
128 | qu += "reminders, alarms, maintainer, startdate, completeddate);"; | ||
127 | qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; | 129 | qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; |
128 | return qu; | 130 | return qu; |
129 | } | 131 | } |
130 | 132 | ||
131 | LoadQuery::LoadQuery() : OSQLQuery() {} | 133 | LoadQuery::LoadQuery() : OSQLQuery() {} |
132 | LoadQuery::~LoadQuery() {} | 134 | LoadQuery::~LoadQuery() {} |
133 | QString LoadQuery::query()const { | 135 | QString LoadQuery::query()const { |
134 | QString qu; | 136 | QString qu; |
135 | // We do not need "distinct" here. The primary key is always unique.. | 137 | // We do not need "distinct" here. The primary key is always unique.. |
136 | //qu += "select distinct uid from todolist"; | 138 | //qu += "select distinct uid from todolist"; |
137 | qu += "select uid from todolist"; | 139 | qu += "select uid from todolist"; |
138 | 140 | ||
139 | return qu; | 141 | return qu; |
140 | } | 142 | } |
141 | 143 | ||
142 | InsertQuery::InsertQuery( const OTodo& todo ) | 144 | InsertQuery::InsertQuery( const OTodo& todo ) |
143 | : OSQLQuery(), m_todo( todo ) { | 145 | : OSQLQuery(), m_todo( todo ) { |
144 | } | 146 | } |
145 | InsertQuery::~InsertQuery() { | 147 | InsertQuery::~InsertQuery() { |
146 | } | 148 | } |
147 | /* | 149 | /* |
148 | * converts from a OTodo to a query | 150 | * converts from a OTodo to a query |
149 | * we leave out X-Ref + Alarms | 151 | * we leave out X-Ref + Alarms |
150 | */ | 152 | */ |
151 | QString InsertQuery::query()const{ | 153 | QString InsertQuery::query()const{ |
152 | 154 | ||
153 | int year, month, day; | 155 | int year, month, day; |
154 | year = month = day = 0; | 156 | year = month = day = 0; |
155 | if (m_todo.hasDueDate() ) { | 157 | if (m_todo.hasDueDate() ) { |
156 | QDate date = m_todo.dueDate(); | 158 | QDate date = m_todo.dueDate(); |
157 | year = date.year(); | 159 | year = date.year(); |
158 | month = date.month(); | 160 | month = date.month(); |
159 | day = date.day(); | 161 | day = date.day(); |
160 | } | 162 | } |
161 | int sYear = 0, sMonth = 0, sDay = 0; | 163 | int sYear = 0, sMonth = 0, sDay = 0; |
162 | if( m_todo.hasStartDate() ){ | 164 | if( m_todo.hasStartDate() ){ |
163 | QDate sDate = m_todo.startDate(); | 165 | QDate sDate = m_todo.startDate(); |
164 | sYear = sDate.year(); | 166 | sYear = sDate.year(); |
165 | sMonth= sDate.month(); | 167 | sMonth= sDate.month(); |
166 | sDay = sDate.day(); | 168 | sDay = sDate.day(); |
167 | } | 169 | } |
168 | 170 | ||
169 | int eYear = 0, eMonth = 0, eDay = 0; | 171 | int eYear = 0, eMonth = 0, eDay = 0; |
170 | if( m_todo.hasCompletedDate() ){ | 172 | if( m_todo.hasCompletedDate() ){ |
171 | QDate eDate = m_todo.completedDate(); | 173 | QDate eDate = m_todo.completedDate(); |
172 | eYear = eDate.year(); | 174 | eYear = eDate.year(); |
173 | eMonth= eDate.month(); | 175 | eMonth= eDate.month(); |
174 | eDay = eDate.day(); | 176 | eDay = eDate.day(); |
175 | } | 177 | } |
176 | QString qu; | 178 | QString qu; |
179 | QMap<int, QString> recMap = m_todo.recurrence().toMap(); | ||
177 | qu = "insert into todolist VALUES(" | 180 | qu = "insert into todolist VALUES(" |
178 | + QString::number( m_todo.uid() ) + "," | 181 | + QString::number( m_todo.uid() ) + "," |
179 | + "'" + m_todo.idsToString( m_todo.categories() ) + "'" + "," | 182 | + "'" + m_todo.idsToString( m_todo.categories() ) + "'" + "," |
180 | + QString::number( m_todo.isCompleted() ) + "," | 183 | + QString::number( m_todo.isCompleted() ) + "," |
181 | + "'" + m_todo.description() + "'" + "," | 184 | + "'" + m_todo.description() + "'" + "," |
182 | + "'" + m_todo.summary() + "'" + "," | 185 | + "'" + m_todo.summary() + "'" + "," |
183 | + QString::number(m_todo.priority() ) + "," | 186 | + QString::number(m_todo.priority() ) + "," |
184 | + "'" + QString::number(year) + "-" | 187 | + "'" + QString::number(year) + "-" |
185 | + QString::number(month) | 188 | + QString::number(month) |
186 | + "-" + QString::number( day ) + "'" + "," | 189 | + "-" + QString::number( day ) + "'" + "," |
187 | + QString::number( m_todo.progress() ) + "," | 190 | + QString::number( m_todo.progress() ) + "," |
188 | + QString::number( m_todo.state().state() ) + "," | 191 | + QString::number( m_todo.state().state() ) + "," |
189 | + "'" + m_todo.recurrence().toString() + "'"+ ","; | 192 | + "'" + recMap[ ORecur::RType ] + "'" + "," |
193 | + "'" + recMap[ ORecur::RWeekdays ] + "'" + "," | ||
194 | + "'" + recMap[ ORecur::RPosition ] + "'" + "," | ||
195 | + "'" + recMap[ ORecur::RFreq ] + "'" + "," | ||
196 | + "'" + recMap[ ORecur::RHasEndDate ] + "'" + "," | ||
197 | + "'" + recMap[ ORecur::EndDate ] + "'" + "," | ||
198 | + "'" + recMap[ ORecur::Created ] + "'" + "," | ||
199 | + "'" + recMap[ ORecur::Exceptions ] + "'" + ","; | ||
190 | 200 | ||
191 | if ( m_todo.hasNotifiers() ) { | 201 | if ( m_todo.hasNotifiers() ) { |
192 | OPimNotifyManager manager = m_todo.notifiers(); | 202 | OPimNotifyManager manager = m_todo.notifiers(); |
193 | qu += "'" + manager.remindersToString() + "'" + "," | 203 | qu += "'" + manager.remindersToString() + "'" + "," |
194 | + "'" + manager.alarmsToString() + "'" + ","; | 204 | + "'" + manager.alarmsToString() + "'" + ","; |
195 | } | 205 | } |
196 | else{ | 206 | else{ |
197 | qu += QString( "''" ) + "," | 207 | qu += QString( "''" ) + "," |
198 | + "''" + ","; | 208 | + "''" + ","; |
199 | } | 209 | } |
200 | 210 | ||
201 | qu += QString( "''" ) + QString( "," ) // Maintainers (cur. not supported !) | 211 | qu += QString( "''" ) + QString( "," ) // Maintainers (cur. not supported !) |
202 | + "'" + QString::number(sYear) + "-" | 212 | + "'" + QString::number(sYear) + "-" |
203 | + QString::number(sMonth) | 213 | + QString::number(sMonth) |
204 | + "-" + QString::number(sDay) + "'" + "," | 214 | + "-" + QString::number(sDay) + "'" + "," |
205 | + "'" + QString::number(eYear) + "-" | 215 | + "'" + QString::number(eYear) + "-" |
206 | + QString::number(eMonth) | 216 | + QString::number(eMonth) |
207 | + "-"+QString::number(eDay) + "'" | 217 | + "-"+QString::number(eDay) + "'" |
208 | + ")"; | 218 | + ")"; |
209 | 219 | ||
210 | qWarning("add %s", qu.latin1() ); | 220 | qWarning("add %s", qu.latin1() ); |
211 | return qu; | 221 | return qu; |
212 | } | 222 | } |
213 | 223 | ||
214 | RemoveQuery::RemoveQuery(int uid ) | 224 | RemoveQuery::RemoveQuery(int uid ) |
215 | : OSQLQuery(), m_uid( uid ) {} | 225 | : OSQLQuery(), m_uid( uid ) {} |
216 | RemoveQuery::~RemoveQuery() {} | 226 | RemoveQuery::~RemoveQuery() {} |
217 | QString RemoveQuery::query()const { | 227 | QString RemoveQuery::query()const { |
218 | QString qu = "DELETE from todolist where uid = " + QString::number(m_uid); | 228 | QString qu = "DELETE from todolist where uid = " + QString::number(m_uid); |
219 | return qu; | 229 | return qu; |
220 | } | 230 | } |
221 | 231 | ||
@@ -495,94 +505,107 @@ bool OTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ | |||
495 | year = list[0].toInt(); | 505 | year = list[0].toInt(); |
496 | month = list[1].toInt(); | 506 | month = list[1].toInt(); |
497 | day = list[2].toInt(); | 507 | day = list[2].toInt(); |
498 | da.setYMD( year, month, day ); | 508 | da.setYMD( year, month, day ); |
499 | return true; | 509 | return true; |
500 | } | 510 | } |
501 | } | 511 | } |
502 | OTodo OTodoAccessBackendSQL::todo( const OSQLResult& res) const{ | 512 | OTodo OTodoAccessBackendSQL::todo( const OSQLResult& res) const{ |
503 | if ( res.state() == OSQLResult::Failure ) { | 513 | if ( res.state() == OSQLResult::Failure ) { |
504 | OTodo to; | 514 | OTodo to; |
505 | return to; | 515 | return to; |
506 | } | 516 | } |
507 | 517 | ||
508 | OSQLResultItem::ValueList list = res.results(); | 518 | OSQLResultItem::ValueList list = res.results(); |
509 | OSQLResultItem::ValueList::Iterator it = list.begin(); | 519 | OSQLResultItem::ValueList::Iterator it = list.begin(); |
510 | qWarning("todo1"); | 520 | qWarning("todo1"); |
511 | OTodo to = todo( (*it) ); | 521 | OTodo to = todo( (*it) ); |
512 | cache( to ); | 522 | cache( to ); |
513 | ++it; | 523 | ++it; |
514 | 524 | ||
515 | for ( ; it != list.end(); ++it ) { | 525 | for ( ; it != list.end(); ++it ) { |
516 | qWarning("caching"); | 526 | qWarning("caching"); |
517 | cache( todo( (*it) ) ); | 527 | cache( todo( (*it) ) ); |
518 | } | 528 | } |
519 | return to; | 529 | return to; |
520 | } | 530 | } |
521 | OTodo OTodoAccessBackendSQL::todo( OSQLResultItem& item )const { | 531 | OTodo OTodoAccessBackendSQL::todo( OSQLResultItem& item )const { |
522 | qWarning("todo"); | 532 | qWarning("todo"); |
523 | bool hasDueDate = false; QDate dueDate = QDate::currentDate(); | 533 | bool hasDueDate = false; QDate dueDate = QDate::currentDate(); |
524 | hasDueDate = date( dueDate, item.data("DueDate") ); | 534 | hasDueDate = date( dueDate, item.data("DueDate") ); |
525 | QStringList cats = QStringList::split(";", item.data("categories") ); | 535 | QStringList cats = QStringList::split(";", item.data("categories") ); |
526 | 536 | ||
537 | qWarning("Item is completed: %d", item.data("completed").toInt() ); | ||
538 | |||
527 | OTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(), | 539 | OTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(), |
528 | cats, item.data("summary"), item.data("description"), | 540 | cats, item.data("summary"), item.data("description"), |
529 | item.data("progress").toUShort(), hasDueDate, dueDate, | 541 | item.data("progress").toUShort(), hasDueDate, dueDate, |
530 | item.data("uid").toInt() ); | 542 | item.data("uid").toInt() ); |
531 | 543 | ||
532 | bool isOk; | 544 | bool isOk; |
533 | int prioInt = QString( item.data("priority") ).toInt( &isOk ); | 545 | int prioInt = QString( item.data("priority") ).toInt( &isOk ); |
534 | if ( isOk ) | 546 | if ( isOk ) |
535 | to.setPriority( prioInt ); | 547 | to.setPriority( prioInt ); |
536 | 548 | ||
537 | bool hasStartDate = false; QDate startDate = QDate::currentDate(); | 549 | bool hasStartDate = false; QDate startDate = QDate::currentDate(); |
538 | hasStartDate = date( startDate, item.data("startdate") ); | 550 | hasStartDate = date( startDate, item.data("startdate") ); |
539 | bool hasCompletedDate = false; QDate completedDate = QDate::currentDate(); | 551 | bool hasCompletedDate = false; QDate completedDate = QDate::currentDate(); |
540 | hasCompletedDate = date( completedDate, item.data("completeddate") ); | 552 | hasCompletedDate = date( completedDate, item.data("completeddate") ); |
541 | 553 | ||
542 | if ( hasStartDate ) | 554 | if ( hasStartDate ) |
543 | to.setStartDate( startDate ); | 555 | to.setStartDate( startDate ); |
544 | if ( hasCompletedDate ) | 556 | if ( hasCompletedDate ) |
545 | to.setCompletedDate( completedDate ); | 557 | to.setCompletedDate( completedDate ); |
546 | 558 | ||
547 | OPimNotifyManager& manager = to.notifiers(); | 559 | OPimNotifyManager& manager = to.notifiers(); |
548 | manager.alarmsFromString( item.data("alarms") ); | 560 | manager.alarmsFromString( item.data("alarms") ); |
549 | manager.remindersFromString( item.data("reminders") ); | 561 | manager.remindersFromString( item.data("reminders") ); |
550 | 562 | ||
551 | OPimState pimState; | 563 | OPimState pimState; |
552 | pimState.setState( QString( item.data("state") ).toInt() ); | 564 | pimState.setState( QString( item.data("state") ).toInt() ); |
553 | to.setState( pimState ); | 565 | to.setState( pimState ); |
554 | 566 | ||
555 | // Recurrence not supported yet | 567 | QMap<int, QString> recMap; |
556 | // to.setRecurrence( | 568 | recMap.insert( ORecur::RType , item.data("RType") ); |
569 | recMap.insert( ORecur::RWeekdays , item.data("RWeekdays") ); | ||
570 | recMap.insert( ORecur::RPosition , item.data("RPosition") ); | ||
571 | recMap.insert( ORecur::RFreq , item.data("RFreq") ); | ||
572 | recMap.insert( ORecur::RHasEndDate, item.data("RHasEndDate") ); | ||
573 | recMap.insert( ORecur::EndDate , item.data("EndDate") ); | ||
574 | recMap.insert( ORecur::Created , item.data("Created") ); | ||
575 | recMap.insert( ORecur::Exceptions , item.data("Exceptions") ); | ||
576 | |||
577 | ORecur recur; | ||
578 | recur.fromMap( recMap ); | ||
579 | to.setRecurrence( recur ); | ||
557 | 580 | ||
558 | return to; | 581 | return to; |
559 | } | 582 | } |
560 | OTodo OTodoAccessBackendSQL::todo( int uid )const { | 583 | OTodo OTodoAccessBackendSQL::todo( int uid )const { |
561 | FindQuery find( uid ); | 584 | FindQuery find( uid ); |
562 | return todo( m_driver->query(&find) ); | 585 | return todo( m_driver->query(&find) ); |
563 | } | 586 | } |
564 | /* | 587 | /* |
565 | * update the dict | 588 | * update the dict |
566 | */ | 589 | */ |
567 | void OTodoAccessBackendSQL::fillDict() { | 590 | void OTodoAccessBackendSQL::fillDict() { |
568 | /* initialize dict */ | 591 | /* initialize dict */ |
569 | /* | 592 | /* |
570 | * UPDATE dict if you change anything!!! | 593 | * UPDATE dict if you change anything!!! |
571 | * FIXME: Isn't this dict obsolete ? (eilers) | 594 | * FIXME: Isn't this dict obsolete ? (eilers) |
572 | */ | 595 | */ |
573 | m_dict.setAutoDelete( TRUE ); | 596 | m_dict.setAutoDelete( TRUE ); |
574 | m_dict.insert("Categories" , new int(OTodo::Category) ); | 597 | m_dict.insert("Categories" , new int(OTodo::Category) ); |
575 | m_dict.insert("Uid" , new int(OTodo::Uid) ); | 598 | m_dict.insert("Uid" , new int(OTodo::Uid) ); |
576 | m_dict.insert("HasDate" , new int(OTodo::HasDate) ); | 599 | m_dict.insert("HasDate" , new int(OTodo::HasDate) ); |
577 | m_dict.insert("Completed" , new int(OTodo::Completed) ); | 600 | m_dict.insert("Completed" , new int(OTodo::Completed) ); |
578 | m_dict.insert("Description" , new int(OTodo::Description) ); | 601 | m_dict.insert("Description" , new int(OTodo::Description) ); |
579 | m_dict.insert("Summary" , new int(OTodo::Summary) ); | 602 | m_dict.insert("Summary" , new int(OTodo::Summary) ); |
580 | m_dict.insert("Priority" , new int(OTodo::Priority) ); | 603 | m_dict.insert("Priority" , new int(OTodo::Priority) ); |
581 | m_dict.insert("DateDay" , new int(OTodo::DateDay) ); | 604 | m_dict.insert("DateDay" , new int(OTodo::DateDay) ); |
582 | m_dict.insert("DateMonth" , new int(OTodo::DateMonth) ); | 605 | m_dict.insert("DateMonth" , new int(OTodo::DateMonth) ); |
583 | m_dict.insert("DateYear" , new int(OTodo::DateYear) ); | 606 | m_dict.insert("DateYear" , new int(OTodo::DateYear) ); |
584 | m_dict.insert("Progress" , new int(OTodo::Progress) ); | 607 | m_dict.insert("Progress" , new int(OTodo::Progress) ); |
585 | m_dict.insert("Completed", new int(OTodo::Completed) ); // Why twice ? (eilers) | 608 | m_dict.insert("Completed", new int(OTodo::Completed) ); // Why twice ? (eilers) |
586 | m_dict.insert("CrossReference", new int(OTodo::CrossReference) ); | 609 | m_dict.insert("CrossReference", new int(OTodo::CrossReference) ); |
587 | // m_dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) ); // old stuff (eilers) | 610 | // m_dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) ); // old stuff (eilers) |
588 | // m_dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) ); // old stuff (eilers) | 611 | // m_dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) ); // old stuff (eilers) |
diff --git a/libopie2/opiepim/core/orecur.cpp b/libopie2/opiepim/core/orecur.cpp index eae1fdc..8c9ad46 100644 --- a/libopie2/opiepim/core/orecur.cpp +++ b/libopie2/opiepim/core/orecur.cpp | |||
@@ -427,84 +427,159 @@ void ORecur::setHasEndDate( bool b) { | |||
427 | void ORecur::setRepitition( int rep ) { | 427 | void ORecur::setRepitition( int rep ) { |
428 | checkOrModify(); | 428 | checkOrModify(); |
429 | data->rep = rep; | 429 | data->rep = rep; |
430 | } | 430 | } |
431 | void ORecur::setService( const QString& app ) { | 431 | void ORecur::setService( const QString& app ) { |
432 | checkOrModify(); | 432 | checkOrModify(); |
433 | data->app = app; | 433 | data->app = app; |
434 | } | 434 | } |
435 | void ORecur::setStart( const QDate& dt ) { | 435 | void ORecur::setStart( const QDate& dt ) { |
436 | checkOrModify(); | 436 | checkOrModify(); |
437 | data->start = dt; | 437 | data->start = dt; |
438 | } | 438 | } |
439 | void ORecur::checkOrModify() { | 439 | void ORecur::checkOrModify() { |
440 | if ( data->count != 1 ) { | 440 | if ( data->count != 1 ) { |
441 | data->deref(); | 441 | data->deref(); |
442 | Data* d2 = new Data; | 442 | Data* d2 = new Data; |
443 | d2->days = data->days; | 443 | d2->days = data->days; |
444 | d2->type = data->type; | 444 | d2->type = data->type; |
445 | d2->freq = data->freq; | 445 | d2->freq = data->freq; |
446 | d2->pos = data->pos; | 446 | d2->pos = data->pos; |
447 | d2->hasEnd = data->hasEnd; | 447 | d2->hasEnd = data->hasEnd; |
448 | d2->end = data->end; | 448 | d2->end = data->end; |
449 | d2->create = data->create; | 449 | d2->create = data->create; |
450 | d2->rep = data->rep; | 450 | d2->rep = data->rep; |
451 | d2->app = data->app; | 451 | d2->app = data->app; |
452 | d2->list = data->list; | 452 | d2->list = data->list; |
453 | d2->start = data->start; | 453 | d2->start = data->start; |
454 | data = d2; | 454 | data = d2; |
455 | } | 455 | } |
456 | } | 456 | } |
457 | QString ORecur::toString()const { | 457 | QString ORecur::toString()const { |
458 | QString buf; | 458 | QString buf; |
459 | QMap<int, QString> recMap = toMap(); | ||
459 | 460 | ||
460 | buf += " rtype=\""; | 461 | buf += " rtype=\""; |
461 | switch ( data->type ) { | 462 | buf += recMap[ORecur::RType]; |
462 | case ORecur::Daily: | ||
463 | buf += "Daily"; | ||
464 | break; | ||
465 | case ORecur::Weekly: | ||
466 | buf += "Weekly"; | ||
467 | break; | ||
468 | case ORecur::MonthlyDay: | ||
469 | buf += "MonthlyDay"; | ||
470 | break; | ||
471 | case ORecur::MonthlyDate: | ||
472 | buf += "MonthlyDate"; | ||
473 | break; | ||
474 | case ORecur::Yearly: | ||
475 | buf += "Yearly"; | ||
476 | break; | ||
477 | default: | ||
478 | buf += "NoRepeat"; | ||
479 | break; | ||
480 | } | ||
481 | buf += "\""; | 463 | buf += "\""; |
482 | if (data->days > 0 ) | 464 | if (data->days > 0 ) |
483 | buf += " rweekdays=\"" + QString::number( static_cast<int>( data->days ) ) + "\""; | 465 | buf += " rweekdays=\"" + recMap[ORecur::RWeekdays] + "\""; |
484 | if ( data->pos != 0 ) | 466 | if ( data->pos != 0 ) |
485 | buf += " rposition=\"" + QString::number(data->pos ) + "\""; | 467 | buf += " rposition=\"" + recMap[ORecur::RPosition] + "\""; |
486 | 468 | ||
487 | buf += " rfreq=\"" + QString::number( data->freq ) + "\""; | 469 | buf += " rfreq=\"" + recMap[ORecur::RFreq] + "\""; |
488 | buf += " rhasenddate=\"" + QString::number( static_cast<int>( data->hasEnd ) ) + "\""; | 470 | buf += " rhasenddate=\"" + recMap[ORecur::RHasEndDate]+ "\""; |
489 | if ( data->hasEnd ) | 471 | if ( data->hasEnd ) |
490 | buf += " enddt=\"" | 472 | buf += " enddt=\"" |
491 | + QString::number( OTimeZone::utc().fromUTCDateTime( QDateTime( data->end, QTime(12,0,0) ) ) ) | 473 | + recMap[ORecur::EndDate] |
492 | + "\""; | 474 | + "\""; |
493 | buf += " created=\"" + QString::number( OTimeZone::utc().fromUTCDateTime( data->create ) ) + "\""; | 475 | buf += " created=\"" + recMap[ORecur::Created] + "\""; |
494 | 476 | ||
495 | if ( data->list.isEmpty() ) return buf; | 477 | if ( data->list.isEmpty() ) return buf; |
496 | // save exceptions list here!! | ||
497 | ExceptionList::ConstIterator it; | ||
498 | ExceptionList list = data->list; | ||
499 | buf += " exceptions=\""; | 478 | buf += " exceptions=\""; |
500 | QDate date; | 479 | buf += recMap[ORecur::Exceptions]; |
501 | for ( it = list.begin(); it != list.end(); ++it ) { | ||
502 | date = (*it); | ||
503 | if ( it != list.begin() ) buf += " "; | ||
504 | |||
505 | buf += QCString().sprintf("%04d%02d%02d", date.year(), date.month(), date.day() ); | ||
506 | } | ||
507 | buf += "\" "; | 480 | buf += "\" "; |
508 | 481 | ||
509 | return buf; | 482 | return buf; |
510 | } | 483 | } |
484 | |||
485 | QString ORecur::rTypeString() const | ||
486 | { | ||
487 | QString retString; | ||
488 | switch ( data->type ) { | ||
489 | case ORecur::Daily: | ||
490 | retString = "Daily"; | ||
491 | break; | ||
492 | case ORecur::Weekly: | ||
493 | retString = "Weekly"; | ||
494 | break; | ||
495 | case ORecur::MonthlyDay: | ||
496 | retString = "MonthlyDay"; | ||
497 | break; | ||
498 | case ORecur::MonthlyDate: | ||
499 | retString = "MonthlyDate"; | ||
500 | break; | ||
501 | case ORecur::Yearly: | ||
502 | retString = "Yearly"; | ||
503 | break; | ||
504 | default: | ||
505 | retString = "NoRepeat"; | ||
506 | break; | ||
507 | |||
508 | } | ||
509 | |||
510 | return retString; | ||
511 | } | ||
512 | |||
513 | QMap<QString, ORecur::RepeatType> ORecur::rTypeValueConvertMap() const | ||
514 | { | ||
515 | QMap<QString, RepeatType> convertMap; | ||
516 | |||
517 | convertMap.insert( QString( "Daily" ), ORecur::Daily ); | ||
518 | convertMap.insert( QString( "Weekly" ), ORecur::Weekly ); | ||
519 | convertMap.insert( QString( "MonthlyDay" ), ORecur::MonthlyDay ); | ||
520 | convertMap.insert( QString( "MonthlyDate" ), ORecur::MonthlyDate ); | ||
521 | convertMap.insert( QString( "Yearly" ), ORecur::Yearly ); | ||
522 | convertMap.insert( QString( "NoRepeat" ), ORecur::NoRepeat ); | ||
523 | |||
524 | return convertMap; | ||
525 | } | ||
526 | |||
527 | |||
528 | QMap<int, QString> ORecur::toMap() const | ||
529 | { | ||
530 | QMap<int, QString> retMap; | ||
531 | |||
532 | retMap.insert( ORecur::RType, rTypeString() ); | ||
533 | retMap.insert( ORecur::RWeekdays, QString::number( static_cast<int>( data->days ) ) ); | ||
534 | retMap.insert( ORecur::RPosition, QString::number(data->pos ) ); | ||
535 | retMap.insert( ORecur::RFreq, QString::number( data->freq ) ); | ||
536 | retMap.insert( ORecur::RHasEndDate, QString::number( static_cast<int>( data->hasEnd ) ) ); | ||
537 | if( data -> hasEnd ) | ||
538 | retMap.insert( ORecur::EndDate, QString::number( OTimeZone::utc().fromUTCDateTime( QDateTime( data->end, QTime(12,0,0) ) ) ) ); | ||
539 | retMap.insert( ORecur::Created, QString::number( OTimeZone::utc().fromUTCDateTime( data->create ) ) ); | ||
540 | |||
541 | if ( data->list.isEmpty() ) return retMap; | ||
542 | |||
543 | // save exceptions list here!! | ||
544 | ExceptionList::ConstIterator it; | ||
545 | ExceptionList list = data->list; | ||
546 | QString exceptBuf; | ||
547 | QDate date; | ||
548 | for ( it = list.begin(); it != list.end(); ++it ) { | ||
549 | date = (*it); | ||
550 | if ( it != list.begin() ) exceptBuf += " "; | ||
551 | |||
552 | exceptBuf += QCString().sprintf("%04d%02d%02d", date.year(), date.month(), date.day() ); | ||
553 | } | ||
554 | |||
555 | retMap.insert( ORecur::Exceptions, exceptBuf ); | ||
556 | |||
557 | return retMap; | ||
558 | } | ||
559 | |||
560 | void ORecur::fromMap( const QMap<int, QString>& map ) | ||
561 | { | ||
562 | QMap<QString, RepeatType> repTypeMap = rTypeValueConvertMap(); | ||
563 | |||
564 | data -> type = repTypeMap[ map [ORecur::RType] ]; | ||
565 | data -> days = (char) map[ ORecur::RWeekdays ].toInt(); | ||
566 | data -> pos = map[ ORecur::RPosition ].toInt(); | ||
567 | data -> freq = map[ ORecur::RFreq ].toInt(); | ||
568 | data -> hasEnd= map[ ORecur::RHasEndDate ].toInt() ? true : false; | ||
569 | OTimeZone utc = OTimeZone::utc(); | ||
570 | if ( data -> hasEnd ){ | ||
571 | data -> end = utc.fromUTCDateTime( (time_t) map[ ORecur::EndDate ].toLong() ).date(); | ||
572 | } | ||
573 | data -> create = utc.fromUTCDateTime( (time_t) map[ ORecur::Created ].toLong() ).date(); | ||
574 | |||
575 | #if 0 | ||
576 | // FIXME: Exceptions currently not supported... | ||
577 | // Convert the list of exceptions from QString into ExceptionList | ||
578 | data -> list.clear(); | ||
579 | QString exceptStr = map[ ORecur::Exceptions ]; | ||
580 | QStringList exceptList = QStringList::split( " ", exceptStr ); | ||
581 | ... | ||
582 | #endif | ||
583 | |||
584 | |||
585 | } | ||
diff --git a/libopie2/opiepim/core/orecur.h b/libopie2/opiepim/core/orecur.h index b214b3f..47901b0 100644 --- a/libopie2/opiepim/core/orecur.h +++ b/libopie2/opiepim/core/orecur.h | |||
@@ -1,91 +1,101 @@ | |||
1 | /* | 1 | /* |
2 | * GPL from TT | 2 | * GPL from TT |
3 | */ | 3 | */ |
4 | 4 | ||
5 | #ifndef OPIE_RECUR_H | 5 | #ifndef OPIE_RECUR_H |
6 | #define OPIE_RECUR_H | 6 | #define OPIE_RECUR_H |
7 | 7 | ||
8 | #include <sys/types.h> | 8 | #include <sys/types.h> |
9 | 9 | ||
10 | #include <qdatetime.h> | 10 | #include <qdatetime.h> |
11 | #include <qvaluelist.h> | 11 | #include <qvaluelist.h> |
12 | 12 | #include <qmap.h> | |
13 | 13 | ||
14 | class ORecur { | 14 | class ORecur { |
15 | public: | 15 | public: |
16 | typedef QValueList<QDate> ExceptionList; | 16 | typedef QValueList<QDate> ExceptionList; |
17 | enum RepeatType{ NoRepeat = -1, Daily, Weekly, MonthlyDay, | 17 | enum RepeatType{ NoRepeat = -1, Daily, Weekly, MonthlyDay, |
18 | MonthlyDate, Yearly }; | 18 | MonthlyDate, Yearly }; |
19 | enum Days { MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08, | 19 | enum Days { MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08, |
20 | FRI = 0x10, SAT = 0x20, SUN = 0x40 }; | 20 | FRI = 0x10, SAT = 0x20, SUN = 0x40 }; |
21 | enum Fields{ RType = 0, RWeekdays, RPosition, RFreq, RHasEndDate, | ||
22 | EndDate, Created, Exceptions }; | ||
23 | |||
21 | ORecur(); | 24 | ORecur(); |
22 | ORecur( const ORecur& ); | 25 | ORecur( const ORecur& ); |
23 | ~ORecur(); | 26 | ~ORecur(); |
24 | 27 | ||
25 | ORecur &operator=( const ORecur& ); | 28 | ORecur &operator=( const ORecur& ); |
26 | bool operator==(const ORecur& )const; | 29 | bool operator==(const ORecur& )const; |
27 | 30 | ||
28 | bool doesRecur()const; | 31 | bool doesRecur()const; |
29 | /* if it recurrs on that day */ | 32 | /* if it recurrs on that day */ |
30 | bool doesRecur( const QDate& ); | 33 | bool doesRecur( const QDate& ); |
31 | RepeatType type()const; | 34 | RepeatType type()const; |
32 | int frequency()const; | 35 | int frequency()const; |
33 | int position()const; | 36 | int position()const; |
34 | char days()const; | 37 | char days()const; |
35 | bool hasEndDate()const; | 38 | bool hasEndDate()const; |
36 | QDate start()const; | 39 | QDate start()const; |
37 | QDate endDate()const; | 40 | QDate endDate()const; |
38 | QDateTime createdDateTime()const; | 41 | QDateTime createdDateTime()const; |
39 | /** | 42 | /** |
40 | * starting on monday=0, sunday=6 | 43 | * starting on monday=0, sunday=6 |
41 | * for convience | 44 | * for convience |
42 | */ | 45 | */ |
43 | bool repeatOnWeekDay( int day )const; | 46 | bool repeatOnWeekDay( int day )const; |
44 | 47 | ||
45 | /** | 48 | /** |
46 | * FromWhereToStart is not included!!! | 49 | * FromWhereToStart is not included!!! |
47 | */ | 50 | */ |
48 | bool nextOcurrence( const QDate& FromWhereToStart, QDate &recurDate ); | 51 | bool nextOcurrence( const QDate& FromWhereToStart, QDate &recurDate ); |
49 | 52 | ||
50 | /** | 53 | /** |
51 | * The module this ORecur belongs to | 54 | * The module this ORecur belongs to |
52 | */ | 55 | */ |
53 | QString service()const; | 56 | QString service()const; |
54 | 57 | ||
55 | /* | 58 | /* |
56 | * reference to the exception list | 59 | * reference to the exception list |
57 | */ | 60 | */ |
58 | ExceptionList &exceptions(); | 61 | ExceptionList &exceptions(); |
59 | 62 | ||
60 | /** | 63 | /** |
61 | * the current repetition | 64 | * the current repetition |
62 | */ | 65 | */ |
63 | int repetition()const; | 66 | int repetition()const; |
64 | 67 | ||
65 | void setType( const RepeatType& ); | 68 | void setType( const RepeatType& ); |
66 | void setFrequency( int freq ); | 69 | void setFrequency( int freq ); |
67 | void setPosition( int pos ); | 70 | void setPosition( int pos ); |
68 | void setDays( char c); | 71 | void setDays( char c); |
69 | void setEndDate( const QDate& dt ); | 72 | void setEndDate( const QDate& dt ); |
70 | void setStart( const QDate& dt ); | 73 | void setStart( const QDate& dt ); |
71 | void setCreatedDateTime( const QDateTime& ); | 74 | void setCreatedDateTime( const QDateTime& ); |
72 | void setHasEndDate( bool b ); | 75 | void setHasEndDate( bool b ); |
73 | void setRepitition(int ); | 76 | void setRepitition(int ); |
74 | 77 | ||
75 | void setService( const QString& ser ); | 78 | void setService( const QString& ser ); |
79 | |||
80 | QMap<int, QString> toMap() const; | ||
81 | void fromMap( const QMap<int, QString>& map ); | ||
76 | 82 | ||
77 | /* almost internal */ | 83 | /* almost internal */ |
78 | QString toString()const; | 84 | QString toString()const; |
79 | private: | 85 | private: |
80 | bool p_nextOccurrence( const QDate& from, QDate& next ); | 86 | bool p_nextOccurrence( const QDate& from, QDate& next ); |
81 | void deref(); | 87 | void deref(); |
82 | inline void checkOrModify(); | 88 | inline void checkOrModify(); |
83 | 89 | ||
90 | /* Converts rType to String */ | ||
91 | QString rTypeString() const; | ||
92 | /* Returns a map to convert Stringname for RType to RepeatType */ | ||
93 | QMap<QString, RepeatType> rTypeValueConvertMap() const; | ||
84 | 94 | ||
85 | class Data; | 95 | class Data; |
86 | Data* data; | 96 | Data* data; |
87 | class ORecurPrivate; | 97 | class ORecurPrivate; |
88 | ORecurPrivate *d; | 98 | ORecurPrivate *d; |
89 | }; | 99 | }; |
90 | 100 | ||
91 | #endif | 101 | #endif |