summaryrefslogtreecommitdiff
authorzecke <zecke>2003-02-21 16:52:49 (UTC)
committer zecke <zecke>2003-02-21 16:52:49 (UTC)
commit0bb9d0f9e7da80f0ae3b91d4ebbb7aab4d2b9df7 (patch) (unidiff)
treef3ce9c9441a1073762f3e0c61cc85f0d5a1fd81d
parenta298235aa1489937e7657079e6352adfc8746acf (diff)
downloadopie-0bb9d0f9e7da80f0ae3b91d4ebbb7aab4d2b9df7.zip
opie-0bb9d0f9e7da80f0ae3b91d4ebbb7aab4d2b9df7.tar.gz
opie-0bb9d0f9e7da80f0ae3b91d4ebbb7aab4d2b9df7.tar.bz2
-Remove old Todo classes they're deprecated and today I already using the
new API -Guard against self assignment in OTodo -Add test apps for OPIM -Opiefied Event classes -Added TimeZone handling and pinning of TimeZones to OEvent -Adjust ORecur and the widget to better timezone behaviour
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/libopie.pro14
-rw-r--r--libopie/orecurrancewidget.cpp2
-rw-r--r--libopie/pim/ocontactaccessbackend_vcard.cpp11
-rw-r--r--libopie/pim/oevent.cpp427
-rw-r--r--libopie/pim/oevent.h198
-rw-r--r--libopie/pim/orecur.cpp25
-rw-r--r--libopie/pim/orecur.h12
-rw-r--r--libopie/pim/otimezone.cpp104
-rw-r--r--libopie/pim/otimezone.h71
-rw-r--r--libopie/pim/otodo.cpp2
-rw-r--r--libopie/pim/test/oevent_test.cpp23
-rw-r--r--libopie/pim/test/oevent_test.pro11
-rw-r--r--libopie/pim/test/test_todo.cpp36
-rw-r--r--libopie/pim/test/todo_test.pro11
-rw-r--r--libopie/tododb.cpp268
-rw-r--r--libopie/tododb.h46
-rw-r--r--libopie/todoevent.cpp339
-rw-r--r--libopie/todoevent.h191
-rw-r--r--libopie/todoresource.h14
-rw-r--r--libopie/todovcalresource.cpp158
-rw-r--r--libopie/todovcalresource.h42
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp11
-rw-r--r--libopie2/opiepim/core/orecur.cpp25
-rw-r--r--libopie2/opiepim/core/orecur.h12
-rw-r--r--libopie2/opiepim/core/otimezone.cpp104
-rw-r--r--libopie2/opiepim/core/otimezone.h71
-rw-r--r--libopie2/opiepim/oevent.cpp427
-rw-r--r--libopie2/opiepim/oevent.h198
-rw-r--r--libopie2/opiepim/otodo.cpp2
29 files changed, 1751 insertions, 1104 deletions
diff --git a/libopie/libopie.pro b/libopie/libopie.pro
index 675e1fa..2b843c1 100644
--- a/libopie/libopie.pro
+++ b/libopie/libopie.pro
@@ -1,108 +1,112 @@
1TEMPLATE = lib 1TEMPLATE = lib
2CONFIG += qte warn_on release 2CONFIG += qte warn_on release
3HEADERS = ofontmenu.h \ 3HEADERS = ofontmenu.h \
4 ocolorbutton.h \ 4 ocolorbutton.h \
5 ofiledialog.h ofileselector.h tododb.h \ 5 ofiledialog.h ofileselector.h \
6 ocheckitem.h todoevent.h todoresource.h \ 6 ocheckitem.h \
7 todovcalresource.h xmltree.h \ 7 xmltree.h \
8 colordialog.h colorpopupmenu.h \ 8 colordialog.h colorpopupmenu.h \
9 oclickablelabel.h oprocctrl.h \ 9 oclickablelabel.h oprocctrl.h \
10 oprocess.h odevice.h odevicebutton.h \ 10 oprocess.h odevice.h odevicebutton.h \
11 otimepicker.h otabwidget.h \ 11 otimepicker.h otabwidget.h \
12 otabbar.h otabinfo.h \ 12 otabbar.h otabinfo.h \
13 ofontselector.h \ 13 ofontselector.h \
14 pim/opimrecord.h \ 14 pim/opimrecord.h \
15 pim/otodo.h \ 15 pim/otodo.h \
16 pim/orecordlist.h \ 16 pim/orecordlist.h \
17 pim/opimaccesstemplate.h \ 17 pim/opimaccesstemplate.h \
18 pim/opimaccessbackend.h \ 18 pim/opimaccessbackend.h \
19 pim/otodoaccess.h \ 19 pim/otodoaccess.h \
20 pim/otodoaccessbackend.h \ 20 pim/otodoaccessbackend.h \
21 pim/ocontact.h \ 21 pim/ocontact.h \
22 pim/ocontactaccess.h \ 22 pim/ocontactaccess.h \
23 pim/ocontactaccessbackend.h \ 23 pim/ocontactaccessbackend.h \
24 pim/ocontactaccessbackend_xml.h \ 24 pim/ocontactaccessbackend_xml.h \
25 pim/ocontactaccessbackend_vcard.h \ 25 pim/ocontactaccessbackend_vcard.h \
26 pim/obackendfactory.h \ 26 pim/obackendfactory.h \
27 pim/opimcache.h \ 27 pim/opimcache.h \
28 pim/otodoaccessvcal.h \ 28 pim/otodoaccessvcal.h \
29 pim/orecur.h \ 29 pim/orecur.h \
30 pim/opimstate.h \ 30 pim/opimstate.h \
31 pim/opimxrefpartner.h \ 31 pim/opimxrefpartner.h \
32 pim/opimxref.h \ 32 pim/opimxref.h \
33 pim/opimxrefmanager.h \ 33 pim/opimxrefmanager.h \
34 pim/opimmaintainer.h \ 34 pim/opimmaintainer.h \
35 pim/opimnotify.h \ 35 pim/opimnotify.h \
36 pim/opimnotifymanager.h \ 36 pim/opimnotifymanager.h \
37 pim/opimmainwindow.h \ 37 pim/opimmainwindow.h \
38 pim/opimresolver.h \ 38 pim/opimresolver.h \
39 pim/oevent.h \
40 pim/otimezone.h \
39 orecurrancewidget.h \ 41 orecurrancewidget.h \
40 oticker.h 42 oticker.h
41# pim/otodoaccesssql.h \ 43# pim/otodoaccesssql.h \
42 44
43SOURCES = ofontmenu.cc \ 45SOURCES = ofontmenu.cc \
44 ocolorbutton.cpp \ 46 ocolorbutton.cpp \
45 sharp_compat.cpp \ 47 sharp_compat.cpp \
46 xmltree.cc \ 48 xmltree.cc \
47 ofiledialog.cc ofileselector.cc \ 49 ofiledialog.cc ofileselector.cc \
48 ocheckitem.cpp tododb.cpp todoevent.cpp \ 50 ocheckitem.cpp \
49 todovcalresource.cpp colordialog.cpp \ 51 colordialog.cpp \
50 colorpopupmenu.cpp oclickablelabel.cpp \ 52 colorpopupmenu.cpp oclickablelabel.cpp \
51 oprocctrl.cpp oprocess.cpp \ 53 oprocctrl.cpp oprocess.cpp \
52 odevice.cpp odevicebutton.cpp otimepicker.cpp \ 54 odevice.cpp odevicebutton.cpp otimepicker.cpp \
53 otabwidget.cpp otabbar.cpp \ 55 otabwidget.cpp otabbar.cpp \
54 ofontselector.cpp \ 56 ofontselector.cpp \
55 pim/otodo.cpp \ 57 pim/otodo.cpp \
56 pim/opimrecord.cpp \ 58 pim/opimrecord.cpp \
57 pim/otodoaccess.cpp \ 59 pim/otodoaccess.cpp \
58 pim/otodoaccessbackend.cpp \ 60 pim/otodoaccessbackend.cpp \
59 pim/otodoaccessxml.cpp \ 61 pim/otodoaccessxml.cpp \
60 pim/ocontact.cpp \ 62 pim/ocontact.cpp \
61 pim/ocontactaccess.cpp \ 63 pim/ocontactaccess.cpp \
62 pim/ocontactaccessbackend_vcard.cpp \ 64 pim/ocontactaccessbackend_vcard.cpp \
63 pim/otodoaccessvcal.cpp \ 65 pim/otodoaccessvcal.cpp \
64 pim/orecur.cpp \ 66 pim/orecur.cpp \
65 pim/opimstate.cpp \ 67 pim/opimstate.cpp \
66 pim/opimxrefpartner.cpp \ 68 pim/opimxrefpartner.cpp \
67 pim/opimxref.cpp \ 69 pim/opimxref.cpp \
68 pim/opimxrefmanager.cpp \ 70 pim/opimxrefmanager.cpp \
69 pim/opimmaintainer.cpp \ 71 pim/opimmaintainer.cpp \
70 pim/opimnotify.cpp \ 72 pim/opimnotify.cpp \
71 pim/opimnotifymanager.cpp \ 73 pim/opimnotifymanager.cpp \
72 pim/opimmainwindow.cpp \ 74 pim/opimmainwindow.cpp \
73 pim/opimresolver.cpp \ 75 pim/opimresolver.cpp \
76 pim/oevent.cpp \
77 pim/otimezone.cpp \
74 orecurrancewidget.cpp \ 78 orecurrancewidget.cpp \
75 oticker.cpp 79 oticker.cpp
76# pim/otodoaccesssql.cpp \ 80# pim/otodoaccesssql.cpp \
77 81
78TARGET = opie 82TARGET = opie
79INCLUDEPATH += $(OPIEDIR)/include 83INCLUDEPATH += $(OPIEDIR)/include
80DESTDIR = $(OPIEDIR)/lib$(PROJMAK) 84DESTDIR = $(OPIEDIR)/lib$(PROJMAK)
81#VERSION = 1.0.0 85#VERSION = 1.0.0
82 86
83LIBS += -lqpe 87LIBS += -lqpe
84 88
85# LIBS += -lopiesql 89# LIBS += -lopiesql
86 90
87INTERFACES = otimepickerbase.ui orecurrancebase.ui 91INTERFACES = otimepickerbase.ui orecurrancebase.ui
88 92
89TRANSLATIONS = ../i18n/de/libopie.ts \ 93TRANSLATIONS = ../i18n/de/libopie.ts \
90 ../i18n/xx/libopie.ts \ 94 ../i18n/xx/libopie.ts \
91 ../i18n/en/libopie.ts \ 95 ../i18n/en/libopie.ts \
92 ../i18n/es/libopie.ts \ 96 ../i18n/es/libopie.ts \
93 ../i18n/fr/libopie.ts \ 97 ../i18n/fr/libopie.ts \
94 ../i18n/hu/libopie.ts \ 98 ../i18n/hu/libopie.ts \
95 ../i18n/ja/libopie.ts \ 99 ../i18n/ja/libopie.ts \
96 ../i18n/ko/libopie.ts \ 100 ../i18n/ko/libopie.ts \
97 ../i18n/no/libopie.ts \ 101 ../i18n/no/libopie.ts \
98 ../i18n/pl/libopie.ts \ 102 ../i18n/pl/libopie.ts \
99 ../i18n/pt/libopie.ts \ 103 ../i18n/pt/libopie.ts \
100 ../i18n/pt_BR/libopie.ts \ 104 ../i18n/pt_BR/libopie.ts \
101 ../i18n/sl/libopie.ts \ 105 ../i18n/sl/libopie.ts \
102 ../i18n/zh_CN/libopie.ts \ 106 ../i18n/zh_CN/libopie.ts \
103 ../i18n/zh_TW/libopie.ts \ 107 ../i18n/zh_TW/libopie.ts \
104 ../i18n/da/libopie.ts 108 ../i18n/da/libopie.ts
105 109
106 110
107 111
108include ( $(OPIEDIR)/include.pro ) 112include ( $(OPIEDIR)/include.pro )
diff --git a/libopie/orecurrancewidget.cpp b/libopie/orecurrancewidget.cpp
index 0484ab9..db86184 100644
--- a/libopie/orecurrancewidget.cpp
+++ b/libopie/orecurrancewidget.cpp
@@ -1,436 +1,436 @@
1#include <qapplication.h> 1#include <qapplication.h>
2#include <qlabel.h> 2#include <qlabel.h>
3#include <qpopupmenu.h> 3#include <qpopupmenu.h>
4#include <qspinbox.h> 4#include <qspinbox.h>
5 5
6#include <qpe/timestring.h> 6#include <qpe/timestring.h>
7 7
8#include "orecurrancewidget.h" 8#include "orecurrancewidget.h"
9 9
10// Global Templates for use in setting up the repeat label... 10// Global Templates for use in setting up the repeat label...
11const QString strDayTemplate = QObject::tr("Every"); 11const QString strDayTemplate = QObject::tr("Every");
12const QString strYearTemplate = QObject::tr("%1 %2 every "); 12const QString strYearTemplate = QObject::tr("%1 %2 every ");
13const QString strMonthDateTemplate = QObject::tr("The %1 every "); 13const QString strMonthDateTemplate = QObject::tr("The %1 every ");
14const QString strMonthDayTemplate = QObject::tr("The %1 %1 of every"); 14const QString strMonthDayTemplate = QObject::tr("The %1 %1 of every");
15const QString strWeekTemplate = QObject::tr("Every "); 15const QString strWeekTemplate = QObject::tr("Every ");
16const QString dayLabel[] = { QObject::tr("Monday"), 16const QString dayLabel[] = { QObject::tr("Monday"),
17 QObject::tr("Tuesday"), 17 QObject::tr("Tuesday"),
18 QObject::tr("Wednesday"), 18 QObject::tr("Wednesday"),
19 QObject::tr("Thursday"), 19 QObject::tr("Thursday"),
20 QObject::tr("Friday"), 20 QObject::tr("Friday"),
21 QObject::tr("Saturday"), 21 QObject::tr("Saturday"),
22 QObject::tr("Sunday") }; 22 QObject::tr("Sunday") };
23 23
24 24
25 static QString numberPlacing( int x );// return the proper word format for 25 static QString numberPlacing( int x );// return the proper word format for
26 // x (1st, 2nd, etc) 26 // x (1st, 2nd, etc)
27static int week( const QDate &dt ); // what week in the month is dt? 27static int week( const QDate &dt ); // what week in the month is dt?
28 28
29 29
30ORecurranceWidget::ORecurranceWidget( bool startOnMonday, 30ORecurranceWidget::ORecurranceWidget( bool startOnMonday,
31 const QDate& newStart, 31 const QDate& newStart,
32 QWidget* parent, 32 QWidget* parent,
33 const char* name, 33 const char* name,
34 bool modal, 34 bool modal,
35 WFlags fl ) 35 WFlags fl )
36 : ORecurranceBase( parent, name, modal, fl ), 36 : ORecurranceBase( parent, name, modal, fl ),
37 start( newStart ), 37 start( newStart ),
38 currInterval( None ), 38 currInterval( None ),
39 startWeekOnMonday( startOnMonday ) 39 startWeekOnMonday( startOnMonday )
40{ 40{
41 init(); 41 init();
42 fraType->setButton( currInterval ); 42 fraType->setButton( currInterval );
43 chkNoEnd->setChecked( TRUE ); 43 chkNoEnd->setChecked( TRUE );
44 setupNone(); 44 setupNone();
45} 45}
46ORecurranceWidget::ORecurranceWidget( bool startOnMonday, 46ORecurranceWidget::ORecurranceWidget( bool startOnMonday,
47 const ORecur& rp, const QDate& startDate, 47 const ORecur& rp, const QDate& startDate,
48 QWidget* parent, const char* name, 48 QWidget* parent, const char* name,
49 bool modal, WFlags fl) 49 bool modal, WFlags fl)
50 : ORecurranceBase( parent, name, modal, fl ), 50 : ORecurranceBase( parent, name, modal, fl ),
51 start( startDate ), 51 start( startDate ),
52 end( rp.endDate() ), 52 end( rp.endDate() ),
53 startWeekOnMonday( startOnMonday ) 53 startWeekOnMonday( startOnMonday )
54{ 54{
55 // do some stuff with the repeat pattern 55 // do some stuff with the repeat pattern
56 init(); 56 init();
57 setRecurrence( rp ); 57 setRecurrence( rp );
58} 58}
59 59
60ORecurranceWidget::~ORecurranceWidget() { 60ORecurranceWidget::~ORecurranceWidget() {
61} 61}
62void ORecurranceWidget::setStartDate( const QDate& date ) { 62void ORecurranceWidget::setStartDate( const QDate& date ) {
63 qWarning("ORecurranceWidget::setStartDate"); 63 qWarning("ORecurranceWidget::setStartDate");
64 setRecurrence( recurrence(), date ); 64 setRecurrence( recurrence(), date );
65} 65}
66void ORecurranceWidget::setRecurrence( const ORecur& rp ) { 66void ORecurranceWidget::setRecurrence( const ORecur& rp ) {
67 setRecurrence( rp, start ); 67 setRecurrence( rp, start );
68} 68}
69void ORecurranceWidget::setRecurrence( const ORecur& rp, const QDate& date ) { 69void ORecurranceWidget::setRecurrence( const ORecur& rp, const QDate& date ) {
70 start = date; 70 start = date;
71 end = rp.endDate(); 71 end = rp.endDate();
72 switch ( rp.type() ) { 72 switch ( rp.type() ) {
73 default: 73 default:
74 case ORecur::NoRepeat: 74 case ORecur::NoRepeat:
75 currInterval = None; 75 currInterval = None;
76 setupNone(); 76 setupNone();
77 break; 77 break;
78 case ORecur::Daily: 78 case ORecur::Daily:
79 currInterval = Day; 79 currInterval = Day;
80 setupDaily(); 80 setupDaily();
81 break; 81 break;
82 case ORecur::Weekly: 82 case ORecur::Weekly:
83 currInterval = Week; 83 currInterval = Week;
84 setupWeekly(); 84 setupWeekly();
85 int day, buttons; 85 int day, buttons;
86 for ( day = 0x01, buttons = 0; buttons < 7; 86 for ( day = 0x01, buttons = 0; buttons < 7;
87 day = day << 1, buttons++ ) { 87 day = day << 1, buttons++ ) {
88 if ( rp.days() & day ) { 88 if ( rp.days() & day ) {
89 if ( startWeekOnMonday ) 89 if ( startWeekOnMonday )
90 fraExtra->setButton( buttons ); 90 fraExtra->setButton( buttons );
91 else { 91 else {
92 if ( buttons == 7 ) 92 if ( buttons == 7 )
93 fraExtra->setButton( 0 ); 93 fraExtra->setButton( 0 );
94 else 94 else
95 fraExtra->setButton( buttons + 1 ); 95 fraExtra->setButton( buttons + 1 );
96 } 96 }
97 } 97 }
98 } 98 }
99 slotWeekLabel(); 99 slotWeekLabel();
100 break; 100 break;
101 case ORecur::MonthlyDay: 101 case ORecur::MonthlyDay:
102 currInterval = Month; 102 currInterval = Month;
103 setupMonthly(); 103 setupMonthly();
104 fraExtra->setButton( 0 ); 104 fraExtra->setButton( 0 );
105 slotMonthLabel( 0 ); 105 slotMonthLabel( 0 );
106 break; 106 break;
107 case ORecur::MonthlyDate: 107 case ORecur::MonthlyDate:
108 currInterval = Month; 108 currInterval = Month;
109 setupMonthly(); 109 setupMonthly();
110 fraExtra->setButton( 1 ); 110 fraExtra->setButton( 1 );
111 slotMonthLabel( 1 ); 111 slotMonthLabel( 1 );
112 break; 112 break;
113 case ORecur::Yearly: 113 case ORecur::Yearly:
114 currInterval = Year; 114 currInterval = Year;
115 setupYearly(); 115 setupYearly();
116 break; 116 break;
117 } 117 }
118 fraType->setButton( currInterval ); 118 fraType->setButton( currInterval );
119 spinFreq->setValue( rp.frequency() ); 119 spinFreq->setValue( rp.frequency() );
120 if ( !rp.hasEndDate() ) { 120 if ( !rp.hasEndDate() ) {
121 cmdEnd->setText( tr("No End Date") ); 121 cmdEnd->setText( tr("No End Date") );
122 chkNoEnd->setChecked( TRUE ); 122 chkNoEnd->setChecked( TRUE );
123 } else 123 } else
124 cmdEnd->setText( TimeString::shortDate( end ) ); 124 cmdEnd->setText( TimeString::shortDate( end ) );
125} 125}
126ORecur ORecurranceWidget::recurrence()const { 126ORecur ORecurranceWidget::recurrence()const {
127 QListIterator<QToolButton> it( listRTypeButtons ); 127 QListIterator<QToolButton> it( listRTypeButtons );
128 QListIterator<QToolButton> itExtra( listExtra ); 128 QListIterator<QToolButton> itExtra( listExtra );
129 ORecur rpTmp; 129 ORecur rpTmp;
130 int i; 130 int i;
131 for ( i = 0; *it; ++it, i++ ) { 131 for ( i = 0; *it; ++it, i++ ) {
132 if ( (*it)->isOn() ) { 132 if ( (*it)->isOn() ) {
133 switch ( i ) { 133 switch ( i ) {
134 case None: 134 case None:
135 rpTmp.setType( ORecur::NoRepeat ); 135 rpTmp.setType( ORecur::NoRepeat );
136 break; 136 break;
137 case Day: 137 case Day:
138 rpTmp.setType( ORecur::Daily ); 138 rpTmp.setType( ORecur::Daily );
139 break; 139 break;
140 case Week:{ 140 case Week:{
141 rpTmp.setType( ORecur::Weekly ); 141 rpTmp.setType( ORecur::Weekly );
142 int day; 142 int day;
143 int day2 = 0; 143 int day2 = 0;
144 for ( day = 1; *itExtra; ++itExtra, day = day << 1 ) { 144 for ( day = 1; *itExtra; ++itExtra, day = day << 1 ) {
145 if ( (*itExtra)->isOn() ) { 145 if ( (*itExtra)->isOn() ) {
146 if ( startWeekOnMonday ) 146 if ( startWeekOnMonday )
147 day2 |= day; 147 day2 |= day;
148 else { 148 else {
149 if ( day == 1 ) 149 if ( day == 1 )
150 day2 |= Event::SUN; 150 day2 |= Event::SUN;
151 else 151 else
152 day2 |= day >> 1; 152 day2 |= day >> 1;
153 } 153 }
154 } 154 }
155 } 155 }
156 rpTmp.setDays( day2 ); 156 rpTmp.setDays( day2 );
157 } 157 }
158 break; 158 break;
159 case Month: 159 case Month:
160 if ( cmdExtra1->isOn() ) 160 if ( cmdExtra1->isOn() )
161 rpTmp.setType( ORecur::MonthlyDay ); 161 rpTmp.setType( ORecur::MonthlyDay );
162 else if ( cmdExtra2->isOn() ) 162 else if ( cmdExtra2->isOn() )
163 rpTmp.setType( ORecur::MonthlyDate ); 163 rpTmp.setType( ORecur::MonthlyDate );
164 // figure out the montly day... 164 // figure out the montly day...
165 rpTmp.setPosition( week( start ) ); 165 rpTmp.setPosition( week( start ) );
166 break; 166 break;
167 case Year: 167 case Year:
168 rpTmp.setType( ORecur::Yearly ); 168 rpTmp.setType( ORecur::Yearly );
169 break; 169 break;
170 } 170 }
171 break; // no need to keep looking! 171 break; // no need to keep looking!
172 } 172 }
173 } 173 }
174 rpTmp.setFrequency(spinFreq->value() ); 174 rpTmp.setFrequency(spinFreq->value() );
175 rpTmp.setHasEndDate( !chkNoEnd->isChecked() ); 175 rpTmp.setHasEndDate( !chkNoEnd->isChecked() );
176 if ( rpTmp.hasEndDate() ) { 176 if ( rpTmp.hasEndDate() ) {
177 rpTmp.setEndDate( end ); 177 rpTmp.setEndDate( end );
178 } 178 }
179 // timestamp it... 179 // timestamp it...
180 rpTmp.setCreateTime( time( NULL ) ); 180// rpTmp.setCreateTime( ); current DateTime is already set -zecke
181 return rpTmp; 181 return rpTmp;
182} 182}
183QDate ORecurranceWidget::endDate()const { 183QDate ORecurranceWidget::endDate()const {
184 return end; 184 return end;
185} 185}
186void ORecurranceWidget::slotSetRType(int rtype) { 186void ORecurranceWidget::slotSetRType(int rtype) {
187 // now call the right function based on the type... 187 // now call the right function based on the type...
188 currInterval = static_cast<repeatButtons>(rtype); 188 currInterval = static_cast<repeatButtons>(rtype);
189 switch ( currInterval ) { 189 switch ( currInterval ) {
190 case None: 190 case None:
191 setupNone(); 191 setupNone();
192 break; 192 break;
193 case Day: 193 case Day:
194 setupDaily(); 194 setupDaily();
195 break; 195 break;
196 case Week: 196 case Week:
197 setupWeekly(); 197 setupWeekly();
198 slotWeekLabel(); 198 slotWeekLabel();
199 break; 199 break;
200 case Month: 200 case Month:
201 setupMonthly(); 201 setupMonthly();
202 cmdExtra2->setOn( TRUE ); 202 cmdExtra2->setOn( TRUE );
203 slotMonthLabel( 1 ); 203 slotMonthLabel( 1 );
204 break; 204 break;
205 case Year: 205 case Year:
206 setupYearly(); 206 setupYearly();
207 break; 207 break;
208 } 208 }
209} 209}
210void ORecurranceWidget::endDateChanged(int y, int m, int d) { 210void ORecurranceWidget::endDateChanged(int y, int m, int d) {
211 end.setYMD( y, m, d ); 211 end.setYMD( y, m, d );
212 if ( end < start ) 212 if ( end < start )
213 end = start; 213 end = start;
214 cmdEnd->setText( TimeString::shortDate( end ) ); 214 cmdEnd->setText( TimeString::shortDate( end ) );
215 repeatPicker->setDate( end.year(), end.month(), end.day() ); 215 repeatPicker->setDate( end.year(), end.month(), end.day() );
216} 216}
217void ORecurranceWidget::slotNoEnd( bool unused) { 217void ORecurranceWidget::slotNoEnd( bool unused) {
218 // if the item was toggled, then go ahead and set it to the maximum date 218 // if the item was toggled, then go ahead and set it to the maximum date
219 if ( unused ) { 219 if ( unused ) {
220 end.setYMD( 3000, 12, 31 ); 220 end.setYMD( 3000, 12, 31 );
221 cmdEnd->setText( tr("No End Date") ); 221 cmdEnd->setText( tr("No End Date") );
222 } else { 222 } else {
223 end = start; 223 end = start;
224 cmdEnd->setText( TimeString::shortDate(end) ); 224 cmdEnd->setText( TimeString::shortDate(end) );
225 } 225 }
226} 226}
227void ORecurranceWidget::setupRepeatLabel( const QString& s) { 227void ORecurranceWidget::setupRepeatLabel( const QString& s) {
228 lblVar1->setText( s ); 228 lblVar1->setText( s );
229} 229}
230void ORecurranceWidget::setupRepeatLabel( int x) { 230void ORecurranceWidget::setupRepeatLabel( int x) {
231 // change the spelling based on the value of x 231 // change the spelling based on the value of x
232 QString strVar2; 232 QString strVar2;
233 233
234 if ( x > 1 ) 234 if ( x > 1 )
235 lblVar1->show(); 235 lblVar1->show();
236 else 236 else
237 lblVar1->hide(); 237 lblVar1->hide();
238 238
239 switch ( currInterval ) { 239 switch ( currInterval ) {
240 case None: 240 case None:
241 break; 241 break;
242 case Day: 242 case Day:
243 if ( x > 1 ) 243 if ( x > 1 )
244 strVar2 = tr( "days" ); 244 strVar2 = tr( "days" );
245 else 245 else
246 strVar2 = tr( "day" ); 246 strVar2 = tr( "day" );
247 break; 247 break;
248 case Week: 248 case Week:
249 if ( x > 1 ) 249 if ( x > 1 )
250 strVar2 = tr( "weeks" ); 250 strVar2 = tr( "weeks" );
251 else 251 else
252 strVar2 = tr( "week" ); 252 strVar2 = tr( "week" );
253 break; 253 break;
254 case Month: 254 case Month:
255 if ( x > 1 ) 255 if ( x > 1 )
256 strVar2 = tr( "months" ); 256 strVar2 = tr( "months" );
257 else 257 else
258 strVar2 = tr( "month" ); 258 strVar2 = tr( "month" );
259 break; 259 break;
260 case Year: 260 case Year:
261 if ( x > 1 ) 261 if ( x > 1 )
262 strVar2 = tr( "years" ); 262 strVar2 = tr( "years" );
263 else 263 else
264 strVar2 = tr( "year" ); 264 strVar2 = tr( "year" );
265 break; 265 break;
266 } 266 }
267 if ( !strVar2.isNull() ) 267 if ( !strVar2.isNull() )
268 lblVar2->setText( strVar2 ); 268 lblVar2->setText( strVar2 );
269} 269}
270void ORecurranceWidget::slotWeekLabel() { 270void ORecurranceWidget::slotWeekLabel() {
271 QString str; 271 QString str;
272 QListIterator<QToolButton> it( listExtra ); 272 QListIterator<QToolButton> it( listExtra );
273 unsigned int i; 273 unsigned int i;
274 unsigned int keepMe; 274 unsigned int keepMe;
275 bool bNeedCarriage = FALSE; 275 bool bNeedCarriage = FALSE;
276 // don't do something we'll regret!!! 276 // don't do something we'll regret!!!
277 if ( currInterval != Week ) 277 if ( currInterval != Week )
278 return; 278 return;
279 279
280 if ( startWeekOnMonday ) 280 if ( startWeekOnMonday )
281 keepMe = start.dayOfWeek() - 1; 281 keepMe = start.dayOfWeek() - 1;
282 else 282 else
283 keepMe = start.dayOfWeek() % 7; 283 keepMe = start.dayOfWeek() % 7;
284 284
285 QStringList list; 285 QStringList list;
286 for ( i = 0; *it; ++it, i++ ) { 286 for ( i = 0; *it; ++it, i++ ) {
287 // a crazy check, if you are repeating weekly, the current day 287 // a crazy check, if you are repeating weekly, the current day
288 // must be selected!!! 288 // must be selected!!!
289 if ( i == keepMe && !( (*it)->isOn() ) ) 289 if ( i == keepMe && !( (*it)->isOn() ) )
290 (*it)->setOn( TRUE ); 290 (*it)->setOn( TRUE );
291 if ( (*it)->isOn() ) { 291 if ( (*it)->isOn() ) {
292 if ( startWeekOnMonday ) 292 if ( startWeekOnMonday )
293 list.append( dayLabel[i] ); 293 list.append( dayLabel[i] );
294 else { 294 else {
295 if ( i == 0 ) 295 if ( i == 0 )
296 list.append( dayLabel[6] ); 296 list.append( dayLabel[6] );
297 else 297 else
298 list.append( dayLabel[i - 1] ); 298 list.append( dayLabel[i - 1] );
299 } 299 }
300 } 300 }
301 } 301 }
302 QStringList::Iterator itStr; 302 QStringList::Iterator itStr;
303 for ( i = 0, itStr = list.begin(); itStr != list.end(); ++itStr, i++ ) { 303 for ( i = 0, itStr = list.begin(); itStr != list.end(); ++itStr, i++ ) {
304 if ( i == 3 ) 304 if ( i == 3 )
305 bNeedCarriage = TRUE; 305 bNeedCarriage = TRUE;
306 else 306 else
307 bNeedCarriage = FALSE; 307 bNeedCarriage = FALSE;
308 if ( str.isNull() ) 308 if ( str.isNull() )
309 str = *itStr; 309 str = *itStr;
310 else if ( i == list.count() - 1 ) { 310 else if ( i == list.count() - 1 ) {
311 if ( i < 2 ) 311 if ( i < 2 )
312 str += tr(" and ") + *itStr; 312 str += tr(" and ") + *itStr;
313 else { 313 else {
314 if ( bNeedCarriage ) 314 if ( bNeedCarriage )
315 str += tr( ",\nand " ) + *itStr; 315 str += tr( ",\nand " ) + *itStr;
316 else 316 else
317 str += tr( ", and " ) + *itStr; 317 str += tr( ", and " ) + *itStr;
318 } 318 }
319 } else { 319 } else {
320 if ( bNeedCarriage ) 320 if ( bNeedCarriage )
321 str += ",\n" + *itStr; 321 str += ",\n" + *itStr;
322 else 322 else
323 str += ", " + *itStr; 323 str += ", " + *itStr;
324 } 324 }
325 } 325 }
326 str = str.prepend( "on " ); 326 str = str.prepend( "on " );
327 lblWeekVar->setText( str ); 327 lblWeekVar->setText( str );
328} 328}
329void ORecurranceWidget::slotMonthLabel(int type) { 329void ORecurranceWidget::slotMonthLabel(int type) {
330 QString str; 330 QString str;
331 if ( currInterval != Month || type > 1 ) 331 if ( currInterval != Month || type > 1 )
332 return; 332 return;
333 if ( type == 1 ) 333 if ( type == 1 )
334 str = strMonthDateTemplate.arg( numberPlacing(start.day()) ); 334 str = strMonthDateTemplate.arg( numberPlacing(start.day()) );
335 else 335 else
336 str = strMonthDayTemplate.arg( numberPlacing(week(start))) 336 str = strMonthDayTemplate.arg( numberPlacing(week(start)))
337 .arg( dayLabel[start.dayOfWeek() - 1] ); 337 .arg( dayLabel[start.dayOfWeek() - 1] );
338 lblRepeat->setText( str ); 338 lblRepeat->setText( str );
339} 339}
340void ORecurranceWidget::slotChangeStartOfWeek( bool onMonday ) { 340void ORecurranceWidget::slotChangeStartOfWeek( bool onMonday ) {
341 startWeekOnMonday = onMonday; 341 startWeekOnMonday = onMonday;
342 // we need to make this unintrusive as possible... 342 // we need to make this unintrusive as possible...
343 int saveSpin = spinFreq->value(); 343 int saveSpin = spinFreq->value();
344 char days = 0; 344 char days = 0;
345 int day; 345 int day;
346 QListIterator<QToolButton> itExtra( listExtra ); 346 QListIterator<QToolButton> itExtra( listExtra );
347 for ( day = 1; *itExtra; ++itExtra, day = day << 1 ) { 347 for ( day = 1; *itExtra; ++itExtra, day = day << 1 ) {
348 if ( (*itExtra)->isOn() ) { 348 if ( (*itExtra)->isOn() ) {
349 if ( !startWeekOnMonday ) 349 if ( !startWeekOnMonday )
350 days |= day; 350 days |= day;
351 else { 351 else {
352 if ( day == 1 ) 352 if ( day == 1 )
353 days |= ORecur::SUN; 353 days |= ORecur::SUN;
354 else 354 else
355 days |= day >> 1; 355 days |= day >> 1;
356 } 356 }
357 } 357 }
358 } 358 }
359 setupWeekly(); 359 setupWeekly();
360 spinFreq->setValue( saveSpin ); 360 spinFreq->setValue( saveSpin );
361 int buttons; 361 int buttons;
362 for ( day = 0x01, buttons = 0; buttons < 7; 362 for ( day = 0x01, buttons = 0; buttons < 7;
363 day = day << 1, buttons++ ) { 363 day = day << 1, buttons++ ) {
364 if ( days & day ) { 364 if ( days & day ) {
365 if ( startWeekOnMonday ) 365 if ( startWeekOnMonday )
366 fraExtra->setButton( buttons ); 366 fraExtra->setButton( buttons );
367 else { 367 else {
368 if ( buttons == 7 ) 368 if ( buttons == 7 )
369 fraExtra->setButton( 0 ); 369 fraExtra->setButton( 0 );
370 else 370 else
371 fraExtra->setButton( buttons + 1 ); 371 fraExtra->setButton( buttons + 1 );
372 } 372 }
373 } 373 }
374 } 374 }
375 slotWeekLabel(); 375 slotWeekLabel();
376} 376}
377void ORecurranceWidget::setupNone() { 377void ORecurranceWidget::setupNone() {
378 lblRepeat->setText( tr("No Repeat") ); 378 lblRepeat->setText( tr("No Repeat") );
379 lblVar1->hide(); 379 lblVar1->hide();
380 lblVar2->hide(); 380 lblVar2->hide();
381 hideExtras(); 381 hideExtras();
382 cmdEnd->hide(); 382 cmdEnd->hide();
383 lblFreq->hide(); 383 lblFreq->hide();
384 lblEvery->hide(); 384 lblEvery->hide();
385 lblFreq->hide(); 385 lblFreq->hide();
386 spinFreq->hide(); 386 spinFreq->hide();
387 lblEnd->hide(); 387 lblEnd->hide();
388 lblWeekVar->hide(); 388 lblWeekVar->hide();
389} 389}
390void ORecurranceWidget::setupDaily() { 390void ORecurranceWidget::setupDaily() {
391 hideExtras(); 391 hideExtras();
392 lblWeekVar->hide(); 392 lblWeekVar->hide();
393 spinFreq->setValue( 1 ); 393 spinFreq->setValue( 1 );
394 lblFreq->setText( tr("day(s)") ); 394 lblFreq->setText( tr("day(s)") );
395 lblVar2->show(); 395 lblVar2->show();
396 showRepeatStuff(); 396 showRepeatStuff();
397 lblRepeat->setText( strDayTemplate ); 397 lblRepeat->setText( strDayTemplate );
398 setupRepeatLabel( 1 ); 398 setupRepeatLabel( 1 );
399} 399}
400void ORecurranceWidget::setupWeekly() { 400void ORecurranceWidget::setupWeekly() {
401// reshow the buttons... 401// reshow the buttons...
402 fraExtra->setTitle( tr("Repeat On") ); 402 fraExtra->setTitle( tr("Repeat On") );
403 fraExtra->setExclusive( FALSE ); 403 fraExtra->setExclusive( FALSE );
404 fraExtra->show(); 404 fraExtra->show();
405 if ( startWeekOnMonday ) { 405 if ( startWeekOnMonday ) {
406 cmdExtra1->setText( tr("Mon") ); 406 cmdExtra1->setText( tr("Mon") );
407 cmdExtra2->setText( tr("Tue") ); 407 cmdExtra2->setText( tr("Tue") );
408 cmdExtra3->setText( tr("Wed") ); 408 cmdExtra3->setText( tr("Wed") );
409 cmdExtra4->setText( tr("Thu") ); 409 cmdExtra4->setText( tr("Thu") );
410 cmdExtra5->setText( tr("Fri") ); 410 cmdExtra5->setText( tr("Fri") );
411 cmdExtra6->setText( tr("Sat") ); 411 cmdExtra6->setText( tr("Sat") );
412 cmdExtra7->setText( tr("Sun") ); 412 cmdExtra7->setText( tr("Sun") );
413 } else { 413 } else {
414 cmdExtra1->setText( tr("Sun") ); 414 cmdExtra1->setText( tr("Sun") );
415 cmdExtra2->setText( tr("Mon") ); 415 cmdExtra2->setText( tr("Mon") );
416 cmdExtra3->setText( tr("Tue") ); 416 cmdExtra3->setText( tr("Tue") );
417 cmdExtra4->setText( tr("Wed") ); 417 cmdExtra4->setText( tr("Wed") );
418 cmdExtra5->setText( tr("Thu") ); 418 cmdExtra5->setText( tr("Thu") );
419 cmdExtra6->setText( tr("Fri") ); 419 cmdExtra6->setText( tr("Fri") );
420 cmdExtra7->setText( tr("Sat") ); 420 cmdExtra7->setText( tr("Sat") );
421 } 421 }
422 // I hope clustering these improve performance.... 422 // I hope clustering these improve performance....
423 cmdExtra1->setOn( FALSE ); 423 cmdExtra1->setOn( FALSE );
424 cmdExtra2->setOn( FALSE ); 424 cmdExtra2->setOn( FALSE );
425 cmdExtra3->setOn( FALSE ); 425 cmdExtra3->setOn( FALSE );
426 cmdExtra4->setOn( FALSE ); 426 cmdExtra4->setOn( FALSE );
427 cmdExtra5->setOn( FALSE ); 427 cmdExtra5->setOn( FALSE );
428 cmdExtra6->setOn( FALSE ); 428 cmdExtra6->setOn( FALSE );
429 cmdExtra7->setOn( FALSE ); 429 cmdExtra7->setOn( FALSE );
430 430
431 cmdExtra1->show(); 431 cmdExtra1->show();
432 cmdExtra2->show(); 432 cmdExtra2->show();
433 cmdExtra3->show(); 433 cmdExtra3->show();
434 cmdExtra4->show(); 434 cmdExtra4->show();
435 cmdExtra5->show(); 435 cmdExtra5->show();
436 cmdExtra6->show(); 436 cmdExtra6->show();
diff --git a/libopie/pim/ocontactaccessbackend_vcard.cpp b/libopie/pim/ocontactaccessbackend_vcard.cpp
index 622d40a..e537269 100644
--- a/libopie/pim/ocontactaccessbackend_vcard.cpp
+++ b/libopie/pim/ocontactaccessbackend_vcard.cpp
@@ -1,333 +1,342 @@
1/* 1/*
2 * VCard Backend for the OPIE-Contact Database. 2 * VCard Backend for the OPIE-Contact Database.
3 * 3 *
4 * Copyright (C) 2000 Trolltech AS. All rights reserved. 4 * Copyright (C) 2000 Trolltech AS. All rights reserved.
5 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 5 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
6 * 6 *
7 * ===================================================================== 7 * =====================================================================
8 *This program is free software; you can redistribute it and/or 8 *This program is free software; you can redistribute it and/or
9 *modify it under the terms of the GNU Library General Public 9 *modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version. 11 * version 2 of the License, or (at your option) any later version.
12 * ===================================================================== 12 * =====================================================================
13 * ToDo: 13 * ToDo:
14 * 14 *
15 * ===================================================================== 15 * =====================================================================
16 * Version: $Id$ 16 * Version: $Id$
17 * ===================================================================== 17 * =====================================================================
18 * History: 18 * History:
19 * $Log$ 19 * $Log$
20 * Revision 1.8 2003/02/21 16:52:49 zecke
21 * -Remove old Todo classes they're deprecated and today I already using the
22 * new API
23 * -Guard against self assignment in OTodo
24 * -Add test apps for OPIM
25 * -Opiefied Event classes
26 * -Added TimeZone handling and pinning of TimeZones to OEvent
27 * -Adjust ORecur and the widget to better timezone behaviour
28 *
20 * Revision 1.7 2003/02/16 22:25:46 zecke 29 * Revision 1.7 2003/02/16 22:25:46 zecke
21 * 0000276 Fix for that bug.. or better temp workaround 30 * 0000276 Fix for that bug.. or better temp workaround
22 * A Preferred Number is HOME|VOICE 31 * A Preferred Number is HOME|VOICE
23 * A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test 32 * A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test
24 * triggers both 33 * triggers both
25 * and the cell phone number overrides the other entries.. 34 * and the cell phone number overrides the other entries..
26 * 35 *
27 * as a temp I check that it's not equal to HOME|VOICE|CELL before setting the 36 * as a temp I check that it's not equal to HOME|VOICE|CELL before setting the
28 * number 37 * number
29 * 38 *
30 * The right and final fix would be to reorder the if statement to make it 39 * The right and final fix would be to reorder the if statement to make it
31 * if else based and the less common thing put to the bottom 40 * if else based and the less common thing put to the bottom
32 * 41 *
33 * OTodoAccessVcal fix the date for beaming 42 * OTodoAccessVcal fix the date for beaming
34 * 43 *
35 * Revision 1.6 2003/01/13 15:49:31 eilers 44 * Revision 1.6 2003/01/13 15:49:31 eilers
36 * Fixing crash when businesscard.vcf is missing.. 45 * Fixing crash when businesscard.vcf is missing..
37 * 46 *
38 * Revision 1.5 2002/12/07 13:26:22 eilers 47 * Revision 1.5 2002/12/07 13:26:22 eilers
39 * Fixing bug in storing anniversary.. 48 * Fixing bug in storing anniversary..
40 * 49 *
41 * Revision 1.4 2002/11/13 14:14:51 eilers 50 * Revision 1.4 2002/11/13 14:14:51 eilers
42 * Added sorted for Contacts.. 51 * Added sorted for Contacts..
43 * 52 *
44 * Revision 1.3 2002/11/11 16:41:09 kergoth 53 * Revision 1.3 2002/11/11 16:41:09 kergoth
45 * no default arguments in implementation 54 * no default arguments in implementation
46 * 55 *
47 * Revision 1.2 2002/11/10 15:41:53 eilers 56 * Revision 1.2 2002/11/10 15:41:53 eilers
48 * Bugfixes.. 57 * Bugfixes..
49 * 58 *
50 * Revision 1.1 2002/11/09 14:34:52 eilers 59 * Revision 1.1 2002/11/09 14:34:52 eilers
51 * Added VCard Backend. 60 * Added VCard Backend.
52 * 61 *
53 */ 62 */
54#include "ocontactaccessbackend_vcard.h" 63#include "ocontactaccessbackend_vcard.h"
55#include "../../library/backend/vobject_p.h" 64#include "../../library/backend/vobject_p.h"
56#include "../../library/backend/qfiledirect_p.h" 65#include "../../library/backend/qfiledirect_p.h"
57 66
58#include <qpe/timeconversion.h> 67#include <qpe/timeconversion.h>
59 68
60#include <qfile.h> 69#include <qfile.h>
61 70
62OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ): 71OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ):
63 m_dirty( false ), 72 m_dirty( false ),
64 m_file( filename ) 73 m_file( filename )
65{ 74{
66 load(); 75 load();
67} 76}
68 77
69 78
70bool OContactAccessBackend_VCard::load () 79bool OContactAccessBackend_VCard::load ()
71{ 80{
72 m_map.clear(); 81 m_map.clear();
73 m_dirty = false; 82 m_dirty = false;
74 83
75 VObject* obj = 0l; 84 VObject* obj = 0l;
76 85
77 if ( QFile( m_file ).exists() ){ 86 if ( QFile::exists(m_file) ){
78 obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); 87 obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() );
79 if ( !obj ) 88 if ( !obj )
80 return false; 89 return false;
81 }else{ 90 }else{
82 qWarning("File \"%s\" not found !", m_file.latin1() ); 91 qWarning("File \"%s\" not found !", m_file.latin1() );
83 return false; 92 return false;
84 } 93 }
85 94
86 while ( obj ) { 95 while ( obj ) {
87 OContact con = parseVObject( obj ); 96 OContact con = parseVObject( obj );
88 /* 97 /*
89 * if uid is 0 assign a new one 98 * if uid is 0 assign a new one
90 * this at least happens on 99 * this at least happens on
91 * Nokia6210 100 * Nokia6210
92 */ 101 */
93 if ( con.uid() == 0 ){ 102 if ( con.uid() == 0 ){
94 con.setUid( 1 ); 103 con.setUid( 1 );
95 qWarning("assigned new uid %d",con.uid() ); 104 qWarning("assigned new uid %d",con.uid() );
96 } 105 }
97 106
98 m_map.insert( con.uid(), con ); 107 m_map.insert( con.uid(), con );
99 108
100 VObject *t = obj; 109 VObject *t = obj;
101 obj = nextVObjectInList(obj); 110 obj = nextVObjectInList(obj);
102 cleanVObject( t ); 111 cleanVObject( t );
103 } 112 }
104 113
105 return true; 114 return true;
106 115
107} 116}
108bool OContactAccessBackend_VCard::reload() 117bool OContactAccessBackend_VCard::reload()
109{ 118{
110 return load(); 119 return load();
111} 120}
112bool OContactAccessBackend_VCard::save() 121bool OContactAccessBackend_VCard::save()
113{ 122{
114 if (!m_dirty ) 123 if (!m_dirty )
115 return true; 124 return true;
116 125
117 QFileDirect file( m_file ); 126 QFileDirect file( m_file );
118 if (!file.open(IO_WriteOnly ) ) 127 if (!file.open(IO_WriteOnly ) )
119 return false; 128 return false;
120 129
121 VObject *obj; 130 VObject *obj;
122 obj = newVObject( VCCalProp ); 131 obj = newVObject( VCCalProp );
123 addPropValue( obj, VCVersionProp, "1.0" ); 132 addPropValue( obj, VCVersionProp, "1.0" );
124 133
125 VObject *vo; 134 VObject *vo;
126 for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ 135 for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){
127 vo = createVObject( *it ); 136 vo = createVObject( *it );
128 writeVObject( file.directHandle() , vo ); 137 writeVObject( file.directHandle() , vo );
129 cleanVObject( vo ); 138 cleanVObject( vo );
130 } 139 }
131 cleanStrTbl(); 140 cleanStrTbl();
132 141
133 m_dirty = false; 142 m_dirty = false;
134 return true; 143 return true;
135 144
136 145
137} 146}
138void OContactAccessBackend_VCard::clear () 147void OContactAccessBackend_VCard::clear ()
139{ 148{
140 m_map.clear(); 149 m_map.clear();
141 m_dirty = true; // ??? sure ? (se) 150 m_dirty = true; // ??? sure ? (se)
142} 151}
143 152
144bool OContactAccessBackend_VCard::add ( const OContact& newcontact ) 153bool OContactAccessBackend_VCard::add ( const OContact& newcontact )
145{ 154{
146 m_map.insert( newcontact.uid(), newcontact ); 155 m_map.insert( newcontact.uid(), newcontact );
147 m_dirty = true; 156 m_dirty = true;
148 return true; 157 return true;
149} 158}
150 159
151bool OContactAccessBackend_VCard::remove ( int uid ) 160bool OContactAccessBackend_VCard::remove ( int uid )
152{ 161{
153 m_map.remove( uid ); 162 m_map.remove( uid );
154 m_dirty = true; 163 m_dirty = true;
155 return true; 164 return true;
156} 165}
157 166
158bool OContactAccessBackend_VCard::replace ( const OContact &contact ) 167bool OContactAccessBackend_VCard::replace ( const OContact &contact )
159{ 168{
160 m_map.replace( contact.uid(), contact ); 169 m_map.replace( contact.uid(), contact );
161 m_dirty = true; 170 m_dirty = true;
162 return true; 171 return true;
163} 172}
164 173
165OContact OContactAccessBackend_VCard::find ( int uid ) const 174OContact OContactAccessBackend_VCard::find ( int uid ) const
166{ 175{
167 return m_map[uid]; 176 return m_map[uid];
168} 177}
169 178
170QArray<int> OContactAccessBackend_VCard::allRecords() const 179QArray<int> OContactAccessBackend_VCard::allRecords() const
171{ 180{
172 QArray<int> ar( m_map.count() ); 181 QArray<int> ar( m_map.count() );
173 QMap<int, OContact>::ConstIterator it; 182 QMap<int, OContact>::ConstIterator it;
174 int i = 0; 183 int i = 0;
175 for ( it = m_map.begin(); it != m_map.end(); ++it ) { 184 for ( it = m_map.begin(); it != m_map.end(); ++it ) {
176 ar[i] = it.key(); 185 ar[i] = it.key();
177 i++; 186 i++;
178 } 187 }
179 return ar; 188 return ar;
180} 189}
181 190
182// Not implemented 191// Not implemented
183QArray<int> OContactAccessBackend_VCard::queryByExample ( const OContact&, int ) 192QArray<int> OContactAccessBackend_VCard::queryByExample ( const OContact&, int )
184{ 193{
185 QArray<int> ar(0); 194 QArray<int> ar(0);
186 return ar; 195 return ar;
187} 196}
188 197
189// Not implemented 198// Not implemented
190QArray<int> OContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const 199QArray<int> OContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const
191{ 200{
192 QArray<int> ar(0); 201 QArray<int> ar(0);
193 return ar; 202 return ar;
194} 203}
195 204
196const uint OContactAccessBackend_VCard::querySettings() 205const uint OContactAccessBackend_VCard::querySettings()
197{ 206{
198 return 0; // No search possible 207 return 0; // No search possible
199} 208}
200 209
201bool OContactAccessBackend_VCard::hasQuerySettings (uint ) const 210bool OContactAccessBackend_VCard::hasQuerySettings (uint ) const
202{ 211{
203 return false; // No search possible, therefore all settings invalid ;) 212 return false; // No search possible, therefore all settings invalid ;)
204} 213}
205 214
206bool OContactAccessBackend_VCard::wasChangedExternally() 215bool OContactAccessBackend_VCard::wasChangedExternally()
207{ 216{
208 return false; // Don't expect concurrent access 217 return false; // Don't expect concurrent access
209} 218}
210 219
211// Not implemented 220// Not implemented
212QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int ) 221QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int )
213{ 222{
214 QArray<int> ar(0); 223 QArray<int> ar(0);
215 return ar; 224 return ar;
216} 225}
217 226
218// *** Private stuff *** 227// *** Private stuff ***
219 228
220 229
221OContact OContactAccessBackend_VCard::parseVObject( VObject *obj ) 230OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
222{ 231{
223 OContact c; 232 OContact c;
224 233
225 VObjectIterator it; 234 VObjectIterator it;
226 initPropIterator( &it, obj ); 235 initPropIterator( &it, obj );
227 while( moreIteration( &it ) ) { 236 while( moreIteration( &it ) ) {
228 VObject *o = nextVObject( &it ); 237 VObject *o = nextVObject( &it );
229 QCString name = vObjectName( o ); 238 QCString name = vObjectName( o );
230 QCString value = vObjectStringZValue( o ); 239 QCString value = vObjectStringZValue( o );
231 if ( name == VCNameProp ) { 240 if ( name == VCNameProp ) {
232 VObjectIterator nit; 241 VObjectIterator nit;
233 initPropIterator( &nit, o ); 242 initPropIterator( &nit, o );
234 while( moreIteration( &nit ) ) { 243 while( moreIteration( &nit ) ) {
235 VObject *o = nextVObject( &nit ); 244 VObject *o = nextVObject( &nit );
236 QCString name = vObjectTypeInfo( o ); 245 QCString name = vObjectTypeInfo( o );
237 QString value = vObjectStringZValue( o ); 246 QString value = vObjectStringZValue( o );
238 if ( name == VCNamePrefixesProp ) 247 if ( name == VCNamePrefixesProp )
239 c.setTitle( value ); 248 c.setTitle( value );
240 else if ( name == VCNameSuffixesProp ) 249 else if ( name == VCNameSuffixesProp )
241 c.setSuffix( value ); 250 c.setSuffix( value );
242 else if ( name == VCFamilyNameProp ) 251 else if ( name == VCFamilyNameProp )
243 c.setLastName( value ); 252 c.setLastName( value );
244 else if ( name == VCGivenNameProp ) 253 else if ( name == VCGivenNameProp )
245 c.setFirstName( value ); 254 c.setFirstName( value );
246 else if ( name == VCAdditionalNamesProp ) 255 else if ( name == VCAdditionalNamesProp )
247 c.setMiddleName( value ); 256 c.setMiddleName( value );
248 } 257 }
249 } 258 }
250 else if ( name == VCAdrProp ) { 259 else if ( name == VCAdrProp ) {
251 bool work = TRUE; // default address is work address 260 bool work = TRUE; // default address is work address
252 QString street; 261 QString street;
253 QString city; 262 QString city;
254 QString region; 263 QString region;
255 QString postal; 264 QString postal;
256 QString country; 265 QString country;
257 266
258 VObjectIterator nit; 267 VObjectIterator nit;
259 initPropIterator( &nit, o ); 268 initPropIterator( &nit, o );
260 while( moreIteration( &nit ) ) { 269 while( moreIteration( &nit ) ) {
261 VObject *o = nextVObject( &nit ); 270 VObject *o = nextVObject( &nit );
262 QCString name = vObjectName( o ); 271 QCString name = vObjectName( o );
263 QString value = vObjectStringZValue( o ); 272 QString value = vObjectStringZValue( o );
264 if ( name == VCHomeProp ) 273 if ( name == VCHomeProp )
265 work = FALSE; 274 work = FALSE;
266 else if ( name == VCWorkProp ) 275 else if ( name == VCWorkProp )
267 work = TRUE; 276 work = TRUE;
268 else if ( name == VCStreetAddressProp ) 277 else if ( name == VCStreetAddressProp )
269 street = value; 278 street = value;
270 else if ( name == VCCityProp ) 279 else if ( name == VCCityProp )
271 city = value; 280 city = value;
272 else if ( name == VCRegionProp ) 281 else if ( name == VCRegionProp )
273 region = value; 282 region = value;
274 else if ( name == VCPostalCodeProp ) 283 else if ( name == VCPostalCodeProp )
275 postal = value; 284 postal = value;
276 else if ( name == VCCountryNameProp ) 285 else if ( name == VCCountryNameProp )
277 country = value; 286 country = value;
278 } 287 }
279 if ( work ) { 288 if ( work ) {
280 c.setBusinessStreet( street ); 289 c.setBusinessStreet( street );
281 c.setBusinessCity( city ); 290 c.setBusinessCity( city );
282 c.setBusinessCountry( country ); 291 c.setBusinessCountry( country );
283 c.setBusinessZip( postal ); 292 c.setBusinessZip( postal );
284 c.setBusinessState( region ); 293 c.setBusinessState( region );
285 } else { 294 } else {
286 c.setHomeStreet( street ); 295 c.setHomeStreet( street );
287 c.setHomeCity( city ); 296 c.setHomeCity( city );
288 c.setHomeCountry( country ); 297 c.setHomeCountry( country );
289 c.setHomeZip( postal ); 298 c.setHomeZip( postal );
290 c.setHomeState( region ); 299 c.setHomeState( region );
291 } 300 }
292 } 301 }
293 else if ( name == VCTelephoneProp ) { 302 else if ( name == VCTelephoneProp ) {
294 enum { 303 enum {
295 HOME = 0x01, 304 HOME = 0x01,
296 WORK = 0x02, 305 WORK = 0x02,
297 VOICE = 0x04, 306 VOICE = 0x04,
298 CELL = 0x08, 307 CELL = 0x08,
299 FAX = 0x10, 308 FAX = 0x10,
300 PAGER = 0x20, 309 PAGER = 0x20,
301 UNKNOWN = 0x80 310 UNKNOWN = 0x80
302 }; 311 };
303 int type = 0; 312 int type = 0;
304 313
305 VObjectIterator nit; 314 VObjectIterator nit;
306 initPropIterator( &nit, o ); 315 initPropIterator( &nit, o );
307 while( moreIteration( &nit ) ) { 316 while( moreIteration( &nit ) ) {
308 VObject *o = nextVObject( &nit ); 317 VObject *o = nextVObject( &nit );
309 QCString name = vObjectTypeInfo( o ); 318 QCString name = vObjectTypeInfo( o );
310 if ( name == VCHomeProp ) 319 if ( name == VCHomeProp )
311 type |= HOME; 320 type |= HOME;
312 else if ( name == VCWorkProp ) 321 else if ( name == VCWorkProp )
313 type |= WORK; 322 type |= WORK;
314 else if ( name == VCVoiceProp ) 323 else if ( name == VCVoiceProp )
315 type |= VOICE; 324 type |= VOICE;
316 else if ( name == VCCellularProp ) 325 else if ( name == VCCellularProp )
317 type |= CELL; 326 type |= CELL;
318 else if ( name == VCFaxProp ) 327 else if ( name == VCFaxProp )
319 type |= FAX; 328 type |= FAX;
320 else if ( name == VCPagerProp ) 329 else if ( name == VCPagerProp )
321 type |= PAGER; 330 type |= PAGER;
322 else if ( name == VCPreferredProp ) 331 else if ( name == VCPreferredProp )
323 ; 332 ;
324 else 333 else
325 type |= UNKNOWN; 334 type |= UNKNOWN;
326 } 335 }
327 if ( (type & UNKNOWN) != UNKNOWN ) { 336 if ( (type & UNKNOWN) != UNKNOWN ) {
328 if ( ( type & (HOME|WORK) ) == 0 ) // default 337 if ( ( type & (HOME|WORK) ) == 0 ) // default
329 type |= HOME; 338 type |= HOME;
330 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default 339 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default
331 type |= VOICE; 340 type |= VOICE;
332 341
333 qWarning("value %s %d", value.data(), type ); 342 qWarning("value %s %d", value.data(), type );
diff --git a/libopie/pim/oevent.cpp b/libopie/pim/oevent.cpp
new file mode 100644
index 0000000..71b9441
--- a/dev/null
+++ b/libopie/pim/oevent.cpp
@@ -0,0 +1,427 @@
1#include <qshared.h>
2
3#include <qpe/palmtopuidgen.h>
4#include <qpe/categories.h>
5
6#include "orecur.h"
7#include "opimresolver.h"
8#include "opimnotifymanager.h"
9
10#include "oevent.h"
11
12namespace OCalendarHelper {
13 static int week( const QDate& date) {
14 // Calculates the week this date is in within that
15 // month. Equals the "row" is is in in the month view
16 int week = 1;
17 QDate tmp( date.year(), date.month(), 1 );
18 if ( date.dayOfWeek() < tmp.dayOfWeek() )
19 ++week;
20
21 week += ( date.day() - 1 ) / 7;
22
23 return week;
24 }
25 static int occurence( const QDate& date) {
26 // calculates the number of occurrances of this day of the
27 // week till the given date (e.g 3rd Wednesday of the month)
28 return ( date.day() - 1 ) / 7 + 1;
29 }
30 static int dayOfWeek( char day ) {
31 int dayOfWeek = 1;
32 char i = ORecur::MON;
33 while ( !( i & day ) && i <= ORecur::SUN ) {
34 i <<= 1;
35 ++dayOfWeek;
36 }
37 return dayOfWeek;
38 }
39 static int monthDiff( const QDate& first, const QDate& second ) {
40 return ( second.year() - first.year() ) * 12 +
41 second.month() - first.month();
42 }
43}
44
45struct OEvent::Data : public QShared {
46 Data() : QShared() {
47 recur = 0;
48 manager = 0;
49 isAllDay = false;
50 }
51 ~Data() {
52 delete manager;
53 delete recur;
54 }
55 QString description;
56 QString location;
57 OPimNotifyManager* manager;
58 ORecur* recur;
59 QString note;
60 QDateTime created;
61 QDateTime start;
62 QDateTime end;
63 bool isAllDay : 1;
64 QString timezone;
65};
66
67OEvent::OEvent( int uid )
68 : OPimRecord( uid ) {
69 data = new Data;
70}
71OEvent::OEvent( const OEvent& ev)
72 : OPimRecord( ev ), data( ev.data )
73{
74 data->ref();
75}
76OEvent::~OEvent() {
77 if ( data->deref() ) {
78 delete data;
79 data = 0;
80 }
81}
82OEvent& OEvent::operator=( const OEvent& ev) {
83 if ( *this == ev ) return *this;
84
85 OPimRecord::operator=( ev );
86 ev.data->ref();
87 deref();
88 data = ev.data;
89
90
91 return *this;
92}
93QString OEvent::description()const {
94 return data->description;
95}
96void OEvent::setDescription( const QString& description ) {
97 changeOrModify();
98 data->description = description;
99}
100void OEvent::setLocation( const QString& loc ) {
101 changeOrModify();
102 data->location = loc;
103}
104QString OEvent::location()const {
105 return data->location;
106}
107OPimNotifyManager &OEvent::notifiers() {
108 // I hope we can skip the changeOrModify here
109 // the notifier should take care of it
110 // and OPimNotify is shared too
111 if (!data->manager )
112 data->manager = new OPimNotifyManager;
113
114 return *data->manager;
115}
116bool OEvent::hasNotifiers()const {
117 return ( data->manager);
118}
119ORecur OEvent::recurrence()const {
120 if (!data->recur)
121 data->recur = new ORecur;
122
123 return *data->recur;
124}
125void OEvent::setRecurrence( const ORecur& rec) {
126 changeOrModify();
127 if (data->recur )
128 (*data->recur) = rec;
129 else
130 data->recur = new ORecur( rec );
131}
132bool OEvent::hasRecurrence()const {
133 return data->recur;
134}
135QString OEvent::note()const {
136 return data->note;
137}
138void OEvent::setNote( const QString& note ) {
139 changeOrModify();
140 data->note = note;
141}
142QDateTime OEvent::createdDateTime()const {
143 return data->created;
144}
145void OEvent::setCreatedDateTime( const QDateTime& time ) {
146 changeOrModify();
147 data->created = time;
148}
149QDateTime OEvent::startDateTime()const {
150 if ( data->isAllDay )
151 return QDateTime( data->start.date(), QTime(0, 0, 0 ) );
152 return data->start;
153}
154QDateTime OEvent::startDateTimeInZone()const {
155 /* if no timezone, or all day event or if the current and this timeZone match... */
156 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime();
157
158 OTimeZone zone(data->timezone );
159 return zone.toDateTime( data->start, OTimeZone::current() );
160}
161void OEvent::setStartDateTime( const QDateTime& dt ) {
162 changeOrModify();
163 data->start = dt;
164}
165QDateTime OEvent::endDateTime()const {
166 /*
167 * if all Day event the end time needs
168 * to be on the same day as the start
169 */
170 if ( data->isAllDay )
171 return QDateTime( data->start.date(), QTime(23, 59, 59 ) );
172 return data->end;
173}
174QDateTime OEvent::endDateTimeInZone()const {
175 /* if no timezone, or all day event or if the current and this timeZone match... */
176 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime();
177
178 OTimeZone zone(data->timezone );
179 return zone.toDateTime( data->end, OTimeZone::current() );
180}
181void OEvent::setEndDateTime( const QDateTime& dt ) {
182 changeOrModify();
183 data->end = dt;
184}
185bool OEvent::isMultipleDay()const {
186 return data->end.date().day() - data->start.date().day();
187}
188bool OEvent::isAllDay()const {
189 return data->isAllDay;
190}
191void OEvent::setTimeZone( const QString& tz ) {
192 changeOrModify();
193 data->timezone = tz;
194}
195QString OEvent::timeZone()const {
196 return data->timezone;
197}
198bool OEvent::match( const QRegExp& )const {
199 // FIXME
200 return false;
201}
202QString OEvent::toRichText()const {
203 // FIXME
204 return "OEvent test";
205}
206QString OEvent::toShortText()const {
207 return "OEvent shotText";
208}
209QString OEvent::type()const {
210 return QString::fromLatin1("OEvent");
211}
212QString OEvent::recordField( int /*id */ )const {
213 return QString::null;
214}
215int OEvent::rtti() {
216 return OPimResolver::DateBook;
217}
218bool OEvent::loadFromStream( QDataStream& ) {
219 return true;
220}
221bool OEvent::saveToStream( QDataStream& )const {
222 return true;
223}
224void OEvent::changeOrModify() {
225 if ( data->count != 1 ) {
226 data->deref();
227 Data* d2 = new Data;
228 d2->description = data->description;
229 d2->location = data->location;
230 d2->manager = data->manager;
231 d2->recur = data->recur;
232 d2->note = data->note;
233 d2->created = data->created;
234 d2->start = data->start;
235 d2->end = data->end;
236 d2->isAllDay = data->isAllDay;
237 d2->timezone = data->timezone;
238
239 data = d2;
240 }
241}
242void OEvent::deref() {
243 if ( data->deref() ) {
244 delete data;
245 data = 0;
246 }
247}
248// FIXME
249QMap<int, QString> OEvent::toMap()const {
250 return QMap<int, QString>();
251}
252QMap<QString, QString> OEvent::toExtraMap()const {
253 return QMap<QString, QString>();
254}
255
256
257struct OEffectiveEvent::Data : public QShared {
258 Data() : QShared() {
259 }
260 OEvent event;
261 QDate date;
262 QTime start, end;
263 QDate startDate, endDate;
264 bool dates : 1;
265};
266
267OEffectiveEvent::OEffectiveEvent() {
268 data = new Data;
269 data->date = QDate::currentDate();
270 data->start = data->end = QTime::currentTime();
271 data->dates = false;
272}
273OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate,
274 Position pos ) {
275 data = new Data;
276 data->event = ev;
277 data->date = startDate;
278 if ( pos & Start )
279 data->start = ev.startDateTime().time();
280 else
281 data->start = QTime( 0, 0, 0 );
282
283 if ( pos & End )
284 data->end = ev.endDateTime().time();
285 else
286 data->end = QTime( 23, 59, 59 );
287
288 data->dates = false;
289}
290OEffectiveEvent::OEffectiveEvent( const OEffectiveEvent& ev) {
291 data = ev.data;
292 data->ref();
293}
294OEffectiveEvent::~OEffectiveEvent() {
295 if ( data->deref() ) {
296 delete data;
297 data = 0;
298 }
299}
300OEffectiveEvent& OEffectiveEvent::operator=( const OEffectiveEvent& ev ) {
301 if ( *this == ev ) return *this;
302
303 ev.data->ref();
304 deref();
305 data = ev.data;
306
307 return *this;
308}
309
310void OEffectiveEvent::setStartTime( const QTime& ti) {
311 changeOrModify();
312 data->start = ti;
313}
314void OEffectiveEvent::setEndTime( const QTime& en) {
315 changeOrModify();
316 data->end = en;
317}
318void OEffectiveEvent::setEvent( const OEvent& ev) {
319 changeOrModify();
320 data->event = ev;
321}
322void OEffectiveEvent::setDate( const QDate& da) {
323 changeOrModify();
324 data->date = da;
325}
326void OEffectiveEvent::setEffectiveDates( const QDate& from,
327 const QDate& to ) {
328 if (!from.isValid() ) {
329 data->dates = false;
330 return;
331 }
332
333 data->startDate = from;
334 data->endDate = to;
335}
336QString OEffectiveEvent::description()const {
337 return data->event.description();
338}
339QString OEffectiveEvent::location()const {
340 return data->event.location();
341}
342QString OEffectiveEvent::note()const {
343 return data->event.note();
344}
345OEvent OEffectiveEvent::event()const {
346 return data->event;
347}
348QTime OEffectiveEvent::startTime()const {
349 return data->start;
350}
351QTime OEffectiveEvent::endTime()const {
352 return data->end;
353}
354QDate OEffectiveEvent::date()const {
355 return data->date;
356}
357int OEffectiveEvent::length()const {
358 return (data->end.hour() * 60 - data->start.hour() * 60)
359 + QABS(data->start.minute() - data->end.minute() );
360}
361int OEffectiveEvent::size()const {
362 return ( data->end.hour() - data->start.hour() ) * 3600
363 + (data->end.minute() - data->start.minute() * 60
364 + data->end.second() - data->start.second() );
365}
366QDate OEffectiveEvent::startDate()const {
367 if ( data->dates )
368 return data->startDate;
369 else if ( data->event.hasRecurrence() ) // single day, since multi-day should have a d pointer
370 return data->date;
371 else
372 return data->event.startDateTime().date();
373}
374QDate OEffectiveEvent::endDate()const {
375 if ( data->dates )
376 return data->endDate;
377 else if ( data->event.hasRecurrence() )
378 return data->date;
379 else
380 return data->event.endDateTime().date();
381}
382void OEffectiveEvent::deref() {
383 if ( data->deref() ) {
384 delete data;
385 data = 0;
386 }
387}
388void OEffectiveEvent::changeOrModify() {
389 if ( data->count != 1 ) {
390 data->deref();
391 Data* d2 = new Data;
392 d2->event = data->event;
393 d2->date = data->date;
394 d2->start = data->start;
395 d2->end = data->end;
396 d2->startDate = data->startDate;
397 d2->endDate = data->endDate;
398 d2->dates = data->dates;
399 data = d2;
400 }
401}
402bool OEffectiveEvent::operator<( const OEffectiveEvent &e ) const{
403 if ( data->date < e.date() )
404 return TRUE;
405 if ( data->date == e.date() )
406 return ( startTime() < e.startTime() );
407 else
408 return FALSE;
409}
410bool OEffectiveEvent::operator<=( const OEffectiveEvent &e ) const{
411 return (data->date <= e.date() );
412}
413bool OEffectiveEvent::operator==( const OEffectiveEvent &e ) const {
414 return ( date() == e.date()
415 && startTime() == e.startTime()
416 && endTime()== e.endTime()
417 && event() == e.event() );
418}
419bool OEffectiveEvent::operator!=( const OEffectiveEvent &e ) const {
420 return !(*this == e );
421}
422bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const {
423 return !(*this <= e );
424}
425bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const {
426 return !(*this < e);
427}
diff --git a/libopie/pim/oevent.h b/libopie/pim/oevent.h
new file mode 100644
index 0000000..4489be7
--- a/dev/null
+++ b/libopie/pim/oevent.h
@@ -0,0 +1,198 @@
1// CONTAINS GPLed code of TT
2
3#ifndef OPIE_PIM_EVENT_H
4#define OPIE_PIM_EVENT_H
5
6#include <qstring.h>
7#include <qdatetime.h>
8#include <qvaluelist.h>
9
10#include <qpe/recordfields.h>
11#include <qpe/palmtopuidgen.h>
12
13#include "otimezone.h"
14#include "opimrecord.h"
15
16namespace OCalendarHelper {
17 /** calculate the week number of the date */
18 static int week( const QDate& );
19 /** calculate the occurence of week days since the start of the month */
20 static int ocurrence( const QDate& );
21
22 // returns the dayOfWeek for the *first* day it finds (ignores
23 // any further days!). Returns 1 (Monday) if there isn't any day found
24 static int dayOfWeek( char day );
25
26 /** returns the diff of month */
27 static int monthDiff( const QDate& first, const QDate& second );
28
29}
30
31class OPimNotifyManager;
32class ORecur;
33class OEvent : public OPimRecord {
34public:
35 typedef QValueList<OEvent> ValueList;
36 enum RecordFields {
37 Uid = Qtopia::UID_ID,
38 Category = Qtopia::CATEGORY_ID,
39 Description,
40 Location,
41 Alarm,
42 Reminder,
43 Recurrence,
44 Note,
45 Created,
46 StartDate,
47 EndDate,
48 AllDay,
49 TimeZone
50 };
51
52 OEvent(int uid = 0);
53 OEvent( const OEvent& );
54 ~OEvent();
55 OEvent &operator=( const OEvent& );
56
57 QString description()const;
58 void setDescription( const QString& description );
59
60 QString location()const;
61 void setLocation( const QString& loc );
62
63 bool hasNotifiers()const;
64 OPimNotifyManager &notifiers();
65
66 ORecur recurrence()const;
67 void setRecurrence( const ORecur& );
68 bool hasRecurrence()const;
69
70 QString note()const;
71 void setNote( const QString& note );
72
73
74 QDateTime createdDateTime()const;
75 void setCreatedDateTime( const QDateTime& dt);
76
77 /** set the date to dt. dt is the QDateTime in localtime */
78 void setStartDateTime( const QDateTime& );
79 /** returns the datetime in the local timeZone */
80 QDateTime startDateTime()const;
81
82 /** returns the start datetime in the current zone */
83 QDateTime startDateTimeInZone()const;
84
85 /** in current timezone */
86 void setEndDateTime( const QDateTime& );
87 /** in current timezone */
88 QDateTime endDateTime()const;
89 QDateTime endDateTimeInZone()const;
90
91 bool isMultipleDay()const;
92 bool isAllDay()const;
93 void setAllDay( bool isAllDay );
94
95 /* pin this event to a timezone! FIXME */
96 void setTimeZone( const QString& timeZone );
97 QString timeZone()const;
98
99
100 bool match( const QRegExp& )const;
101
102
103
104
105 /* needed reimp */
106 QString toRichText()const;
107 QString toShortText()const;
108 QString type()const;
109
110 QMap<int, QString> toMap()const;
111 QMap<QString, QString> toExtraMap()const;
112 QString recordField(int )const;
113
114 static int rtti();
115
116 bool loadFromStream( QDataStream& );
117 bool saveToStream( QDataStream& )const;
118
119/* bool operator==( const OEvent& );
120 bool operator!=( const OEvent& );
121 bool operator<( const OEvent& );
122 bool operator<=( const OEvent& );
123 bool operator>( const OEvent& );
124 bool operator>=(const OEvent& );
125*/
126private:
127 inline void changeOrModify();
128 void deref();
129 struct Data;
130 Data* data;
131 class Private;
132 Private* priv;
133
134};
135
136/**
137 * AN Event can span through multiple days. We split up a multiday eve
138 */
139
140class OEffectiveEvent {
141public:
142 QValueList<OEffectiveEvent> ValueList;
143 enum Position { MidWay, Start, End, StartEnd };
144 // If we calculate the effective event of a multi-day event
145 // we have to figure out whether we are at the first day,
146 // at the end, or anywhere else ("middle"). This is important
147 // for the start/end times (00:00/23:59)
148 // MidWay: 00:00 -> 23:59, as we are "in the middle" of a multi-
149 // day event
150 // Start: start time -> 23:59
151 // End: 00:00 -> end time
152 // Start | End == StartEnd: for single-day events (default)
153 // here we draw start time -> end time
154 OEffectiveEvent();
155 OEffectiveEvent( const OEvent& event, const QDate& startDate, Position pos = StartEnd );
156 OEffectiveEvent( const OEffectiveEvent& );
157 OEffectiveEvent &operator=(const OEffectiveEvent& );
158 ~OEffectiveEvent();
159
160 void setStartTime( const QTime& );
161 void setEndTime( const QTime& );
162 void setEvent( const OEvent& );
163 void setDate( const QDate& );
164
165 void setEffectiveDates( const QDate& from, const QDate& to );
166
167 QString description()const;
168 QString location()const;
169 QString note()const;
170 OEvent event()const;
171 QTime startTime()const;
172 QTime endTime()const;
173 QDate date()const;
174
175 /* return the length in hours */
176 int length()const;
177 int size()const;
178
179 QDate startDate()const;
180 QDate endDate()const;
181
182 bool operator<( const OEffectiveEvent &e ) const;
183 bool operator<=( const OEffectiveEvent &e ) const;
184 bool operator==( const OEffectiveEvent &e ) const;
185 bool operator!=( const OEffectiveEvent &e ) const;
186 bool operator>( const OEffectiveEvent &e ) const;
187 bool operator>= ( const OEffectiveEvent &e ) const;
188
189private:
190 void deref();
191 inline void changeOrModify();
192 class Private;
193 Private* priv;
194 struct Data;
195 Data* data;
196
197};
198#endif
diff --git a/libopie/pim/orecur.cpp b/libopie/pim/orecur.cpp
index daf3506..e6a4787 100644
--- a/libopie/pim/orecur.cpp
+++ b/libopie/pim/orecur.cpp
@@ -1,451 +1,446 @@
1#include <qshared.h> 1#include <qshared.h>
2 2
3#include <qtopia/timeconversion.h> 3#include <qtopia/timeconversion.h>
4 4
5#include "orecur.h" 5#include "orecur.h"
6 6
7struct ORecur::Data : public QShared { 7struct ORecur::Data : public QShared {
8 Data() : QShared() { 8 Data() : QShared() {
9 type = ORecur::NoRepeat; 9 type = ORecur::NoRepeat;
10 freq = -1; 10 freq = -1;
11 days = 0; 11 days = 0;
12 pos = 0; 12 pos = 0;
13 create = -1; 13 create = QDateTime::currentDateTime();
14 hasEnd = FALSE; 14 hasEnd = FALSE;
15 end = 0; 15 end = QDate::currentDate();
16 } 16 }
17 char days; // Q_UINT8 for 8 seven days;) 17 char days; // Q_UINT8 for 8 seven days;)
18 ORecur::RepeatType type; 18 ORecur::RepeatType type;
19 int freq; 19 int freq;
20 int pos; 20 int pos;
21 bool hasEnd : 1; 21 bool hasEnd : 1;
22 time_t end; 22 QDate end;
23 time_t create; 23 QDateTime create;
24 int rep; 24 int rep;
25 QString app; 25 QString app;
26 ExceptionList list; 26 ExceptionList list;
27 QDate start; 27 QDate start;
28}; 28};
29 29
30 30
31ORecur::ORecur() { 31ORecur::ORecur() {
32 data = new Data; 32 data = new Data;
33} 33}
34ORecur::ORecur( const ORecur& rec) 34ORecur::ORecur( const ORecur& rec)
35 : data( rec.data ) 35 : data( rec.data )
36{ 36{
37 data->ref(); 37 data->ref();
38} 38}
39ORecur::~ORecur() { 39ORecur::~ORecur() {
40 if ( data->deref() ) { 40 if ( data->deref() ) {
41 delete data; 41 delete data;
42 data = 0l; 42 data = 0l;
43 } 43 }
44} 44}
45void ORecur::deref() { 45void ORecur::deref() {
46 if ( data->deref() ) { 46 if ( data->deref() ) {
47 delete data; 47 delete data;
48 data = 0l; 48 data = 0l;
49 } 49 }
50} 50}
51bool ORecur::operator==( const ORecur& )const { 51bool ORecur::operator==( const ORecur& )const {
52 return false; 52 return false;
53} 53}
54ORecur &ORecur::operator=( const ORecur& re) { 54ORecur &ORecur::operator=( const ORecur& re) {
55 if ( *this == re ) return *this;
56
55 re.data->ref(); 57 re.data->ref();
56 deref(); 58 deref();
57 data = re.data; 59 data = re.data;
58 60
59 return *this; 61 return *this;
60} 62}
61bool ORecur::doesRecur()const { 63bool ORecur::doesRecur()const {
62 return !( type() == NoRepeat ); 64 return !( type() == NoRepeat );
63} 65}
64/* 66/*
65 * we try to be smart here 67 * we try to be smart here
66 * 68 *
67 */ 69 */
68bool ORecur::doesRecur( const QDate& date ) { 70bool ORecur::doesRecur( const QDate& date ) {
69 /* the day before the recurrance */ 71 /* the day before the recurrance */
70 QDate da = date.addDays(-1); 72 QDate da = date.addDays(-1);
71 73
72 QDate recur; 74 QDate recur;
73 if (!nextOcurrence( da, recur ) ) 75 if (!nextOcurrence( da, recur ) )
74 return false; 76 return false;
75 77
76 return (recur == date); 78 return (recur == date);
77} 79}
78// FIXME unuglify! 80// FIXME unuglify!
79// GPL from Datebookdb.cpp 81// GPL from Datebookdb.cpp
80// FIXME exception list! 82// FIXME exception list!
81bool ORecur::nextOcurrence( const QDate& from, QDate& next ) { 83bool ORecur::nextOcurrence( const QDate& from, QDate& next ) {
82 84
83 // easy checks, first are we too far in the future or too far in the past? 85 // easy checks, first are we too far in the future or too far in the past?
84 QDate tmpDate; 86 QDate tmpDate;
85 int freq = frequency(); 87 int freq = frequency();
86 int diff, diff2, a; 88 int diff, diff2, a;
87 int iday, imonth, iyear; 89 int iday, imonth, iyear;
88 int dayOfWeek = 0; 90 int dayOfWeek = 0;
89 int firstOfWeek = 0; 91 int firstOfWeek = 0;
90 int weekOfMonth; 92 int weekOfMonth;
91 93
92 94
93 if (hasEndDate() && endDate() < from) 95 if (hasEndDate() && endDate() < from)
94 return FALSE; 96 return FALSE;
95 97
96 if (start() >= from) { 98 if (start() >= from) {
97 next = start(); 99 next = start();
98 return TRUE; 100 return TRUE;
99 } 101 }
100 102
101 switch ( type() ) { 103 switch ( type() ) {
102 case Weekly: 104 case Weekly:
103 /* weekly is just daily by 7 */ 105 /* weekly is just daily by 7 */
104 /* first convert the repeatPattern.Days() mask to the next 106 /* first convert the repeatPattern.Days() mask to the next
105 day of week valid after from */ 107 day of week valid after from */
106 dayOfWeek = from.dayOfWeek(); 108 dayOfWeek = from.dayOfWeek();
107 dayOfWeek--; /* we want 0-6, doco for above specs 1-7 */ 109 dayOfWeek--; /* we want 0-6, doco for above specs 1-7 */
108 110
109 /* this is done in case freq > 1 and from in week not 111 /* this is done in case freq > 1 and from in week not
110 for this round */ 112 for this round */
111 // firstOfWeek = 0; this is already done at decl. 113 // firstOfWeek = 0; this is already done at decl.
112 while(!((1 << firstOfWeek) & days() )) 114 while(!((1 << firstOfWeek) & days() ))
113 firstOfWeek++; 115 firstOfWeek++;
114 116
115 /* there is at least one 'day', or there would be no event */ 117 /* there is at least one 'day', or there would be no event */
116 while(!((1 << (dayOfWeek % 7)) & days() )) 118 while(!((1 << (dayOfWeek % 7)) & days() ))
117 dayOfWeek++; 119 dayOfWeek++;
118 120
119 dayOfWeek = dayOfWeek % 7; /* the actual day of week */ 121 dayOfWeek = dayOfWeek % 7; /* the actual day of week */
120 dayOfWeek -= start().dayOfWeek() -1; 122 dayOfWeek -= start().dayOfWeek() -1;
121 123
122 firstOfWeek = firstOfWeek % 7; /* the actual first of week */ 124 firstOfWeek = firstOfWeek % 7; /* the actual first of week */
123 firstOfWeek -= start().dayOfWeek() -1; 125 firstOfWeek -= start().dayOfWeek() -1;
124 126
125 // dayOfWeek may be negitive now 127 // dayOfWeek may be negitive now
126 // day of week is number of days to add to start day 128 // day of week is number of days to add to start day
127 129
128 freq *= 7; 130 freq *= 7;
129 // FALL-THROUGH !!!!! 131 // FALL-THROUGH !!!!!
130 case Daily: 132 case Daily:
131 // the add is for the possible fall through from weekly */ 133 // the add is for the possible fall through from weekly */
132 if(start().addDays(dayOfWeek) > from) { 134 if(start().addDays(dayOfWeek) > from) {
133 /* first week exception */ 135 /* first week exception */
134 next = QDate(start().addDays(dayOfWeek) ); 136 next = QDate(start().addDays(dayOfWeek) );
135 if ((next > endDate()) 137 if ((next > endDate())
136 && hasEndDate() ) 138 && hasEndDate() )
137 return FALSE; 139 return FALSE;
138 return TRUE; 140 return TRUE;
139 } 141 }
140 /* if from is middle of a non-week */ 142 /* if from is middle of a non-week */
141 143
142 diff = start().addDays(dayOfWeek).daysTo(from) % freq; 144 diff = start().addDays(dayOfWeek).daysTo(from) % freq;
143 diff2 = start().addDays(firstOfWeek).daysTo(from) % freq; 145 diff2 = start().addDays(firstOfWeek).daysTo(from) % freq;
144 146
145 if(diff != 0) 147 if(diff != 0)
146 diff = freq - diff; 148 diff = freq - diff;
147 if(diff2 != 0) 149 if(diff2 != 0)
148 diff2 = freq - diff2; 150 diff2 = freq - diff2;
149 diff = QMIN(diff, diff2); 151 diff = QMIN(diff, diff2);
150 152
151 next = QDate(from.addDays(diff)); 153 next = QDate(from.addDays(diff));
152 if ( (next > endDate()) 154 if ( (next > endDate())
153 && hasEndDate() ) 155 && hasEndDate() )
154 return FALSE; 156 return FALSE;
155 return TRUE; 157 return TRUE;
156 case MonthlyDay: 158 case MonthlyDay:
157 iday = from.day(); 159 iday = from.day();
158 iyear = from.year(); 160 iyear = from.year();
159 imonth = from.month(); 161 imonth = from.month();
160 /* find equivelent day of month for this month */ 162 /* find equivelent day of month for this month */
161 dayOfWeek = start().dayOfWeek(); 163 dayOfWeek = start().dayOfWeek();
162 weekOfMonth = (start().day() - 1) / 7; 164 weekOfMonth = (start().day() - 1) / 7;
163 165
164 /* work out when the next valid month is */ 166 /* work out when the next valid month is */
165 a = from.year() - start().year(); 167 a = from.year() - start().year();
166 a *= 12; 168 a *= 12;
167 a = a + (imonth - start().month()); 169 a = a + (imonth - start().month());
168 /* a is e.start()monthsFrom(from); */ 170 /* a is e.start()monthsFrom(from); */
169 if(a % freq) { 171 if(a % freq) {
170 a = freq - (a % freq); 172 a = freq - (a % freq);
171 imonth = from.month() + a; 173 imonth = from.month() + a;
172 if (imonth > 12) { 174 if (imonth > 12) {
173 imonth--; 175 imonth--;
174 iyear += imonth / 12; 176 iyear += imonth / 12;
175 imonth = imonth % 12; 177 imonth = imonth % 12;
176 imonth++; 178 imonth++;
177 } 179 }
178 } 180 }
179 /* imonth is now the first month after or on 181 /* imonth is now the first month after or on
180 from that matches the frequency given */ 182 from that matches the frequency given */
181 183
182 /* find for this month */ 184 /* find for this month */
183 tmpDate = QDate( iyear, imonth, 1 ); 185 tmpDate = QDate( iyear, imonth, 1 );
184 186
185 iday = 1; 187 iday = 1;
186 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; 188 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7;
187 iday += 7 * weekOfMonth; 189 iday += 7 * weekOfMonth;
188 while (iday > tmpDate.daysInMonth()) { 190 while (iday > tmpDate.daysInMonth()) {
189 imonth += freq; 191 imonth += freq;
190 if (imonth > 12) { 192 if (imonth > 12) {
191 imonth--; 193 imonth--;
192 iyear += imonth / 12; 194 iyear += imonth / 12;
193 imonth = imonth % 12; 195 imonth = imonth % 12;
194 imonth++; 196 imonth++;
195 } 197 }
196 tmpDate = QDate( iyear, imonth, 1 ); 198 tmpDate = QDate( iyear, imonth, 1 );
197 /* these loops could go for a while, check end case now */ 199 /* these loops could go for a while, check end case now */
198 if ((tmpDate > endDate()) && hasEndDate() ) 200 if ((tmpDate > endDate()) && hasEndDate() )
199 return FALSE; 201 return FALSE;
200 iday = 1; 202 iday = 1;
201 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; 203 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7;
202 iday += 7 * weekOfMonth; 204 iday += 7 * weekOfMonth;
203 } 205 }
204 tmpDate = QDate(iyear, imonth, iday); 206 tmpDate = QDate(iyear, imonth, iday);
205 207
206 if (tmpDate >= from) { 208 if (tmpDate >= from) {
207 next = tmpDate; 209 next = tmpDate;
208 if ((next > endDate() ) && hasEndDate() ) 210 if ((next > endDate() ) && hasEndDate() )
209 return FALSE; 211 return FALSE;
210 return TRUE; 212 return TRUE;
211 } 213 }
212 214
213 /* need to find the next iteration */ 215 /* need to find the next iteration */
214 do { 216 do {
215 imonth += freq; 217 imonth += freq;
216 if (imonth > 12) { 218 if (imonth > 12) {
217 imonth--; 219 imonth--;
218 iyear += imonth / 12; 220 iyear += imonth / 12;
219 imonth = imonth % 12; 221 imonth = imonth % 12;
220 imonth++; 222 imonth++;
221 } 223 }
222 tmpDate = QDate( iyear, imonth, 1 ); 224 tmpDate = QDate( iyear, imonth, 1 );
223 /* these loops could go for a while, check end case now */ 225 /* these loops could go for a while, check end case now */
224 if ((tmpDate > endDate()) && hasEndDate() ) 226 if ((tmpDate > endDate()) && hasEndDate() )
225 return FALSE; 227 return FALSE;
226 iday = 1; 228 iday = 1;
227 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; 229 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7;
228 iday += 7 * weekOfMonth; 230 iday += 7 * weekOfMonth;
229 } while (iday > tmpDate.daysInMonth()); 231 } while (iday > tmpDate.daysInMonth());
230 tmpDate = QDate(iyear, imonth, iday); 232 tmpDate = QDate(iyear, imonth, iday);
231 233
232 next = tmpDate; 234 next = tmpDate;
233 if ((next > endDate()) && hasEndDate() ) 235 if ((next > endDate()) && hasEndDate() )
234 return FALSE; 236 return FALSE;
235 return TRUE; 237 return TRUE;
236 case MonthlyDate: 238 case MonthlyDate:
237 iday = start().day(); 239 iday = start().day();
238 iyear = from.year(); 240 iyear = from.year();
239 imonth = from.month(); 241 imonth = from.month();
240 242
241 a = from.year() - start().year(); 243 a = from.year() - start().year();
242 a *= 12; 244 a *= 12;
243 a = a + (imonth - start().month()); 245 a = a + (imonth - start().month());
244 /* a is e.start()monthsFrom(from); */ 246 /* a is e.start()monthsFrom(from); */
245 if(a % freq) { 247 if(a % freq) {
246 a = freq - (a % freq); 248 a = freq - (a % freq);
247 imonth = from.month() + a; 249 imonth = from.month() + a;
248 if (imonth > 12) { 250 if (imonth > 12) {
249 imonth--; 251 imonth--;
250 iyear += imonth / 12; 252 iyear += imonth / 12;
251 imonth = imonth % 12; 253 imonth = imonth % 12;
252 imonth++; 254 imonth++;
253 } 255 }
254 } 256 }
255 /* imonth is now the first month after or on 257 /* imonth is now the first month after or on
256 from that matches the frequencey given */ 258 from that matches the frequencey given */
257 259
258 /* this could go for a while, worse case, 4*12 iterations, probably */ 260 /* this could go for a while, worse case, 4*12 iterations, probably */
259 while(!QDate::isValid(iyear, imonth, iday) ) { 261 while(!QDate::isValid(iyear, imonth, iday) ) {
260 imonth += freq; 262 imonth += freq;
261 if (imonth > 12) { 263 if (imonth > 12) {
262 imonth--; 264 imonth--;
263 iyear += imonth / 12; 265 iyear += imonth / 12;
264 imonth = imonth % 12; 266 imonth = imonth % 12;
265 imonth++; 267 imonth++;
266 } 268 }
267 /* these loops could go for a while, check end case now */ 269 /* these loops could go for a while, check end case now */
268 if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() ) 270 if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() )
269 return FALSE; 271 return FALSE;
270 } 272 }
271 273
272 if(QDate(iyear, imonth, iday) >= from) { 274 if(QDate(iyear, imonth, iday) >= from) {
273 /* done */ 275 /* done */
274 next = QDate(iyear, imonth, iday); 276 next = QDate(iyear, imonth, iday);
275 if ((next > endDate()) && hasEndDate() ) 277 if ((next > endDate()) && hasEndDate() )
276 return FALSE; 278 return FALSE;
277 return TRUE; 279 return TRUE;
278 } 280 }
279 281
280 /* ok, need to cycle */ 282 /* ok, need to cycle */
281 imonth += freq; 283 imonth += freq;
282 imonth--; 284 imonth--;
283 iyear += imonth / 12; 285 iyear += imonth / 12;
284 imonth = imonth % 12; 286 imonth = imonth % 12;
285 imonth++; 287 imonth++;
286 288
287 while(!QDate::isValid(iyear, imonth, iday) ) { 289 while(!QDate::isValid(iyear, imonth, iday) ) {
288 imonth += freq; 290 imonth += freq;
289 imonth--; 291 imonth--;
290 iyear += imonth / 12; 292 iyear += imonth / 12;
291 imonth = imonth % 12; 293 imonth = imonth % 12;
292 imonth++; 294 imonth++;
293 if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() ) 295 if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() )
294 return FALSE; 296 return FALSE;
295 } 297 }
296 298
297 next = QDate(iyear, imonth, iday); 299 next = QDate(iyear, imonth, iday);
298 if ((next > endDate()) && hasEndDate() ) 300 if ((next > endDate()) && hasEndDate() )
299 return FALSE; 301 return FALSE;
300 return TRUE; 302 return TRUE;
301 case Yearly: 303 case Yearly:
302 iday = start().day(); 304 iday = start().day();
303 imonth = start().month(); 305 imonth = start().month();
304 iyear = from.year(); // after all, we want to start in this year 306 iyear = from.year(); // after all, we want to start in this year
305 307
306 diff = 1; 308 diff = 1;
307 if(imonth == 2 && iday > 28) { 309 if(imonth == 2 && iday > 28) {
308 /* leap year, and it counts, calculate actual frequency */ 310 /* leap year, and it counts, calculate actual frequency */
309 if(freq % 4) 311 if(freq % 4)
310 if (freq % 2) 312 if (freq % 2)
311 freq = freq * 4; 313 freq = freq * 4;
312 else 314 else
313 freq = freq * 2; 315 freq = freq * 2;
314 /* else divides by 4 already, leave freq alone */ 316 /* else divides by 4 already, leave freq alone */
315 diff = 4; 317 diff = 4;
316 } 318 }
317 319
318 a = from.year() - start().year(); 320 a = from.year() - start().year();
319 if(a % freq) { 321 if(a % freq) {
320 a = freq - (a % freq); 322 a = freq - (a % freq);
321 iyear = iyear + a; 323 iyear = iyear + a;
322 } 324 }
323 325
324 /* under the assumption we won't hit one of the special not-leap years twice */ 326 /* under the assumption we won't hit one of the special not-leap years twice */
325 if(!QDate::isValid(iyear, imonth, iday)) { 327 if(!QDate::isValid(iyear, imonth, iday)) {
326 /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ 328 /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */
327 iyear += freq; 329 iyear += freq;
328 } 330 }
329 331
330 if(QDate(iyear, imonth, iday) >= from) { 332 if(QDate(iyear, imonth, iday) >= from) {
331 next = QDate(iyear, imonth, iday); 333 next = QDate(iyear, imonth, iday);
332 334
333 if ((next > endDate()) && hasEndDate() ) 335 if ((next > endDate()) && hasEndDate() )
334 return FALSE; 336 return FALSE;
335 return TRUE; 337 return TRUE;
336 } 338 }
337 /* iyear == from.year(), need to advance again */ 339 /* iyear == from.year(), need to advance again */
338 iyear += freq; 340 iyear += freq;
339 /* under the assumption we won't hit one of the special not-leap years twice */ 341 /* under the assumption we won't hit one of the special not-leap years twice */
340 if(!QDate::isValid(iyear, imonth, iday)) { 342 if(!QDate::isValid(iyear, imonth, iday)) {
341 /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ 343 /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */
342 iyear += freq; 344 iyear += freq;
343 } 345 }
344 346
345 next = QDate(iyear, imonth, iday); 347 next = QDate(iyear, imonth, iday);
346 if ((next > endDate()) && hasEndDate() ) 348 if ((next > endDate()) && hasEndDate() )
347 return FALSE; 349 return FALSE;
348 return TRUE; 350 return TRUE;
349 default: 351 default:
350 return FALSE; 352 return FALSE;
351 } 353 }
352} 354}
353ORecur::RepeatType ORecur::type()const{ 355ORecur::RepeatType ORecur::type()const{
354 return data->type; 356 return data->type;
355} 357}
356int ORecur::frequency()const { 358int ORecur::frequency()const {
357 return data->freq; 359 return data->freq;
358} 360}
359int ORecur::position()const { 361int ORecur::position()const {
360 return data->pos; 362 return data->pos;
361} 363}
362char ORecur::days() const{ 364char ORecur::days() const{
363 return data->days; 365 return data->days;
364} 366}
365bool ORecur::hasEndDate()const { 367bool ORecur::hasEndDate()const {
366 return data->hasEnd; 368 return data->hasEnd;
367} 369}
368QDate ORecur::endDate()const { 370QDate ORecur::endDate()const {
369 return TimeConversion::fromUTC( data->end ).date(); 371 return data->end;
370} 372}
371QDate ORecur::start()const{ 373QDate ORecur::start()const{
372 return data->start; 374 return data->start;
373} 375}
374time_t ORecur::endDateUTC()const { 376QDateTime ORecur::createdDateTime()const {
375 return data->end;
376}
377time_t ORecur::createTime()const {
378 return data->create; 377 return data->create;
379} 378}
380int ORecur::repetition()const { 379int ORecur::repetition()const {
381 return data->rep; 380 return data->rep;
382} 381}
383QString ORecur::service()const { 382QString ORecur::service()const {
384 return data->app; 383 return data->app;
385} 384}
386ORecur::ExceptionList& ORecur::exceptions() { 385ORecur::ExceptionList& ORecur::exceptions() {
387 return data->list; 386 return data->list;
388} 387}
389void ORecur::setType( const RepeatType& z) { 388void ORecur::setType( const RepeatType& z) {
390 checkOrModify(); 389 checkOrModify();
391 data->type = z; 390 data->type = z;
392} 391}
393void ORecur::setFrequency( int freq ) { 392void ORecur::setFrequency( int freq ) {
394 checkOrModify(); 393 checkOrModify();
395 data->freq = freq; 394 data->freq = freq;
396} 395}
397void ORecur::setPosition( int pos ) { 396void ORecur::setPosition( int pos ) {
398 checkOrModify(); 397 checkOrModify();
399 data->pos = pos; 398 data->pos = pos;
400} 399}
401void ORecur::setDays( char c ) { 400void ORecur::setDays( char c ) {
402 checkOrModify(); 401 checkOrModify();
403 data->days = c; 402 data->days = c;
404} 403}
405void ORecur::setEndDate( const QDate& dt) { 404void ORecur::setEndDate( const QDate& dt) {
406 checkOrModify(); 405 checkOrModify();
407 data->end = TimeConversion::toUTC( dt ); 406 data->end = dt;
408}
409void ORecur::setEndDateUTC( time_t t) {
410 checkOrModify();
411 data->end = t;
412} 407}
413void ORecur::setCreateTime( time_t t) { 408void ORecur::setCreatedDateTime( const QDateTime& t) {
414 checkOrModify(); 409 checkOrModify();
415 data->create = t; 410 data->create = t;
416} 411}
417void ORecur::setHasEndDate( bool b) { 412void ORecur::setHasEndDate( bool b) {
418 checkOrModify(); 413 checkOrModify();
419 data->hasEnd = b; 414 data->hasEnd = b;
420} 415}
421void ORecur::setRepitition( int rep ) { 416void ORecur::setRepitition( int rep ) {
422 checkOrModify(); 417 checkOrModify();
423 data->rep = rep; 418 data->rep = rep;
424} 419}
425void ORecur::setService( const QString& app ) { 420void ORecur::setService( const QString& app ) {
426 checkOrModify(); 421 checkOrModify();
427 data->app = app; 422 data->app = app;
428} 423}
429void ORecur::setStart( const QDate& dt ) { 424void ORecur::setStart( const QDate& dt ) {
430 checkOrModify(); 425 checkOrModify();
431 data->start = dt; 426 data->start = dt;
432} 427}
433void ORecur::checkOrModify() { 428void ORecur::checkOrModify() {
434 if ( data->count != 1 ) { 429 if ( data->count != 1 ) {
435 data->deref(); 430 data->deref();
436 Data* d2 = new Data; 431 Data* d2 = new Data;
437 d2->days = data->days; 432 d2->days = data->days;
438 d2->type = data->type; 433 d2->type = data->type;
439 d2->freq = data->freq; 434 d2->freq = data->freq;
440 d2->pos = data->pos; 435 d2->pos = data->pos;
441 d2->hasEnd = data->hasEnd; 436 d2->hasEnd = data->hasEnd;
442 d2->end = data->end; 437 d2->end = data->end;
443 d2->create = data->create; 438 d2->create = data->create;
444 d2->rep = data->rep; 439 d2->rep = data->rep;
445 d2->app = data->app; 440 d2->app = data->app;
446 d2->list = data->list; 441 d2->list = data->list;
447 d2->start = data->start; 442 d2->start = data->start;
448 data = d2; 443 data = d2;
449 } 444 }
450} 445}
451 446
diff --git a/libopie/pim/orecur.h b/libopie/pim/orecur.h
index 8713d97..1e0014b 100644
--- a/libopie/pim/orecur.h
+++ b/libopie/pim/orecur.h
@@ -1,83 +1,87 @@
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
13 13
14class ORecur { 14class ORecur {
15public: 15public:
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 ORecur(); 21 ORecur();
22 ORecur( const ORecur& ); 22 ORecur( const ORecur& );
23 ~ORecur(); 23 ~ORecur();
24 24
25 ORecur &operator=( const ORecur& ); 25 ORecur &operator=( const ORecur& );
26 bool operator==(const ORecur& )const; 26 bool operator==(const ORecur& )const;
27 27
28 bool doesRecur()const; 28 bool doesRecur()const;
29 /* if it recurrs on that day */ 29 /* if it recurrs on that day */
30 bool doesRecur( const QDate& ); 30 bool doesRecur( const QDate& );
31 RepeatType type()const; 31 RepeatType type()const;
32 int frequency()const; 32 int frequency()const;
33 int position()const; 33 int position()const;
34 char days()const; 34 char days()const;
35 bool hasEndDate()const; 35 bool hasEndDate()const;
36 QDate start()const; 36 QDate start()const;
37 QDate endDate()const; 37 QDate endDate()const;
38 time_t endDateUTC()const; 38 QDateTime createdDateTime()const;
39 time_t createTime()const; 39 /**
40 * starting on monday=0, sunday=6
41 * for convience
42 */
43 bool repeatOnWeekDay( int day )const;
40 44
41 /** 45 /**
42 * FromWhereToStart is not included!!! 46 * FromWhereToStart is not included!!!
43 */ 47 */
44 bool nextOcurrence( const QDate& FromWhereToStart, QDate &recurDate ); 48 bool nextOcurrence( const QDate& FromWhereToStart, QDate &recurDate );
49
45 /** 50 /**
46 * The module this ORecur belongs to 51 * The module this ORecur belongs to
47 */ 52 */
48 QString service()const; 53 QString service()const;
49 54
50 /* 55 /*
51 * reference to the exception list 56 * reference to the exception list
52 */ 57 */
53 ExceptionList &exceptions(); 58 ExceptionList &exceptions();
54 59
55 /** 60 /**
56 * the current repetition 61 * the current repetition
57 */ 62 */
58 int repetition()const; 63 int repetition()const;
59 64
60 void setType( const RepeatType& ); 65 void setType( const RepeatType& );
61 void setFrequency( int freq ); 66 void setFrequency( int freq );
62 void setPosition( int pos ); 67 void setPosition( int pos );
63 void setDays( char c); 68 void setDays( char c);
64 void setEndDate( const QDate& dt ); 69 void setEndDate( const QDate& dt );
65 void setStart( const QDate& dt ); 70 void setStart( const QDate& dt );
66 void setEndDateUTC( time_t ); 71 void setCreatedDateTime( const QDateTime& );
67 void setCreateTime( time_t );
68 void setHasEndDate( bool b ); 72 void setHasEndDate( bool b );
69 void setRepitition(int ); 73 void setRepitition(int );
70 74
71 void setService( const QString& ser ); 75 void setService( const QString& ser );
72private: 76private:
73 void deref(); 77 void deref();
74 inline void checkOrModify(); 78 inline void checkOrModify();
75 79
76 80
77 class Data; 81 class Data;
78 Data* data; 82 Data* data;
79 class ORecurPrivate; 83 class ORecurPrivate;
80 ORecurPrivate *d; 84 ORecurPrivate *d;
81}; 85};
82 86
83#endif 87#endif
diff --git a/libopie/pim/otimezone.cpp b/libopie/pim/otimezone.cpp
new file mode 100644
index 0000000..b2bd3aa
--- a/dev/null
+++ b/libopie/pim/otimezone.cpp
@@ -0,0 +1,104 @@
1#include <stdio.h>
2#include <stdlib.h>
3
4#include <sys/types.h>
5
6#include "otimezone.h"
7
8namespace {
9
10 QDateTime utcTime( time_t t) {
11 tm* broken = ::gmtime( &t );
12 QDateTime ret;
13 ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) );
14 ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) );
15 return ret;
16 }
17 QDateTime utcTime( time_t t, const QString& zone) {
18 QCString org = ::getenv( "TZ" );
19 ::setenv( "TZ", zone.latin1(), true );
20 ::tzset();
21
22 tm* broken = ::localtime( &t );
23 ::setenv( "TZ", org, true );
24
25 QDateTime ret;
26 ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) );
27 ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) );
28
29 return ret;
30 }
31 time_t to_Time_t( const QDateTime& utc, const QString& str ) {
32 QDate d = utc.date();
33 QTime t = utc.time();
34
35 tm broken;
36 broken.tm_year = d.year() - 1900;
37 broken.tm_mon = d.month() - 1;
38 broken.tm_mday = d.day();
39 broken.tm_hour = t.hour();
40 broken.tm_min = t.minute();
41 broken.tm_sec = t.second();
42
43 QCString org = ::getenv( "TZ" );
44 ::setenv( "TZ", str.latin1(), true );
45 ::tzset();
46
47 time_t ti = ::mktime( &broken );
48 ::setenv( "TZ", org, true );
49
50 return ti;
51 }
52}
53OTimeZone::OTimeZone( const ZoneName& zone )
54 : m_name(zone) {
55}
56OTimeZone::~OTimeZone() {
57}
58
59bool OTimeZone::isValid()const {
60 return !m_name.isEmpty();
61}
62
63/*
64 * we will get the current timezone
65 * and ask it to convert to the timezone date
66 */
67QDateTime OTimeZone::toLocalDateTime( const QDateTime& dt) {
68 return OTimeZone::current().toDateTime( dt, *this );
69}
70QDateTime OTimeZone::toUTCDateTime( const QDateTime& dt ) {
71 return OTimeZone::utc().toDateTime( dt, *this );
72}
73QDateTime OTimeZone::fromUTCDateTime( time_t t) {
74 return utcTime( t );
75}
76QDateTime OTimeZone::toDateTime( time_t t) {
77 return utcTime( t, m_name );
78}
79/*
80 * convert dt to utc using zone.m_name
81 * convert utc -> timeZoneDT using this->m_name
82 */
83QDateTime OTimeZone::toDateTime( const QDateTime& dt, const OTimeZone& zone ) {
84 time_t utc = to_Time_t( dt, zone.m_name );
85 qWarning("%d %s", utc, zone.m_name.latin1() );
86 return utcTime( utc, m_name );
87}
88time_t OTimeZone::fromDateTime( const QDateTime& time ) {
89 return to_Time_t( time, m_name );
90}
91time_t OTimeZone::fromUTCDateTime( const QDateTime& time ) {
92 return to_Time_t( time, "UTC" );
93}
94OTimeZone OTimeZone::current() {
95 QCString str = ::getenv("TZ");
96 OTimeZone zone( str );
97 return zone;
98}
99OTimeZone OTimeZone::utc() {
100 return OTimeZone("UTC");
101}
102QString OTimeZone::timeZone()const {
103 return m_name;
104}
diff --git a/libopie/pim/otimezone.h b/libopie/pim/otimezone.h
new file mode 100644
index 0000000..bb08349
--- a/dev/null
+++ b/libopie/pim/otimezone.h
@@ -0,0 +1,71 @@
1#ifndef OPIE_TIME_ZONE_H
2#define OPIE_TIME_ZONE_H
3
4#include <time.h>
5#include <qdatetime.h>
6
7/**
8 * A very primitive class to convert time
9 * from one timezone to another
10 * and to localtime
11 * and time_t
12 */
13class OTimeZone {
14 public:
15 typedef QString ZoneName;
16 OTimeZone( const ZoneName& = ZoneName::null );
17 virtual ~OTimeZone(); // just in case.
18
19 bool isValid()const;
20
21 /**
22 * converts the QDateTime to a DateTime
23 * in the local timezone
24 * if QDateTime is 25th Jan and takes place in Europe/Berlin at 12h
25 * and the current timezone is Europe/London the returned
26 * time will be 11h.
27 */
28 QDateTime toLocalDateTime( const QDateTime& dt );
29
30 /**
31 * converts the QDateTime to UTC time
32 */
33 QDateTime toUTCDateTime( const QDateTime& dt );
34
35 /**
36 * reads the time_t into a QDateTime using UTC as timezone!
37 */
38 QDateTime fromUTCDateTime( time_t );
39
40 /**
41 * converts the time_t to the time in the timezone
42 */
43 QDateTime toDateTime( time_t );
44
45 /**
46 * converts the QDateTime from one timezone to this timeZone
47 */
48 QDateTime toDateTime( const QDateTime&, const OTimeZone& timeZone );
49
50 /**
51 * converts the date time into a time_t. It takes the timezone into account
52 */
53 time_t fromDateTime( const QDateTime& );
54
55 /**
56 * converts the datetime with timezone UTC
57 */
58 time_t fromUTCDateTime( const QDateTime& );
59
60 static OTimeZone current();
61 static OTimeZone utc();
62
63 QString timeZone()const;
64 private:
65 ZoneName m_name;
66 class Private;
67 Private* d;
68};
69
70
71#endif
diff --git a/libopie/pim/otodo.cpp b/libopie/pim/otodo.cpp
index b4d4aa9..049359e 100644
--- a/libopie/pim/otodo.cpp
+++ b/libopie/pim/otodo.cpp
@@ -87,336 +87,338 @@ OTodo::OTodo(bool completed, int priority,
87{ 87{
88// qWarning("OTodoData" + summary); 88// qWarning("OTodoData" + summary);
89 setCategories( idsFromString( category.join(";") ) ); 89 setCategories( idsFromString( category.join(";") ) );
90 90
91 data = new OTodoData; 91 data = new OTodoData;
92 92
93 data->date = date; 93 data->date = date;
94 data->isCompleted = completed; 94 data->isCompleted = completed;
95 data->hasDate = hasDate; 95 data->hasDate = hasDate;
96 data->priority = priority; 96 data->priority = priority;
97 data->sum = summary; 97 data->sum = summary;
98 data->prog = progress; 98 data->prog = progress;
99 data->desc = Qtopia::simplifyMultiLineSpace(description ); 99 data->desc = Qtopia::simplifyMultiLineSpace(description );
100} 100}
101bool OTodo::match( const QRegExp &regExp )const 101bool OTodo::match( const QRegExp &regExp )const
102{ 102{
103 if( QString::number( data->priority ).find( regExp ) != -1 ){ 103 if( QString::number( data->priority ).find( regExp ) != -1 ){
104 return true; 104 return true;
105 }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){ 105 }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){
106 return true; 106 return true;
107 }else if(data->desc.find( regExp ) != -1 ){ 107 }else if(data->desc.find( regExp ) != -1 ){
108 return true; 108 return true;
109 }else if(data->sum.find( regExp ) != -1 ) { 109 }else if(data->sum.find( regExp ) != -1 ) {
110 return true; 110 return true;
111 } 111 }
112 return false; 112 return false;
113} 113}
114bool OTodo::isCompleted() const 114bool OTodo::isCompleted() const
115{ 115{
116 return data->isCompleted; 116 return data->isCompleted;
117} 117}
118bool OTodo::hasDueDate() const 118bool OTodo::hasDueDate() const
119{ 119{
120 return data->hasDate; 120 return data->hasDate;
121} 121}
122bool OTodo::hasStartDate()const { 122bool OTodo::hasStartDate()const {
123 return data->start.isValid(); 123 return data->start.isValid();
124} 124}
125bool OTodo::hasCompletedDate()const { 125bool OTodo::hasCompletedDate()const {
126 return data->completed.isValid(); 126 return data->completed.isValid();
127} 127}
128int OTodo::priority()const 128int OTodo::priority()const
129{ 129{
130 return data->priority; 130 return data->priority;
131} 131}
132QString OTodo::summary() const 132QString OTodo::summary() const
133{ 133{
134 return data->sum; 134 return data->sum;
135} 135}
136ushort OTodo::progress() const 136ushort OTodo::progress() const
137{ 137{
138 return data->prog; 138 return data->prog;
139} 139}
140QDate OTodo::dueDate()const 140QDate OTodo::dueDate()const
141{ 141{
142 return data->date; 142 return data->date;
143} 143}
144QDate OTodo::startDate()const { 144QDate OTodo::startDate()const {
145 return data->start; 145 return data->start;
146} 146}
147QDate OTodo::completedDate()const { 147QDate OTodo::completedDate()const {
148 return data->completed; 148 return data->completed;
149} 149}
150QString OTodo::description()const 150QString OTodo::description()const
151{ 151{
152 return data->desc; 152 return data->desc;
153} 153}
154OPimState OTodo::state()const { 154OPimState OTodo::state()const {
155 return data->state; 155 return data->state;
156} 156}
157ORecur OTodo::recurrence()const { 157ORecur OTodo::recurrence()const {
158 return data->recur; 158 return data->recur;
159} 159}
160OPimMaintainer OTodo::maintainer()const { 160OPimMaintainer OTodo::maintainer()const {
161 return data->maintainer; 161 return data->maintainer;
162} 162}
163void OTodo::setCompleted( bool completed ) 163void OTodo::setCompleted( bool completed )
164{ 164{
165 changeOrModify(); 165 changeOrModify();
166 data->isCompleted = completed; 166 data->isCompleted = completed;
167} 167}
168void OTodo::setHasDueDate( bool hasDate ) 168void OTodo::setHasDueDate( bool hasDate )
169{ 169{
170 changeOrModify(); 170 changeOrModify();
171 data->hasDate = hasDate; 171 data->hasDate = hasDate;
172} 172}
173void OTodo::setDescription(const QString &desc ) 173void OTodo::setDescription(const QString &desc )
174{ 174{
175// qWarning( "desc " + desc ); 175// qWarning( "desc " + desc );
176 changeOrModify(); 176 changeOrModify();
177 data->desc = Qtopia::simplifyMultiLineSpace(desc ); 177 data->desc = Qtopia::simplifyMultiLineSpace(desc );
178} 178}
179void OTodo::setSummary( const QString& sum ) 179void OTodo::setSummary( const QString& sum )
180{ 180{
181 changeOrModify(); 181 changeOrModify();
182 data->sum = sum; 182 data->sum = sum;
183} 183}
184void OTodo::setPriority(int prio ) 184void OTodo::setPriority(int prio )
185{ 185{
186 changeOrModify(); 186 changeOrModify();
187 data->priority = prio; 187 data->priority = prio;
188} 188}
189void OTodo::setDueDate( const QDate& date ) 189void OTodo::setDueDate( const QDate& date )
190{ 190{
191 changeOrModify(); 191 changeOrModify();
192 data->date = date; 192 data->date = date;
193} 193}
194void OTodo::setStartDate( const QDate& date ) { 194void OTodo::setStartDate( const QDate& date ) {
195 changeOrModify(); 195 changeOrModify();
196 data->start = date; 196 data->start = date;
197} 197}
198void OTodo::setCompletedDate( const QDate& date ) { 198void OTodo::setCompletedDate( const QDate& date ) {
199 changeOrModify(); 199 changeOrModify();
200 data->completed = date; 200 data->completed = date;
201} 201}
202void OTodo::setState( const OPimState& state ) { 202void OTodo::setState( const OPimState& state ) {
203 changeOrModify(); 203 changeOrModify();
204 data->state = state; 204 data->state = state;
205} 205}
206void OTodo::setRecurrence( const ORecur& rec) { 206void OTodo::setRecurrence( const ORecur& rec) {
207 changeOrModify(); 207 changeOrModify();
208 data->recur = rec; 208 data->recur = rec;
209} 209}
210void OTodo::setMaintainer( const OPimMaintainer& pim ) { 210void OTodo::setMaintainer( const OPimMaintainer& pim ) {
211 changeOrModify(); 211 changeOrModify();
212 data->maintainer = pim; 212 data->maintainer = pim;
213} 213}
214bool OTodo::isOverdue( ) 214bool OTodo::isOverdue( )
215{ 215{
216 if( data->hasDate && !data->isCompleted) 216 if( data->hasDate && !data->isCompleted)
217 return QDate::currentDate() > data->date; 217 return QDate::currentDate() > data->date;
218 return false; 218 return false;
219} 219}
220void OTodo::setProgress(ushort progress ) 220void OTodo::setProgress(ushort progress )
221{ 221{
222 changeOrModify(); 222 changeOrModify();
223 data->prog = progress; 223 data->prog = progress;
224} 224}
225QString OTodo::toShortText() const { 225QString OTodo::toShortText() const {
226 return summary(); 226 return summary();
227} 227}
228/*! 228/*!
229 Returns a richt text string 229 Returns a richt text string
230*/ 230*/
231QString OTodo::toRichText() const 231QString OTodo::toRichText() const
232{ 232{
233 QString text; 233 QString text;
234 QStringList catlist; 234 QStringList catlist;
235 235
236 // Description of the todo 236 // Description of the todo
237 if ( !summary().isEmpty() ) { 237 if ( !summary().isEmpty() ) {
238 text += "<b>" + QObject::tr( "Summary:") + "</b><br>"; 238 text += "<b>" + QObject::tr( "Summary:") + "</b><br>";
239 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 239 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
240 } 240 }
241 if( !description().isEmpty() ){ 241 if( !description().isEmpty() ){
242 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 242 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
243 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ; 243 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ;
244 } 244 }
245 text += "<br><br><br>"; 245 text += "<br><br><br>";
246 246
247 text += "<b>" + QObject::tr( "Priority:") +" </b>" 247 text += "<b>" + QObject::tr( "Priority:") +" </b>"
248 + QString::number( priority() ) + " <br>"; 248 + QString::number( priority() ) + " <br>";
249 text += "<b>" + QObject::tr( "Progress:") + " </b>" 249 text += "<b>" + QObject::tr( "Progress:") + " </b>"
250 + QString::number( progress() ) + " %<br>"; 250 + QString::number( progress() ) + " %<br>";
251 if (hasDueDate() ){ 251 if (hasDueDate() ){
252 text += "<b>" + QObject::tr( "Deadline:") + " </b>"; 252 text += "<b>" + QObject::tr( "Deadline:") + " </b>";
253 text += dueDate().toString(); 253 text += dueDate().toString();
254 text += "<br>"; 254 text += "<br>";
255 } 255 }
256 256
257 text += "<b>" + QObject::tr( "Category:") + "</b> "; 257 text += "<b>" + QObject::tr( "Category:") + "</b> ";
258 text += categoryNames( "Todo List" ).join(", "); 258 text += categoryNames( "Todo List" ).join(", ");
259 text += "<br>"; 259 text += "<br>";
260 260
261 return text; 261 return text;
262} 262}
263OPimNotifyManager& OTodo::notifiers() { 263OPimNotifyManager& OTodo::notifiers() {
264 return data->notifiers; 264 return data->notifiers;
265} 265}
266 266
267bool OTodo::operator<( const OTodo &toDoEvent )const{ 267bool OTodo::operator<( const OTodo &toDoEvent )const{
268 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 268 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
269 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 269 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
270 if( hasDueDate() && toDoEvent.hasDueDate() ){ 270 if( hasDueDate() && toDoEvent.hasDueDate() ){
271 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 271 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
272 return priority() < toDoEvent.priority(); 272 return priority() < toDoEvent.priority();
273 }else{ 273 }else{
274 return dueDate() < toDoEvent.dueDate(); 274 return dueDate() < toDoEvent.dueDate();
275 } 275 }
276 } 276 }
277 return false; 277 return false;
278} 278}
279bool OTodo::operator<=(const OTodo &toDoEvent )const 279bool OTodo::operator<=(const OTodo &toDoEvent )const
280{ 280{
281 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 281 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
282 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true; 282 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true;
283 if( hasDueDate() && toDoEvent.hasDueDate() ){ 283 if( hasDueDate() && toDoEvent.hasDueDate() ){
284 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 284 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
285 return priority() <= toDoEvent.priority(); 285 return priority() <= toDoEvent.priority();
286 }else{ 286 }else{
287 return dueDate() <= toDoEvent.dueDate(); 287 return dueDate() <= toDoEvent.dueDate();
288 } 288 }
289 } 289 }
290 return true; 290 return true;
291} 291}
292bool OTodo::operator>(const OTodo &toDoEvent )const 292bool OTodo::operator>(const OTodo &toDoEvent )const
293{ 293{
294 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; 294 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false;
295 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 295 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
296 if( hasDueDate() && toDoEvent.hasDueDate() ){ 296 if( hasDueDate() && toDoEvent.hasDueDate() ){
297 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 297 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
298 return priority() > toDoEvent.priority(); 298 return priority() > toDoEvent.priority();
299 }else{ 299 }else{
300 return dueDate() > toDoEvent.dueDate(); 300 return dueDate() > toDoEvent.dueDate();
301 } 301 }
302 } 302 }
303 return false; 303 return false;
304} 304}
305bool OTodo::operator>=(const OTodo &toDoEvent )const 305bool OTodo::operator>=(const OTodo &toDoEvent )const
306{ 306{
307 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 307 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
308 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 308 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
309 if( hasDueDate() && toDoEvent.hasDueDate() ){ 309 if( hasDueDate() && toDoEvent.hasDueDate() ){
310 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 310 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
311 return priority() > toDoEvent.priority(); 311 return priority() > toDoEvent.priority();
312 }else{ 312 }else{
313 return dueDate() > toDoEvent.dueDate(); 313 return dueDate() > toDoEvent.dueDate();
314 } 314 }
315 } 315 }
316 return true; 316 return true;
317} 317}
318bool OTodo::operator==(const OTodo &toDoEvent )const 318bool OTodo::operator==(const OTodo &toDoEvent )const
319{ 319{
320 if ( data->priority != toDoEvent.data->priority ) return false; 320 if ( data->priority != toDoEvent.data->priority ) return false;
321 if ( data->priority != toDoEvent.data->prog ) return false; 321 if ( data->priority != toDoEvent.data->prog ) return false;
322 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; 322 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false;
323 if ( data->hasDate != toDoEvent.data->hasDate ) return false; 323 if ( data->hasDate != toDoEvent.data->hasDate ) return false;
324 if ( data->date != toDoEvent.data->date ) return false; 324 if ( data->date != toDoEvent.data->date ) return false;
325 if ( data->sum != toDoEvent.data->sum ) return false; 325 if ( data->sum != toDoEvent.data->sum ) return false;
326 if ( data->desc != toDoEvent.data->desc ) return false; 326 if ( data->desc != toDoEvent.data->desc ) return false;
327 if ( data->maintainer != toDoEvent.data->maintainer ) 327 if ( data->maintainer != toDoEvent.data->maintainer )
328 return false; 328 return false;
329 329
330 return OPimRecord::operator==( toDoEvent ); 330 return OPimRecord::operator==( toDoEvent );
331} 331}
332void OTodo::deref() { 332void OTodo::deref() {
333 333
334// qWarning("deref in ToDoEvent"); 334// qWarning("deref in ToDoEvent");
335 if ( data->deref() ) { 335 if ( data->deref() ) {
336// qWarning("deleting"); 336// qWarning("deleting");
337 delete data; 337 delete data;
338 data= 0; 338 data= 0;
339 } 339 }
340} 340}
341OTodo &OTodo::operator=(const OTodo &item ) 341OTodo &OTodo::operator=(const OTodo &item )
342{ 342{
343 if ( *this == item ) return *this;
344
343 OPimRecord::operator=( item ); 345 OPimRecord::operator=( item );
344 //qWarning("operator= ref "); 346 //qWarning("operator= ref ");
345 item.data->ref(); 347 item.data->ref();
346 deref(); 348 deref();
347 data = item.data; 349 data = item.data;
348 350
349 return *this; 351 return *this;
350} 352}
351 353
352QMap<int, QString> OTodo::toMap() const { 354QMap<int, QString> OTodo::toMap() const {
353 QMap<int, QString> map; 355 QMap<int, QString> map;
354 356
355 map.insert( Uid, QString::number( uid() ) ); 357 map.insert( Uid, QString::number( uid() ) );
356 map.insert( Category, idsToString( categories() ) ); 358 map.insert( Category, idsToString( categories() ) );
357 map.insert( HasDate, QString::number( data->hasDate ) ); 359 map.insert( HasDate, QString::number( data->hasDate ) );
358 map.insert( Completed, QString::number( data->isCompleted ) ); 360 map.insert( Completed, QString::number( data->isCompleted ) );
359 map.insert( Description, data->desc ); 361 map.insert( Description, data->desc );
360 map.insert( Summary, data->sum ); 362 map.insert( Summary, data->sum );
361 map.insert( Priority, QString::number( data->priority ) ); 363 map.insert( Priority, QString::number( data->priority ) );
362 map.insert( DateDay, QString::number( data->date.day() ) ); 364 map.insert( DateDay, QString::number( data->date.day() ) );
363 map.insert( DateMonth, QString::number( data->date.month() ) ); 365 map.insert( DateMonth, QString::number( data->date.month() ) );
364 map.insert( DateYear, QString::number( data->date.year() ) ); 366 map.insert( DateYear, QString::number( data->date.year() ) );
365 map.insert( Progress, QString::number( data->prog ) ); 367 map.insert( Progress, QString::number( data->prog ) );
366// map.insert( CrossReference, crossToString() ); 368// map.insert( CrossReference, crossToString() );
367 /* FIXME!!! map.insert( State, ); 369 /* FIXME!!! map.insert( State, );
368 map.insert( Recurrence, ); 370 map.insert( Recurrence, );
369 map.insert( Reminders, ); 371 map.insert( Reminders, );
370 map. 372 map.
371 */ 373 */
372 return map; 374 return map;
373} 375}
374 376
375QMap<QString, QString> OTodo::toExtraMap()const { 377QMap<QString, QString> OTodo::toExtraMap()const {
376 return data->extra; 378 return data->extra;
377} 379}
378/** 380/**
379 * change or modify looks at the ref count and either 381 * change or modify looks at the ref count and either
380 * creates a new QShared Object or it can modify it 382 * creates a new QShared Object or it can modify it
381 * right in place 383 * right in place
382 */ 384 */
383void OTodo::changeOrModify() { 385void OTodo::changeOrModify() {
384 if ( data->count != 1 ) { 386 if ( data->count != 1 ) {
385 qWarning("changeOrModify"); 387 qWarning("changeOrModify");
386 data->deref(); 388 data->deref();
387 OTodoData* d2 = new OTodoData(); 389 OTodoData* d2 = new OTodoData();
388 copy(data, d2 ); 390 copy(data, d2 );
389 data = d2; 391 data = d2;
390 } 392 }
391} 393}
392// WATCHOUT 394// WATCHOUT
393/* 395/*
394 * if you add something to the Data struct 396 * if you add something to the Data struct
395 * be sure to copy it here 397 * be sure to copy it here
396 */ 398 */
397void OTodo::copy( OTodoData* src, OTodoData* dest ) { 399void OTodo::copy( OTodoData* src, OTodoData* dest ) {
398 dest->date = src->date; 400 dest->date = src->date;
399 dest->isCompleted = src->isCompleted; 401 dest->isCompleted = src->isCompleted;
400 dest->hasDate = src->hasDate; 402 dest->hasDate = src->hasDate;
401 dest->priority = src->priority; 403 dest->priority = src->priority;
402 dest->desc = src->desc; 404 dest->desc = src->desc;
403 dest->sum = src->sum; 405 dest->sum = src->sum;
404 dest->extra = src->extra; 406 dest->extra = src->extra;
405 dest->prog = src->prog; 407 dest->prog = src->prog;
406 dest->state = src->state; 408 dest->state = src->state;
407 dest->recur = src->recur; 409 dest->recur = src->recur;
408 dest->maintainer = src->maintainer; 410 dest->maintainer = src->maintainer;
409 dest->start = src->start; 411 dest->start = src->start;
410 dest->completed = src->completed; 412 dest->completed = src->completed;
411 dest->notifiers = src->notifiers; 413 dest->notifiers = src->notifiers;
412} 414}
413QString OTodo::type() const { 415QString OTodo::type() const {
414 return QString::fromLatin1("OTodo"); 416 return QString::fromLatin1("OTodo");
415} 417}
416QString OTodo::recordField(int /*id*/ )const { 418QString OTodo::recordField(int /*id*/ )const {
417 return QString::null; 419 return QString::null;
418} 420}
419 421
420int OTodo::rtti(){ 422int OTodo::rtti(){
421 return OPimResolver::TodoList; 423 return OPimResolver::TodoList;
422} 424}
diff --git a/libopie/pim/test/oevent_test.cpp b/libopie/pim/test/oevent_test.cpp
new file mode 100644
index 0000000..50cc032
--- a/dev/null
+++ b/libopie/pim/test/oevent_test.cpp
@@ -0,0 +1,23 @@
1#include <qdatetime.h>
2
3#include "../oevent.h"
4
5int main(int argc, char* argv ) {
6 OEvent ev;
7 ev.setUid( 20 );
8
9 ev.setDescription( "Foo" );
10
11 OEvent ev2 = ev;
12 ev2.setDescription("Foo2");
13 qWarning("%s", ev2.description().latin1() );
14 qWarning("%s", ev.description().latin1() );
15
16 QDateTime time = QDateTime::currentDateTime();
17 ev2.setStartDateTime( time );
18 ev2.setTimeZone( "Europe/London" );
19
20 qWarning("%s", ev2.startDateTime().toString().latin1() );
21 qWarning("%s", ev2.startDateTimeInZone().toString().latin1() );
22 return 0;
23}
diff --git a/libopie/pim/test/oevent_test.pro b/libopie/pim/test/oevent_test.pro
new file mode 100644
index 0000000..3365def
--- a/dev/null
+++ b/libopie/pim/test/oevent_test.pro
@@ -0,0 +1,11 @@
1 TEMPLATE= app
2 #CONFIG = qt warn_on debug
3 CONFIG = qt warn_on release
4 #HEADERS =
5 SOURCES = oevent_test.cpp
6 INCLUDEPATH+= $(OPIEDIR)/include
7 DEPENDPATH+= $(OPIEDIR)/include
8LIBS += -lqpe -lopie
9 TARGET = oevent_test
10
11include ( $(OPIEDIR)/include.pro ) \ No newline at end of file
diff --git a/libopie/pim/test/test_todo.cpp b/libopie/pim/test/test_todo.cpp
new file mode 100644
index 0000000..7440503
--- a/dev/null
+++ b/libopie/pim/test/test_todo.cpp
@@ -0,0 +1,36 @@
1#include <qdatetime.h>
2#include <qmap.h>
3
4#include <opie/otodo.h>
5#include <opie/otodoaccess.h>
6#include <opie/otodoaccessxml.h>
7
8int main(int argc, char* argv[] ) {
9
10 OTodoAccessXML* xml = new OTodoAccessXML("demo");
11 OTodoAccess ac(xml);
12 int elc;
13 QTime timer;
14 qWarning("start loading");
15 timer.start();
16 ac.load();
17 elc = timer.elapsed();
18 qWarning("Elapsed loading %d %d", elc, elc/1000);
19
20 timer.start();
21 OTodoAccess::List lis = ac.allRecords();
22 elc = timer.elapsed();
23 qWarning("Elapsed allRecords %d %d", elc, elc/1000 );
24 OTodoAccess::List::Iterator it;
25 timer.start();
26ac.save();
27/*
28 for( it = lis.begin(); it != lis.end(); ++it ) {
29 qWarning("Desc: " + (*it).summary() );
30 qWarning("UID %d", (*it).uid() );
31 }
32 */
33elc = timer.elapsed();
34
35 qWarning("elapsed iterating %d %d", elc, elc/1000 );
36};
diff --git a/libopie/pim/test/todo_test.pro b/libopie/pim/test/todo_test.pro
new file mode 100644
index 0000000..3d14dda
--- a/dev/null
+++ b/libopie/pim/test/todo_test.pro
@@ -0,0 +1,11 @@
1 TEMPLATE= app
2 #CONFIG = qt warn_on debug
3 CONFIG = qt warn_on release
4 #HEADERS =
5 SOURCES = test_todo.cpp
6 INCLUDEPATH+= $(OPIEDIR)/include
7 DEPENDPATH+= $(OPIEDIR)/include
8LIBS += -lqpe -lopie -lopiesql
9 TARGET = todo_test
10
11include ( $(OPIEDIR)/ ) \ No newline at end of file
diff --git a/libopie/tododb.cpp b/libopie/tododb.cpp
deleted file mode 100644
index 17163a0..0000000
--- a/libopie/tododb.cpp
+++ b/dev/null
@@ -1,268 +0,0 @@
1
2#include <qdir.h>
3#include <opie/tododb.h>
4#include <opie/xmltree.h>
5#include <opie/todoresource.h>
6#include <qpe/palmtoprecord.h>
7#include <qpe/global.h>
8
9using namespace Opie;
10
11namespace {
12
13class FileToDoResource : public ToDoResource {
14public:
15 FileToDoResource() {};
16 // FIXME better parsing
17 bool save(const QString &name, const QValueList<ToDoEvent> &m_todos ){
18 // prepare the XML
19 XMLElement *tasks = new XMLElement( );
20 tasks->setTagName("Tasks" );
21 for( QValueList<ToDoEvent>::ConstIterator it = m_todos.begin(); it != m_todos.end(); ++it ){
22 XMLElement::AttributeMap map;
23 XMLElement *task = new XMLElement();
24 map.insert( "Completed", QString::number((int)(*it).isCompleted() ) );
25 map.insert( "HasDate", QString::number((int)(*it).hasDate() ) );
26 map.insert( "Priority", QString::number( (*it).priority() ) );
27 map.insert( "Progress", QString::number( (*it).progress() ) );
28 map.insert( "Summary", (*it).summary() );
29 QArray<int> arrat = (*it).categories();
30 QString attr;
31 for(uint i=0; i < arrat.count(); i++ ){
32 attr.append(QString::number(arrat[i])+";" );
33 }
34 if(!attr.isEmpty() ) // remove the last ;
35 attr.remove(attr.length()-1, 1 );
36 map.insert( "Categories", attr );
37 //else
38 //map.insert( "Categories", QString::null );
39 map.insert( "Description", (*it).description() );
40 if( (*it).hasDate() ){
41 map.insert("DateYear", QString::number( (*it).date().year() ) );
42 map.insert("DateMonth", QString::number( (*it).date().month() ) );
43 map.insert("DateDay", QString::number( (*it).date().day() ) );
44 }
45 map.insert("Uid", QString::number( (*it).uid() ) );
46 task->setTagName("Task" );
47 task->setAttributes( map );
48 tasks->appendChild(task);
49 }
50 QFile file( name);
51 if( file.open(IO_WriteOnly ) ){
52 QTextStream stream(&file );
53 stream.setEncoding( QTextStream::UnicodeUTF8 );
54 stream << "<!DOCTYPE Tasks>" << endl;
55 tasks->save(stream );
56 delete tasks;
57 stream << "</Tasks>" << endl;
58 file.close();
59 return true;
60 }
61 return false;
62 }
63 QValueList<ToDoEvent> load( const QString &name ){
64 qWarning("loading tododb" );
65 QValueList<ToDoEvent> m_todos;
66 XMLElement *root = XMLElement::load( name );
67 if(root != 0l ){ // start parsing
68 qWarning("ToDoDB::load tagName(): %s", root->tagName().latin1() );
69 //if( root->tagName() == QString::fromLatin1("Tasks" ) ){// Start
70 XMLElement *element = root->firstChild();
71 if (element == 0 )
72 return m_todos;
73 element = element->firstChild();
74 while( element ){
75 if( element->tagName() != QString::fromLatin1("Task") ){
76 element = element->nextChild();
77 continue;
78 }
79 qWarning("ToDoDB::load element tagName() : %s", element->tagName().latin1() );
80 QString dummy;
81 ToDoEvent event;
82 bool ok;
83 int dumInt;
84 // completed
85 dummy = element->attribute("Completed" );
86 dumInt = dummy.toInt(&ok );
87 if(ok ) event.setCompleted( dumInt == 0 ? false : true );
88 // progress
89 dummy = element->attribute("Progress" );
90 {
91 ushort dumShort = dummy.toUShort(&ok);
92 event.setProgress( dumShort );
93
94 }
95 // hasDate
96 dummy = element->attribute("HasDate" );
97 dumInt = dummy.toInt(&ok );
98 if(ok ) event.setHasDate( dumInt == 0 ? false: true );
99 // set the date
100 bool hasDa = dumInt;
101 if ( hasDa ) { //parse the date
102 int year, day, month = 0;
103 year = day = month;
104 // year
105 dummy = element->attribute("DateYear" );
106 dumInt = dummy.toInt(&ok );
107 if( ok ) year = dumInt;
108 // month
109 dummy = element->attribute("DateMonth" );
110 dumInt = dummy.toInt(&ok );
111 if(ok ) month = dumInt;
112 dummy = element->attribute("DateDay" );
113 dumInt = dummy.toInt(&ok );
114 if(ok ) day = dumInt;
115 // set the date
116 QDate date( year, month, day );
117 event.setDate( date);
118 }
119 dummy = element->attribute("Priority" );
120 dumInt = dummy.toInt(&ok );
121 if(!ok ) dumInt = ToDoEvent::NORMAL;
122 event.setPriority( dumInt );
123 //description
124 dummy = element->attribute("Description" );
125 event.setDescription( dummy );
126 dummy = element->attribute("Summary" );
127 event.setSummary( dummy );
128 // category
129 dummy = element->attribute("Categories" );
130 QStringList ids = QStringList::split(";", dummy );
131 event.setCategories( ids );
132
133 //uid
134 dummy = element->attribute("Uid" );
135 dumInt = dummy.toInt(&ok );
136 if(ok ) event.setUid( dumInt );
137 m_todos.append( event );
138 element = element->nextChild(); // next element
139 }
140 //}
141 }else {
142 qWarning("could not load" );
143 }
144 delete root;
145 qWarning("returning" );
146 return m_todos;
147 }
148};
149
150}
151
152ToDoDB::ToDoDB(const QString &fileName, ToDoResource *res ){
153 m_fileName = fileName;
154 if( fileName.isEmpty() && res == 0 ){
155 m_fileName = Global::applicationFileName("todolist","todolist.xml");
156 res = new FileToDoResource();
157 //qWarning("%s", m_fileName.latin1() );
158 }else if(res == 0 ){ // let's create a ToDoResource for xml
159 res = new FileToDoResource();
160 }
161 m_res = res;
162 load();
163}
164ToDoResource* ToDoDB::resource(){
165 return m_res;
166};
167void ToDoDB::setResource( ToDoResource *res )
168{
169 delete m_res;
170 m_res = res;
171}
172ToDoDB::~ToDoDB()
173{
174 delete m_res;
175}
176QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to,
177 bool all )
178{
179 QValueList<ToDoEvent> events;
180 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
181 if( (*it).hasDate() ){
182 if( (*it).date() >= from && (*it).date() <= to )
183 events.append( (*it) );
184 }else if( all ){
185 events.append( (*it) );
186 }
187 }
188 return events;
189}
190QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from,
191 bool all)
192{
193 return effectiveToDos( from, QDate::currentDate(), all );
194}
195QValueList<ToDoEvent> ToDoDB::overDue()
196{
197 QValueList<ToDoEvent> events;
198 for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
199 if( (*it).isOverdue() )
200 events.append((*it) );
201 }
202 return events;
203}
204QValueList<ToDoEvent> ToDoDB::rawToDos()
205{
206 return m_todos;
207}
208void ToDoDB::addEvent( const ToDoEvent &event )
209{
210 m_todos.append( event );
211}
212void ToDoDB::editEvent( const ToDoEvent &event )
213{
214 m_todos.remove( event );
215 m_todos.append( event );
216}
217void ToDoDB::removeEvent( const ToDoEvent &event )
218{
219 m_todos.remove( event );
220}
221void ToDoDB::replaceEvent(const ToDoEvent &event )
222{
223 QValueList<ToDoEvent>::Iterator it;
224 int uid = event.uid();
225 // == is not overloaded as we would like :( so let's search for the uid
226 for(it = m_todos.begin(); it != m_todos.end(); ++it ){
227 if( (*it).uid() == uid ){
228 m_todos.remove( (*it) );
229 break; // should save us the iterate is now borked
230 }
231 }
232 m_todos.append(event);
233}
234void ToDoDB::reload()
235{
236 load();
237}
238void ToDoDB::mergeWith(const QValueList<ToDoEvent>& events )
239{
240 QValueList<ToDoEvent>::ConstIterator it;
241 for( it = events.begin(); it != events.end(); ++it ){
242 replaceEvent( (*it) );
243 }
244}
245void ToDoDB::setFileName(const QString &file )
246{
247 m_fileName =file;
248}
249QString ToDoDB::fileName()const
250{
251 return m_fileName;
252}
253void ToDoDB::load()
254{
255 m_todos = m_res->load( m_fileName );
256}
257bool ToDoDB::save()
258{
259 return m_res->save( m_fileName, m_todos );
260}
261
262
263
264
265
266
267
268
diff --git a/libopie/tododb.h b/libopie/tododb.h
deleted file mode 100644
index 7fd9f96..0000000
--- a/libopie/tododb.h
+++ b/dev/null
@@ -1,46 +0,0 @@
1
2#ifndef tododb_h
3#define tododb_h
4
5#include <qvaluelist.h>
6
7#include <opie/todoevent.h>
8
9class ToDoResource;
10class ToDoDB
11{
12 public:
13 // if no argument is supplied pick the default book
14 ToDoDB(const QString &fileName = QString::null, ToDoResource* resource= 0 );
15 ~ToDoDB();
16 QValueList<ToDoEvent> effectiveToDos(const QDate &from,
17 const QDate &to,
18 bool includeNoDates = true);
19 QValueList<ToDoEvent> effectiveToDos(const QDate &start, bool includeNoDates = true );
20 QValueList<ToDoEvent> rawToDos(); // all events
21 QValueList<ToDoEvent> overDue();
22
23 void addEvent(const ToDoEvent &event );
24 void editEvent(const ToDoEvent &editEvent );
25 void removeEvent(const ToDoEvent &event);
26 void replaceEvent(const ToDoEvent &event );
27 // QValueList<ToDoEvents will overwrite existing ones no smart code at all ;)
28 void mergeWith(const QValueList<ToDoEvent>& );
29 void reload();
30 void setFileName(const QString & );
31 QString fileName()const;
32 bool save();
33 ToDoResource *resource();
34 void setResource(ToDoResource* res);
35
36 private:
37 class ToDoDBPrivate;
38 ToDoDBPrivate *d;
39 QString m_fileName;
40 ToDoResource *m_res;
41 QValueList<ToDoEvent> m_todos;
42 void load();
43};
44
45
46#endif
diff --git a/libopie/todoevent.cpp b/libopie/todoevent.cpp
deleted file mode 100644
index f744550..0000000
--- a/libopie/todoevent.cpp
+++ b/dev/null
@@ -1,339 +0,0 @@
1
2#include <opie/todoevent.h>
3
4
5#include <qpe/palmtopuidgen.h>
6#include <qpe/stringutil.h>
7#include <qpe/palmtoprecord.h>
8
9#include <qpe/stringutil.h>
10#include <qpe/categories.h>
11#include <qpe/categoryselect.h>
12
13#include <qobject.h>
14
15ToDoEvent::ToDoEvent(const ToDoEvent &event )
16{
17 *this = event;
18}
19
20ToDoEvent::ToDoEvent(bool completed, int priority,
21 const QStringList &category,
22 const QString& summary,
23 const QString &description,
24 ushort progress,
25 bool hasDate, QDate date, int uid )
26{
27 m_date = date;
28 m_isCompleted = completed;
29 m_hasDate = hasDate;
30 m_priority = priority;
31 m_category = category;
32 m_sum = summary;
33 m_prog = progress;
34 m_desc = Qtopia::simplifyMultiLineSpace(description );
35 if (uid == -1 ) {
36 Qtopia::UidGen *uidgen = new Qtopia::UidGen();
37 uid = uidgen->generate();
38 delete uidgen;
39 }// generate the ids
40 m_uid = uid;
41}
42QArray<int> ToDoEvent::categories()const
43{
44 QArray<int> array(m_category.count() ); // currently the datebook can be only in one category
45 array = Qtopia::Record::idsFromString( m_category.join(";") );
46 return array;
47}
48bool ToDoEvent::match( const QRegExp &regExp )const
49{
50 if( QString::number( m_priority ).find( regExp ) != -1 ){
51 return true;
52 }else if( m_hasDate && m_date.toString().find( regExp) != -1 ){
53 return true;
54 }else if(m_desc.find( regExp ) != -1 ){
55 return true;
56 }
57 return false;
58}
59bool ToDoEvent::isCompleted() const
60{
61 return m_isCompleted;
62}
63bool ToDoEvent::hasDate() const
64{
65 return m_hasDate;
66}
67int ToDoEvent::priority()const
68{
69 return m_priority;
70}
71QStringList ToDoEvent::allCategories()const
72{
73 return m_category;
74}
75QString ToDoEvent::extra(const QString& )const
76{
77 return QString::null;
78}
79QString ToDoEvent::summary() const
80{
81 return m_sum;
82}
83ushort ToDoEvent::progress() const
84{
85 return m_prog;
86}
87QStringList ToDoEvent::relatedApps() const
88{
89 QStringList list;
90 QMap<QString, QArray<int> >::ConstIterator it;
91 for ( it = m_relations.begin(); it != m_relations.end(); ++it ) {
92 list << it.key();
93 }
94 return list;
95}
96QArray<int> ToDoEvent::relations( const QString& app)const
97{
98 QArray<int> tmp;
99 QMap<QString, QArray<int> >::ConstIterator it;
100 it = m_relations.find( app);
101 if ( it != m_relations.end() )
102 tmp = it.data();
103 return tmp;
104}
105void ToDoEvent::insertCategory(const QString &str )
106{
107 m_category.append( str );
108}
109void ToDoEvent::clearCategories()
110{
111 m_category.clear();
112}
113void ToDoEvent::setCategories(const QStringList &list )
114{
115 m_category = list;
116}
117QDate ToDoEvent::date()const
118{
119 return m_date;
120}
121
122QString ToDoEvent::description()const
123{
124 return m_desc;
125}
126void ToDoEvent::setCompleted( bool completed )
127{
128 m_isCompleted = completed;
129}
130void ToDoEvent::setHasDate( bool hasDate )
131{
132 m_hasDate = hasDate;
133}
134void ToDoEvent::setDescription(const QString &desc )
135{
136 m_desc = Qtopia::simplifyMultiLineSpace(desc );
137}
138void ToDoEvent::setExtra( const QString&, const QString& )
139{
140
141}
142void ToDoEvent::setSummary( const QString& sum )
143{
144 m_sum = sum;
145}
146void ToDoEvent::setCategory( const QString &cat )
147{
148 qWarning("setCategory %s", cat.latin1() );
149 m_category.clear();
150 m_category << cat;
151}
152void ToDoEvent::setPriority(int prio )
153{
154 m_priority = prio;
155}
156void ToDoEvent::setDate( QDate date )
157{
158 m_date = date;
159}
160void ToDoEvent::addRelated( const QString &app, int id )
161{
162 QMap<QString, QArray<int> >::Iterator it;
163 QArray<int> tmp;
164 it = m_relations.find( app );
165 if ( it == m_relations.end() ) {
166 tmp.resize(1 );
167 tmp[0] = id;
168 }else{
169 tmp = it.data();
170 tmp.resize( tmp.size() + 1 );
171 tmp[tmp.size() - 1] = id;
172 }
173 m_relations.replace( app, tmp );
174}
175void ToDoEvent::addRelated(const QString& app, QArray<int> ids )
176{
177 QMap<QString, QArray<int> >::Iterator it;
178 QArray<int> tmp;
179 it = m_relations.find( app);
180 if ( it == m_relations.end() ) { // not there
181 /** tmp.resize( ids.size() ); stupid??
182 */
183 tmp = ids;
184 }else{
185 tmp = it.data();
186 int offset = tmp.size()-1;
187 tmp.resize( tmp.size() + ids.size() );
188 for (uint i = 0; i < ids.size(); i++ ) {
189 tmp[offset+i] = ids[i];
190 }
191
192 }
193 m_relations.replace( app, tmp );
194}
195void ToDoEvent::clearRelated( const QString& app )
196{
197 m_relations.remove( app );
198}
199bool ToDoEvent::isOverdue( )
200{
201 if( m_hasDate )
202 return QDate::currentDate() > m_date;
203 return false;
204}
205void ToDoEvent::setProgress(ushort progress )
206{
207 m_prog = progress;
208}
209/*!
210 Returns a richt text string
211*/
212QString ToDoEvent::richText() const
213{
214 QString text;
215 QStringList catlist;
216
217 // Description of the todo
218 if ( !description().isEmpty() ){
219 text += "<b>" + QObject::tr( "Summary:") + "</b><br>";
220 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
221 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
222 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br><br><br>";
223 }
224 text += "<b>" + QObject::tr( "Priority:") +" </b>"
225 + QString::number( priority() ) + " <br>";
226 text += "<b>" + QObject::tr( "Progress:") + " </b>"
227 + QString::number( progress() ) + " %<br>";
228 if (hasDate() ){
229 text += "<b>" + QObject::tr( "Deadline:") + " </b>";
230 text += date().toString();
231 text += "<br>";
232 }
233
234 // Open database of all categories and get the list of
235 // the categories this todoevent belongs to.
236 // Then print them...
237 // I am not sure whether there is no better way doing this !?
238 Categories catdb;
239 bool firstloop = true;
240 catdb.load( categoryFileName() );
241 catlist = allCategories();
242
243 text += "<b>" + QObject::tr( "Category:") + "</b> ";
244 for ( QStringList::Iterator it = catlist.begin(); it != catlist.end(); ++it ) {
245 if (!firstloop){
246 text += ", ";
247 }
248 firstloop = false;
249 text += catdb.label ("todo", (*it).toInt());
250 }
251 text += "<br>";
252 return text;
253}
254
255bool ToDoEvent::operator<( const ToDoEvent &toDoEvent )const{
256 if( !hasDate() && !toDoEvent.hasDate() ) return true;
257 if( !hasDate() && toDoEvent.hasDate() ) return false;
258 if( hasDate() && toDoEvent.hasDate() ){
259 if( date() == toDoEvent.date() ){ // let's the priority decide
260 return priority() < toDoEvent.priority();
261 }else{
262 return date() < toDoEvent.date();
263 }
264 }
265 return false;
266}
267bool ToDoEvent::operator<=(const ToDoEvent &toDoEvent )const
268{
269 if( !hasDate() && !toDoEvent.hasDate() ) return true;
270 if( !hasDate() && toDoEvent.hasDate() ) return true;
271 if( hasDate() && toDoEvent.hasDate() ){
272 if( date() == toDoEvent.date() ){ // let's the priority decide
273 return priority() <= toDoEvent.priority();
274 }else{
275 return date() <= toDoEvent.date();
276 }
277 }
278 return true;
279}
280bool ToDoEvent::operator>(const ToDoEvent &toDoEvent )const
281{
282 if( !hasDate() && !toDoEvent.hasDate() ) return false;
283 if( !hasDate() && toDoEvent.hasDate() ) return false;
284 if( hasDate() && toDoEvent.hasDate() ){
285 if( date() == toDoEvent.date() ){ // let's the priority decide
286 return priority() > toDoEvent.priority();
287 }else{
288 return date() > toDoEvent.date();
289 }
290 }
291 return false;
292}
293bool ToDoEvent::operator>=(const ToDoEvent &toDoEvent )const
294{
295 if( !hasDate() && !toDoEvent.hasDate() ) return true;
296 if( !hasDate() && toDoEvent.hasDate() ) return false;
297 if( hasDate() && toDoEvent.hasDate() ){
298 if( date() == toDoEvent.date() ){ // let's the priority decide
299 return priority() > toDoEvent.priority();
300 }else{
301 return date() > toDoEvent.date();
302 }
303 }
304 return true;
305}
306bool ToDoEvent::operator==(const ToDoEvent &toDoEvent )const
307{
308 if( m_priority == toDoEvent.m_priority &&
309 m_priority == toDoEvent.m_prog &&
310 m_isCompleted == toDoEvent.m_isCompleted &&
311 m_hasDate == toDoEvent.m_hasDate &&
312 m_date == toDoEvent.m_date &&
313 m_category == toDoEvent.m_category &&
314 m_sum == toDoEvent.m_sum &&
315 m_desc == toDoEvent.m_desc )
316 return true;
317 return false;
318}
319ToDoEvent &ToDoEvent::operator=(const ToDoEvent &item )
320{
321 m_date = item.m_date;
322 m_isCompleted = item.m_isCompleted;
323 m_hasDate = item.m_hasDate;
324 m_priority = item.m_priority;
325 m_category = item.m_category;
326 m_desc = item.m_desc;
327 m_uid = item.m_uid;
328 m_sum = item.m_sum;
329 m_prog = item.m_prog;
330 return *this;
331}
332
333
334
335
336
337
338
339
diff --git a/libopie/todoevent.h b/libopie/todoevent.h
deleted file mode 100644
index b55a39b..0000000
--- a/libopie/todoevent.h
+++ b/dev/null
@@ -1,191 +0,0 @@
1
2#ifndef todoevent_h
3#define todoevent_h
4
5
6#include <qarray.h>
7#include <qmap.h>
8#include <qregexp.h>
9#include <qstringlist.h>
10#include <qdatetime.h>
11
12
13class ToDoEvent {
14 friend class ToDoDB;
15 public:
16 // priorities from Very low to very high
17 enum Priority { VERYHIGH=1, HIGH, NORMAL, LOW, VERYLOW };
18 /* Constructs a new ToDoEvent
19 @param completed Is the TodoEvent completed
20 @param priority What is the priority of this ToDoEvent
21 @param category Which category does it belong( uid )
22 @param summary A small summary of the todo
23 @param description What is this ToDoEvent about
24 @param hasDate Does this Event got a deadline
25 @param date what is the deadline?
26 @param uid what is the UUID of this Event
27 **/
28 ToDoEvent( bool completed = false, int priority = NORMAL,
29 const QStringList &category = QStringList(),
30 const QString &summary = QString::null ,
31 const QString &description = QString::null,
32 ushort progress = 0,
33 bool hasDate = false, QDate date = QDate::currentDate(), int uid = -1 );
34 /* Copy c'tor
35
36 **/
37 ToDoEvent(const ToDoEvent & );
38
39 /*
40 Is this event completed?
41 **/
42 bool isCompleted() const;
43
44 /*
45 Does this Event have a deadline
46 **/
47 bool hasDate() const;
48
49 /*
50 What is the priority?
51 **/
52 int priority()const ;
53
54 /**
55 * progress as ushort 0, 20, 40, 60, 80 or 100%
56 */
57 ushort progress() const;
58 /*
59 All category numbers as QString in a List
60 **/
61 QStringList allCategories()const;
62
63 /*
64 * Same as above but with QArray<int>
65 */
66 QArray<int> categories() const;
67
68 /**
69 * The end Date
70 */
71 QDate date()const;
72
73 /**
74 * The description of the todo
75 */
76 QString description()const;
77
78 /**
79 * A small summary of the todo
80 */
81 QString summary() const;
82
83 /**
84 * Return this todoevent in a RichText formatted QString
85 */
86 QString richText() const;
87
88 /**
89 * Returns the UID of the Todo
90 */
91 int uid()const { return m_uid;};
92
93
94 QString extra(const QString& )const;
95
96 /**
97 * returns a list of apps which have related items
98 */
99 QStringList relatedApps()const;
100
101 /**
102 * returns all relations for one app
103 */
104 QArray<int> relations( const QString& app )const;
105 /**
106 * Set if this Todo is completed
107 */
108 void setCompleted(bool completed );
109
110 /**
111 * set if this todo got an end data
112 */
113 void setHasDate( bool hasDate );
114 // if the category doesn't exist we will create it
115 // this sets the the Category after this call category will be the only category
116 void setCategory( const QString &category );
117 // adds a category to the Categories of this event
118 void insertCategory(const QString &category );
119
120 /**
121 * Removes this event from all categories
122 */
123 void clearCategories();
124
125 /**
126 * This todo belongs to xxx categories
127 */
128 void setCategories(const QStringList& );
129
130 /**
131 * Set the priority of the Todo
132 */
133 void setPriority(int priority );
134
135 /**
136 * Set the progress.
137 */
138 void setProgress( ushort progress );
139
140 /**
141 * add related function it replaces too ;)
142 */
143 void addRelated( const QString& app, int id );
144
145 /**
146 * add related
147 */
148 void addRelated( const QString& app, QArray<int> ids );
149
150 /**
151 * clear relations for one app
152 */
153 void clearRelated(const QString& app);
154
155 /**
156 * set the end date
157 */
158 void setDate( QDate date );
159 void setDescription(const QString& );
160 void setSummary(const QString& );
161 void setExtra( const QString&, const QString& );
162 bool isOverdue();
163
164 bool match( const QRegExp &r )const;
165
166 void setUid(int id) {m_uid = id; };
167 bool operator<(const ToDoEvent &toDoEvent )const;
168 bool operator<=(const ToDoEvent &toDoEvent )const;
169 bool operator!=(const ToDoEvent &toDoEvent )const { return !(*this == toDoEvent); };
170 bool operator>(const ToDoEvent &toDoEvent )const;
171 bool operator>=(const ToDoEvent &toDoEvent)const;
172 bool operator==(const ToDoEvent &toDoEvent )const;
173 ToDoEvent &operator=(const ToDoEvent &toDoEvent );
174 private:
175 class ToDoEventPrivate;
176 ToDoEventPrivate *d;
177 QDate m_date;
178 bool m_isCompleted:1;
179 bool m_hasDate:1;
180 int m_priority;
181 QStringList m_category;
182 QString m_desc;
183 QString m_sum;
184 QMap<QString, QString> m_extra;
185 QMap<QString, QArray<int> > m_relations;
186 int m_uid;
187 ushort m_prog;
188};
189
190
191#endif
diff --git a/libopie/todoresource.h b/libopie/todoresource.h
deleted file mode 100644
index 34edb04..0000000
--- a/libopie/todoresource.h
+++ b/dev/null
@@ -1,14 +0,0 @@
1
2
3#ifndef opietodoresource_h
4#define opietodoresource_h
5
6class ToDoEvent;
7class ToDoResource {
8 public:
9 ToDoResource( ) {};
10 virtual QValueList<ToDoEvent> load(const QString &file ) = 0;
11 virtual bool save( const QString &file, const QValueList<ToDoEvent> & ) = 0;
12};
13
14#endif
diff --git a/libopie/todovcalresource.cpp b/libopie/todovcalresource.cpp
deleted file mode 100644
index 1df5aff..0000000
--- a/libopie/todovcalresource.cpp
+++ b/dev/null
@@ -1,158 +0,0 @@
1/*
2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Holger Freyther <freyther@kde.org>
4           .>+-= the use of vobject was inspired by libkcal
5 _;:,     .>    :=|. This library is free software; you can
6.> <`_,   >  .   <= redistribute it and/or modify it under
7:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; either version 2 of the License,
10     ._= =}       : or (at your option) any later version.
11    .%`+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more
18++=   -.     .`     .: details.
19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with
22    --        :-=` this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA.
26
27*/
28
29#include <qfile.h>
30#include <qvaluelist.h>
31#include <opie/todoevent.h>
32#include <opie/todovcalresource.h>
33
34#include "../library/backend/vobject_p.h"
35#include "../library/timeconversion.h"
36#include "../library/backend/qfiledirect_p.h"
37
38static VObject *vobjByEvent( const ToDoEvent &event )
39{
40 VObject *task = newVObject( VCTodoProp );
41 if( task == 0 )
42 return 0l;
43 if( event.hasDate() )
44 addPropValue( task, VCDueProp, TimeConversion::toISO8601( event.date() ) );
45
46 if( event.isCompleted() )
47 addPropValue( task, VCStatusProp, "COMPLETED");
48
49 QString string = QString::number(event.priority() );
50 addPropValue( task, VCPriorityProp, string.local8Bit() );
51 addPropValue( task, VCCategoriesProp, event.allCategories().join(";").local8Bit() );
52 addPropValue( task, VCDescriptionProp, event.description().local8Bit() );
53 addPropValue( task, VCSummaryProp, event.summary().left(15).local8Bit() );
54 return task;
55};
56
57static ToDoEvent eventByVObj( VObject *obj ){
58 ToDoEvent event;
59 VObject *ob;
60 QCString name;
61 // no uid, attendees, ... and no fun
62 // description
63 if( ( ob = isAPropertyOf( obj, VCDescriptionProp )) != 0 ){
64 name = vObjectStringZValue( ob );
65 event.setDescription( name );
66 }
67 // summary
68 if ( ( ob = isAPropertyOf( obj, VCSummaryProp ) ) != 0 ) {
69 name = vObjectStringZValue( ob );
70 event.setSummary( name );
71 }
72 // completed
73 if( ( ob = isAPropertyOf( obj, VCStatusProp )) != 0 ){
74 name = vObjectStringZValue( ob );
75 if( name == "COMPLETED" ){
76 event.setCompleted( true );
77 }else{
78 event.setCompleted( false );
79 }
80 }else
81 event.setCompleted( false );
82 // priority
83 if ((ob = isAPropertyOf(obj, VCPriorityProp))) {
84 name = vObjectStringZValue( ob );
85 bool ok;
86 event.setPriority(name.toInt(&ok) );
87 }
88 //due date
89 if((ob = isAPropertyOf(obj, VCDueProp)) ){
90 event.setHasDate( true );
91 name = vObjectStringZValue( ob );
92 event.setDate( TimeConversion::fromISO8601( name).date() );
93 }
94 // categories
95 if((ob = isAPropertyOf( obj, VCCategoriesProp )) != 0 ){
96 name = vObjectStringZValue( ob );
97 qWarning("Categories:%s", name.data() );
98 }
99
100 return event;
101};
102
103
104QValueList<ToDoEvent> ToDoVCalResource::load(const QString &file)
105{
106 QValueList<ToDoEvent> events;
107 VObject *vcal = 0l;
108 vcal = Parse_MIME_FromFileName( (char *)file.utf8().data() ); // from vobject
109 if(!vcal )
110 return events;
111 // start parsing
112
113 VObjectIterator it;
114 VObject *vobj;
115 initPropIterator(&it, vcal);
116
117 while( moreIteration( &it ) ) {
118 vobj = ::nextVObject( &it );
119 QCString name = ::vObjectName( vobj );
120 //QCString objVal = ::vObjectStringZValue( vobj );
121 // let's find out the type
122 if( name == VCTodoProp ){
123 events.append( eventByVObj( vobj ) );
124
125 } // parse the value
126 }
127 return events;
128}
129bool ToDoVCalResource::save(const QString &fileName, const QValueList<ToDoEvent>&list )
130{
131 QFileDirect file ( fileName );
132 if(!file.open(IO_WriteOnly ) )
133 return false;
134 // obj
135 VObject *obj;
136 obj = newVObject( VCCalProp );
137 addPropValue( obj, VCVersionProp, "1.0" );
138 VObject *vo;
139 for(QValueList<ToDoEvent>::ConstIterator it = list.begin(); it != list.end(); ++it ){
140 vo = vobjByEvent( (*it) );
141 addVObjectProp(obj, vo );
142 }
143 writeVObject( file.directHandle(), obj );
144 cleanVObject( obj );
145 cleanStrTbl();
146
147 return true;
148}
149
150
151
152
153
154
155
156
157
158
diff --git a/libopie/todovcalresource.h b/libopie/todovcalresource.h
deleted file mode 100644
index 0663bc2..0000000
--- a/libopie/todovcalresource.h
+++ b/dev/null
@@ -1,42 +0,0 @@
1/*
2               =. This file is part of the OPIE Project
3             .=l. Copyright (c) 2002 Holger Freyther <freyther@kde.org>
4           .>+-=
5 _;:,     .>    :=|. This library is free software; you can
6.> <`_,   >  .   <= redistribute it and/or modify it under
7:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
8.="- .-=="i,     .._ License as published by the Free Software
9 - .   .-<_>     .<> Foundation; either version 2 of the License,
10     ._= =}       : or (at your option) any later version.
11    .%`+i>       _;_.
12    .i_,=:_.      -<s. This library is distributed in the hope that
13     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
14    : ..    .:,     . . . without even the implied warranty of
15    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
16  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
17..}^=.=       =       ; Library General Public License for more
18++=   -.     .`     .: details.
19 :     =  ...= . :.=-
20 -.   .:....=;==+<; You should have received a copy of the GNU
21  -_. . .   )=.  = Library General Public License along with
22    --        :-=` this library; see the file COPYING.LIB.
23 If not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330,
25 Boston, MA 02111-1307, USA.
26
27*/
28
29#ifndef opievcaltodoresource_h
30#define opievcaltodoresource_h
31
32#include <opie/todoresource.h>
33
34class ToDoVCalResource : public ToDoResource {
35 public:
36 ToDoVCalResource() { };
37 QValueList<ToDoEvent> load(const QString &file );
38 bool save( const QString &filename, const QValueList<ToDoEvent> & );
39
40};
41
42#endif
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
index 622d40a..e537269 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
@@ -1,333 +1,342 @@
1/* 1/*
2 * VCard Backend for the OPIE-Contact Database. 2 * VCard Backend for the OPIE-Contact Database.
3 * 3 *
4 * Copyright (C) 2000 Trolltech AS. All rights reserved. 4 * Copyright (C) 2000 Trolltech AS. All rights reserved.
5 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 5 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
6 * 6 *
7 * ===================================================================== 7 * =====================================================================
8 *This program is free software; you can redistribute it and/or 8 *This program is free software; you can redistribute it and/or
9 *modify it under the terms of the GNU Library General Public 9 *modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version. 11 * version 2 of the License, or (at your option) any later version.
12 * ===================================================================== 12 * =====================================================================
13 * ToDo: 13 * ToDo:
14 * 14 *
15 * ===================================================================== 15 * =====================================================================
16 * Version: $Id$ 16 * Version: $Id$
17 * ===================================================================== 17 * =====================================================================
18 * History: 18 * History:
19 * $Log$ 19 * $Log$
20 * Revision 1.8 2003/02/21 16:52:49 zecke
21 * -Remove old Todo classes they're deprecated and today I already using the
22 * new API
23 * -Guard against self assignment in OTodo
24 * -Add test apps for OPIM
25 * -Opiefied Event classes
26 * -Added TimeZone handling and pinning of TimeZones to OEvent
27 * -Adjust ORecur and the widget to better timezone behaviour
28 *
20 * Revision 1.7 2003/02/16 22:25:46 zecke 29 * Revision 1.7 2003/02/16 22:25:46 zecke
21 * 0000276 Fix for that bug.. or better temp workaround 30 * 0000276 Fix for that bug.. or better temp workaround
22 * A Preferred Number is HOME|VOICE 31 * A Preferred Number is HOME|VOICE
23 * A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test 32 * A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test
24 * triggers both 33 * triggers both
25 * and the cell phone number overrides the other entries.. 34 * and the cell phone number overrides the other entries..
26 * 35 *
27 * as a temp I check that it's not equal to HOME|VOICE|CELL before setting the 36 * as a temp I check that it's not equal to HOME|VOICE|CELL before setting the
28 * number 37 * number
29 * 38 *
30 * The right and final fix would be to reorder the if statement to make it 39 * The right and final fix would be to reorder the if statement to make it
31 * if else based and the less common thing put to the bottom 40 * if else based and the less common thing put to the bottom
32 * 41 *
33 * OTodoAccessVcal fix the date for beaming 42 * OTodoAccessVcal fix the date for beaming
34 * 43 *
35 * Revision 1.6 2003/01/13 15:49:31 eilers 44 * Revision 1.6 2003/01/13 15:49:31 eilers
36 * Fixing crash when businesscard.vcf is missing.. 45 * Fixing crash when businesscard.vcf is missing..
37 * 46 *
38 * Revision 1.5 2002/12/07 13:26:22 eilers 47 * Revision 1.5 2002/12/07 13:26:22 eilers
39 * Fixing bug in storing anniversary.. 48 * Fixing bug in storing anniversary..
40 * 49 *
41 * Revision 1.4 2002/11/13 14:14:51 eilers 50 * Revision 1.4 2002/11/13 14:14:51 eilers
42 * Added sorted for Contacts.. 51 * Added sorted for Contacts..
43 * 52 *
44 * Revision 1.3 2002/11/11 16:41:09 kergoth 53 * Revision 1.3 2002/11/11 16:41:09 kergoth
45 * no default arguments in implementation 54 * no default arguments in implementation
46 * 55 *
47 * Revision 1.2 2002/11/10 15:41:53 eilers 56 * Revision 1.2 2002/11/10 15:41:53 eilers
48 * Bugfixes.. 57 * Bugfixes..
49 * 58 *
50 * Revision 1.1 2002/11/09 14:34:52 eilers 59 * Revision 1.1 2002/11/09 14:34:52 eilers
51 * Added VCard Backend. 60 * Added VCard Backend.
52 * 61 *
53 */ 62 */
54#include "ocontactaccessbackend_vcard.h" 63#include "ocontactaccessbackend_vcard.h"
55#include "../../library/backend/vobject_p.h" 64#include "../../library/backend/vobject_p.h"
56#include "../../library/backend/qfiledirect_p.h" 65#include "../../library/backend/qfiledirect_p.h"
57 66
58#include <qpe/timeconversion.h> 67#include <qpe/timeconversion.h>
59 68
60#include <qfile.h> 69#include <qfile.h>
61 70
62OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ): 71OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ):
63 m_dirty( false ), 72 m_dirty( false ),
64 m_file( filename ) 73 m_file( filename )
65{ 74{
66 load(); 75 load();
67} 76}
68 77
69 78
70bool OContactAccessBackend_VCard::load () 79bool OContactAccessBackend_VCard::load ()
71{ 80{
72 m_map.clear(); 81 m_map.clear();
73 m_dirty = false; 82 m_dirty = false;
74 83
75 VObject* obj = 0l; 84 VObject* obj = 0l;
76 85
77 if ( QFile( m_file ).exists() ){ 86 if ( QFile::exists(m_file) ){
78 obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); 87 obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() );
79 if ( !obj ) 88 if ( !obj )
80 return false; 89 return false;
81 }else{ 90 }else{
82 qWarning("File \"%s\" not found !", m_file.latin1() ); 91 qWarning("File \"%s\" not found !", m_file.latin1() );
83 return false; 92 return false;
84 } 93 }
85 94
86 while ( obj ) { 95 while ( obj ) {
87 OContact con = parseVObject( obj ); 96 OContact con = parseVObject( obj );
88 /* 97 /*
89 * if uid is 0 assign a new one 98 * if uid is 0 assign a new one
90 * this at least happens on 99 * this at least happens on
91 * Nokia6210 100 * Nokia6210
92 */ 101 */
93 if ( con.uid() == 0 ){ 102 if ( con.uid() == 0 ){
94 con.setUid( 1 ); 103 con.setUid( 1 );
95 qWarning("assigned new uid %d",con.uid() ); 104 qWarning("assigned new uid %d",con.uid() );
96 } 105 }
97 106
98 m_map.insert( con.uid(), con ); 107 m_map.insert( con.uid(), con );
99 108
100 VObject *t = obj; 109 VObject *t = obj;
101 obj = nextVObjectInList(obj); 110 obj = nextVObjectInList(obj);
102 cleanVObject( t ); 111 cleanVObject( t );
103 } 112 }
104 113
105 return true; 114 return true;
106 115
107} 116}
108bool OContactAccessBackend_VCard::reload() 117bool OContactAccessBackend_VCard::reload()
109{ 118{
110 return load(); 119 return load();
111} 120}
112bool OContactAccessBackend_VCard::save() 121bool OContactAccessBackend_VCard::save()
113{ 122{
114 if (!m_dirty ) 123 if (!m_dirty )
115 return true; 124 return true;
116 125
117 QFileDirect file( m_file ); 126 QFileDirect file( m_file );
118 if (!file.open(IO_WriteOnly ) ) 127 if (!file.open(IO_WriteOnly ) )
119 return false; 128 return false;
120 129
121 VObject *obj; 130 VObject *obj;
122 obj = newVObject( VCCalProp ); 131 obj = newVObject( VCCalProp );
123 addPropValue( obj, VCVersionProp, "1.0" ); 132 addPropValue( obj, VCVersionProp, "1.0" );
124 133
125 VObject *vo; 134 VObject *vo;
126 for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ 135 for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){
127 vo = createVObject( *it ); 136 vo = createVObject( *it );
128 writeVObject( file.directHandle() , vo ); 137 writeVObject( file.directHandle() , vo );
129 cleanVObject( vo ); 138 cleanVObject( vo );
130 } 139 }
131 cleanStrTbl(); 140 cleanStrTbl();
132 141
133 m_dirty = false; 142 m_dirty = false;
134 return true; 143 return true;
135 144
136 145
137} 146}
138void OContactAccessBackend_VCard::clear () 147void OContactAccessBackend_VCard::clear ()
139{ 148{
140 m_map.clear(); 149 m_map.clear();
141 m_dirty = true; // ??? sure ? (se) 150 m_dirty = true; // ??? sure ? (se)
142} 151}
143 152
144bool OContactAccessBackend_VCard::add ( const OContact& newcontact ) 153bool OContactAccessBackend_VCard::add ( const OContact& newcontact )
145{ 154{
146 m_map.insert( newcontact.uid(), newcontact ); 155 m_map.insert( newcontact.uid(), newcontact );
147 m_dirty = true; 156 m_dirty = true;
148 return true; 157 return true;
149} 158}
150 159
151bool OContactAccessBackend_VCard::remove ( int uid ) 160bool OContactAccessBackend_VCard::remove ( int uid )
152{ 161{
153 m_map.remove( uid ); 162 m_map.remove( uid );
154 m_dirty = true; 163 m_dirty = true;
155 return true; 164 return true;
156} 165}
157 166
158bool OContactAccessBackend_VCard::replace ( const OContact &contact ) 167bool OContactAccessBackend_VCard::replace ( const OContact &contact )
159{ 168{
160 m_map.replace( contact.uid(), contact ); 169 m_map.replace( contact.uid(), contact );
161 m_dirty = true; 170 m_dirty = true;
162 return true; 171 return true;
163} 172}
164 173
165OContact OContactAccessBackend_VCard::find ( int uid ) const 174OContact OContactAccessBackend_VCard::find ( int uid ) const
166{ 175{
167 return m_map[uid]; 176 return m_map[uid];
168} 177}
169 178
170QArray<int> OContactAccessBackend_VCard::allRecords() const 179QArray<int> OContactAccessBackend_VCard::allRecords() const
171{ 180{
172 QArray<int> ar( m_map.count() ); 181 QArray<int> ar( m_map.count() );
173 QMap<int, OContact>::ConstIterator it; 182 QMap<int, OContact>::ConstIterator it;
174 int i = 0; 183 int i = 0;
175 for ( it = m_map.begin(); it != m_map.end(); ++it ) { 184 for ( it = m_map.begin(); it != m_map.end(); ++it ) {
176 ar[i] = it.key(); 185 ar[i] = it.key();
177 i++; 186 i++;
178 } 187 }
179 return ar; 188 return ar;
180} 189}
181 190
182// Not implemented 191// Not implemented
183QArray<int> OContactAccessBackend_VCard::queryByExample ( const OContact&, int ) 192QArray<int> OContactAccessBackend_VCard::queryByExample ( const OContact&, int )
184{ 193{
185 QArray<int> ar(0); 194 QArray<int> ar(0);
186 return ar; 195 return ar;
187} 196}
188 197
189// Not implemented 198// Not implemented
190QArray<int> OContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const 199QArray<int> OContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const
191{ 200{
192 QArray<int> ar(0); 201 QArray<int> ar(0);
193 return ar; 202 return ar;
194} 203}
195 204
196const uint OContactAccessBackend_VCard::querySettings() 205const uint OContactAccessBackend_VCard::querySettings()
197{ 206{
198 return 0; // No search possible 207 return 0; // No search possible
199} 208}
200 209
201bool OContactAccessBackend_VCard::hasQuerySettings (uint ) const 210bool OContactAccessBackend_VCard::hasQuerySettings (uint ) const
202{ 211{
203 return false; // No search possible, therefore all settings invalid ;) 212 return false; // No search possible, therefore all settings invalid ;)
204} 213}
205 214
206bool OContactAccessBackend_VCard::wasChangedExternally() 215bool OContactAccessBackend_VCard::wasChangedExternally()
207{ 216{
208 return false; // Don't expect concurrent access 217 return false; // Don't expect concurrent access
209} 218}
210 219
211// Not implemented 220// Not implemented
212QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int ) 221QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int )
213{ 222{
214 QArray<int> ar(0); 223 QArray<int> ar(0);
215 return ar; 224 return ar;
216} 225}
217 226
218// *** Private stuff *** 227// *** Private stuff ***
219 228
220 229
221OContact OContactAccessBackend_VCard::parseVObject( VObject *obj ) 230OContact OContactAccessBackend_VCard::parseVObject( VObject *obj )
222{ 231{
223 OContact c; 232 OContact c;
224 233
225 VObjectIterator it; 234 VObjectIterator it;
226 initPropIterator( &it, obj ); 235 initPropIterator( &it, obj );
227 while( moreIteration( &it ) ) { 236 while( moreIteration( &it ) ) {
228 VObject *o = nextVObject( &it ); 237 VObject *o = nextVObject( &it );
229 QCString name = vObjectName( o ); 238 QCString name = vObjectName( o );
230 QCString value = vObjectStringZValue( o ); 239 QCString value = vObjectStringZValue( o );
231 if ( name == VCNameProp ) { 240 if ( name == VCNameProp ) {
232 VObjectIterator nit; 241 VObjectIterator nit;
233 initPropIterator( &nit, o ); 242 initPropIterator( &nit, o );
234 while( moreIteration( &nit ) ) { 243 while( moreIteration( &nit ) ) {
235 VObject *o = nextVObject( &nit ); 244 VObject *o = nextVObject( &nit );
236 QCString name = vObjectTypeInfo( o ); 245 QCString name = vObjectTypeInfo( o );
237 QString value = vObjectStringZValue( o ); 246 QString value = vObjectStringZValue( o );
238 if ( name == VCNamePrefixesProp ) 247 if ( name == VCNamePrefixesProp )
239 c.setTitle( value ); 248 c.setTitle( value );
240 else if ( name == VCNameSuffixesProp ) 249 else if ( name == VCNameSuffixesProp )
241 c.setSuffix( value ); 250 c.setSuffix( value );
242 else if ( name == VCFamilyNameProp ) 251 else if ( name == VCFamilyNameProp )
243 c.setLastName( value ); 252 c.setLastName( value );
244 else if ( name == VCGivenNameProp ) 253 else if ( name == VCGivenNameProp )
245 c.setFirstName( value ); 254 c.setFirstName( value );
246 else if ( name == VCAdditionalNamesProp ) 255 else if ( name == VCAdditionalNamesProp )
247 c.setMiddleName( value ); 256 c.setMiddleName( value );
248 } 257 }
249 } 258 }
250 else if ( name == VCAdrProp ) { 259 else if ( name == VCAdrProp ) {
251 bool work = TRUE; // default address is work address 260 bool work = TRUE; // default address is work address
252 QString street; 261 QString street;
253 QString city; 262 QString city;
254 QString region; 263 QString region;
255 QString postal; 264 QString postal;
256 QString country; 265 QString country;
257 266
258 VObjectIterator nit; 267 VObjectIterator nit;
259 initPropIterator( &nit, o ); 268 initPropIterator( &nit, o );
260 while( moreIteration( &nit ) ) { 269 while( moreIteration( &nit ) ) {
261 VObject *o = nextVObject( &nit ); 270 VObject *o = nextVObject( &nit );
262 QCString name = vObjectName( o ); 271 QCString name = vObjectName( o );
263 QString value = vObjectStringZValue( o ); 272 QString value = vObjectStringZValue( o );
264 if ( name == VCHomeProp ) 273 if ( name == VCHomeProp )
265 work = FALSE; 274 work = FALSE;
266 else if ( name == VCWorkProp ) 275 else if ( name == VCWorkProp )
267 work = TRUE; 276 work = TRUE;
268 else if ( name == VCStreetAddressProp ) 277 else if ( name == VCStreetAddressProp )
269 street = value; 278 street = value;
270 else if ( name == VCCityProp ) 279 else if ( name == VCCityProp )
271 city = value; 280 city = value;
272 else if ( name == VCRegionProp ) 281 else if ( name == VCRegionProp )
273 region = value; 282 region = value;
274 else if ( name == VCPostalCodeProp ) 283 else if ( name == VCPostalCodeProp )
275 postal = value; 284 postal = value;
276 else if ( name == VCCountryNameProp ) 285 else if ( name == VCCountryNameProp )
277 country = value; 286 country = value;
278 } 287 }
279 if ( work ) { 288 if ( work ) {
280 c.setBusinessStreet( street ); 289 c.setBusinessStreet( street );
281 c.setBusinessCity( city ); 290 c.setBusinessCity( city );
282 c.setBusinessCountry( country ); 291 c.setBusinessCountry( country );
283 c.setBusinessZip( postal ); 292 c.setBusinessZip( postal );
284 c.setBusinessState( region ); 293 c.setBusinessState( region );
285 } else { 294 } else {
286 c.setHomeStreet( street ); 295 c.setHomeStreet( street );
287 c.setHomeCity( city ); 296 c.setHomeCity( city );
288 c.setHomeCountry( country ); 297 c.setHomeCountry( country );
289 c.setHomeZip( postal ); 298 c.setHomeZip( postal );
290 c.setHomeState( region ); 299 c.setHomeState( region );
291 } 300 }
292 } 301 }
293 else if ( name == VCTelephoneProp ) { 302 else if ( name == VCTelephoneProp ) {
294 enum { 303 enum {
295 HOME = 0x01, 304 HOME = 0x01,
296 WORK = 0x02, 305 WORK = 0x02,
297 VOICE = 0x04, 306 VOICE = 0x04,
298 CELL = 0x08, 307 CELL = 0x08,
299 FAX = 0x10, 308 FAX = 0x10,
300 PAGER = 0x20, 309 PAGER = 0x20,
301 UNKNOWN = 0x80 310 UNKNOWN = 0x80
302 }; 311 };
303 int type = 0; 312 int type = 0;
304 313
305 VObjectIterator nit; 314 VObjectIterator nit;
306 initPropIterator( &nit, o ); 315 initPropIterator( &nit, o );
307 while( moreIteration( &nit ) ) { 316 while( moreIteration( &nit ) ) {
308 VObject *o = nextVObject( &nit ); 317 VObject *o = nextVObject( &nit );
309 QCString name = vObjectTypeInfo( o ); 318 QCString name = vObjectTypeInfo( o );
310 if ( name == VCHomeProp ) 319 if ( name == VCHomeProp )
311 type |= HOME; 320 type |= HOME;
312 else if ( name == VCWorkProp ) 321 else if ( name == VCWorkProp )
313 type |= WORK; 322 type |= WORK;
314 else if ( name == VCVoiceProp ) 323 else if ( name == VCVoiceProp )
315 type |= VOICE; 324 type |= VOICE;
316 else if ( name == VCCellularProp ) 325 else if ( name == VCCellularProp )
317 type |= CELL; 326 type |= CELL;
318 else if ( name == VCFaxProp ) 327 else if ( name == VCFaxProp )
319 type |= FAX; 328 type |= FAX;
320 else if ( name == VCPagerProp ) 329 else if ( name == VCPagerProp )
321 type |= PAGER; 330 type |= PAGER;
322 else if ( name == VCPreferredProp ) 331 else if ( name == VCPreferredProp )
323 ; 332 ;
324 else 333 else
325 type |= UNKNOWN; 334 type |= UNKNOWN;
326 } 335 }
327 if ( (type & UNKNOWN) != UNKNOWN ) { 336 if ( (type & UNKNOWN) != UNKNOWN ) {
328 if ( ( type & (HOME|WORK) ) == 0 ) // default 337 if ( ( type & (HOME|WORK) ) == 0 ) // default
329 type |= HOME; 338 type |= HOME;
330 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default 339 if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default
331 type |= VOICE; 340 type |= VOICE;
332 341
333 qWarning("value %s %d", value.data(), type ); 342 qWarning("value %s %d", value.data(), type );
diff --git a/libopie2/opiepim/core/orecur.cpp b/libopie2/opiepim/core/orecur.cpp
index daf3506..e6a4787 100644
--- a/libopie2/opiepim/core/orecur.cpp
+++ b/libopie2/opiepim/core/orecur.cpp
@@ -1,451 +1,446 @@
1#include <qshared.h> 1#include <qshared.h>
2 2
3#include <qtopia/timeconversion.h> 3#include <qtopia/timeconversion.h>
4 4
5#include "orecur.h" 5#include "orecur.h"
6 6
7struct ORecur::Data : public QShared { 7struct ORecur::Data : public QShared {
8 Data() : QShared() { 8 Data() : QShared() {
9 type = ORecur::NoRepeat; 9 type = ORecur::NoRepeat;
10 freq = -1; 10 freq = -1;
11 days = 0; 11 days = 0;
12 pos = 0; 12 pos = 0;
13 create = -1; 13 create = QDateTime::currentDateTime();
14 hasEnd = FALSE; 14 hasEnd = FALSE;
15 end = 0; 15 end = QDate::currentDate();
16 } 16 }
17 char days; // Q_UINT8 for 8 seven days;) 17 char days; // Q_UINT8 for 8 seven days;)
18 ORecur::RepeatType type; 18 ORecur::RepeatType type;
19 int freq; 19 int freq;
20 int pos; 20 int pos;
21 bool hasEnd : 1; 21 bool hasEnd : 1;
22 time_t end; 22 QDate end;
23 time_t create; 23 QDateTime create;
24 int rep; 24 int rep;
25 QString app; 25 QString app;
26 ExceptionList list; 26 ExceptionList list;
27 QDate start; 27 QDate start;
28}; 28};
29 29
30 30
31ORecur::ORecur() { 31ORecur::ORecur() {
32 data = new Data; 32 data = new Data;
33} 33}
34ORecur::ORecur( const ORecur& rec) 34ORecur::ORecur( const ORecur& rec)
35 : data( rec.data ) 35 : data( rec.data )
36{ 36{
37 data->ref(); 37 data->ref();
38} 38}
39ORecur::~ORecur() { 39ORecur::~ORecur() {
40 if ( data->deref() ) { 40 if ( data->deref() ) {
41 delete data; 41 delete data;
42 data = 0l; 42 data = 0l;
43 } 43 }
44} 44}
45void ORecur::deref() { 45void ORecur::deref() {
46 if ( data->deref() ) { 46 if ( data->deref() ) {
47 delete data; 47 delete data;
48 data = 0l; 48 data = 0l;
49 } 49 }
50} 50}
51bool ORecur::operator==( const ORecur& )const { 51bool ORecur::operator==( const ORecur& )const {
52 return false; 52 return false;
53} 53}
54ORecur &ORecur::operator=( const ORecur& re) { 54ORecur &ORecur::operator=( const ORecur& re) {
55 if ( *this == re ) return *this;
56
55 re.data->ref(); 57 re.data->ref();
56 deref(); 58 deref();
57 data = re.data; 59 data = re.data;
58 60
59 return *this; 61 return *this;
60} 62}
61bool ORecur::doesRecur()const { 63bool ORecur::doesRecur()const {
62 return !( type() == NoRepeat ); 64 return !( type() == NoRepeat );
63} 65}
64/* 66/*
65 * we try to be smart here 67 * we try to be smart here
66 * 68 *
67 */ 69 */
68bool ORecur::doesRecur( const QDate& date ) { 70bool ORecur::doesRecur( const QDate& date ) {
69 /* the day before the recurrance */ 71 /* the day before the recurrance */
70 QDate da = date.addDays(-1); 72 QDate da = date.addDays(-1);
71 73
72 QDate recur; 74 QDate recur;
73 if (!nextOcurrence( da, recur ) ) 75 if (!nextOcurrence( da, recur ) )
74 return false; 76 return false;
75 77
76 return (recur == date); 78 return (recur == date);
77} 79}
78// FIXME unuglify! 80// FIXME unuglify!
79// GPL from Datebookdb.cpp 81// GPL from Datebookdb.cpp
80// FIXME exception list! 82// FIXME exception list!
81bool ORecur::nextOcurrence( const QDate& from, QDate& next ) { 83bool ORecur::nextOcurrence( const QDate& from, QDate& next ) {
82 84
83 // easy checks, first are we too far in the future or too far in the past? 85 // easy checks, first are we too far in the future or too far in the past?
84 QDate tmpDate; 86 QDate tmpDate;
85 int freq = frequency(); 87 int freq = frequency();
86 int diff, diff2, a; 88 int diff, diff2, a;
87 int iday, imonth, iyear; 89 int iday, imonth, iyear;
88 int dayOfWeek = 0; 90 int dayOfWeek = 0;
89 int firstOfWeek = 0; 91 int firstOfWeek = 0;
90 int weekOfMonth; 92 int weekOfMonth;
91 93
92 94
93 if (hasEndDate() && endDate() < from) 95 if (hasEndDate() && endDate() < from)
94 return FALSE; 96 return FALSE;
95 97
96 if (start() >= from) { 98 if (start() >= from) {
97 next = start(); 99 next = start();
98 return TRUE; 100 return TRUE;
99 } 101 }
100 102
101 switch ( type() ) { 103 switch ( type() ) {
102 case Weekly: 104 case Weekly:
103 /* weekly is just daily by 7 */ 105 /* weekly is just daily by 7 */
104 /* first convert the repeatPattern.Days() mask to the next 106 /* first convert the repeatPattern.Days() mask to the next
105 day of week valid after from */ 107 day of week valid after from */
106 dayOfWeek = from.dayOfWeek(); 108 dayOfWeek = from.dayOfWeek();
107 dayOfWeek--; /* we want 0-6, doco for above specs 1-7 */ 109 dayOfWeek--; /* we want 0-6, doco for above specs 1-7 */
108 110
109 /* this is done in case freq > 1 and from in week not 111 /* this is done in case freq > 1 and from in week not
110 for this round */ 112 for this round */
111 // firstOfWeek = 0; this is already done at decl. 113 // firstOfWeek = 0; this is already done at decl.
112 while(!((1 << firstOfWeek) & days() )) 114 while(!((1 << firstOfWeek) & days() ))
113 firstOfWeek++; 115 firstOfWeek++;
114 116
115 /* there is at least one 'day', or there would be no event */ 117 /* there is at least one 'day', or there would be no event */
116 while(!((1 << (dayOfWeek % 7)) & days() )) 118 while(!((1 << (dayOfWeek % 7)) & days() ))
117 dayOfWeek++; 119 dayOfWeek++;
118 120
119 dayOfWeek = dayOfWeek % 7; /* the actual day of week */ 121 dayOfWeek = dayOfWeek % 7; /* the actual day of week */
120 dayOfWeek -= start().dayOfWeek() -1; 122 dayOfWeek -= start().dayOfWeek() -1;
121 123
122 firstOfWeek = firstOfWeek % 7; /* the actual first of week */ 124 firstOfWeek = firstOfWeek % 7; /* the actual first of week */
123 firstOfWeek -= start().dayOfWeek() -1; 125 firstOfWeek -= start().dayOfWeek() -1;
124 126
125 // dayOfWeek may be negitive now 127 // dayOfWeek may be negitive now
126 // day of week is number of days to add to start day 128 // day of week is number of days to add to start day
127 129
128 freq *= 7; 130 freq *= 7;
129 // FALL-THROUGH !!!!! 131 // FALL-THROUGH !!!!!
130 case Daily: 132 case Daily:
131 // the add is for the possible fall through from weekly */ 133 // the add is for the possible fall through from weekly */
132 if(start().addDays(dayOfWeek) > from) { 134 if(start().addDays(dayOfWeek) > from) {
133 /* first week exception */ 135 /* first week exception */
134 next = QDate(start().addDays(dayOfWeek) ); 136 next = QDate(start().addDays(dayOfWeek) );
135 if ((next > endDate()) 137 if ((next > endDate())
136 && hasEndDate() ) 138 && hasEndDate() )
137 return FALSE; 139 return FALSE;
138 return TRUE; 140 return TRUE;
139 } 141 }
140 /* if from is middle of a non-week */ 142 /* if from is middle of a non-week */
141 143
142 diff = start().addDays(dayOfWeek).daysTo(from) % freq; 144 diff = start().addDays(dayOfWeek).daysTo(from) % freq;
143 diff2 = start().addDays(firstOfWeek).daysTo(from) % freq; 145 diff2 = start().addDays(firstOfWeek).daysTo(from) % freq;
144 146
145 if(diff != 0) 147 if(diff != 0)
146 diff = freq - diff; 148 diff = freq - diff;
147 if(diff2 != 0) 149 if(diff2 != 0)
148 diff2 = freq - diff2; 150 diff2 = freq - diff2;
149 diff = QMIN(diff, diff2); 151 diff = QMIN(diff, diff2);
150 152
151 next = QDate(from.addDays(diff)); 153 next = QDate(from.addDays(diff));
152 if ( (next > endDate()) 154 if ( (next > endDate())
153 && hasEndDate() ) 155 && hasEndDate() )
154 return FALSE; 156 return FALSE;
155 return TRUE; 157 return TRUE;
156 case MonthlyDay: 158 case MonthlyDay:
157 iday = from.day(); 159 iday = from.day();
158 iyear = from.year(); 160 iyear = from.year();
159 imonth = from.month(); 161 imonth = from.month();
160 /* find equivelent day of month for this month */ 162 /* find equivelent day of month for this month */
161 dayOfWeek = start().dayOfWeek(); 163 dayOfWeek = start().dayOfWeek();
162 weekOfMonth = (start().day() - 1) / 7; 164 weekOfMonth = (start().day() - 1) / 7;
163 165
164 /* work out when the next valid month is */ 166 /* work out when the next valid month is */
165 a = from.year() - start().year(); 167 a = from.year() - start().year();
166 a *= 12; 168 a *= 12;
167 a = a + (imonth - start().month()); 169 a = a + (imonth - start().month());
168 /* a is e.start()monthsFrom(from); */ 170 /* a is e.start()monthsFrom(from); */
169 if(a % freq) { 171 if(a % freq) {
170 a = freq - (a % freq); 172 a = freq - (a % freq);
171 imonth = from.month() + a; 173 imonth = from.month() + a;
172 if (imonth > 12) { 174 if (imonth > 12) {
173 imonth--; 175 imonth--;
174 iyear += imonth / 12; 176 iyear += imonth / 12;
175 imonth = imonth % 12; 177 imonth = imonth % 12;
176 imonth++; 178 imonth++;
177 } 179 }
178 } 180 }
179 /* imonth is now the first month after or on 181 /* imonth is now the first month after or on
180 from that matches the frequency given */ 182 from that matches the frequency given */
181 183
182 /* find for this month */ 184 /* find for this month */
183 tmpDate = QDate( iyear, imonth, 1 ); 185 tmpDate = QDate( iyear, imonth, 1 );
184 186
185 iday = 1; 187 iday = 1;
186 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; 188 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7;
187 iday += 7 * weekOfMonth; 189 iday += 7 * weekOfMonth;
188 while (iday > tmpDate.daysInMonth()) { 190 while (iday > tmpDate.daysInMonth()) {
189 imonth += freq; 191 imonth += freq;
190 if (imonth > 12) { 192 if (imonth > 12) {
191 imonth--; 193 imonth--;
192 iyear += imonth / 12; 194 iyear += imonth / 12;
193 imonth = imonth % 12; 195 imonth = imonth % 12;
194 imonth++; 196 imonth++;
195 } 197 }
196 tmpDate = QDate( iyear, imonth, 1 ); 198 tmpDate = QDate( iyear, imonth, 1 );
197 /* these loops could go for a while, check end case now */ 199 /* these loops could go for a while, check end case now */
198 if ((tmpDate > endDate()) && hasEndDate() ) 200 if ((tmpDate > endDate()) && hasEndDate() )
199 return FALSE; 201 return FALSE;
200 iday = 1; 202 iday = 1;
201 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; 203 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7;
202 iday += 7 * weekOfMonth; 204 iday += 7 * weekOfMonth;
203 } 205 }
204 tmpDate = QDate(iyear, imonth, iday); 206 tmpDate = QDate(iyear, imonth, iday);
205 207
206 if (tmpDate >= from) { 208 if (tmpDate >= from) {
207 next = tmpDate; 209 next = tmpDate;
208 if ((next > endDate() ) && hasEndDate() ) 210 if ((next > endDate() ) && hasEndDate() )
209 return FALSE; 211 return FALSE;
210 return TRUE; 212 return TRUE;
211 } 213 }
212 214
213 /* need to find the next iteration */ 215 /* need to find the next iteration */
214 do { 216 do {
215 imonth += freq; 217 imonth += freq;
216 if (imonth > 12) { 218 if (imonth > 12) {
217 imonth--; 219 imonth--;
218 iyear += imonth / 12; 220 iyear += imonth / 12;
219 imonth = imonth % 12; 221 imonth = imonth % 12;
220 imonth++; 222 imonth++;
221 } 223 }
222 tmpDate = QDate( iyear, imonth, 1 ); 224 tmpDate = QDate( iyear, imonth, 1 );
223 /* these loops could go for a while, check end case now */ 225 /* these loops could go for a while, check end case now */
224 if ((tmpDate > endDate()) && hasEndDate() ) 226 if ((tmpDate > endDate()) && hasEndDate() )
225 return FALSE; 227 return FALSE;
226 iday = 1; 228 iday = 1;
227 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; 229 iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7;
228 iday += 7 * weekOfMonth; 230 iday += 7 * weekOfMonth;
229 } while (iday > tmpDate.daysInMonth()); 231 } while (iday > tmpDate.daysInMonth());
230 tmpDate = QDate(iyear, imonth, iday); 232 tmpDate = QDate(iyear, imonth, iday);
231 233
232 next = tmpDate; 234 next = tmpDate;
233 if ((next > endDate()) && hasEndDate() ) 235 if ((next > endDate()) && hasEndDate() )
234 return FALSE; 236 return FALSE;
235 return TRUE; 237 return TRUE;
236 case MonthlyDate: 238 case MonthlyDate:
237 iday = start().day(); 239 iday = start().day();
238 iyear = from.year(); 240 iyear = from.year();
239 imonth = from.month(); 241 imonth = from.month();
240 242
241 a = from.year() - start().year(); 243 a = from.year() - start().year();
242 a *= 12; 244 a *= 12;
243 a = a + (imonth - start().month()); 245 a = a + (imonth - start().month());
244 /* a is e.start()monthsFrom(from); */ 246 /* a is e.start()monthsFrom(from); */
245 if(a % freq) { 247 if(a % freq) {
246 a = freq - (a % freq); 248 a = freq - (a % freq);
247 imonth = from.month() + a; 249 imonth = from.month() + a;
248 if (imonth > 12) { 250 if (imonth > 12) {
249 imonth--; 251 imonth--;
250 iyear += imonth / 12; 252 iyear += imonth / 12;
251 imonth = imonth % 12; 253 imonth = imonth % 12;
252 imonth++; 254 imonth++;
253 } 255 }
254 } 256 }
255 /* imonth is now the first month after or on 257 /* imonth is now the first month after or on
256 from that matches the frequencey given */ 258 from that matches the frequencey given */
257 259
258 /* this could go for a while, worse case, 4*12 iterations, probably */ 260 /* this could go for a while, worse case, 4*12 iterations, probably */
259 while(!QDate::isValid(iyear, imonth, iday) ) { 261 while(!QDate::isValid(iyear, imonth, iday) ) {
260 imonth += freq; 262 imonth += freq;
261 if (imonth > 12) { 263 if (imonth > 12) {
262 imonth--; 264 imonth--;
263 iyear += imonth / 12; 265 iyear += imonth / 12;
264 imonth = imonth % 12; 266 imonth = imonth % 12;
265 imonth++; 267 imonth++;
266 } 268 }
267 /* these loops could go for a while, check end case now */ 269 /* these loops could go for a while, check end case now */
268 if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() ) 270 if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() )
269 return FALSE; 271 return FALSE;
270 } 272 }
271 273
272 if(QDate(iyear, imonth, iday) >= from) { 274 if(QDate(iyear, imonth, iday) >= from) {
273 /* done */ 275 /* done */
274 next = QDate(iyear, imonth, iday); 276 next = QDate(iyear, imonth, iday);
275 if ((next > endDate()) && hasEndDate() ) 277 if ((next > endDate()) && hasEndDate() )
276 return FALSE; 278 return FALSE;
277 return TRUE; 279 return TRUE;
278 } 280 }
279 281
280 /* ok, need to cycle */ 282 /* ok, need to cycle */
281 imonth += freq; 283 imonth += freq;
282 imonth--; 284 imonth--;
283 iyear += imonth / 12; 285 iyear += imonth / 12;
284 imonth = imonth % 12; 286 imonth = imonth % 12;
285 imonth++; 287 imonth++;
286 288
287 while(!QDate::isValid(iyear, imonth, iday) ) { 289 while(!QDate::isValid(iyear, imonth, iday) ) {
288 imonth += freq; 290 imonth += freq;
289 imonth--; 291 imonth--;
290 iyear += imonth / 12; 292 iyear += imonth / 12;
291 imonth = imonth % 12; 293 imonth = imonth % 12;
292 imonth++; 294 imonth++;
293 if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() ) 295 if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() )
294 return FALSE; 296 return FALSE;
295 } 297 }
296 298
297 next = QDate(iyear, imonth, iday); 299 next = QDate(iyear, imonth, iday);
298 if ((next > endDate()) && hasEndDate() ) 300 if ((next > endDate()) && hasEndDate() )
299 return FALSE; 301 return FALSE;
300 return TRUE; 302 return TRUE;
301 case Yearly: 303 case Yearly:
302 iday = start().day(); 304 iday = start().day();
303 imonth = start().month(); 305 imonth = start().month();
304 iyear = from.year(); // after all, we want to start in this year 306 iyear = from.year(); // after all, we want to start in this year
305 307
306 diff = 1; 308 diff = 1;
307 if(imonth == 2 && iday > 28) { 309 if(imonth == 2 && iday > 28) {
308 /* leap year, and it counts, calculate actual frequency */ 310 /* leap year, and it counts, calculate actual frequency */
309 if(freq % 4) 311 if(freq % 4)
310 if (freq % 2) 312 if (freq % 2)
311 freq = freq * 4; 313 freq = freq * 4;
312 else 314 else
313 freq = freq * 2; 315 freq = freq * 2;
314 /* else divides by 4 already, leave freq alone */ 316 /* else divides by 4 already, leave freq alone */
315 diff = 4; 317 diff = 4;
316 } 318 }
317 319
318 a = from.year() - start().year(); 320 a = from.year() - start().year();
319 if(a % freq) { 321 if(a % freq) {
320 a = freq - (a % freq); 322 a = freq - (a % freq);
321 iyear = iyear + a; 323 iyear = iyear + a;
322 } 324 }
323 325
324 /* under the assumption we won't hit one of the special not-leap years twice */ 326 /* under the assumption we won't hit one of the special not-leap years twice */
325 if(!QDate::isValid(iyear, imonth, iday)) { 327 if(!QDate::isValid(iyear, imonth, iday)) {
326 /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ 328 /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */
327 iyear += freq; 329 iyear += freq;
328 } 330 }
329 331
330 if(QDate(iyear, imonth, iday) >= from) { 332 if(QDate(iyear, imonth, iday) >= from) {
331 next = QDate(iyear, imonth, iday); 333 next = QDate(iyear, imonth, iday);
332 334
333 if ((next > endDate()) && hasEndDate() ) 335 if ((next > endDate()) && hasEndDate() )
334 return FALSE; 336 return FALSE;
335 return TRUE; 337 return TRUE;
336 } 338 }
337 /* iyear == from.year(), need to advance again */ 339 /* iyear == from.year(), need to advance again */
338 iyear += freq; 340 iyear += freq;
339 /* under the assumption we won't hit one of the special not-leap years twice */ 341 /* under the assumption we won't hit one of the special not-leap years twice */
340 if(!QDate::isValid(iyear, imonth, iday)) { 342 if(!QDate::isValid(iyear, imonth, iday)) {
341 /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ 343 /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */
342 iyear += freq; 344 iyear += freq;
343 } 345 }
344 346
345 next = QDate(iyear, imonth, iday); 347 next = QDate(iyear, imonth, iday);
346 if ((next > endDate()) && hasEndDate() ) 348 if ((next > endDate()) && hasEndDate() )
347 return FALSE; 349 return FALSE;
348 return TRUE; 350 return TRUE;
349 default: 351 default:
350 return FALSE; 352 return FALSE;
351 } 353 }
352} 354}
353ORecur::RepeatType ORecur::type()const{ 355ORecur::RepeatType ORecur::type()const{
354 return data->type; 356 return data->type;
355} 357}
356int ORecur::frequency()const { 358int ORecur::frequency()const {
357 return data->freq; 359 return data->freq;
358} 360}
359int ORecur::position()const { 361int ORecur::position()const {
360 return data->pos; 362 return data->pos;
361} 363}
362char ORecur::days() const{ 364char ORecur::days() const{
363 return data->days; 365 return data->days;
364} 366}
365bool ORecur::hasEndDate()const { 367bool ORecur::hasEndDate()const {
366 return data->hasEnd; 368 return data->hasEnd;
367} 369}
368QDate ORecur::endDate()const { 370QDate ORecur::endDate()const {
369 return TimeConversion::fromUTC( data->end ).date(); 371 return data->end;
370} 372}
371QDate ORecur::start()const{ 373QDate ORecur::start()const{
372 return data->start; 374 return data->start;
373} 375}
374time_t ORecur::endDateUTC()const { 376QDateTime ORecur::createdDateTime()const {
375 return data->end;
376}
377time_t ORecur::createTime()const {
378 return data->create; 377 return data->create;
379} 378}
380int ORecur::repetition()const { 379int ORecur::repetition()const {
381 return data->rep; 380 return data->rep;
382} 381}
383QString ORecur::service()const { 382QString ORecur::service()const {
384 return data->app; 383 return data->app;
385} 384}
386ORecur::ExceptionList& ORecur::exceptions() { 385ORecur::ExceptionList& ORecur::exceptions() {
387 return data->list; 386 return data->list;
388} 387}
389void ORecur::setType( const RepeatType& z) { 388void ORecur::setType( const RepeatType& z) {
390 checkOrModify(); 389 checkOrModify();
391 data->type = z; 390 data->type = z;
392} 391}
393void ORecur::setFrequency( int freq ) { 392void ORecur::setFrequency( int freq ) {
394 checkOrModify(); 393 checkOrModify();
395 data->freq = freq; 394 data->freq = freq;
396} 395}
397void ORecur::setPosition( int pos ) { 396void ORecur::setPosition( int pos ) {
398 checkOrModify(); 397 checkOrModify();
399 data->pos = pos; 398 data->pos = pos;
400} 399}
401void ORecur::setDays( char c ) { 400void ORecur::setDays( char c ) {
402 checkOrModify(); 401 checkOrModify();
403 data->days = c; 402 data->days = c;
404} 403}
405void ORecur::setEndDate( const QDate& dt) { 404void ORecur::setEndDate( const QDate& dt) {
406 checkOrModify(); 405 checkOrModify();
407 data->end = TimeConversion::toUTC( dt ); 406 data->end = dt;
408}
409void ORecur::setEndDateUTC( time_t t) {
410 checkOrModify();
411 data->end = t;
412} 407}
413void ORecur::setCreateTime( time_t t) { 408void ORecur::setCreatedDateTime( const QDateTime& t) {
414 checkOrModify(); 409 checkOrModify();
415 data->create = t; 410 data->create = t;
416} 411}
417void ORecur::setHasEndDate( bool b) { 412void ORecur::setHasEndDate( bool b) {
418 checkOrModify(); 413 checkOrModify();
419 data->hasEnd = b; 414 data->hasEnd = b;
420} 415}
421void ORecur::setRepitition( int rep ) { 416void ORecur::setRepitition( int rep ) {
422 checkOrModify(); 417 checkOrModify();
423 data->rep = rep; 418 data->rep = rep;
424} 419}
425void ORecur::setService( const QString& app ) { 420void ORecur::setService( const QString& app ) {
426 checkOrModify(); 421 checkOrModify();
427 data->app = app; 422 data->app = app;
428} 423}
429void ORecur::setStart( const QDate& dt ) { 424void ORecur::setStart( const QDate& dt ) {
430 checkOrModify(); 425 checkOrModify();
431 data->start = dt; 426 data->start = dt;
432} 427}
433void ORecur::checkOrModify() { 428void ORecur::checkOrModify() {
434 if ( data->count != 1 ) { 429 if ( data->count != 1 ) {
435 data->deref(); 430 data->deref();
436 Data* d2 = new Data; 431 Data* d2 = new Data;
437 d2->days = data->days; 432 d2->days = data->days;
438 d2->type = data->type; 433 d2->type = data->type;
439 d2->freq = data->freq; 434 d2->freq = data->freq;
440 d2->pos = data->pos; 435 d2->pos = data->pos;
441 d2->hasEnd = data->hasEnd; 436 d2->hasEnd = data->hasEnd;
442 d2->end = data->end; 437 d2->end = data->end;
443 d2->create = data->create; 438 d2->create = data->create;
444 d2->rep = data->rep; 439 d2->rep = data->rep;
445 d2->app = data->app; 440 d2->app = data->app;
446 d2->list = data->list; 441 d2->list = data->list;
447 d2->start = data->start; 442 d2->start = data->start;
448 data = d2; 443 data = d2;
449 } 444 }
450} 445}
451 446
diff --git a/libopie2/opiepim/core/orecur.h b/libopie2/opiepim/core/orecur.h
index 8713d97..1e0014b 100644
--- a/libopie2/opiepim/core/orecur.h
+++ b/libopie2/opiepim/core/orecur.h
@@ -1,83 +1,87 @@
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
13 13
14class ORecur { 14class ORecur {
15public: 15public:
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 ORecur(); 21 ORecur();
22 ORecur( const ORecur& ); 22 ORecur( const ORecur& );
23 ~ORecur(); 23 ~ORecur();
24 24
25 ORecur &operator=( const ORecur& ); 25 ORecur &operator=( const ORecur& );
26 bool operator==(const ORecur& )const; 26 bool operator==(const ORecur& )const;
27 27
28 bool doesRecur()const; 28 bool doesRecur()const;
29 /* if it recurrs on that day */ 29 /* if it recurrs on that day */
30 bool doesRecur( const QDate& ); 30 bool doesRecur( const QDate& );
31 RepeatType type()const; 31 RepeatType type()const;
32 int frequency()const; 32 int frequency()const;
33 int position()const; 33 int position()const;
34 char days()const; 34 char days()const;
35 bool hasEndDate()const; 35 bool hasEndDate()const;
36 QDate start()const; 36 QDate start()const;
37 QDate endDate()const; 37 QDate endDate()const;
38 time_t endDateUTC()const; 38 QDateTime createdDateTime()const;
39 time_t createTime()const; 39 /**
40 * starting on monday=0, sunday=6
41 * for convience
42 */
43 bool repeatOnWeekDay( int day )const;
40 44
41 /** 45 /**
42 * FromWhereToStart is not included!!! 46 * FromWhereToStart is not included!!!
43 */ 47 */
44 bool nextOcurrence( const QDate& FromWhereToStart, QDate &recurDate ); 48 bool nextOcurrence( const QDate& FromWhereToStart, QDate &recurDate );
49
45 /** 50 /**
46 * The module this ORecur belongs to 51 * The module this ORecur belongs to
47 */ 52 */
48 QString service()const; 53 QString service()const;
49 54
50 /* 55 /*
51 * reference to the exception list 56 * reference to the exception list
52 */ 57 */
53 ExceptionList &exceptions(); 58 ExceptionList &exceptions();
54 59
55 /** 60 /**
56 * the current repetition 61 * the current repetition
57 */ 62 */
58 int repetition()const; 63 int repetition()const;
59 64
60 void setType( const RepeatType& ); 65 void setType( const RepeatType& );
61 void setFrequency( int freq ); 66 void setFrequency( int freq );
62 void setPosition( int pos ); 67 void setPosition( int pos );
63 void setDays( char c); 68 void setDays( char c);
64 void setEndDate( const QDate& dt ); 69 void setEndDate( const QDate& dt );
65 void setStart( const QDate& dt ); 70 void setStart( const QDate& dt );
66 void setEndDateUTC( time_t ); 71 void setCreatedDateTime( const QDateTime& );
67 void setCreateTime( time_t );
68 void setHasEndDate( bool b ); 72 void setHasEndDate( bool b );
69 void setRepitition(int ); 73 void setRepitition(int );
70 74
71 void setService( const QString& ser ); 75 void setService( const QString& ser );
72private: 76private:
73 void deref(); 77 void deref();
74 inline void checkOrModify(); 78 inline void checkOrModify();
75 79
76 80
77 class Data; 81 class Data;
78 Data* data; 82 Data* data;
79 class ORecurPrivate; 83 class ORecurPrivate;
80 ORecurPrivate *d; 84 ORecurPrivate *d;
81}; 85};
82 86
83#endif 87#endif
diff --git a/libopie2/opiepim/core/otimezone.cpp b/libopie2/opiepim/core/otimezone.cpp
new file mode 100644
index 0000000..b2bd3aa
--- a/dev/null
+++ b/libopie2/opiepim/core/otimezone.cpp
@@ -0,0 +1,104 @@
1#include <stdio.h>
2#include <stdlib.h>
3
4#include <sys/types.h>
5
6#include "otimezone.h"
7
8namespace {
9
10 QDateTime utcTime( time_t t) {
11 tm* broken = ::gmtime( &t );
12 QDateTime ret;
13 ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) );
14 ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) );
15 return ret;
16 }
17 QDateTime utcTime( time_t t, const QString& zone) {
18 QCString org = ::getenv( "TZ" );
19 ::setenv( "TZ", zone.latin1(), true );
20 ::tzset();
21
22 tm* broken = ::localtime( &t );
23 ::setenv( "TZ", org, true );
24
25 QDateTime ret;
26 ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) );
27 ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) );
28
29 return ret;
30 }
31 time_t to_Time_t( const QDateTime& utc, const QString& str ) {
32 QDate d = utc.date();
33 QTime t = utc.time();
34
35 tm broken;
36 broken.tm_year = d.year() - 1900;
37 broken.tm_mon = d.month() - 1;
38 broken.tm_mday = d.day();
39 broken.tm_hour = t.hour();
40 broken.tm_min = t.minute();
41 broken.tm_sec = t.second();
42
43 QCString org = ::getenv( "TZ" );
44 ::setenv( "TZ", str.latin1(), true );
45 ::tzset();
46
47 time_t ti = ::mktime( &broken );
48 ::setenv( "TZ", org, true );
49
50 return ti;
51 }
52}
53OTimeZone::OTimeZone( const ZoneName& zone )
54 : m_name(zone) {
55}
56OTimeZone::~OTimeZone() {
57}
58
59bool OTimeZone::isValid()const {
60 return !m_name.isEmpty();
61}
62
63/*
64 * we will get the current timezone
65 * and ask it to convert to the timezone date
66 */
67QDateTime OTimeZone::toLocalDateTime( const QDateTime& dt) {
68 return OTimeZone::current().toDateTime( dt, *this );
69}
70QDateTime OTimeZone::toUTCDateTime( const QDateTime& dt ) {
71 return OTimeZone::utc().toDateTime( dt, *this );
72}
73QDateTime OTimeZone::fromUTCDateTime( time_t t) {
74 return utcTime( t );
75}
76QDateTime OTimeZone::toDateTime( time_t t) {
77 return utcTime( t, m_name );
78}
79/*
80 * convert dt to utc using zone.m_name
81 * convert utc -> timeZoneDT using this->m_name
82 */
83QDateTime OTimeZone::toDateTime( const QDateTime& dt, const OTimeZone& zone ) {
84 time_t utc = to_Time_t( dt, zone.m_name );
85 qWarning("%d %s", utc, zone.m_name.latin1() );
86 return utcTime( utc, m_name );
87}
88time_t OTimeZone::fromDateTime( const QDateTime& time ) {
89 return to_Time_t( time, m_name );
90}
91time_t OTimeZone::fromUTCDateTime( const QDateTime& time ) {
92 return to_Time_t( time, "UTC" );
93}
94OTimeZone OTimeZone::current() {
95 QCString str = ::getenv("TZ");
96 OTimeZone zone( str );
97 return zone;
98}
99OTimeZone OTimeZone::utc() {
100 return OTimeZone("UTC");
101}
102QString OTimeZone::timeZone()const {
103 return m_name;
104}
diff --git a/libopie2/opiepim/core/otimezone.h b/libopie2/opiepim/core/otimezone.h
new file mode 100644
index 0000000..bb08349
--- a/dev/null
+++ b/libopie2/opiepim/core/otimezone.h
@@ -0,0 +1,71 @@
1#ifndef OPIE_TIME_ZONE_H
2#define OPIE_TIME_ZONE_H
3
4#include <time.h>
5#include <qdatetime.h>
6
7/**
8 * A very primitive class to convert time
9 * from one timezone to another
10 * and to localtime
11 * and time_t
12 */
13class OTimeZone {
14 public:
15 typedef QString ZoneName;
16 OTimeZone( const ZoneName& = ZoneName::null );
17 virtual ~OTimeZone(); // just in case.
18
19 bool isValid()const;
20
21 /**
22 * converts the QDateTime to a DateTime
23 * in the local timezone
24 * if QDateTime is 25th Jan and takes place in Europe/Berlin at 12h
25 * and the current timezone is Europe/London the returned
26 * time will be 11h.
27 */
28 QDateTime toLocalDateTime( const QDateTime& dt );
29
30 /**
31 * converts the QDateTime to UTC time
32 */
33 QDateTime toUTCDateTime( const QDateTime& dt );
34
35 /**
36 * reads the time_t into a QDateTime using UTC as timezone!
37 */
38 QDateTime fromUTCDateTime( time_t );
39
40 /**
41 * converts the time_t to the time in the timezone
42 */
43 QDateTime toDateTime( time_t );
44
45 /**
46 * converts the QDateTime from one timezone to this timeZone
47 */
48 QDateTime toDateTime( const QDateTime&, const OTimeZone& timeZone );
49
50 /**
51 * converts the date time into a time_t. It takes the timezone into account
52 */
53 time_t fromDateTime( const QDateTime& );
54
55 /**
56 * converts the datetime with timezone UTC
57 */
58 time_t fromUTCDateTime( const QDateTime& );
59
60 static OTimeZone current();
61 static OTimeZone utc();
62
63 QString timeZone()const;
64 private:
65 ZoneName m_name;
66 class Private;
67 Private* d;
68};
69
70
71#endif
diff --git a/libopie2/opiepim/oevent.cpp b/libopie2/opiepim/oevent.cpp
new file mode 100644
index 0000000..71b9441
--- a/dev/null
+++ b/libopie2/opiepim/oevent.cpp
@@ -0,0 +1,427 @@
1#include <qshared.h>
2
3#include <qpe/palmtopuidgen.h>
4#include <qpe/categories.h>
5
6#include "orecur.h"
7#include "opimresolver.h"
8#include "opimnotifymanager.h"
9
10#include "oevent.h"
11
12namespace OCalendarHelper {
13 static int week( const QDate& date) {
14 // Calculates the week this date is in within that
15 // month. Equals the "row" is is in in the month view
16 int week = 1;
17 QDate tmp( date.year(), date.month(), 1 );
18 if ( date.dayOfWeek() < tmp.dayOfWeek() )
19 ++week;
20
21 week += ( date.day() - 1 ) / 7;
22
23 return week;
24 }
25 static int occurence( const QDate& date) {
26 // calculates the number of occurrances of this day of the
27 // week till the given date (e.g 3rd Wednesday of the month)
28 return ( date.day() - 1 ) / 7 + 1;
29 }
30 static int dayOfWeek( char day ) {
31 int dayOfWeek = 1;
32 char i = ORecur::MON;
33 while ( !( i & day ) && i <= ORecur::SUN ) {
34 i <<= 1;
35 ++dayOfWeek;
36 }
37 return dayOfWeek;
38 }
39 static int monthDiff( const QDate& first, const QDate& second ) {
40 return ( second.year() - first.year() ) * 12 +
41 second.month() - first.month();
42 }
43}
44
45struct OEvent::Data : public QShared {
46 Data() : QShared() {
47 recur = 0;
48 manager = 0;
49 isAllDay = false;
50 }
51 ~Data() {
52 delete manager;
53 delete recur;
54 }
55 QString description;
56 QString location;
57 OPimNotifyManager* manager;
58 ORecur* recur;
59 QString note;
60 QDateTime created;
61 QDateTime start;
62 QDateTime end;
63 bool isAllDay : 1;
64 QString timezone;
65};
66
67OEvent::OEvent( int uid )
68 : OPimRecord( uid ) {
69 data = new Data;
70}
71OEvent::OEvent( const OEvent& ev)
72 : OPimRecord( ev ), data( ev.data )
73{
74 data->ref();
75}
76OEvent::~OEvent() {
77 if ( data->deref() ) {
78 delete data;
79 data = 0;
80 }
81}
82OEvent& OEvent::operator=( const OEvent& ev) {
83 if ( *this == ev ) return *this;
84
85 OPimRecord::operator=( ev );
86 ev.data->ref();
87 deref();
88 data = ev.data;
89
90
91 return *this;
92}
93QString OEvent::description()const {
94 return data->description;
95}
96void OEvent::setDescription( const QString& description ) {
97 changeOrModify();
98 data->description = description;
99}
100void OEvent::setLocation( const QString& loc ) {
101 changeOrModify();
102 data->location = loc;
103}
104QString OEvent::location()const {
105 return data->location;
106}
107OPimNotifyManager &OEvent::notifiers() {
108 // I hope we can skip the changeOrModify here
109 // the notifier should take care of it
110 // and OPimNotify is shared too
111 if (!data->manager )
112 data->manager = new OPimNotifyManager;
113
114 return *data->manager;
115}
116bool OEvent::hasNotifiers()const {
117 return ( data->manager);
118}
119ORecur OEvent::recurrence()const {
120 if (!data->recur)
121 data->recur = new ORecur;
122
123 return *data->recur;
124}
125void OEvent::setRecurrence( const ORecur& rec) {
126 changeOrModify();
127 if (data->recur )
128 (*data->recur) = rec;
129 else
130 data->recur = new ORecur( rec );
131}
132bool OEvent::hasRecurrence()const {
133 return data->recur;
134}
135QString OEvent::note()const {
136 return data->note;
137}
138void OEvent::setNote( const QString& note ) {
139 changeOrModify();
140 data->note = note;
141}
142QDateTime OEvent::createdDateTime()const {
143 return data->created;
144}
145void OEvent::setCreatedDateTime( const QDateTime& time ) {
146 changeOrModify();
147 data->created = time;
148}
149QDateTime OEvent::startDateTime()const {
150 if ( data->isAllDay )
151 return QDateTime( data->start.date(), QTime(0, 0, 0 ) );
152 return data->start;
153}
154QDateTime OEvent::startDateTimeInZone()const {
155 /* if no timezone, or all day event or if the current and this timeZone match... */
156 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime();
157
158 OTimeZone zone(data->timezone );
159 return zone.toDateTime( data->start, OTimeZone::current() );
160}
161void OEvent::setStartDateTime( const QDateTime& dt ) {
162 changeOrModify();
163 data->start = dt;
164}
165QDateTime OEvent::endDateTime()const {
166 /*
167 * if all Day event the end time needs
168 * to be on the same day as the start
169 */
170 if ( data->isAllDay )
171 return QDateTime( data->start.date(), QTime(23, 59, 59 ) );
172 return data->end;
173}
174QDateTime OEvent::endDateTimeInZone()const {
175 /* if no timezone, or all day event or if the current and this timeZone match... */
176 if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime();
177
178 OTimeZone zone(data->timezone );
179 return zone.toDateTime( data->end, OTimeZone::current() );
180}
181void OEvent::setEndDateTime( const QDateTime& dt ) {
182 changeOrModify();
183 data->end = dt;
184}
185bool OEvent::isMultipleDay()const {
186 return data->end.date().day() - data->start.date().day();
187}
188bool OEvent::isAllDay()const {
189 return data->isAllDay;
190}
191void OEvent::setTimeZone( const QString& tz ) {
192 changeOrModify();
193 data->timezone = tz;
194}
195QString OEvent::timeZone()const {
196 return data->timezone;
197}
198bool OEvent::match( const QRegExp& )const {
199 // FIXME
200 return false;
201}
202QString OEvent::toRichText()const {
203 // FIXME
204 return "OEvent test";
205}
206QString OEvent::toShortText()const {
207 return "OEvent shotText";
208}
209QString OEvent::type()const {
210 return QString::fromLatin1("OEvent");
211}
212QString OEvent::recordField( int /*id */ )const {
213 return QString::null;
214}
215int OEvent::rtti() {
216 return OPimResolver::DateBook;
217}
218bool OEvent::loadFromStream( QDataStream& ) {
219 return true;
220}
221bool OEvent::saveToStream( QDataStream& )const {
222 return true;
223}
224void OEvent::changeOrModify() {
225 if ( data->count != 1 ) {
226 data->deref();
227 Data* d2 = new Data;
228 d2->description = data->description;
229 d2->location = data->location;
230 d2->manager = data->manager;
231 d2->recur = data->recur;
232 d2->note = data->note;
233 d2->created = data->created;
234 d2->start = data->start;
235 d2->end = data->end;
236 d2->isAllDay = data->isAllDay;
237 d2->timezone = data->timezone;
238
239 data = d2;
240 }
241}
242void OEvent::deref() {
243 if ( data->deref() ) {
244 delete data;
245 data = 0;
246 }
247}
248// FIXME
249QMap<int, QString> OEvent::toMap()const {
250 return QMap<int, QString>();
251}
252QMap<QString, QString> OEvent::toExtraMap()const {
253 return QMap<QString, QString>();
254}
255
256
257struct OEffectiveEvent::Data : public QShared {
258 Data() : QShared() {
259 }
260 OEvent event;
261 QDate date;
262 QTime start, end;
263 QDate startDate, endDate;
264 bool dates : 1;
265};
266
267OEffectiveEvent::OEffectiveEvent() {
268 data = new Data;
269 data->date = QDate::currentDate();
270 data->start = data->end = QTime::currentTime();
271 data->dates = false;
272}
273OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate,
274 Position pos ) {
275 data = new Data;
276 data->event = ev;
277 data->date = startDate;
278 if ( pos & Start )
279 data->start = ev.startDateTime().time();
280 else
281 data->start = QTime( 0, 0, 0 );
282
283 if ( pos & End )
284 data->end = ev.endDateTime().time();
285 else
286 data->end = QTime( 23, 59, 59 );
287
288 data->dates = false;
289}
290OEffectiveEvent::OEffectiveEvent( const OEffectiveEvent& ev) {
291 data = ev.data;
292 data->ref();
293}
294OEffectiveEvent::~OEffectiveEvent() {
295 if ( data->deref() ) {
296 delete data;
297 data = 0;
298 }
299}
300OEffectiveEvent& OEffectiveEvent::operator=( const OEffectiveEvent& ev ) {
301 if ( *this == ev ) return *this;
302
303 ev.data->ref();
304 deref();
305 data = ev.data;
306
307 return *this;
308}
309
310void OEffectiveEvent::setStartTime( const QTime& ti) {
311 changeOrModify();
312 data->start = ti;
313}
314void OEffectiveEvent::setEndTime( const QTime& en) {
315 changeOrModify();
316 data->end = en;
317}
318void OEffectiveEvent::setEvent( const OEvent& ev) {
319 changeOrModify();
320 data->event = ev;
321}
322void OEffectiveEvent::setDate( const QDate& da) {
323 changeOrModify();
324 data->date = da;
325}
326void OEffectiveEvent::setEffectiveDates( const QDate& from,
327 const QDate& to ) {
328 if (!from.isValid() ) {
329 data->dates = false;
330 return;
331 }
332
333 data->startDate = from;
334 data->endDate = to;
335}
336QString OEffectiveEvent::description()const {
337 return data->event.description();
338}
339QString OEffectiveEvent::location()const {
340 return data->event.location();
341}
342QString OEffectiveEvent::note()const {
343 return data->event.note();
344}
345OEvent OEffectiveEvent::event()const {
346 return data->event;
347}
348QTime OEffectiveEvent::startTime()const {
349 return data->start;
350}
351QTime OEffectiveEvent::endTime()const {
352 return data->end;
353}
354QDate OEffectiveEvent::date()const {
355 return data->date;
356}
357int OEffectiveEvent::length()const {
358 return (data->end.hour() * 60 - data->start.hour() * 60)
359 + QABS(data->start.minute() - data->end.minute() );
360}
361int OEffectiveEvent::size()const {
362 return ( data->end.hour() - data->start.hour() ) * 3600
363 + (data->end.minute() - data->start.minute() * 60
364 + data->end.second() - data->start.second() );
365}
366QDate OEffectiveEvent::startDate()const {
367 if ( data->dates )
368 return data->startDate;
369 else if ( data->event.hasRecurrence() ) // single day, since multi-day should have a d pointer
370 return data->date;
371 else
372 return data->event.startDateTime().date();
373}
374QDate OEffectiveEvent::endDate()const {
375 if ( data->dates )
376 return data->endDate;
377 else if ( data->event.hasRecurrence() )
378 return data->date;
379 else
380 return data->event.endDateTime().date();
381}
382void OEffectiveEvent::deref() {
383 if ( data->deref() ) {
384 delete data;
385 data = 0;
386 }
387}
388void OEffectiveEvent::changeOrModify() {
389 if ( data->count != 1 ) {
390 data->deref();
391 Data* d2 = new Data;
392 d2->event = data->event;
393 d2->date = data->date;
394 d2->start = data->start;
395 d2->end = data->end;
396 d2->startDate = data->startDate;
397 d2->endDate = data->endDate;
398 d2->dates = data->dates;
399 data = d2;
400 }
401}
402bool OEffectiveEvent::operator<( const OEffectiveEvent &e ) const{
403 if ( data->date < e.date() )
404 return TRUE;
405 if ( data->date == e.date() )
406 return ( startTime() < e.startTime() );
407 else
408 return FALSE;
409}
410bool OEffectiveEvent::operator<=( const OEffectiveEvent &e ) const{
411 return (data->date <= e.date() );
412}
413bool OEffectiveEvent::operator==( const OEffectiveEvent &e ) const {
414 return ( date() == e.date()
415 && startTime() == e.startTime()
416 && endTime()== e.endTime()
417 && event() == e.event() );
418}
419bool OEffectiveEvent::operator!=( const OEffectiveEvent &e ) const {
420 return !(*this == e );
421}
422bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const {
423 return !(*this <= e );
424}
425bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const {
426 return !(*this < e);
427}
diff --git a/libopie2/opiepim/oevent.h b/libopie2/opiepim/oevent.h
new file mode 100644
index 0000000..4489be7
--- a/dev/null
+++ b/libopie2/opiepim/oevent.h
@@ -0,0 +1,198 @@
1// CONTAINS GPLed code of TT
2
3#ifndef OPIE_PIM_EVENT_H
4#define OPIE_PIM_EVENT_H
5
6#include <qstring.h>
7#include <qdatetime.h>
8#include <qvaluelist.h>
9
10#include <qpe/recordfields.h>
11#include <qpe/palmtopuidgen.h>
12
13#include "otimezone.h"
14#include "opimrecord.h"
15
16namespace OCalendarHelper {
17 /** calculate the week number of the date */
18 static int week( const QDate& );
19 /** calculate the occurence of week days since the start of the month */
20 static int ocurrence( const QDate& );
21
22 // returns the dayOfWeek for the *first* day it finds (ignores
23 // any further days!). Returns 1 (Monday) if there isn't any day found
24 static int dayOfWeek( char day );
25
26 /** returns the diff of month */
27 static int monthDiff( const QDate& first, const QDate& second );
28
29}
30
31class OPimNotifyManager;
32class ORecur;
33class OEvent : public OPimRecord {
34public:
35 typedef QValueList<OEvent> ValueList;
36 enum RecordFields {
37 Uid = Qtopia::UID_ID,
38 Category = Qtopia::CATEGORY_ID,
39 Description,
40 Location,
41 Alarm,
42 Reminder,
43 Recurrence,
44 Note,
45 Created,
46 StartDate,
47 EndDate,
48 AllDay,
49 TimeZone
50 };
51
52 OEvent(int uid = 0);
53 OEvent( const OEvent& );
54 ~OEvent();
55 OEvent &operator=( const OEvent& );
56
57 QString description()const;
58 void setDescription( const QString& description );
59
60 QString location()const;
61 void setLocation( const QString& loc );
62
63 bool hasNotifiers()const;
64 OPimNotifyManager &notifiers();
65
66 ORecur recurrence()const;
67 void setRecurrence( const ORecur& );
68 bool hasRecurrence()const;
69
70 QString note()const;
71 void setNote( const QString& note );
72
73
74 QDateTime createdDateTime()const;
75 void setCreatedDateTime( const QDateTime& dt);
76
77 /** set the date to dt. dt is the QDateTime in localtime */
78 void setStartDateTime( const QDateTime& );
79 /** returns the datetime in the local timeZone */
80 QDateTime startDateTime()const;
81
82 /** returns the start datetime in the current zone */
83 QDateTime startDateTimeInZone()const;
84
85 /** in current timezone */
86 void setEndDateTime( const QDateTime& );
87 /** in current timezone */
88 QDateTime endDateTime()const;
89 QDateTime endDateTimeInZone()const;
90
91 bool isMultipleDay()const;
92 bool isAllDay()const;
93 void setAllDay( bool isAllDay );
94
95 /* pin this event to a timezone! FIXME */
96 void setTimeZone( const QString& timeZone );
97 QString timeZone()const;
98
99
100 bool match( const QRegExp& )const;
101
102
103
104
105 /* needed reimp */
106 QString toRichText()const;
107 QString toShortText()const;
108 QString type()const;
109
110 QMap<int, QString> toMap()const;
111 QMap<QString, QString> toExtraMap()const;
112 QString recordField(int )const;
113
114 static int rtti();
115
116 bool loadFromStream( QDataStream& );
117 bool saveToStream( QDataStream& )const;
118
119/* bool operator==( const OEvent& );
120 bool operator!=( const OEvent& );
121 bool operator<( const OEvent& );
122 bool operator<=( const OEvent& );
123 bool operator>( const OEvent& );
124 bool operator>=(const OEvent& );
125*/
126private:
127 inline void changeOrModify();
128 void deref();
129 struct Data;
130 Data* data;
131 class Private;
132 Private* priv;
133
134};
135
136/**
137 * AN Event can span through multiple days. We split up a multiday eve
138 */
139
140class OEffectiveEvent {
141public:
142 QValueList<OEffectiveEvent> ValueList;
143 enum Position { MidWay, Start, End, StartEnd };
144 // If we calculate the effective event of a multi-day event
145 // we have to figure out whether we are at the first day,
146 // at the end, or anywhere else ("middle"). This is important
147 // for the start/end times (00:00/23:59)
148 // MidWay: 00:00 -> 23:59, as we are "in the middle" of a multi-
149 // day event
150 // Start: start time -> 23:59
151 // End: 00:00 -> end time
152 // Start | End == StartEnd: for single-day events (default)
153 // here we draw start time -> end time
154 OEffectiveEvent();
155 OEffectiveEvent( const OEvent& event, const QDate& startDate, Position pos = StartEnd );
156 OEffectiveEvent( const OEffectiveEvent& );
157 OEffectiveEvent &operator=(const OEffectiveEvent& );
158 ~OEffectiveEvent();
159
160 void setStartTime( const QTime& );
161 void setEndTime( const QTime& );
162 void setEvent( const OEvent& );
163 void setDate( const QDate& );
164
165 void setEffectiveDates( const QDate& from, const QDate& to );
166
167 QString description()const;
168 QString location()const;
169 QString note()const;
170 OEvent event()const;
171 QTime startTime()const;
172 QTime endTime()const;
173 QDate date()const;
174
175 /* return the length in hours */
176 int length()const;
177 int size()const;
178
179 QDate startDate()const;
180 QDate endDate()const;
181
182 bool operator<( const OEffectiveEvent &e ) const;
183 bool operator<=( const OEffectiveEvent &e ) const;
184 bool operator==( const OEffectiveEvent &e ) const;
185 bool operator!=( const OEffectiveEvent &e ) const;
186 bool operator>( const OEffectiveEvent &e ) const;
187 bool operator>= ( const OEffectiveEvent &e ) const;
188
189private:
190 void deref();
191 inline void changeOrModify();
192 class Private;
193 Private* priv;
194 struct Data;
195 Data* data;
196
197};
198#endif
diff --git a/libopie2/opiepim/otodo.cpp b/libopie2/opiepim/otodo.cpp
index b4d4aa9..049359e 100644
--- a/libopie2/opiepim/otodo.cpp
+++ b/libopie2/opiepim/otodo.cpp
@@ -87,336 +87,338 @@ OTodo::OTodo(bool completed, int priority,
87{ 87{
88// qWarning("OTodoData" + summary); 88// qWarning("OTodoData" + summary);
89 setCategories( idsFromString( category.join(";") ) ); 89 setCategories( idsFromString( category.join(";") ) );
90 90
91 data = new OTodoData; 91 data = new OTodoData;
92 92
93 data->date = date; 93 data->date = date;
94 data->isCompleted = completed; 94 data->isCompleted = completed;
95 data->hasDate = hasDate; 95 data->hasDate = hasDate;
96 data->priority = priority; 96 data->priority = priority;
97 data->sum = summary; 97 data->sum = summary;
98 data->prog = progress; 98 data->prog = progress;
99 data->desc = Qtopia::simplifyMultiLineSpace(description ); 99 data->desc = Qtopia::simplifyMultiLineSpace(description );
100} 100}
101bool OTodo::match( const QRegExp &regExp )const 101bool OTodo::match( const QRegExp &regExp )const
102{ 102{
103 if( QString::number( data->priority ).find( regExp ) != -1 ){ 103 if( QString::number( data->priority ).find( regExp ) != -1 ){
104 return true; 104 return true;
105 }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){ 105 }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){
106 return true; 106 return true;
107 }else if(data->desc.find( regExp ) != -1 ){ 107 }else if(data->desc.find( regExp ) != -1 ){
108 return true; 108 return true;
109 }else if(data->sum.find( regExp ) != -1 ) { 109 }else if(data->sum.find( regExp ) != -1 ) {
110 return true; 110 return true;
111 } 111 }
112 return false; 112 return false;
113} 113}
114bool OTodo::isCompleted() const 114bool OTodo::isCompleted() const
115{ 115{
116 return data->isCompleted; 116 return data->isCompleted;
117} 117}
118bool OTodo::hasDueDate() const 118bool OTodo::hasDueDate() const
119{ 119{
120 return data->hasDate; 120 return data->hasDate;
121} 121}
122bool OTodo::hasStartDate()const { 122bool OTodo::hasStartDate()const {
123 return data->start.isValid(); 123 return data->start.isValid();
124} 124}
125bool OTodo::hasCompletedDate()const { 125bool OTodo::hasCompletedDate()const {
126 return data->completed.isValid(); 126 return data->completed.isValid();
127} 127}
128int OTodo::priority()const 128int OTodo::priority()const
129{ 129{
130 return data->priority; 130 return data->priority;
131} 131}
132QString OTodo::summary() const 132QString OTodo::summary() const
133{ 133{
134 return data->sum; 134 return data->sum;
135} 135}
136ushort OTodo::progress() const 136ushort OTodo::progress() const
137{ 137{
138 return data->prog; 138 return data->prog;
139} 139}
140QDate OTodo::dueDate()const 140QDate OTodo::dueDate()const
141{ 141{
142 return data->date; 142 return data->date;
143} 143}
144QDate OTodo::startDate()const { 144QDate OTodo::startDate()const {
145 return data->start; 145 return data->start;
146} 146}
147QDate OTodo::completedDate()const { 147QDate OTodo::completedDate()const {
148 return data->completed; 148 return data->completed;
149} 149}
150QString OTodo::description()const 150QString OTodo::description()const
151{ 151{
152 return data->desc; 152 return data->desc;
153} 153}
154OPimState OTodo::state()const { 154OPimState OTodo::state()const {
155 return data->state; 155 return data->state;
156} 156}
157ORecur OTodo::recurrence()const { 157ORecur OTodo::recurrence()const {
158 return data->recur; 158 return data->recur;
159} 159}
160OPimMaintainer OTodo::maintainer()const { 160OPimMaintainer OTodo::maintainer()const {
161 return data->maintainer; 161 return data->maintainer;
162} 162}
163void OTodo::setCompleted( bool completed ) 163void OTodo::setCompleted( bool completed )
164{ 164{
165 changeOrModify(); 165 changeOrModify();
166 data->isCompleted = completed; 166 data->isCompleted = completed;
167} 167}
168void OTodo::setHasDueDate( bool hasDate ) 168void OTodo::setHasDueDate( bool hasDate )
169{ 169{
170 changeOrModify(); 170 changeOrModify();
171 data->hasDate = hasDate; 171 data->hasDate = hasDate;
172} 172}
173void OTodo::setDescription(const QString &desc ) 173void OTodo::setDescription(const QString &desc )
174{ 174{
175// qWarning( "desc " + desc ); 175// qWarning( "desc " + desc );
176 changeOrModify(); 176 changeOrModify();
177 data->desc = Qtopia::simplifyMultiLineSpace(desc ); 177 data->desc = Qtopia::simplifyMultiLineSpace(desc );
178} 178}
179void OTodo::setSummary( const QString& sum ) 179void OTodo::setSummary( const QString& sum )
180{ 180{
181 changeOrModify(); 181 changeOrModify();
182 data->sum = sum; 182 data->sum = sum;
183} 183}
184void OTodo::setPriority(int prio ) 184void OTodo::setPriority(int prio )
185{ 185{
186 changeOrModify(); 186 changeOrModify();
187 data->priority = prio; 187 data->priority = prio;
188} 188}
189void OTodo::setDueDate( const QDate& date ) 189void OTodo::setDueDate( const QDate& date )
190{ 190{
191 changeOrModify(); 191 changeOrModify();
192 data->date = date; 192 data->date = date;
193} 193}
194void OTodo::setStartDate( const QDate& date ) { 194void OTodo::setStartDate( const QDate& date ) {
195 changeOrModify(); 195 changeOrModify();
196 data->start = date; 196 data->start = date;
197} 197}
198void OTodo::setCompletedDate( const QDate& date ) { 198void OTodo::setCompletedDate( const QDate& date ) {
199 changeOrModify(); 199 changeOrModify();
200 data->completed = date; 200 data->completed = date;
201} 201}
202void OTodo::setState( const OPimState& state ) { 202void OTodo::setState( const OPimState& state ) {
203 changeOrModify(); 203 changeOrModify();
204 data->state = state; 204 data->state = state;
205} 205}
206void OTodo::setRecurrence( const ORecur& rec) { 206void OTodo::setRecurrence( const ORecur& rec) {
207 changeOrModify(); 207 changeOrModify();
208 data->recur = rec; 208 data->recur = rec;
209} 209}
210void OTodo::setMaintainer( const OPimMaintainer& pim ) { 210void OTodo::setMaintainer( const OPimMaintainer& pim ) {
211 changeOrModify(); 211 changeOrModify();
212 data->maintainer = pim; 212 data->maintainer = pim;
213} 213}
214bool OTodo::isOverdue( ) 214bool OTodo::isOverdue( )
215{ 215{
216 if( data->hasDate && !data->isCompleted) 216 if( data->hasDate && !data->isCompleted)
217 return QDate::currentDate() > data->date; 217 return QDate::currentDate() > data->date;
218 return false; 218 return false;
219} 219}
220void OTodo::setProgress(ushort progress ) 220void OTodo::setProgress(ushort progress )
221{ 221{
222 changeOrModify(); 222 changeOrModify();
223 data->prog = progress; 223 data->prog = progress;
224} 224}
225QString OTodo::toShortText() const { 225QString OTodo::toShortText() const {
226 return summary(); 226 return summary();
227} 227}
228/*! 228/*!
229 Returns a richt text string 229 Returns a richt text string
230*/ 230*/
231QString OTodo::toRichText() const 231QString OTodo::toRichText() const
232{ 232{
233 QString text; 233 QString text;
234 QStringList catlist; 234 QStringList catlist;
235 235
236 // Description of the todo 236 // Description of the todo
237 if ( !summary().isEmpty() ) { 237 if ( !summary().isEmpty() ) {
238 text += "<b>" + QObject::tr( "Summary:") + "</b><br>"; 238 text += "<b>" + QObject::tr( "Summary:") + "</b><br>";
239 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 239 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
240 } 240 }
241 if( !description().isEmpty() ){ 241 if( !description().isEmpty() ){
242 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 242 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
243 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ; 243 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ;
244 } 244 }
245 text += "<br><br><br>"; 245 text += "<br><br><br>";
246 246
247 text += "<b>" + QObject::tr( "Priority:") +" </b>" 247 text += "<b>" + QObject::tr( "Priority:") +" </b>"
248 + QString::number( priority() ) + " <br>"; 248 + QString::number( priority() ) + " <br>";
249 text += "<b>" + QObject::tr( "Progress:") + " </b>" 249 text += "<b>" + QObject::tr( "Progress:") + " </b>"
250 + QString::number( progress() ) + " %<br>"; 250 + QString::number( progress() ) + " %<br>";
251 if (hasDueDate() ){ 251 if (hasDueDate() ){
252 text += "<b>" + QObject::tr( "Deadline:") + " </b>"; 252 text += "<b>" + QObject::tr( "Deadline:") + " </b>";
253 text += dueDate().toString(); 253 text += dueDate().toString();
254 text += "<br>"; 254 text += "<br>";
255 } 255 }
256 256
257 text += "<b>" + QObject::tr( "Category:") + "</b> "; 257 text += "<b>" + QObject::tr( "Category:") + "</b> ";
258 text += categoryNames( "Todo List" ).join(", "); 258 text += categoryNames( "Todo List" ).join(", ");
259 text += "<br>"; 259 text += "<br>";
260 260
261 return text; 261 return text;
262} 262}
263OPimNotifyManager& OTodo::notifiers() { 263OPimNotifyManager& OTodo::notifiers() {
264 return data->notifiers; 264 return data->notifiers;
265} 265}
266 266
267bool OTodo::operator<( const OTodo &toDoEvent )const{ 267bool OTodo::operator<( const OTodo &toDoEvent )const{
268 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 268 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
269 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 269 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
270 if( hasDueDate() && toDoEvent.hasDueDate() ){ 270 if( hasDueDate() && toDoEvent.hasDueDate() ){
271 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 271 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
272 return priority() < toDoEvent.priority(); 272 return priority() < toDoEvent.priority();
273 }else{ 273 }else{
274 return dueDate() < toDoEvent.dueDate(); 274 return dueDate() < toDoEvent.dueDate();
275 } 275 }
276 } 276 }
277 return false; 277 return false;
278} 278}
279bool OTodo::operator<=(const OTodo &toDoEvent )const 279bool OTodo::operator<=(const OTodo &toDoEvent )const
280{ 280{
281 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 281 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
282 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true; 282 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true;
283 if( hasDueDate() && toDoEvent.hasDueDate() ){ 283 if( hasDueDate() && toDoEvent.hasDueDate() ){
284 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 284 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
285 return priority() <= toDoEvent.priority(); 285 return priority() <= toDoEvent.priority();
286 }else{ 286 }else{
287 return dueDate() <= toDoEvent.dueDate(); 287 return dueDate() <= toDoEvent.dueDate();
288 } 288 }
289 } 289 }
290 return true; 290 return true;
291} 291}
292bool OTodo::operator>(const OTodo &toDoEvent )const 292bool OTodo::operator>(const OTodo &toDoEvent )const
293{ 293{
294 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; 294 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false;
295 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 295 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
296 if( hasDueDate() && toDoEvent.hasDueDate() ){ 296 if( hasDueDate() && toDoEvent.hasDueDate() ){
297 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 297 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
298 return priority() > toDoEvent.priority(); 298 return priority() > toDoEvent.priority();
299 }else{ 299 }else{
300 return dueDate() > toDoEvent.dueDate(); 300 return dueDate() > toDoEvent.dueDate();
301 } 301 }
302 } 302 }
303 return false; 303 return false;
304} 304}
305bool OTodo::operator>=(const OTodo &toDoEvent )const 305bool OTodo::operator>=(const OTodo &toDoEvent )const
306{ 306{
307 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 307 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
308 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 308 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
309 if( hasDueDate() && toDoEvent.hasDueDate() ){ 309 if( hasDueDate() && toDoEvent.hasDueDate() ){
310 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 310 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
311 return priority() > toDoEvent.priority(); 311 return priority() > toDoEvent.priority();
312 }else{ 312 }else{
313 return dueDate() > toDoEvent.dueDate(); 313 return dueDate() > toDoEvent.dueDate();
314 } 314 }
315 } 315 }
316 return true; 316 return true;
317} 317}
318bool OTodo::operator==(const OTodo &toDoEvent )const 318bool OTodo::operator==(const OTodo &toDoEvent )const
319{ 319{
320 if ( data->priority != toDoEvent.data->priority ) return false; 320 if ( data->priority != toDoEvent.data->priority ) return false;
321 if ( data->priority != toDoEvent.data->prog ) return false; 321 if ( data->priority != toDoEvent.data->prog ) return false;
322 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; 322 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false;
323 if ( data->hasDate != toDoEvent.data->hasDate ) return false; 323 if ( data->hasDate != toDoEvent.data->hasDate ) return false;
324 if ( data->date != toDoEvent.data->date ) return false; 324 if ( data->date != toDoEvent.data->date ) return false;
325 if ( data->sum != toDoEvent.data->sum ) return false; 325 if ( data->sum != toDoEvent.data->sum ) return false;
326 if ( data->desc != toDoEvent.data->desc ) return false; 326 if ( data->desc != toDoEvent.data->desc ) return false;
327 if ( data->maintainer != toDoEvent.data->maintainer ) 327 if ( data->maintainer != toDoEvent.data->maintainer )
328 return false; 328 return false;
329 329
330 return OPimRecord::operator==( toDoEvent ); 330 return OPimRecord::operator==( toDoEvent );
331} 331}
332void OTodo::deref() { 332void OTodo::deref() {
333 333
334// qWarning("deref in ToDoEvent"); 334// qWarning("deref in ToDoEvent");
335 if ( data->deref() ) { 335 if ( data->deref() ) {
336// qWarning("deleting"); 336// qWarning("deleting");
337 delete data; 337 delete data;
338 data= 0; 338 data= 0;
339 } 339 }
340} 340}
341OTodo &OTodo::operator=(const OTodo &item ) 341OTodo &OTodo::operator=(const OTodo &item )
342{ 342{
343 if ( *this == item ) return *this;
344
343 OPimRecord::operator=( item ); 345 OPimRecord::operator=( item );
344 //qWarning("operator= ref "); 346 //qWarning("operator= ref ");
345 item.data->ref(); 347 item.data->ref();
346 deref(); 348 deref();
347 data = item.data; 349 data = item.data;
348 350
349 return *this; 351 return *this;
350} 352}
351 353
352QMap<int, QString> OTodo::toMap() const { 354QMap<int, QString> OTodo::toMap() const {
353 QMap<int, QString> map; 355 QMap<int, QString> map;
354 356
355 map.insert( Uid, QString::number( uid() ) ); 357 map.insert( Uid, QString::number( uid() ) );
356 map.insert( Category, idsToString( categories() ) ); 358 map.insert( Category, idsToString( categories() ) );
357 map.insert( HasDate, QString::number( data->hasDate ) ); 359 map.insert( HasDate, QString::number( data->hasDate ) );
358 map.insert( Completed, QString::number( data->isCompleted ) ); 360 map.insert( Completed, QString::number( data->isCompleted ) );
359 map.insert( Description, data->desc ); 361 map.insert( Description, data->desc );
360 map.insert( Summary, data->sum ); 362 map.insert( Summary, data->sum );
361 map.insert( Priority, QString::number( data->priority ) ); 363 map.insert( Priority, QString::number( data->priority ) );
362 map.insert( DateDay, QString::number( data->date.day() ) ); 364 map.insert( DateDay, QString::number( data->date.day() ) );
363 map.insert( DateMonth, QString::number( data->date.month() ) ); 365 map.insert( DateMonth, QString::number( data->date.month() ) );
364 map.insert( DateYear, QString::number( data->date.year() ) ); 366 map.insert( DateYear, QString::number( data->date.year() ) );
365 map.insert( Progress, QString::number( data->prog ) ); 367 map.insert( Progress, QString::number( data->prog ) );
366// map.insert( CrossReference, crossToString() ); 368// map.insert( CrossReference, crossToString() );
367 /* FIXME!!! map.insert( State, ); 369 /* FIXME!!! map.insert( State, );
368 map.insert( Recurrence, ); 370 map.insert( Recurrence, );
369 map.insert( Reminders, ); 371 map.insert( Reminders, );
370 map. 372 map.
371 */ 373 */
372 return map; 374 return map;
373} 375}
374 376
375QMap<QString, QString> OTodo::toExtraMap()const { 377QMap<QString, QString> OTodo::toExtraMap()const {
376 return data->extra; 378 return data->extra;
377} 379}
378/** 380/**
379 * change or modify looks at the ref count and either 381 * change or modify looks at the ref count and either
380 * creates a new QShared Object or it can modify it 382 * creates a new QShared Object or it can modify it
381 * right in place 383 * right in place
382 */ 384 */
383void OTodo::changeOrModify() { 385void OTodo::changeOrModify() {
384 if ( data->count != 1 ) { 386 if ( data->count != 1 ) {
385 qWarning("changeOrModify"); 387 qWarning("changeOrModify");
386 data->deref(); 388 data->deref();
387 OTodoData* d2 = new OTodoData(); 389 OTodoData* d2 = new OTodoData();
388 copy(data, d2 ); 390 copy(data, d2 );
389 data = d2; 391 data = d2;
390 } 392 }
391} 393}
392// WATCHOUT 394// WATCHOUT
393/* 395/*
394 * if you add something to the Data struct 396 * if you add something to the Data struct
395 * be sure to copy it here 397 * be sure to copy it here
396 */ 398 */
397void OTodo::copy( OTodoData* src, OTodoData* dest ) { 399void OTodo::copy( OTodoData* src, OTodoData* dest ) {
398 dest->date = src->date; 400 dest->date = src->date;
399 dest->isCompleted = src->isCompleted; 401 dest->isCompleted = src->isCompleted;
400 dest->hasDate = src->hasDate; 402 dest->hasDate = src->hasDate;
401 dest->priority = src->priority; 403 dest->priority = src->priority;
402 dest->desc = src->desc; 404 dest->desc = src->desc;
403 dest->sum = src->sum; 405 dest->sum = src->sum;
404 dest->extra = src->extra; 406 dest->extra = src->extra;
405 dest->prog = src->prog; 407 dest->prog = src->prog;
406 dest->state = src->state; 408 dest->state = src->state;
407 dest->recur = src->recur; 409 dest->recur = src->recur;
408 dest->maintainer = src->maintainer; 410 dest->maintainer = src->maintainer;
409 dest->start = src->start; 411 dest->start = src->start;
410 dest->completed = src->completed; 412 dest->completed = src->completed;
411 dest->notifiers = src->notifiers; 413 dest->notifiers = src->notifiers;
412} 414}
413QString OTodo::type() const { 415QString OTodo::type() const {
414 return QString::fromLatin1("OTodo"); 416 return QString::fromLatin1("OTodo");
415} 417}
416QString OTodo::recordField(int /*id*/ )const { 418QString OTodo::recordField(int /*id*/ )const {
417 return QString::null; 419 return QString::null;
418} 420}
419 421
420int OTodo::rtti(){ 422int OTodo::rtti(){
421 return OPimResolver::TodoList; 423 return OPimResolver::TodoList;
422} 424}