summaryrefslogtreecommitdiff
path: root/libopie/pim
Unidiff
Diffstat (limited to 'libopie/pim') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/opimaccessbackend.h28
-rw-r--r--libopie/pim/opimaccesstemplate.h53
-rw-r--r--libopie/pim/orecordlist.h29
-rw-r--r--libopie/pim/otemplatebase.h2
-rw-r--r--libopie/pim/otodo.cpp15
-rw-r--r--libopie/pim/otodo.h10
-rw-r--r--libopie/pim/otodoaccess.cpp71
-rw-r--r--libopie/pim/otodoaccess.h79
-rw-r--r--libopie/pim/otodoaccessbackend.cpp10
-rw-r--r--libopie/pim/otodoaccessbackend.h18
-rw-r--r--libopie/pim/otodoaccessxml.cpp362
-rw-r--r--libopie/pim/otodoaccessxml.h53
12 files changed, 665 insertions, 65 deletions
diff --git a/libopie/pim/opimaccessbackend.h b/libopie/pim/opimaccessbackend.h
index 5707b58..c27acbb 100644
--- a/libopie/pim/opimaccessbackend.h
+++ b/libopie/pim/opimaccessbackend.h
@@ -20,21 +20,21 @@ public:
20 OPimAccessBackend(); 20 OPimAccessBackend();
21 virtual ~OPimAccessBackend(); 21 virtual ~OPimAccessBackend();
22 22
23 /** 23 /**
24 * load the resource 24 * load the resource
25 */ 25 */
26 virtual void load() = 0; 26 virtual bool load() = 0;
27 27
28 /** 28 /**
29 * reload the resource 29 * reload the resource
30 */ 30 */
31 virtual void reload() = 0; 31 virtual bool reload() = 0;
32 32
33 /** 33 /**
34 * save the resource and 34 * save the resource and
35 * all it's changes 35 * all it's changes
36 */ 36 */
37 virtual void save() = 0; 37 virtual bool save() = 0;
38 38
39 /** 39 /**
40 * return an array of 40 * return an array of
@@ -42,5 +42,5 @@ public:
42 */ 42 */
43 virtual QArray<int> allRecords()const = 0; 43 virtual QArray<int> allRecords()const = 0;
44 44
45 /** 45 /**
46 * queryByExample for T with the SortOrder 46 * queryByExample for T with the SortOrder
@@ -48,26 +48,26 @@ public:
48 */ 48 */
49 virtual QArray<int> queryByExample( const T& t, int sort ) = 0; 49 virtual QArray<int> queryByExample( const T& t, int sort ) = 0;
50 50
51 /** 51 /**
52 * find the OPimRecord with uid @param uid 52 * find the OPimRecord with uid @param uid
53 * returns T and T.isEmpty() if nothing was found 53 * returns T and T.isEmpty() if nothing was found
54 */ 54 */
55 virtual T find(int uid ) = 0; 55 virtual T find(int uid )const = 0;
56 56
57 /** 57 /**
58 * clear the back end 58 * clear the back end
59 */ 59 */
60 virtual void clear() = 0; 60 virtual void clear() = 0;
61 61
62 /** 62 /**
63 * add T 63 * add T
64 */ 64 */
65 virtual bool add( const T& t ) = 0; 65 virtual bool add( const T& t ) = 0;
66 66
67 /** 67 /**
68 * remove 68 * remove
69 */ 69 */
70 virtual bool remove( int uid ) = 0; 70 virtual bool remove( int uid ) = 0;
71 71
72 /** 72 /**
73 * replace a record with T.uid() 73 * replace a record with T.uid()
diff --git a/libopie/pim/opimaccesstemplate.h b/libopie/pim/opimaccesstemplate.h
index 36f5a99..31ab516 100644
--- a/libopie/pim/opimaccesstemplate.h
+++ b/libopie/pim/opimaccesstemplate.h
@@ -15,5 +15,5 @@
15 * interface or you want to implement 15 * interface or you want to implement
16 * your own Access lib 16 * your own Access lib
17 * Just create a OPimRecord and inherit from 17 * Just create a OPimRecord and inherit from
18 * the plugins 18 * the plugins
19 */ 19 */
@@ -37,19 +37,19 @@ public:
37 OPimAccessTemplate( BackEnd* end); 37 OPimAccessTemplate( BackEnd* end);
38 virtual ~OPimAccessTemplate(); 38 virtual ~OPimAccessTemplate();
39 39
40 /** 40 /**
41 * load from the backend 41 * load from the backend
42 */ 42 */
43 virtual void load(); 43 virtual bool load();
44 44
45 /** 45 /**
46 * reload from the backend 46 * reload from the backend
47 */ 47 */
48 virtual void reload(); 48 virtual bool reload();
49 49
50 /** 50 /**
51 * save to the backend 51 * save to the backend
52 */ 52 */
53 virtual void save(); 53 virtual bool save();
54 54
55 /** 55 /**
@@ -57,5 +57,5 @@ public:
57 */ 57 */
58 bool wasChangedExternally()const; 58 bool wasChangedExternally()const;
59 59
60 /** 60 /**
61 * return a List of records 61 * return a List of records
@@ -63,14 +63,14 @@ public:
63 */ 63 */
64 virtual List allRecords()const; 64 virtual List allRecords()const;
65 65
66 /** 66 /**
67 * queryByExample 67 * queryByExample
68 */ 68 */
69 virtual List queryByExample( const T& t, int sortOrder ); 69 virtual List queryByExample( const T& t, int sortOrder );
70 70
71 /** 71 /**
72 * find the OPimRecord uid 72 * find the OPimRecord uid
73 */ 73 */
74 virtual T find( int uid ); 74 virtual T find( int uid )const;
75 75
76 /* invalidate cache here */ 76 /* invalidate cache here */
@@ -79,5 +79,5 @@ public:
79 */ 79 */
80 virtual void clear() ; 80 virtual void clear() ;
81 81
82 /** 82 /**
83 * add T to the backend 83 * add T to the backend
@@ -90,10 +90,10 @@ public:
90 */ 90 */
91 virtual bool remove( const T& t ); 91 virtual bool remove( const T& t );
92 92
93 /** 93 /**
94 * remove the OPimRecord with uid 94 * remove the OPimRecord with uid
95 */ 95 */
96 virtual bool remove( int uid ); 96 virtual bool remove( int uid );
97 97
98 /** 98 /**
99 * replace T from backend 99 * replace T from backend
@@ -105,5 +105,6 @@ protected:
105 */ 105 */
106 void invalidateCache(); 106 void invalidateCache();
107 107
108 void setBackEnd( BackEnd* end );
108 /** 109 /**
109 * returns the backend 110 * returns the backend
@@ -126,14 +127,14 @@ OPimAccessTemplate<T>::~OPimAccessTemplate() {
126} 127}
127template <class T> 128template <class T>
128void OPimAccessTemplate<T>::load() { 129bool OPimAccessTemplate<T>::load() {
129 m_backEnd->load(); 130 return m_backEnd->load();
130} 131}
131template <class T> 132template <class T>
132void OPimAccessTemplate<T>::reload() { 133bool OPimAccessTemplate<T>::reload() {
133 m_backEnd->reload(); 134 return m_backEnd->reload();
134} 135}
135template <class T> 136template <class T>
136void OPimAccessTemplate<T>::save() { 137bool OPimAccessTemplate<T>::save() {
137 m_backEnd->save(); 138 return m_backEnd->save();
138} 139}
139template <class T> 140template <class T>
@@ -152,5 +153,5 @@ OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) {
152} 153}
153template <class T> 154template <class T>
154T OPimAccessTemplate<T>::find( int uid ) { 155T OPimAccessTemplate<T>::find( int uid ) const{
155 T t = m_backEnd->find( uid ); 156 T t = m_backEnd->find( uid );
156 return t; 157 return t;
@@ -189,3 +190,7 @@ bool OPimAccessTemplate<T>::wasChangedExternally()const {
189 return false; 190 return false;
190} 191}
192template <class T>
193void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) {
194 m_backEnd = end;
195}
191#endif 196#endif
diff --git a/libopie/pim/orecordlist.h b/libopie/pim/orecordlist.h
index 3b30a73..75bb33c 100644
--- a/libopie/pim/orecordlist.h
+++ b/libopie/pim/orecordlist.h
@@ -15,9 +15,11 @@
15 * doSomeCoolStuff( (*it) ); 15 * doSomeCoolStuff( (*it) );
16 */ 16 */
17template <class T> class ORecordList;
17template <class T = OPimRecord> 18template <class T = OPimRecord>
18class ORecordListIterator { 19class ORecordListIterator {
20 friend class ORecordList<T>;
19public: 21public:
20 typedef OTemplateBase<T> Base; 22 typedef OTemplateBase<T> Base;
21 23
22 /** 24 /**
23 * The c'tor used internally from 25 * The c'tor used internally from
@@ -25,5 +27,5 @@ public:
25 */ 27 */
26 ORecordListIterator( const QArray<int>, const Base* ); 28 ORecordListIterator( const QArray<int>, const Base* );
27 29
28 /** 30 /**
29 * The standard c'tor 31 * The standard c'tor
@@ -31,10 +33,10 @@ public:
31 ORecordListIterator(); 33 ORecordListIterator();
32 ~ORecordListIterator(); 34 ~ORecordListIterator();
33 35
34 ORecordListIterator( const ORecordListIterator& ); 36 ORecordListIterator( const ORecordListIterator& );
35 ORecordListIterator &operator=(const ORecordListIterator& ); 37 ORecordListIterator &operator=(const ORecordListIterator& );
36 38
37 /** 39 /**
38 * a * operator ;) 40 * a * operator ;)
39 * use it like this T = (*it); 41 * use it like this T = (*it);
40 */ 42 */
@@ -60,5 +62,5 @@ private:
60 * The recordlist used as a return type 62 * The recordlist used as a return type
61 * from OPimAccessTemplate 63 * from OPimAccessTemplate
62 */ 64 */
63template <class T = OPimRecord > 65template <class T = OPimRecord >
64class ORecordList { 66class ORecordList {
@@ -66,6 +68,6 @@ public:
66 typedef OTemplateBase<T> Base; 68 typedef OTemplateBase<T> Base;
67 typedef ORecordListIterator<T> Iterator; 69 typedef ORecordListIterator<T> Iterator;
68 70
69 /** 71 /**
70 * c'tor 72 * c'tor
71 */ 73 */
@@ -73,10 +75,10 @@ public:
73 const Base* ); 75 const Base* );
74 ~ORecordList(); 76 ~ORecordList();
75 77
76 /** 78 /**
77 * the first iterator 79 * the first iterator
78 */ 80 */
79 Iterator begin(); 81 Iterator begin();
80 82
81 /** 83 /**
82 * the end 84 * the end
@@ -106,4 +108,5 @@ ORecordListIterator<T>::~ORecordListIterator() {
106template <class T> 108template <class T>
107ORecordListIterator<T>::ORecordListIterator( const ORecordListIterator<T>& it) { 109ORecordListIterator<T>::ORecordListIterator( const ORecordListIterator<T>& it) {
110 qWarning("ORecordListIterator");
108 m_uids = it.m_uids; 111 m_uids = it.m_uids;
109 m_current = it.m_current; 112 m_current = it.m_current;
@@ -126,4 +129,5 @@ ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIter
126template <class T> 129template <class T>
127T &ORecordListIterator<T>::operator*() { 130T &ORecordListIterator<T>::operator*() {
131 qWarning("operator* %d %d", m_current, m_uids[m_current] );
128 if (!m_end ) 132 if (!m_end )
129 m_record = m_temp->find( m_uids[m_current] ); 133 m_record = m_temp->find( m_uids[m_current] );
@@ -136,5 +140,5 @@ T &ORecordListIterator<T>::operator*() {
136template <class T> 140template <class T>
137ORecordListIterator<T> &ORecordListIterator<T>::operator++() { 141ORecordListIterator<T> &ORecordListIterator<T>::operator++() {
138 if (m_current < m_uids.count() ) { 142 if (m_current < (int)m_uids.count() ) {
139 m_end = false; 143 m_end = false;
140 ++m_current; 144 ++m_current;
@@ -190,4 +194,5 @@ ORecordList<T>::~ORecordList() {
190template <class T> 194template <class T>
191ORecordList<T>::Iterator ORecordList<T>::begin() { 195ORecordList<T>::Iterator ORecordList<T>::begin() {
196 qWarning("ORecordList::begin");
192 Iterator it( m_ids, m_acc ); 197 Iterator it( m_ids, m_acc );
193 return it; 198 return it;
@@ -198,4 +203,6 @@ ORecordList<T>::Iterator ORecordList<T>::end() {
198 it.m_end = true; 203 it.m_end = true;
199 it.m_current = m_ids.count(); 204 it.m_current = m_ids.count();
205
206 return it;
200} 207}
201#endif 208#endif
diff --git a/libopie/pim/otemplatebase.h b/libopie/pim/otemplatebase.h
index add1de4..f71417b 100644
--- a/libopie/pim/otemplatebase.h
+++ b/libopie/pim/otemplatebase.h
@@ -14,5 +14,5 @@ public:
14 virtual ~OTemplateBase() { 14 virtual ~OTemplateBase() {
15 } 15 }
16 virtual T find( int uid ) = 0; 16 virtual T find( int uid )const = 0;
17 17
18}; 18};
diff --git a/libopie/pim/otodo.cpp b/libopie/pim/otodo.cpp
index 8239ba6..b3c14e6 100644
--- a/libopie/pim/otodo.cpp
+++ b/libopie/pim/otodo.cpp
@@ -37,9 +37,10 @@ OTodo::OTodo(const OTodo &event )
37{ 37{
38 data->ref(); 38 data->ref();
39 //qWarning("ref up"); 39 qWarning("ref up");
40} 40}
41OTodo::~OTodo() { 41OTodo::~OTodo() {
42 qWarning("~OTodo " + data->sum );
42 if ( data->deref() ) { 43 if ( data->deref() ) {
43 //qWarning("OTodo::dereffing"); 44 qWarning("OTodo::dereffing");
44 delete data; 45 delete data;
45 data = 0l; 46 data = 0l;
@@ -54,7 +55,9 @@ OTodo::OTodo(bool completed, int priority,
54 : OPimRecord( uid ) 55 : OPimRecord( uid )
55{ 56{
56 //qWarning("OTodoData"); 57 qWarning("OTodoData " + summary);
57 setCategories( category ); 58 setCategories( category );
59
58 data = new OTodoData; 60 data = new OTodoData;
61
59 data->date = date; 62 data->date = date;
60 data->isCompleted = completed; 63 data->isCompleted = completed;
@@ -75,8 +78,10 @@ OTodo::OTodo(bool completed, int priority,
75 : OPimRecord( uid ) 78 : OPimRecord( uid )
76{ 79{
77 //qWarning("OTodoData"); 80 qWarning("OTodoData" + summary);
78 setCategories( idsFromString( category.join(";") ) ); 81 setCategories( idsFromString( category.join(";") ) );
82
79 data = new OTodoData; 83 data = new OTodoData;
80 data->date = date; 84 data->date = date;
85
81 data->isCompleted = completed; 86 data->isCompleted = completed;
82 data->hasDate = hasDate; 87 data->hasDate = hasDate;
@@ -351,5 +356,5 @@ QMap<QString, QString> OTodo::toExtraMap()const {
351void OTodo::changeOrModify() { 356void OTodo::changeOrModify() {
352 if ( data->count != 1 ) { 357 if ( data->count != 1 ) {
353 //qWarning("changeOrModify"); 358 qWarning("changeOrModify");
354 data->deref(); 359 data->deref();
355 OTodoData* d2 = new OTodoData(); 360 OTodoData* d2 = new OTodoData();
diff --git a/libopie/pim/otodo.h b/libopie/pim/otodo.h
index 75af44c..1443e4f 100644
--- a/libopie/pim/otodo.h
+++ b/libopie/pim/otodo.h
@@ -136,14 +136,4 @@ public:
136 136
137 /** 137 /**
138 * returns a list of apps which have related items
139 */
140 QStringList relatedApps()const;
141
142 /**
143 * returns all relations for one app
144 */
145 QArray<int> relations( const QString& app )const;
146
147 /**
148 * toMap puts all data into the map. int relates 138 * toMap puts all data into the map. int relates
149 * to ToDoEvent RecordFields enum 139 * to ToDoEvent RecordFields enum
diff --git a/libopie/pim/otodoaccess.cpp b/libopie/pim/otodoaccess.cpp
new file mode 100644
index 0000000..a65cf5c
--- a/dev/null
+++ b/libopie/pim/otodoaccess.cpp
@@ -0,0 +1,71 @@
1#include <qdatetime.h>
2
3#include <qpe/alarmserver.h>
4
5#include "otodoaccessxml.h"
6#include "otodoaccess.h"
7
8
9OTodoAccess::OTodoAccess( OTodoAccessBackend* end )
10 : QObject(), OPimAccessTemplate<OTodo>( end ), m_todoBackEnd( end )
11{
12 if (end == 0l )
13 m_todoBackEnd = new OTodoAccessXML( "Todolist" );
14
15 setBackEnd( m_todoBackEnd );
16}
17OTodoAccess::~OTodoAccess() {
18 qWarning("~OTodoAccess");
19}
20void OTodoAccess::mergeWith( const QValueList<OTodo>& list ) {
21 QValueList<OTodo>::ConstIterator it;
22 for ( it = list.begin(); it != list.end(); ++it ) {
23 replace( (*it) );
24 }
25}
26OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start,
27 const QDate& end,
28 bool includeNoDates ) {
29 QArray<int> ints = m_todoBackEnd->effectiveToDos( start, end, includeNoDates );
30
31 List lis( ints, this );
32 return lis;
33}
34OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start,
35 bool includeNoDates ) {
36 return effectiveToDos( start, QDate::currentDate(),
37 includeNoDates );
38}
39OTodoAccess::List OTodoAccess::overDue() {
40 List lis( m_todoBackEnd->overDue(), this );
41 return lis;
42}
43void OTodoAccess::addAlarm( const OTodo& event) {
44 if (!event.hasAlarmDateTime() )
45 return;
46
47 QDateTime now = QDateTime::currentDateTime();
48 QDateTime schedule = event.alarmDateTime();
49
50 if ( schedule > now ){
51 AlarmServer::addAlarm( schedule,
52 "QPE/Application/todolist",
53 "alarm(QDateTime,int)", event.uid() );
54
55 }
56}
57void OTodoAccess::delAlarm( int uid) {
58
59 QDateTime schedule; // Create null DateTime
60
61 // I hope this will remove all scheduled alarms
62 // with the given uid !?
63 // If not: I have to rethink how to remove already
64 // scheduled events... (se)
65 // it should be fine -zecke
66 qWarning("Removing alarm for event with uid %d", uid );
67 AlarmServer::deleteAlarm( schedule ,
68 "QPE/Application/todolist",
69 "alarm(QDateTime,int)", uid );
70}
71
diff --git a/libopie/pim/otodoaccess.h b/libopie/pim/otodoaccess.h
new file mode 100644
index 0000000..c43efe9
--- a/dev/null
+++ b/libopie/pim/otodoaccess.h
@@ -0,0 +1,79 @@
1#ifndef OPIE_TODO_ACCESS_H
2#define OPIE_TODO_ACCESS_H
3
4#include <qobject.h>
5#include <qvaluelist.h>
6
7#include "otodo.h"
8#include "otodoaccessbackend.h"
9#include "opimaccesstemplate.h"
10
11
12/**
13 * OTodoAccess
14 * the class to get access to
15 * the todolist
16 */
17class OTodoAccess : public QObject, public OPimAccessTemplate<OTodo> {
18 Q_OBJECT
19public:
20 /**
21 * if you use 0l
22 * the default resource will be
23 * icked up
24 */
25 OTodoAccess( OTodoAccessBackend* = 0l);
26 ~OTodoAccess();
27
28
29 /* our functions here */
30 /**
31 * include todos from start to end
32 * includeNoDates whether or not to include
33 * events with no dates
34 */
35 List effectiveToDos( const QDate& start,
36 const QDate& end,
37 bool includeNoDates = true );
38
39 /**
40 * start
41 * end date taken from the currentDate()
42 */
43 List effectiveToDos( const QDate& start,
44 bool includeNoDates = true );
45
46
47 /**
48 * return overdue OTodos
49 */
50 List overDue();
51 /**
52 * merge a list of OTodos into
53 * the resource
54 */
55 void mergeWith( const QValueList<OTodo>& );
56
57 /**
58 * add an Alarm to the AlarmServer
59 */
60 void addAlarm( const OTodo& );
61
62 /**
63 * delete an alarm with the uid from
64 * the alarm server
65 */
66 void delAlarm( int uid );
67
68signals:
69 /**
70 * if the OTodoAccess was changed
71 */
72 void signalChanged( const OTodoAccess* );
73private:
74 OTodoAccessBackend* m_todoBackEnd;
75 class OTodoAccessPrivate;
76 OTodoAccessPrivate* d;
77};
78
79#endif
diff --git a/libopie/pim/otodoaccessbackend.cpp b/libopie/pim/otodoaccessbackend.cpp
new file mode 100644
index 0000000..baaeecc
--- a/dev/null
+++ b/libopie/pim/otodoaccessbackend.cpp
@@ -0,0 +1,10 @@
1
2#include "otodoaccessbackend.h"
3
4OTodoAccessBackend::OTodoAccessBackend()
5 : OPimAccessBackend<OTodo>()
6{
7}
8OTodoAccessBackend::~OTodoAccessBackend() {
9
10}
diff --git a/libopie/pim/otodoaccessbackend.h b/libopie/pim/otodoaccessbackend.h
new file mode 100644
index 0000000..ebe2189
--- a/dev/null
+++ b/libopie/pim/otodoaccessbackend.h
@@ -0,0 +1,18 @@
1#ifndef OPIE_TODO_ACCESS_BACKEND_H
2#define OPIE_TODO_ACCESS_BACKEND_H
3
4#include "otodo.h"
5#include "opimaccessbackend.h"
6
7class OTodoAccessBackend : public OPimAccessBackend<OTodo> {
8public:
9 OTodoAccessBackend();
10 ~OTodoAccessBackend();
11 virtual QArray<int> effectiveToDos( const QDate& start,
12 const QDate& end,
13 bool includeNoDates ) = 0;
14 virtual QArray<int> overDue() = 0;
15
16};
17
18#endif
diff --git a/libopie/pim/otodoaccessxml.cpp b/libopie/pim/otodoaccessxml.cpp
new file mode 100644
index 0000000..21756c9
--- a/dev/null
+++ b/libopie/pim/otodoaccessxml.cpp
@@ -0,0 +1,362 @@
1#include <qfile.h>
2
3#include <qpe/global.h>
4#include <qpe/stringutil.h>
5#include <qpe/timeconversion.h>
6
7#include <opie/xmltree.h>
8
9#include "otodoaccessxml.h"
10
11OTodoAccessXML::OTodoAccessXML( const QString& appName,
12 const QString& fileName )
13 : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false )
14{
15 if (!fileName.isEmpty() )
16 m_file = fileName;
17 else
18 m_file = Global::applicationFileName( "todolist", "todolist.xml" );
19}
20OTodoAccessXML::~OTodoAccessXML() {
21
22}
23bool OTodoAccessXML::load() {
24 m_opened = false;
25 m_changed = false;
26 /* initialize dict */
27 /*
28 * UPDATE dict if you change anything!!!
29 */
30 QAsciiDict<int> dict(15);
31 dict.setAutoDelete( TRUE );
32 dict.insert("Categories" , new int(OTodo::Category) );
33 dict.insert("Uid" , new int(OTodo::Uid) );
34 dict.insert("HasDate" , new int(OTodo::HasDate) );
35 dict.insert("Completed" , new int(OTodo::Completed) );
36 dict.insert("Description" , new int(OTodo::Description) );
37 dict.insert("Summary" , new int(OTodo::Summary) );
38 dict.insert("Priority" , new int(OTodo::Priority) );
39 dict.insert("DateDay" , new int(OTodo::DateDay) );
40 dict.insert("DateMonth" , new int(OTodo::DateMonth) );
41 dict.insert("DateYear" , new int(OTodo::DateYear) );
42 dict.insert("Progress" , new int(OTodo::Progress) );
43 dict.insert("Completed", new int(OTodo::Completed) );
44 dict.insert("CrossReference", new int(OTodo::CrossReference) );
45 dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) );
46 dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) );
47
48 Opie::XMLElement *root = Opie::XMLElement::load( m_file );
49 int day, year, month;
50 day = year = month = -1;
51
52 /* if opened */
53 if ( root != 0l ) {
54 Opie::XMLElement *element = root->firstChild();
55 if ( element == 0l )
56 return false;
57
58 element = element->firstChild();
59
60 while ( element ) {
61 if ( element->tagName() != QString::fromLatin1("Task") ) {
62 element = element->nextChild();
63 continue;
64 }
65 /* here is the right element for a task */
66 OTodo ev = todo( &dict, element );
67 m_events.insert( ev.uid(), ev );
68
69 element = element->nextChild();
70 }
71 return true;
72 }else {
73 qWarning("could not parse");
74 return false;;
75 }
76 delete root;
77
78 m_opened = true;
79 return true;
80}
81bool OTodoAccessXML::reload() {
82 return load();
83}
84bool OTodoAccessXML::save() {
85 if (!m_opened || !m_changed )
86 return true;
87 QString strNewFile = m_file + ".new";
88 QFile f( strNewFile );
89 if (!f.open( IO_WriteOnly|IO_Raw ) )
90 return false;
91
92 int written;
93 QString out;
94 out = "<!DOCTYPE Tasks>\n<Tasks>\n";
95
96 // for all todos
97 QMap<int, OTodo>::Iterator it;
98 for (it = m_events.begin(); it != m_events.end(); ++it ) {
99 out+= "<Task " + toString( (*it) ) + " />\n";
100 QCString cstr = out.utf8();
101 written = f.writeBlock( cstr.data(), cstr.length() );
102
103 /* less written then we wanted */
104 if ( written != (int)cstr.length() ) {
105 f.close();
106 QFile::remove( strNewFile );
107 return false;
108 }
109 out = QString::null;
110 }
111
112 out += "</Tasks>";
113 QCString cstr = out.utf8();
114 written = f.writeBlock( cstr.data(), cstr.length() );
115
116 if ( written != (int)cstr.length() ) {
117 f.close();
118 QFile::remove( strNewFile );
119 return false;
120 }
121 /* flush before renaming */
122 f.close();
123
124 if( ::rename( strNewFile.latin1(), m_file.latin1() ) < 0 ) {
125 qWarning("error renaming");
126 QFile::remove( strNewFile );
127 }
128
129 m_changed = false;
130 return true;
131}
132QArray<int> OTodoAccessXML::allRecords()const {
133 QArray<int> ids( m_events.count() );
134 QMap<int, OTodo>::ConstIterator it;
135 int i = 0;
136
137 for ( it = m_events.begin(); it != m_events.end(); ++it ) {
138 ids[i] = it.key();
139 i++;
140 }
141 return ids;
142}
143QArray<int> OTodoAccessXML::queryByExample( const OTodo&, int sort ) {
144 QArray<int> ids(0);
145 return ids;
146}
147OTodo OTodoAccessXML::find( int uid )const {
148 OTodo todo;
149 todo.setUid( 0 ); // isEmpty()
150 QMap<int, OTodo>::ConstIterator it = m_events.find( uid );
151 if ( it != m_events.end() )
152 todo = it.data();
153
154 return todo;
155}
156void OTodoAccessXML::clear() {
157 if (m_opened )
158 m_changed = true;
159
160 m_events.clear();
161}
162bool OTodoAccessXML::add( const OTodo& todo ) {
163 m_changed = true;
164 m_events.insert( todo.uid(), todo );
165
166 return true;
167}
168bool OTodoAccessXML::remove( int uid ) {
169 m_changed = true;
170 m_events.remove( uid );
171
172 return true;
173}
174bool OTodoAccessXML::replace( const OTodo& todo) {
175 m_changed = true;
176 m_events.replace( todo.uid(), todo );
177
178 return true;
179}
180QArray<int> OTodoAccessXML::effectiveToDos( const QDate& start,
181 const QDate& end,
182 bool includeNoDates ) {
183 QArray<int> ids( m_events.count() );
184 QMap<int, OTodo>::Iterator it;
185
186 int i = 0;
187 for ( it = m_events.begin(); it != m_events.end(); ++it ) {
188 if ( !it.data().hasDueDate() ) {
189 if ( includeNoDates ) {
190 ids[i] = it.key();
191 i++;
192 }
193 }else if ( it.data().dueDate() >= start &&
194 it.data().dueDate() <= end ) {
195 ids[i] = it.key();
196 i++;
197 }
198 }
199 ids.resize( i );
200 return ids;
201}
202QArray<int> OTodoAccessXML::overDue() {
203 QArray<int> ids( m_events.count() );
204 int i = 0;
205
206 QMap<int, OTodo>::Iterator it;
207 for ( it = m_events.begin(); it != m_events.end(); ++it ) {
208 if ( it.data().isOverdue() ) {
209 ids[i] = it.key();
210 i++;
211 }
212 }
213 ids.resize( i );
214 return ids;
215}
216
217
218/* private */
219OTodo OTodoAccessXML::todo( QAsciiDict<int>* dict, Opie::XMLElement* element)const {
220 qWarning("parse to do from XMLElement" );
221 OTodo ev;
222 QMap<QString, QString> attributes = element->attributes();
223 QMap<QString, QString>::Iterator it;
224
225 int *find=0;
226 int day, month, year;
227 day = month = year = -1;
228 for ( it = attributes.begin(); it != attributes.end(); ++it ) {
229 find = (*dict)[ it.key() ];
230 if (!find ) {
231 qWarning("Unknown option" + it.key() );
232 ev.setCustomField( it.key(), it.data() );
233 continue;
234 }
235
236 switch( *find ) {
237 case OTodo::Uid:
238 ev.setUid( it.data().toInt() );
239 break;
240 case OTodo::Category:
241 ev.setCategories( ev.idsFromString( it.data() ) );
242 break;
243 case OTodo::HasDate:
244 ev.setHasDueDate( it.data().toInt() );
245 break;
246 case OTodo::Completed:
247 ev.setCompleted( it.data().toInt() );
248 break;
249 case OTodo::Description:
250 ev.setDescription( it.data() );
251 break;
252 case OTodo::Summary:
253 ev.setSummary( it.data() );
254 break;
255 case OTodo::Priority:
256 ev.setPriority( it.data().toInt() );
257 break;
258 case OTodo::DateDay:
259 day = it.data().toInt();
260 break;
261 case OTodo::DateMonth:
262 month = it.data().toInt();
263 break;
264 case OTodo::DateYear:
265 year = it.data().toInt();
266 break;
267 case OTodo::Progress:
268 ev.setProgress( it.data().toInt() );
269 break;
270 case OTodo::CrossReference:
271 {
272 /*
273 * A cross refernce looks like
274 * appname,id;appname,id
275 * we need to split it up
276 */
277 QStringList refs = QStringList::split(';', it.data() );
278 QStringList::Iterator strIt;
279 for (strIt = refs.begin(); strIt != refs.end(); ++strIt ) {
280 int pos = (*strIt).find(',');
281 if ( pos > -1 )
282 ev.addRelation( (*strIt).left(pos), (*strIt).mid(pos+1).toInt() );
283
284 }
285 break;
286 }
287 case OTodo::HasAlarmDateTime:
288 ev.setHasAlarmDateTime( it.data().toInt() );
289 break;
290 case OTodo::AlarmDateTime: {
291 /* this sounds better ;) zecke */
292 ev.setAlarmDateTime( TimeConversion::fromISO8601( it.data().local8Bit() ) );
293 break;
294 }
295 default:
296 break;
297 }
298 }
299 if ( ev.hasDueDate() ) {
300 QDate date( year, month, day );
301 ev.setDueDate( date );
302 }
303
304 return ev;
305}
306QString OTodoAccessXML::toString( const OTodo& ev )const {
307 QString str;
308
309 str += "Completed=\"" + QString::number( ev.isCompleted() ) + "\" ";
310 str += "HasDate=\"" + QString::number( ev.hasDueDate() ) + "\" ";
311 str += "Priority=\"" + QString::number( ev.priority() ) + "\" ";
312 str += "Progress=\"" + QString::number(ev.progress() ) + "\" ";
313
314 str += "Categories=\"" + toString( ev.categories() ) + "\" ";
315 str += "Description=\"" + Qtopia::escapeString( ev.description() ) + "\" ";
316 str += "Summary=\"" + Qtopia::escapeString( ev.summary() ) + "\" ";
317
318 if ( ev.hasDueDate() ) {
319 str += "DateYear=\"" + QString::number( ev.dueDate().year() ) + "\" ";
320 str += "DateMonth=\"" + QString::number( ev.dueDate().month() ) + "\" ";
321 str += "DateDay=\"" + QString::number( ev.dueDate().day() ) + "\" ";
322 }
323 str += "Uid=\"" + QString::number( ev.uid() ) + "\" ";
324
325// append the extra options
326 /* FIXME Qtopia::Record this is currently not
327 * possible you can set custom fields
328 * but don' iterate over the list
329 * I may do #define private protected
330 * for this case - cough --zecke
331 */
332 /*
333 QMap<QString, QString> extras = ev.extras();
334 QMap<QString, QString>::Iterator extIt;
335 for (extIt = extras.begin(); extIt != extras.end(); ++extIt )
336 str += extIt.key() + "=\"" + extIt.data() + "\" ";
337 */
338 // cross refernce
339 QStringList list = ev.relatedApps();
340 QStringList::Iterator listIt;
341 QString refs;
342 str += "CrossReference=\"";
343 bool added = false;
344 for ( listIt = list.begin(); listIt != list.end(); ++listIt ) {
345 added = true;
346 QArray<int> ints = ev.relations( (*listIt) );
347 for ( uint i = 0; i< ints.count(); i++ ) {
348 str += (*listIt) + "," + QString::number( i ) + ";";
349 }
350 }
351 if ( added )
352 str = str.remove( str.length()-1, 1 );
353
354 str += "\" ";
355
356 str += "AlarmDateTime=\"" + TimeConversion::toISO8601( ev.alarmDateTime() ) + "\" ";
357
358 return str;
359}
360QString OTodoAccessXML::toString( const QArray<int>& ints ) const {
361 return Qtopia::Record::idsToString( ints );
362}
diff --git a/libopie/pim/otodoaccessxml.h b/libopie/pim/otodoaccessxml.h
new file mode 100644
index 0000000..be9109d
--- a/dev/null
+++ b/libopie/pim/otodoaccessxml.h
@@ -0,0 +1,53 @@
1#ifndef OPIE_TODO_ACCESS_XML_H
2#define OPIE_TODO_ACCESS_XML_H
3
4#include <qasciidict.h>
5#include <qmap.h>
6
7#include "otodoaccessbackend.h"
8
9namespace Opie {
10 class XMLElement;
11};
12
13class OTodoAccessXML : public OTodoAccessBackend {
14public:
15 /**
16 * fileName if Empty we will use the default path
17 */
18 OTodoAccessXML( const QString& appName,
19 const QString& fileName = QString::null );
20 ~OTodoAccessXML();
21
22 bool load();
23 bool reload();
24 bool save();
25
26 QArray<int> allRecords()const;
27 QArray<int> queryByExample( const OTodo&, int sort );
28 OTodo find( int uid )const;
29 void clear();
30 bool add( const OTodo& );
31 bool remove( int uid );
32 bool replace( const OTodo& );
33
34 /* our functions */
35 QArray<int> effectiveToDos( const QDate& start,
36 const QDate& end,
37 bool includeNoDates );
38 QArray<int> overDue();
39private:
40 OTodo todo( QAsciiDict<int>*, Opie::XMLElement* )const;
41 QString toString( const OTodo& )const;
42 QString toString( const QArray<int>& ints ) const;
43 QMap<int, OTodo> m_events;
44 QString m_file;
45 QString m_app;
46 bool m_opened : 1;
47 bool m_changed : 1;
48 class OTodoAccessXMLPrivate;
49 OTodoAccessXMLPrivate* d;
50
51};
52
53#endif