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
@@ -1,89 +1,89 @@
1#ifndef OPIE_PIM_ACCESS_BACKEND 1#ifndef OPIE_PIM_ACCESS_BACKEND
2#define OPIE_PIM_ACCESS_BACKEND 2#define OPIE_PIM_ACCESS_BACKEND
3 3
4#include <qarray.h> 4#include <qarray.h>
5 5
6#include <opie/opimrecord.h> 6#include <opie/opimrecord.h>
7 7
8 8
9/** 9/**
10 * OPimAccessBackend is the base class 10 * OPimAccessBackend is the base class
11 * for all private backends 11 * for all private backends
12 * it operates on OPimRecord as the base class 12 * it operates on OPimRecord as the base class
13 * and it's responsible for fast manipulating 13 * and it's responsible for fast manipulating
14 * the resource the implementation takes care 14 * the resource the implementation takes care
15 * of 15 * of
16 */ 16 */
17template <class T = OPimRecord> 17template <class T = OPimRecord>
18class OPimAccessBackend { 18class OPimAccessBackend {
19public: 19public:
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
41 * all available uids 41 * all available uids
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
47 * sort 47 * sort
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()
74 */ 74 */
75 virtual bool replace( const T& t ) = 0; 75 virtual bool replace( const T& t ) = 0;
76 76
77 77
78}; 78};
79 79
80template <class T> 80template <class T>
81OPimAccessBackend<T>::OPimAccessBackend() { 81OPimAccessBackend<T>::OPimAccessBackend() {
82 82
83} 83}
84template <class T> 84template <class T>
85OPimAccessBackend<T>::~OPimAccessBackend() { 85OPimAccessBackend<T>::~OPimAccessBackend() {
86 86
87} 87}
88 88
89#endif 89#endif
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
@@ -1,191 +1,196 @@
1#ifndef OPIE_PIM_ACCESS_TEMPLATE_H 1#ifndef OPIE_PIM_ACCESS_TEMPLATE_H
2#define OPIE_PIM_ACCESS_TEMPLATE_H 2#define OPIE_PIM_ACCESS_TEMPLATE_H
3 3
4#include <qarray.h> 4#include <qarray.h>
5 5
6#include <opie/opimrecord.h> 6#include <opie/opimrecord.h>
7#include <opie/opimaccessbackend.h> 7#include <opie/opimaccessbackend.h>
8#include <opie/orecordlist.h> 8#include <opie/orecordlist.h>
9 9
10#include "otemplatebase.h" 10#include "otemplatebase.h"
11 11
12/** 12/**
13 * Thats the frontend to our OPIE PIM 13 * Thats the frontend to our OPIE PIM
14 * Library. Either you want to use it's 14 * Library. Either you want to use it's
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 */
20 20
21template <class T = OPimRecord > 21template <class T = OPimRecord >
22class OPimAccessTemplate : public OTemplateBase<T> { 22class OPimAccessTemplate : public OTemplateBase<T> {
23public: 23public:
24 typedef ORecordList<T> List; 24 typedef ORecordList<T> List;
25 typedef OPimAccessBackend<T> BackEnd; 25 typedef OPimAccessBackend<T> BackEnd;
26 26
27 /** 27 /**
28 * our sort order 28 * our sort order
29 * should be safe explaining 29 * should be safe explaining
30 */ 30 */
31 enum SortOrder { WildCards = 0, IgnoreCase = 1, 31 enum SortOrder { WildCards = 0, IgnoreCase = 1,
32 RegExp = 2, ExactMatch = 4 }; 32 RegExp = 2, ExactMatch = 4 };
33 33
34 /** 34 /**
35 * c'tor BackEnd 35 * c'tor BackEnd
36 */ 36 */
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 /**
56 * if the resource was changed externally 56 * if the resource was changed externally
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
62 * you can iterate over them 62 * you can iterate over them
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 */
77 /** 77 /**
78 * clears the backend and invalidates the backend 78 * clears the backend and invalidates the backend
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
84 */ 84 */
85 virtual bool add( const T& t ) ; 85 virtual bool add( const T& t ) ;
86 86
87 /* only the uid matters */ 87 /* only the uid matters */
88 /** 88 /**
89 * remove T from the backend 89 * remove T from the backend
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
100 */ 100 */
101 virtual bool replace( const T& t) ; 101 virtual bool replace( const T& t) ;
102protected: 102protected:
103 /** 103 /**
104 * invalidate the cache 104 * invalidate the cache
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
110 */ 111 */
111 BackEnd* backEnd(); 112 BackEnd* backEnd();
112 BackEnd* m_backEnd; 113 BackEnd* m_backEnd;
113 114
114}; 115};
115 116
116template <class T> 117template <class T>
117OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) 118OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end )
118 : OTemplateBase<T>(), m_backEnd( end ) 119 : OTemplateBase<T>(), m_backEnd( end )
119{ 120{
120 121
121} 122}
122template <class T> 123template <class T>
123OPimAccessTemplate<T>::~OPimAccessTemplate() { 124OPimAccessTemplate<T>::~OPimAccessTemplate() {
124 qWarning("~OPimAccessTemplate<T>"); 125 qWarning("~OPimAccessTemplate<T>");
125 delete m_backEnd; 126 delete m_backEnd;
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>
140OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { 141OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const {
141 QArray<int> ints = m_backEnd->allRecords(); 142 QArray<int> ints = m_backEnd->allRecords();
142 List lis(ints, this ); 143 List lis(ints, this );
143 return lis; 144 return lis;
144} 145}
145template <class T> 146template <class T>
146OPimAccessTemplate<T>::List 147OPimAccessTemplate<T>::List
147OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { 148OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) {
148 QArray<int> ints = m_backEnd->queryByExample( t, sortOrder ); 149 QArray<int> ints = m_backEnd->queryByExample( t, sortOrder );
149 150
150 List lis(ints, this ); 151 List lis(ints, this );
151 return lis; 152 return lis;
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;
157} 158}
158template <class T> 159template <class T>
159void OPimAccessTemplate<T>::clear() { 160void OPimAccessTemplate<T>::clear() {
160 invalidateCache(); 161 invalidateCache();
161 m_backEnd->clear(); 162 m_backEnd->clear();
162} 163}
163template <class T> 164template <class T>
164bool OPimAccessTemplate<T>::add( const T& t ) { 165bool OPimAccessTemplate<T>::add( const T& t ) {
165 return m_backEnd->add( t ); 166 return m_backEnd->add( t );
166} 167}
167template <class T> 168template <class T>
168bool OPimAccessTemplate<T>::remove( const T& t ) { 169bool OPimAccessTemplate<T>::remove( const T& t ) {
169 return m_backEnd->remove( t.uid() ); 170 return m_backEnd->remove( t.uid() );
170} 171}
171template <class T> 172template <class T>
172bool OPimAccessTemplate<T>::remove( int uid ) { 173bool OPimAccessTemplate<T>::remove( int uid ) {
173 return m_backEnd->remove( uid ); 174 return m_backEnd->remove( uid );
174} 175}
175template <class T> 176template <class T>
176bool OPimAccessTemplate<T>::replace( const T& t ) { 177bool OPimAccessTemplate<T>::replace( const T& t ) {
177 return m_backEnd->replace( t ); 178 return m_backEnd->replace( t );
178} 179}
179template <class T> 180template <class T>
180void OPimAccessTemplate<T>::invalidateCache() { 181void OPimAccessTemplate<T>::invalidateCache() {
181 182
182} 183}
183template <class T> 184template <class T>
184OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() { 185OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() {
185 return m_backEnd; 186 return m_backEnd;
186} 187}
187template <class T> 188template <class T>
188bool OPimAccessTemplate<T>::wasChangedExternally()const { 189bool 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
@@ -1,201 +1,208 @@
1 1
2#ifndef OPIE_RECORD_LIST_H 2#ifndef OPIE_RECORD_LIST_H
3#define OPIE_RECORD_LIST_H 3#define OPIE_RECORD_LIST_H
4 4
5#include <qarray.h> 5#include <qarray.h>
6 6
7#include "otemplatebase.h" 7#include "otemplatebase.h"
8#include "opimrecord.h" 8#include "opimrecord.h"
9 9
10/** 10/**
11 * Our List Iterator 11 * Our List Iterator
12 * it behaves like STL or Qt 12 * it behaves like STL or Qt
13 * 13 *
14 * for(it = list.begin(); it != list.end(); ++it ) 14 * for(it = list.begin(); it != list.end(); ++it )
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
24 * ORecordList 26 * ORecordList
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
30 */ 32 */
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 */
41 T &operator*(); 43 T &operator*();
42 ORecordListIterator &operator++(); 44 ORecordListIterator &operator++();
43 ORecordListIterator &operator--(); 45 ORecordListIterator &operator--();
44 46
45 bool operator==( const ORecordListIterator& it ); 47 bool operator==( const ORecordListIterator& it );
46 bool operator!=( const ORecordListIterator& it ); 48 bool operator!=( const ORecordListIterator& it );
47 49
48private: 50private:
49 QArray<int> m_uids; 51 QArray<int> m_uids;
50 int m_current; 52 int m_current;
51 const Base* m_temp; 53 const Base* m_temp;
52 bool m_end : 1; 54 bool m_end : 1;
53 T m_record; 55 T m_record;
54 56
55 /* d pointer for future versions */ 57 /* d pointer for future versions */
56 class IteratorPrivate; 58 class IteratorPrivate;
57 IteratorPrivate *d; 59 IteratorPrivate *d;
58}; 60};
59/** 61/**
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 {
65public: 67public:
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 */
72 ORecordList( const QArray<int>& ids, 74 ORecordList( const QArray<int>& ids,
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
83 */ 85 */
84 Iterator end(); 86 Iterator end();
85 /* 87 /*
86 ConstIterator begin()const; 88 ConstIterator begin()const;
87 ConstIterator end()const; 89 ConstIterator end()const;
88 */ 90 */
89private: 91private:
90 QArray<int> m_ids; 92 QArray<int> m_ids;
91 const Base* m_acc; 93 const Base* m_acc;
92}; 94};
93 95
94/* ok now implement it */ 96/* ok now implement it */
95template <class T> 97template <class T>
96ORecordListIterator<T>::ORecordListIterator() { 98ORecordListIterator<T>::ORecordListIterator() {
97 m_current = 0; 99 m_current = 0;
98 m_temp = 0l; 100 m_temp = 0l;
99 m_end = true; 101 m_end = true;
100} 102}
101template <class T> 103template <class T>
102ORecordListIterator<T>::~ORecordListIterator() { 104ORecordListIterator<T>::~ORecordListIterator() {
103/* nothing to delete */ 105/* nothing to delete */
104} 106}
105 107
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;
110 m_temp = it.m_temp; 113 m_temp = it.m_temp;
111 m_end = it.m_end; 114 m_end = it.m_end;
112 m_record = it.m_record; 115 m_record = it.m_record;
113} 116}
114 117
115template <class T> 118template <class T>
116ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIterator<T>& it) { 119ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIterator<T>& it) {
117 m_uids = it.m_uids; 120 m_uids = it.m_uids;
118 m_current = it.m_current; 121 m_current = it.m_current;
119 m_temp = it.m_temp; 122 m_temp = it.m_temp;
120 m_end = it.m_end; 123 m_end = it.m_end;
121 m_record = it.m_record; 124 m_record = it.m_record;
122 125
123 return *this; 126 return *this;
124} 127}
125 128
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] );
130 else 134 else
131 m_record = T(); 135 m_record = T();
132 136
133 return m_record; 137 return m_record;
134} 138}
135 139
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;
141 }else 145 }else
142 m_end = true; 146 m_end = true;
143 147
144 return *this; 148 return *this;
145} 149}
146template <class T> 150template <class T>
147ORecordListIterator<T> &ORecordListIterator<T>::operator--() { 151ORecordListIterator<T> &ORecordListIterator<T>::operator--() {
148 if ( m_current > 0 ) { 152 if ( m_current > 0 ) {
149 --m_current; 153 --m_current;
150 m_end = false; 154 m_end = false;
151 } else 155 } else
152 m_end = true; 156 m_end = true;
153 157
154 return *this; 158 return *this;
155} 159}
156 160
157template <class T> 161template <class T>
158bool ORecordListIterator<T>::operator==( const ORecordListIterator<T>& it ) { 162bool ORecordListIterator<T>::operator==( const ORecordListIterator<T>& it ) {
159 163
160 /* if both are at we're the same.... */ 164 /* if both are at we're the same.... */
161 if ( m_end == it.m_end ) return true; 165 if ( m_end == it.m_end ) return true;
162 166
163 if ( m_uids != it.m_uids ) return false; 167 if ( m_uids != it.m_uids ) return false;
164 if ( m_current != it.m_current ) return false; 168 if ( m_current != it.m_current ) return false;
165 if ( m_temp != it.m_temp ) return false; 169 if ( m_temp != it.m_temp ) return false;
166 170
167 return true; 171 return true;
168} 172}
169template <class T> 173template <class T>
170bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it ) { 174bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it ) {
171 return !(*this == it ); 175 return !(*this == it );
172} 176}
173template <class T> 177template <class T>
174ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids, 178ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids,
175 const Base* t ) 179 const Base* t )
176 : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ) 180 : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false )
177{ 181{
178} 182}
179 183
180template <class T> 184template <class T>
181ORecordList<T>::ORecordList( const QArray<int>& ids, 185ORecordList<T>::ORecordList( const QArray<int>& ids,
182 const Base* acc ) 186 const Base* acc )
183 : m_ids( ids ), m_acc( acc ) 187 : m_ids( ids ), m_acc( acc )
184{ 188{
185} 189}
186template <class T> 190template <class T>
187ORecordList<T>::~ORecordList() { 191ORecordList<T>::~ORecordList() {
188/* nothing to do here */ 192/* nothing to do here */
189} 193}
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;
194} 199}
195template <class T> 200template <class T>
196ORecordList<T>::Iterator ORecordList<T>::end() { 201ORecordList<T>::Iterator ORecordList<T>::end() {
197 Iterator it( m_ids, m_acc ); 202 Iterator it( m_ids, m_acc );
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
@@ -1,21 +1,21 @@
1#ifndef OPIE_TEMPLATE_BASE_H 1#ifndef OPIE_TEMPLATE_BASE_H
2#define OPIE_TEMPLATE_BASE_H 2#define OPIE_TEMPLATE_BASE_H
3 3
4#include "opimrecord.h" 4#include "opimrecord.h"
5 5
6/** 6/**
7 * internal template base 7 * internal template base
8 */ 8 */
9template <class T = OPimRecord> 9template <class T = OPimRecord>
10class OTemplateBase { 10class OTemplateBase {
11public: 11public:
12 OTemplateBase() { 12 OTemplateBase() {
13 }; 13 };
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};
19 19
20 20
21#endif 21#endif
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
@@ -1,378 +1,383 @@
1 1
2#include <qobject.h> 2#include <qobject.h>
3#include <qshared.h> 3#include <qshared.h>
4 4
5 5
6 6
7#include <qpe/palmtopuidgen.h> 7#include <qpe/palmtopuidgen.h>
8#include <qpe/stringutil.h> 8#include <qpe/stringutil.h>
9#include <qpe/palmtoprecord.h> 9#include <qpe/palmtoprecord.h>
10#include <qpe/stringutil.h> 10#include <qpe/stringutil.h>
11#include <qpe/categories.h> 11#include <qpe/categories.h>
12#include <qpe/categoryselect.h> 12#include <qpe/categoryselect.h>
13 13
14 14
15 15
16#include "otodo.h" 16#include "otodo.h"
17 17
18 18
19struct OTodo::OTodoData : public QShared { 19struct OTodo::OTodoData : public QShared {
20 OTodoData() : QShared() { 20 OTodoData() : QShared() {
21 }; 21 };
22 22
23 QDate date; 23 QDate date;
24 bool isCompleted:1; 24 bool isCompleted:1;
25 bool hasDate:1; 25 bool hasDate:1;
26 int priority; 26 int priority;
27 QString desc; 27 QString desc;
28 QString sum; 28 QString sum;
29 QMap<QString, QString> extra; 29 QMap<QString, QString> extra;
30 ushort prog; 30 ushort prog;
31 bool hasAlarmDateTime :1; 31 bool hasAlarmDateTime :1;
32 QDateTime alarmDateTime; 32 QDateTime alarmDateTime;
33}; 33};
34 34
35OTodo::OTodo(const OTodo &event ) 35OTodo::OTodo(const OTodo &event )
36 : OPimRecord( event ), data( event.data ) 36 : OPimRecord( event ), data( event.data )
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;
46 } 47 }
47} 48}
48OTodo::OTodo(bool completed, int priority, 49OTodo::OTodo(bool completed, int priority,
49 const QArray<int> &category, 50 const QArray<int> &category,
50 const QString& summary, 51 const QString& summary,
51 const QString &description, 52 const QString &description,
52 ushort progress, 53 ushort progress,
53 bool hasDate, QDate date, int uid ) 54 bool hasDate, QDate date, int uid )
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;
61 data->hasDate = hasDate; 64 data->hasDate = hasDate;
62 data->priority = priority; 65 data->priority = priority;
63 data->sum = summary; 66 data->sum = summary;
64 data->prog = progress; 67 data->prog = progress;
65 data->desc = Qtopia::simplifyMultiLineSpace(description ); 68 data->desc = Qtopia::simplifyMultiLineSpace(description );
66 data->hasAlarmDateTime = false; 69 data->hasAlarmDateTime = false;
67 70
68} 71}
69OTodo::OTodo(bool completed, int priority, 72OTodo::OTodo(bool completed, int priority,
70 const QStringList &category, 73 const QStringList &category,
71 const QString& summary, 74 const QString& summary,
72 const QString &description, 75 const QString &description,
73 ushort progress, 76 ushort progress,
74 bool hasDate, QDate date, int uid ) 77 bool hasDate, QDate date, int uid )
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;
83 data->priority = priority; 88 data->priority = priority;
84 data->sum = summary; 89 data->sum = summary;
85 data->prog = progress; 90 data->prog = progress;
86 data->desc = Qtopia::simplifyMultiLineSpace(description ); 91 data->desc = Qtopia::simplifyMultiLineSpace(description );
87 data->hasAlarmDateTime = false; 92 data->hasAlarmDateTime = false;
88 93
89} 94}
90bool OTodo::match( const QRegExp &regExp )const 95bool OTodo::match( const QRegExp &regExp )const
91{ 96{
92 if( QString::number( data->priority ).find( regExp ) != -1 ){ 97 if( QString::number( data->priority ).find( regExp ) != -1 ){
93 return true; 98 return true;
94 }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){ 99 }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){
95 return true; 100 return true;
96 }else if(data->desc.find( regExp ) != -1 ){ 101 }else if(data->desc.find( regExp ) != -1 ){
97 return true; 102 return true;
98 }else if(data->sum.find( regExp ) != -1 ) { 103 }else if(data->sum.find( regExp ) != -1 ) {
99 return true; 104 return true;
100 } 105 }
101 return false; 106 return false;
102} 107}
103bool OTodo::isCompleted() const 108bool OTodo::isCompleted() const
104{ 109{
105 return data->isCompleted; 110 return data->isCompleted;
106} 111}
107bool OTodo::hasDueDate() const 112bool OTodo::hasDueDate() const
108{ 113{
109 return data->hasDate; 114 return data->hasDate;
110} 115}
111bool OTodo::hasAlarmDateTime() const 116bool OTodo::hasAlarmDateTime() const
112{ 117{
113 return data->hasAlarmDateTime; 118 return data->hasAlarmDateTime;
114} 119}
115int OTodo::priority()const 120int OTodo::priority()const
116{ 121{
117 return data->priority; 122 return data->priority;
118} 123}
119QString OTodo::summary() const 124QString OTodo::summary() const
120{ 125{
121 return data->sum; 126 return data->sum;
122} 127}
123ushort OTodo::progress() const 128ushort OTodo::progress() const
124{ 129{
125 return data->prog; 130 return data->prog;
126} 131}
127QDate OTodo::dueDate()const 132QDate OTodo::dueDate()const
128{ 133{
129 return data->date; 134 return data->date;
130} 135}
131 136
132QDateTime OTodo::alarmDateTime() const 137QDateTime OTodo::alarmDateTime() const
133{ 138{
134 return data->alarmDateTime; 139 return data->alarmDateTime;
135} 140}
136 141
137QString OTodo::description()const 142QString OTodo::description()const
138{ 143{
139 return data->desc; 144 return data->desc;
140} 145}
141void OTodo::setCompleted( bool completed ) 146void OTodo::setCompleted( bool completed )
142{ 147{
143 changeOrModify(); 148 changeOrModify();
144 data->isCompleted = completed; 149 data->isCompleted = completed;
145} 150}
146void OTodo::setHasDueDate( bool hasDate ) 151void OTodo::setHasDueDate( bool hasDate )
147{ 152{
148 changeOrModify(); 153 changeOrModify();
149 data->hasDate = hasDate; 154 data->hasDate = hasDate;
150} 155}
151void OTodo::setHasAlarmDateTime( bool hasAlarmDateTime ) 156void OTodo::setHasAlarmDateTime( bool hasAlarmDateTime )
152{ 157{
153 changeOrModify(); 158 changeOrModify();
154 data->hasAlarmDateTime = hasAlarmDateTime; 159 data->hasAlarmDateTime = hasAlarmDateTime;
155} 160}
156void OTodo::setDescription(const QString &desc ) 161void OTodo::setDescription(const QString &desc )
157{ 162{
158 changeOrModify(); 163 changeOrModify();
159 data->desc = Qtopia::simplifyMultiLineSpace(desc ); 164 data->desc = Qtopia::simplifyMultiLineSpace(desc );
160} 165}
161void OTodo::setSummary( const QString& sum ) 166void OTodo::setSummary( const QString& sum )
162{ 167{
163 changeOrModify(); 168 changeOrModify();
164 data->sum = sum; 169 data->sum = sum;
165} 170}
166void OTodo::setPriority(int prio ) 171void OTodo::setPriority(int prio )
167{ 172{
168 changeOrModify(); 173 changeOrModify();
169 data->priority = prio; 174 data->priority = prio;
170} 175}
171void OTodo::setDueDate( QDate date ) 176void OTodo::setDueDate( QDate date )
172{ 177{
173 changeOrModify(); 178 changeOrModify();
174 data->date = date; 179 data->date = date;
175} 180}
176void OTodo::setAlarmDateTime( const QDateTime& alarm ) 181void OTodo::setAlarmDateTime( const QDateTime& alarm )
177{ 182{
178 changeOrModify(); 183 changeOrModify();
179 data->alarmDateTime = alarm; 184 data->alarmDateTime = alarm;
180} 185}
181bool OTodo::isOverdue( ) 186bool OTodo::isOverdue( )
182{ 187{
183 if( data->hasDate ) 188 if( data->hasDate )
184 return QDate::currentDate() > data->date; 189 return QDate::currentDate() > data->date;
185 return false; 190 return false;
186} 191}
187void OTodo::setProgress(ushort progress ) 192void OTodo::setProgress(ushort progress )
188{ 193{
189 changeOrModify(); 194 changeOrModify();
190 data->prog = progress; 195 data->prog = progress;
191} 196}
192QString OTodo::toShortText() const { 197QString OTodo::toShortText() const {
193 return summary(); 198 return summary();
194} 199}
195/*! 200/*!
196 Returns a richt text string 201 Returns a richt text string
197*/ 202*/
198QString OTodo::toRichText() const 203QString OTodo::toRichText() const
199{ 204{
200 QString text; 205 QString text;
201 QStringList catlist; 206 QStringList catlist;
202 207
203 // Description of the todo 208 // Description of the todo
204 if ( !summary().isEmpty() ) { 209 if ( !summary().isEmpty() ) {
205 text += "<b>" + QObject::tr( "Summary:") + "</b><br>"; 210 text += "<b>" + QObject::tr( "Summary:") + "</b><br>";
206 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; 211 text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
207 } 212 }
208 if( !description().isEmpty() ){ 213 if( !description().isEmpty() ){
209 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; 214 text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
210 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ; 215 text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) ;
211 } 216 }
212 text += "<br><br><br>"; 217 text += "<br><br><br>";
213 218
214 text += "<b>" + QObject::tr( "Priority:") +" </b>" 219 text += "<b>" + QObject::tr( "Priority:") +" </b>"
215 + QString::number( priority() ) + " <br>"; 220 + QString::number( priority() ) + " <br>";
216 text += "<b>" + QObject::tr( "Progress:") + " </b>" 221 text += "<b>" + QObject::tr( "Progress:") + " </b>"
217 + QString::number( progress() ) + " %<br>"; 222 + QString::number( progress() ) + " %<br>";
218 if (hasDueDate() ){ 223 if (hasDueDate() ){
219 text += "<b>" + QObject::tr( "Deadline:") + " </b>"; 224 text += "<b>" + QObject::tr( "Deadline:") + " </b>";
220 text += dueDate().toString(); 225 text += dueDate().toString();
221 text += "<br>"; 226 text += "<br>";
222 } 227 }
223 if (hasAlarmDateTime() ){ 228 if (hasAlarmDateTime() ){
224 text += "<b>" + QObject::tr( "Alarmed Notification:") + " </b>"; 229 text += "<b>" + QObject::tr( "Alarmed Notification:") + " </b>";
225 text += alarmDateTime().toString(); 230 text += alarmDateTime().toString();
226 text += "<br>"; 231 text += "<br>";
227 } 232 }
228 233
229 text += "<b>" + QObject::tr( "Category:") + "</b> "; 234 text += "<b>" + QObject::tr( "Category:") + "</b> ";
230 text += categoryNames().join(", "); 235 text += categoryNames().join(", ");
231 text += "<br>"; 236 text += "<br>";
232 237
233 return text; 238 return text;
234} 239}
235 240
236bool OTodo::operator<( const OTodo &toDoEvent )const{ 241bool OTodo::operator<( const OTodo &toDoEvent )const{
237 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 242 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
238 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 243 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
239 if( hasDueDate() && toDoEvent.hasDueDate() ){ 244 if( hasDueDate() && toDoEvent.hasDueDate() ){
240 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 245 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
241 return priority() < toDoEvent.priority(); 246 return priority() < toDoEvent.priority();
242 }else{ 247 }else{
243 return dueDate() < toDoEvent.dueDate(); 248 return dueDate() < toDoEvent.dueDate();
244 } 249 }
245 } 250 }
246 return false; 251 return false;
247} 252}
248bool OTodo::operator<=(const OTodo &toDoEvent )const 253bool OTodo::operator<=(const OTodo &toDoEvent )const
249{ 254{
250 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 255 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
251 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true; 256 if( !hasDueDate() && toDoEvent.hasDueDate() ) return true;
252 if( hasDueDate() && toDoEvent.hasDueDate() ){ 257 if( hasDueDate() && toDoEvent.hasDueDate() ){
253 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 258 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
254 return priority() <= toDoEvent.priority(); 259 return priority() <= toDoEvent.priority();
255 }else{ 260 }else{
256 return dueDate() <= toDoEvent.dueDate(); 261 return dueDate() <= toDoEvent.dueDate();
257 } 262 }
258 } 263 }
259 return true; 264 return true;
260} 265}
261bool OTodo::operator>(const OTodo &toDoEvent )const 266bool OTodo::operator>(const OTodo &toDoEvent )const
262{ 267{
263 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; 268 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false;
264 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 269 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
265 if( hasDueDate() && toDoEvent.hasDueDate() ){ 270 if( hasDueDate() && toDoEvent.hasDueDate() ){
266 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 271 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
267 return priority() > toDoEvent.priority(); 272 return priority() > toDoEvent.priority();
268 }else{ 273 }else{
269 return dueDate() > toDoEvent.dueDate(); 274 return dueDate() > toDoEvent.dueDate();
270 } 275 }
271 } 276 }
272 return false; 277 return false;
273} 278}
274bool OTodo::operator>=(const OTodo &toDoEvent )const 279bool OTodo::operator>=(const OTodo &toDoEvent )const
275{ 280{
276 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; 281 if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true;
277 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; 282 if( !hasDueDate() && toDoEvent.hasDueDate() ) return false;
278 if( hasDueDate() && toDoEvent.hasDueDate() ){ 283 if( hasDueDate() && toDoEvent.hasDueDate() ){
279 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide 284 if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide
280 return priority() > toDoEvent.priority(); 285 return priority() > toDoEvent.priority();
281 }else{ 286 }else{
282 return dueDate() > toDoEvent.dueDate(); 287 return dueDate() > toDoEvent.dueDate();
283 } 288 }
284 } 289 }
285 return true; 290 return true;
286} 291}
287bool OTodo::operator==(const OTodo &toDoEvent )const 292bool OTodo::operator==(const OTodo &toDoEvent )const
288{ 293{
289 if ( data->priority != toDoEvent.data->priority ) return false; 294 if ( data->priority != toDoEvent.data->priority ) return false;
290 if ( data->priority != toDoEvent.data->prog ) return false; 295 if ( data->priority != toDoEvent.data->prog ) return false;
291 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; 296 if ( data->isCompleted != toDoEvent.data->isCompleted ) return false;
292 if ( data->hasDate != toDoEvent.data->hasDate ) return false; 297 if ( data->hasDate != toDoEvent.data->hasDate ) return false;
293 if ( data->date != toDoEvent.data->date ) return false; 298 if ( data->date != toDoEvent.data->date ) return false;
294 if ( data->sum != toDoEvent.data->sum ) return false; 299 if ( data->sum != toDoEvent.data->sum ) return false;
295 if ( data->desc != toDoEvent.data->desc ) return false; 300 if ( data->desc != toDoEvent.data->desc ) return false;
296 if ( data->hasAlarmDateTime != toDoEvent.data->hasAlarmDateTime ) 301 if ( data->hasAlarmDateTime != toDoEvent.data->hasAlarmDateTime )
297 return false; 302 return false;
298 if ( data->alarmDateTime != toDoEvent.data->alarmDateTime ) 303 if ( data->alarmDateTime != toDoEvent.data->alarmDateTime )
299 return false; 304 return false;
300 305
301 return OPimRecord::operator==( toDoEvent ); 306 return OPimRecord::operator==( toDoEvent );
302} 307}
303void OTodo::deref() { 308void OTodo::deref() {
304 309
305 //qWarning("deref in ToDoEvent"); 310 //qWarning("deref in ToDoEvent");
306 if ( data->deref() ) { 311 if ( data->deref() ) {
307 //qWarning("deleting"); 312 //qWarning("deleting");
308 delete data; 313 delete data;
309 d= 0; 314 d= 0;
310 } 315 }
311} 316}
312OTodo &OTodo::operator=(const OTodo &item ) 317OTodo &OTodo::operator=(const OTodo &item )
313{ 318{
314 OPimRecord::operator=( item ); 319 OPimRecord::operator=( item );
315 //qWarning("operator= ref "); 320 //qWarning("operator= ref ");
316 item.data->ref(); 321 item.data->ref();
317 deref(); 322 deref();
318 323
319 return *this; 324 return *this;
320} 325}
321 326
322QMap<int, QString> OTodo::toMap() const { 327QMap<int, QString> OTodo::toMap() const {
323 QMap<int, QString> map; 328 QMap<int, QString> map;
324 329
325 map.insert( Uid, QString::number( uid() ) ); 330 map.insert( Uid, QString::number( uid() ) );
326 map.insert( Category, idsToString( categories() ) ); 331 map.insert( Category, idsToString( categories() ) );
327 map.insert( HasDate, QString::number( data->hasDate ) ); 332 map.insert( HasDate, QString::number( data->hasDate ) );
328 map.insert( Completed, QString::number( data->isCompleted ) ); 333 map.insert( Completed, QString::number( data->isCompleted ) );
329 map.insert( Description, data->desc ); 334 map.insert( Description, data->desc );
330 map.insert( Summary, data->sum ); 335 map.insert( Summary, data->sum );
331 map.insert( Priority, QString::number( data->priority ) ); 336 map.insert( Priority, QString::number( data->priority ) );
332 map.insert( DateDay, QString::number( data->date.day() ) ); 337 map.insert( DateDay, QString::number( data->date.day() ) );
333 map.insert( DateMonth, QString::number( data->date.month() ) ); 338 map.insert( DateMonth, QString::number( data->date.month() ) );
334 map.insert( DateYear, QString::number( data->date.year() ) ); 339 map.insert( DateYear, QString::number( data->date.year() ) );
335 map.insert( Progress, QString::number( data->prog ) ); 340 map.insert( Progress, QString::number( data->prog ) );
336 map.insert( CrossReference, crossToString() ); 341 map.insert( CrossReference, crossToString() );
337 map.insert( HasAlarmDateTime, QString::number( data->hasAlarmDateTime ) ); 342 map.insert( HasAlarmDateTime, QString::number( data->hasAlarmDateTime ) );
338 map.insert( AlarmDateTime, data->alarmDateTime.toString() ); 343 map.insert( AlarmDateTime, data->alarmDateTime.toString() );
339 344
340 return map; 345 return map;
341} 346}
342 347
343QMap<QString, QString> OTodo::toExtraMap()const { 348QMap<QString, QString> OTodo::toExtraMap()const {
344 return data->extra; 349 return data->extra;
345} 350}
346/** 351/**
347 * change or modify looks at the ref count and either 352 * change or modify looks at the ref count and either
348 * creates a new QShared Object or it can modify it 353 * creates a new QShared Object or it can modify it
349 * right in place 354 * right in place
350 */ 355 */
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();
356 copy(data, d2 ); 361 copy(data, d2 );
357 data = d2; 362 data = d2;
358 } 363 }
359} 364}
360void OTodo::copy( OTodoData* src, OTodoData* dest ) { 365void OTodo::copy( OTodoData* src, OTodoData* dest ) {
361 dest->date = src->date; 366 dest->date = src->date;
362 dest->isCompleted = src->isCompleted; 367 dest->isCompleted = src->isCompleted;
363 dest->hasDate = src->hasDate; 368 dest->hasDate = src->hasDate;
364 dest->priority = src->priority; 369 dest->priority = src->priority;
365 dest->desc = src->desc; 370 dest->desc = src->desc;
366 dest->sum = src->sum; 371 dest->sum = src->sum;
367 dest->extra = src->extra; 372 dest->extra = src->extra;
368 dest->prog = src->prog; 373 dest->prog = src->prog;
369 dest->hasAlarmDateTime = src->hasAlarmDateTime; 374 dest->hasAlarmDateTime = src->hasAlarmDateTime;
370 dest->alarmDateTime = src->alarmDateTime; 375 dest->alarmDateTime = src->alarmDateTime;
371} 376}
372QString OTodo::type() const { 377QString OTodo::type() const {
373 return QString::fromLatin1("OTodo"); 378 return QString::fromLatin1("OTodo");
374} 379}
375QString OTodo::recordField(int id )const { 380QString OTodo::recordField(int id )const {
376 return QString::null; 381 return QString::null;
377} 382}
378 383
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
@@ -1,219 +1,209 @@
1 1
2#ifndef OPIE_TODO_EVENT_H 2#ifndef OPIE_TODO_EVENT_H
3#define OPIE_TODO_EVENT_H 3#define OPIE_TODO_EVENT_H
4 4
5 5
6#include <qarray.h> 6#include <qarray.h>
7#include <qmap.h> 7#include <qmap.h>
8#include <qregexp.h> 8#include <qregexp.h>
9#include <qstringlist.h> 9#include <qstringlist.h>
10#include <qdatetime.h> 10#include <qdatetime.h>
11#include <qvaluelist.h> 11#include <qvaluelist.h>
12 12
13#include <qpe/recordfields.h> 13#include <qpe/recordfields.h>
14#include <qpe/palmtopuidgen.h> 14#include <qpe/palmtopuidgen.h>
15 15
16#include <opie/opimrecord.h> 16#include <opie/opimrecord.h>
17 17
18 18
19class OTodo : public OPimRecord { 19class OTodo : public OPimRecord {
20public: 20public:
21 typedef QValueList<OTodo> ValueList; 21 typedef QValueList<OTodo> ValueList;
22 enum RecordFields { 22 enum RecordFields {
23 Uid = Qtopia::UID_ID, 23 Uid = Qtopia::UID_ID,
24 Category = Qtopia::CATEGORY_ID, 24 Category = Qtopia::CATEGORY_ID,
25 HasDate, 25 HasDate,
26 Completed, 26 Completed,
27 Description, 27 Description,
28 Summary, 28 Summary,
29 Priority, 29 Priority,
30 DateDay, 30 DateDay,
31 DateMonth, 31 DateMonth,
32 DateYear, 32 DateYear,
33 Progress, 33 Progress,
34 CrossReference, 34 CrossReference,
35 HasAlarmDateTime, 35 HasAlarmDateTime,
36 AlarmDateTime 36 AlarmDateTime
37 }; 37 };
38 public: 38 public:
39 // priorities from Very low to very high 39 // priorities from Very low to very high
40 enum TaskPriority { VeryHigh=1, High, Normal, Low, VeryLow }; 40 enum TaskPriority { VeryHigh=1, High, Normal, Low, VeryLow };
41 41
42 /* Constructs a new ToDoEvent 42 /* Constructs a new ToDoEvent
43 @param completed Is the TodoEvent completed 43 @param completed Is the TodoEvent completed
44 @param priority What is the priority of this ToDoEvent 44 @param priority What is the priority of this ToDoEvent
45 @param category Which category does it belong( uid ) 45 @param category Which category does it belong( uid )
46 @param summary A small summary of the todo 46 @param summary A small summary of the todo
47 @param description What is this ToDoEvent about 47 @param description What is this ToDoEvent about
48 @param hasDate Does this Event got a deadline 48 @param hasDate Does this Event got a deadline
49 @param date what is the deadline? 49 @param date what is the deadline?
50 @param uid what is the UUID of this Event 50 @param uid what is the UUID of this Event
51 **/ 51 **/
52 OTodo( bool completed = false, int priority = Normal, 52 OTodo( bool completed = false, int priority = Normal,
53 const QStringList &category = QStringList(), 53 const QStringList &category = QStringList(),
54 const QString &summary = QString::null , 54 const QString &summary = QString::null ,
55 const QString &description = QString::null, 55 const QString &description = QString::null,
56 ushort progress = 0, 56 ushort progress = 0,
57 bool hasDate = false, QDate date = QDate::currentDate(), 57 bool hasDate = false, QDate date = QDate::currentDate(),
58 int uid = 0 /*empty*/ ); 58 int uid = 0 /*empty*/ );
59 59
60 OTodo( bool completed, int priority, 60 OTodo( bool completed, int priority,
61 const QArray<int>& category, 61 const QArray<int>& category,
62 const QString& summary = QString::null, 62 const QString& summary = QString::null,
63 const QString& description = QString::null, 63 const QString& description = QString::null,
64 ushort progress = 0, 64 ushort progress = 0,
65 bool hasDate = false, QDate date = QDate::currentDate(), 65 bool hasDate = false, QDate date = QDate::currentDate(),
66 int uid = 0 /* empty */ ); 66 int uid = 0 /* empty */ );
67 67
68 /* Copy c'tor 68 /* Copy c'tor
69 69
70 **/ 70 **/
71 OTodo(const OTodo & ); 71 OTodo(const OTodo & );
72 72
73 /** 73 /**
74 *destructor 74 *destructor
75 */ 75 */
76 ~OTodo(); 76 ~OTodo();
77 77
78 /** 78 /**
79 * Is this event completed? 79 * Is this event completed?
80 */ 80 */
81 bool isCompleted() const; 81 bool isCompleted() const;
82 82
83 /** 83 /**
84 * Does this Event have a deadline 84 * Does this Event have a deadline
85 */ 85 */
86 bool hasDueDate() const; 86 bool hasDueDate() const;
87 87
88 /** 88 /**
89 * Does this Event has an alarm time ? 89 * Does this Event has an alarm time ?
90 */ 90 */
91 bool hasAlarmDateTime() const; 91 bool hasAlarmDateTime() const;
92 92
93 /** 93 /**
94 * What is the priority? 94 * What is the priority?
95 */ 95 */
96 int priority()const ; 96 int priority()const ;
97 97
98 /** 98 /**
99 * progress as ushort 0, 20, 40, 60, 80 or 100% 99 * progress as ushort 0, 20, 40, 60, 80 or 100%
100 */ 100 */
101 ushort progress() const; 101 ushort progress() const;
102 102
103 /** 103 /**
104 * The due Date 104 * The due Date
105 */ 105 */
106 QDate dueDate()const; 106 QDate dueDate()const;
107 107
108 /** 108 /**
109 * Alarm Date and Time 109 * Alarm Date and Time
110 */ 110 */
111 QDateTime alarmDateTime()const; 111 QDateTime alarmDateTime()const;
112 112
113 /** 113 /**
114 * The description of the todo 114 * The description of the todo
115 */ 115 */
116 QString description()const; 116 QString description()const;
117 117
118 /** 118 /**
119 * A small summary of the todo 119 * A small summary of the todo
120 */ 120 */
121 QString summary() const; 121 QString summary() const;
122 122
123 /** 123 /**
124 * @reimplemented 124 * @reimplemented
125 * Return this todoevent in a RichText formatted QString 125 * Return this todoevent in a RichText formatted QString
126 */ 126 */
127 QString toRichText() const; 127 QString toRichText() const;
128 128
129 /** 129 /**
130 * reimplementation 130 * reimplementation
131 */ 131 */
132 QString type()const; 132 QString type()const;
133 QString toShortText()const; 133 QString toShortText()const;
134 QMap<QString, QString> toExtraMap()const; 134 QMap<QString, QString> toExtraMap()const;
135 QString recordField(int id )const; 135 QString recordField(int id )const;
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
150 */ 140 */
151 QMap<int, QString> toMap()const; 141 QMap<int, QString> toMap()const;
152 142
153 /** 143 /**
154 * Set if this Todo is completed 144 * Set if this Todo is completed
155 */ 145 */
156 void setCompleted(bool completed ); 146 void setCompleted(bool completed );
157 147
158 /** 148 /**
159 * set if this todo got an end data 149 * set if this todo got an end data
160 */ 150 */
161 void setHasDueDate( bool hasDate ); 151 void setHasDueDate( bool hasDate );
162 152
163 /** 153 /**
164 * set if this todo has an alarm time and date 154 * set if this todo has an alarm time and date
165 */ 155 */
166 void setHasAlarmDateTime ( bool hasAlarm ); 156 void setHasAlarmDateTime ( bool hasAlarm );
167 157
168 /** 158 /**
169 * Set the priority of the Todo 159 * Set the priority of the Todo
170 */ 160 */
171 void setPriority(int priority ); 161 void setPriority(int priority );
172 162
173 /** 163 /**
174 * Set the progress. 164 * Set the progress.
175 */ 165 */
176 void setProgress( ushort progress ); 166 void setProgress( ushort progress );
177 167
178 /** 168 /**
179 * set the end date 169 * set the end date
180 */ 170 */
181 void setDueDate( QDate date ); 171 void setDueDate( QDate date );
182 172
183 /** 173 /**
184 * set the alarm time 174 * set the alarm time
185 */ 175 */
186 void setAlarmDateTime ( const QDateTime& alarm ); 176 void setAlarmDateTime ( const QDateTime& alarm );
187 177
188 void setDescription(const QString& ); 178 void setDescription(const QString& );
189 void setSummary(const QString& ); 179 void setSummary(const QString& );
190 bool isOverdue(); 180 bool isOverdue();
191 181
192 182
193 bool match( const QRegExp &r )const; 183 bool match( const QRegExp &r )const;
194 184
195 bool operator<(const OTodo &toDoEvent )const; 185 bool operator<(const OTodo &toDoEvent )const;
196 bool operator<=(const OTodo &toDoEvent )const; 186 bool operator<=(const OTodo &toDoEvent )const;
197 bool operator!=(const OTodo &toDoEvent )const; 187 bool operator!=(const OTodo &toDoEvent )const;
198 bool operator>(const OTodo &toDoEvent )const; 188 bool operator>(const OTodo &toDoEvent )const;
199 bool operator>=(const OTodo &toDoEvent)const; 189 bool operator>=(const OTodo &toDoEvent)const;
200 bool operator==(const OTodo &toDoEvent )const; 190 bool operator==(const OTodo &toDoEvent )const;
201 OTodo &operator=(const OTodo &toDoEvent ); 191 OTodo &operator=(const OTodo &toDoEvent );
202 192
203 private: 193 private:
204 class OTodoPrivate; 194 class OTodoPrivate;
205 struct OTodoData; 195 struct OTodoData;
206 196
207 void deref(); 197 void deref();
208 void changeOrModify(); 198 void changeOrModify();
209 void copy( OTodoData* src, OTodoData* dest ); 199 void copy( OTodoData* src, OTodoData* dest );
210 OTodoPrivate *d; 200 OTodoPrivate *d;
211 OTodoData *data; 201 OTodoData *data;
212 202
213}; 203};
214inline bool OTodo::operator!=(const OTodo &toDoEvent )const { 204inline bool OTodo::operator!=(const OTodo &toDoEvent )const {
215 return !(*this == toDoEvent); 205 return !(*this == toDoEvent);
216} 206}
217 207
218 208
219#endif 209#endif
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