-rw-r--r-- | libopie2/opiepim/core/opimaccesstemplate.h | 25 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimcache.h | 6 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimrecord.cpp | 82 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimrecord.h | 12 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimresolver.cpp | 198 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimresolver.h | 52 | ||||
-rw-r--r-- | libopie2/opiepim/core/otemplatebase.h | 63 | ||||
-rw-r--r-- | libopie2/opiepim/core/otodoaccess.cpp | 32 | ||||
-rw-r--r-- | libopie2/opiepim/core/otodoaccess.h | 13 |
9 files changed, 425 insertions, 58 deletions
diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h index 8cf81c8..259e2c1 100644 --- a/libopie2/opiepim/core/opimaccesstemplate.h +++ b/libopie2/opiepim/core/opimaccesstemplate.h | |||
@@ -1,149 +1,158 @@ | |||
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 "opimcache.h" | 10 | #include "opimcache.h" |
11 | #include "otemplatebase.h" | 11 | #include "otemplatebase.h" |
12 | 12 | ||
13 | /** | 13 | /** |
14 | * Thats the frontend to our OPIE PIM | 14 | * Thats the frontend to our OPIE PIM |
15 | * Library. Either you want to use it's | 15 | * Library. Either you want to use it's |
16 | * interface or you want to implement | 16 | * interface or you want to implement |
17 | * your own Access lib | 17 | * your own Access lib |
18 | * Just create a OPimRecord and inherit from | 18 | * Just create a OPimRecord and inherit from |
19 | * the plugins | 19 | * the plugins |
20 | */ | 20 | */ |
21 | 21 | ||
22 | template <class T = OPimRecord > | 22 | template <class T = OPimRecord > |
23 | class OPimAccessTemplate : public OTemplateBase<T> { | 23 | class OPimAccessTemplate : public OTemplateBase<T> { |
24 | public: | 24 | public: |
25 | enum Access { | ||
26 | Random = 0, | ||
27 | SortedAccess | ||
28 | }; | ||
25 | typedef ORecordList<T> List; | 29 | typedef ORecordList<T> List; |
26 | typedef OPimAccessBackend<T> BackEnd; | 30 | typedef OPimAccessBackend<T> BackEnd; |
27 | typedef OPimCache<T> Cache; | 31 | typedef OPimCache<T> Cache; |
28 | 32 | ||
29 | /** | 33 | /** |
30 | * c'tor BackEnd | 34 | * c'tor BackEnd |
35 | * enum Access a small hint on how to handle the backend | ||
31 | */ | 36 | */ |
32 | OPimAccessTemplate( BackEnd* end); | 37 | OPimAccessTemplate( BackEnd* end); |
38 | |||
33 | virtual ~OPimAccessTemplate(); | 39 | virtual ~OPimAccessTemplate(); |
34 | 40 | ||
35 | /** | 41 | /** |
36 | * load from the backend | 42 | * load from the backend |
37 | */ | 43 | */ |
38 | virtual bool load(); | 44 | bool load(); |
39 | 45 | ||
40 | /** Reload database. | 46 | /** Reload database. |
41 | * You should execute this function if the external database | 47 | * You should execute this function if the external database |
42 | * was changed. | 48 | * was changed. |
43 | * This function will load the external database and afterwards | 49 | * This function will load the external database and afterwards |
44 | * rejoin the local changes. Therefore the local database will be set consistent. | 50 | * rejoin the local changes. Therefore the local database will be set consistent. |
45 | */ | 51 | */ |
46 | virtual bool reload(); | 52 | virtual bool reload(); |
47 | 53 | ||
48 | /** Save contacts database. | 54 | /** Save contacts database. |
49 | * Save is more a "commit". After calling this function, all changes are public available. | 55 | * Save is more a "commit". After calling this function, all changes are public available. |
50 | * @return true if successful | 56 | * @return true if successful |
51 | */ | 57 | */ |
52 | virtual bool save(); | 58 | bool save(); |
53 | 59 | ||
54 | /** | 60 | /** |
55 | * if the resource was changed externally | 61 | * if the resource was changed externally |
56 | * You should use the signal handling instead of polling possible changes ! | 62 | * You should use the signal handling instead of polling possible changes ! |
57 | * zecke: Do you implement a signal for otodoaccess ? | 63 | * zecke: Do you implement a signal for otodoaccess ? |
58 | */ | 64 | */ |
59 | bool wasChangedExternally()const; | 65 | bool wasChangedExternally()const; |
60 | 66 | ||
61 | /** | 67 | /** |
62 | * return a List of records | 68 | * return a List of records |
63 | * you can iterate over them | 69 | * you can iterate over them |
64 | */ | 70 | */ |
65 | virtual List allRecords()const; | 71 | virtual List allRecords()const; |
66 | 72 | ||
67 | /** | 73 | /** |
68 | * queryByExample. | 74 | * queryByExample. |
69 | * @see otodoaccess, ocontactaccess | 75 | * @see otodoaccess, ocontactaccess |
70 | */ | 76 | */ |
71 | virtual List queryByExample( const T& t, int querySettings ); | 77 | virtual List queryByExample( const T& t, int querySettings ); |
72 | 78 | ||
73 | /** | 79 | /** |
74 | * find the OPimRecord uid | 80 | * find the OPimRecord uid |
75 | */ | 81 | */ |
76 | virtual T find( int uid )const; | 82 | virtual T find( int uid )const; |
77 | 83 | ||
78 | /** | 84 | /** |
79 | * read ahead cache find method ;) | 85 | * read ahead cache find method ;) |
80 | */ | 86 | */ |
81 | virtual T find( int uid, const QArray<int>&, | 87 | virtual T find( int uid, const QArray<int>&, |
82 | uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; | 88 | uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; |
83 | 89 | ||
84 | /* invalidate cache here */ | 90 | /* invalidate cache here */ |
85 | /** | 91 | /** |
86 | * clears the backend and invalidates the backend | 92 | * clears the backend and invalidates the backend |
87 | */ | 93 | */ |
88 | virtual void clear() ; | 94 | void clear() ; |
89 | 95 | ||
90 | /** | 96 | /** |
91 | * add T to the backend | 97 | * add T to the backend |
92 | * @param t The item to add. | 98 | * @param t The item to add. |
93 | * @return <i>true</i> if added successfully. | 99 | * @return <i>true</i> if added successfully. |
94 | */ | 100 | */ |
95 | virtual bool add( const T& t ) ; | 101 | virtual bool add( const T& t ) ; |
96 | bool add( const OPimRecord& ); | 102 | bool add( const OPimRecord& ); |
97 | 103 | ||
98 | /* only the uid matters */ | 104 | /* only the uid matters */ |
99 | /** | 105 | /** |
100 | * remove T from the backend | 106 | * remove T from the backend |
101 | * @param t The item to remove | 107 | * @param t The item to remove |
102 | * @return <i>true</i> if successful. | 108 | * @return <i>true</i> if successful. |
103 | */ | 109 | */ |
104 | virtual bool remove( const T& t ); | 110 | virtual bool remove( const T& t ); |
105 | 111 | ||
106 | /** | 112 | /** |
107 | * remove the OPimRecord with uid | 113 | * remove the OPimRecord with uid |
108 | * @param uid The ID of the item to remove | 114 | * @param uid The ID of the item to remove |
109 | * @return <i>true</i> if successful. | 115 | * @return <i>true</i> if successful. |
110 | */ | 116 | */ |
111 | virtual bool remove( int uid ); | 117 | bool remove( int uid ); |
118 | bool remove( const OPimRecord& ); | ||
112 | 119 | ||
113 | /** | 120 | /** |
114 | * replace T from backend | 121 | * replace T from backend |
115 | * @param t The item to replace | 122 | * @param t The item to replace |
116 | * @return <i>true</i> if successful. | 123 | * @return <i>true</i> if successful. |
117 | */ | 124 | */ |
118 | virtual bool replace( const T& t) ; | 125 | virtual bool replace( const T& t) ; |
119 | 126 | ||
120 | void setReadAhead( uint count ); | 127 | void setReadAhead( uint count ); |
121 | /** | 128 | /** |
122 | * @internal | 129 | * @internal |
123 | */ | 130 | */ |
124 | void cache( const T& )const; | 131 | void cache( const T& )const; |
125 | void setSaneCacheSize( int ); | 132 | void setSaneCacheSize( int ); |
133 | |||
134 | QArray<int> records()const; | ||
126 | protected: | 135 | protected: |
127 | /** | 136 | /** |
128 | * invalidate the cache | 137 | * invalidate the cache |
129 | */ | 138 | */ |
130 | void invalidateCache(); | 139 | void invalidateCache(); |
131 | 140 | ||
132 | void setBackEnd( BackEnd* end ); | 141 | void setBackEnd( BackEnd* end ); |
133 | /** | 142 | /** |
134 | * returns the backend | 143 | * returns the backend |
135 | */ | 144 | */ |
136 | BackEnd* backEnd(); | 145 | BackEnd* backEnd(); |
137 | BackEnd* m_backEnd; | 146 | BackEnd* m_backEnd; |
138 | Cache m_cache; | 147 | Cache m_cache; |
139 | 148 | ||
140 | }; | 149 | }; |
141 | 150 | ||
142 | template <class T> | 151 | template <class T> |
143 | OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) | 152 | OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) |
144 | : OTemplateBase<T>(), m_backEnd( end ) | 153 | : OTemplateBase<T>(), m_backEnd( end ) |
145 | { | 154 | { |
146 | if (end ) | 155 | if (end ) |
147 | end->setFrontend( this ); | 156 | end->setFrontend( this ); |
148 | } | 157 | } |
149 | template <class T> | 158 | template <class T> |
@@ -151,48 +160,52 @@ OPimAccessTemplate<T>::~OPimAccessTemplate() { | |||
151 | qWarning("~OPimAccessTemplate<T>"); | 160 | qWarning("~OPimAccessTemplate<T>"); |
152 | delete m_backEnd; | 161 | delete m_backEnd; |
153 | } | 162 | } |
154 | template <class T> | 163 | template <class T> |
155 | bool OPimAccessTemplate<T>::load() { | 164 | bool OPimAccessTemplate<T>::load() { |
156 | invalidateCache(); | 165 | invalidateCache(); |
157 | return m_backEnd->load(); | 166 | return m_backEnd->load(); |
158 | } | 167 | } |
159 | template <class T> | 168 | template <class T> |
160 | bool OPimAccessTemplate<T>::reload() { | 169 | bool OPimAccessTemplate<T>::reload() { |
161 | invalidateCache(); // zecke: I think this should be added (se) | 170 | invalidateCache(); // zecke: I think this should be added (se) |
162 | return m_backEnd->reload(); | 171 | return m_backEnd->reload(); |
163 | } | 172 | } |
164 | template <class T> | 173 | template <class T> |
165 | bool OPimAccessTemplate<T>::save() { | 174 | bool OPimAccessTemplate<T>::save() { |
166 | return m_backEnd->save(); | 175 | return m_backEnd->save(); |
167 | } | 176 | } |
168 | template <class T> | 177 | template <class T> |
169 | typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { | 178 | typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { |
170 | QArray<int> ints = m_backEnd->allRecords(); | 179 | QArray<int> ints = m_backEnd->allRecords(); |
171 | List lis(ints, this ); | 180 | List lis(ints, this ); |
172 | return lis; | 181 | return lis; |
173 | } | 182 | } |
174 | template <class T> | 183 | template <class T> |
184 | QArray<int> OPimAccessTemplate<T>::records()const { | ||
185 | return m_backEnd->allRecords(); | ||
186 | } | ||
187 | template <class T> | ||
175 | typename OPimAccessTemplate<T>::List | 188 | typename OPimAccessTemplate<T>::List |
176 | OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { | 189 | OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { |
177 | QArray<int> ints = m_backEnd->queryByExample( t, sortOrder ); | 190 | QArray<int> ints = m_backEnd->queryByExample( t, sortOrder ); |
178 | 191 | ||
179 | List lis(ints, this ); | 192 | List lis(ints, this ); |
180 | return lis; | 193 | return lis; |
181 | } | 194 | } |
182 | template <class T> | 195 | template <class T> |
183 | T OPimAccessTemplate<T>::find( int uid ) const{ | 196 | T OPimAccessTemplate<T>::find( int uid ) const{ |
184 | T t = m_backEnd->find( uid ); | 197 | T t = m_backEnd->find( uid ); |
185 | cache( t ); | 198 | cache( t ); |
186 | return t; | 199 | return t; |
187 | } | 200 | } |
188 | template <class T> | 201 | template <class T> |
189 | T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar, | 202 | T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar, |
190 | uint current, typename OTemplateBase<T>::CacheDirection dir )const { | 203 | uint current, typename OTemplateBase<T>::CacheDirection dir )const { |
191 | /* | 204 | /* |
192 | * better do T.isEmpty() | 205 | * better do T.isEmpty() |
193 | * after a find this way we would | 206 | * after a find this way we would |
194 | * avoid two finds in QCache... | 207 | * avoid two finds in QCache... |
195 | */ | 208 | */ |
196 | // qWarning("find it now %d", uid ); | 209 | // qWarning("find it now %d", uid ); |
197 | if (m_cache.contains( uid ) ) { | 210 | if (m_cache.contains( uid ) ) { |
198 | return m_cache.find( uid ); | 211 | return m_cache.find( uid ); |
@@ -210,48 +223,52 @@ void OPimAccessTemplate<T>::clear() { | |||
210 | template <class T> | 223 | template <class T> |
211 | bool OPimAccessTemplate<T>::add( const T& t ) { | 224 | bool OPimAccessTemplate<T>::add( const T& t ) { |
212 | cache( t ); | 225 | cache( t ); |
213 | return m_backEnd->add( t ); | 226 | return m_backEnd->add( t ); |
214 | } | 227 | } |
215 | template <class T> | 228 | template <class T> |
216 | bool OPimAccessTemplate<T>::add( const OPimRecord& rec) { | 229 | bool OPimAccessTemplate<T>::add( const OPimRecord& rec) { |
217 | /* same type */ | 230 | /* same type */ |
218 | if ( rec.rtti() == T::rtti() ) { | 231 | if ( rec.rtti() == T::rtti() ) { |
219 | const T &t = static_cast<const T&>(rec); | 232 | const T &t = static_cast<const T&>(rec); |
220 | return add(t); | 233 | return add(t); |
221 | } | 234 | } |
222 | return false; | 235 | return false; |
223 | } | 236 | } |
224 | template <class T> | 237 | template <class T> |
225 | bool OPimAccessTemplate<T>::remove( const T& t ) { | 238 | bool OPimAccessTemplate<T>::remove( const T& t ) { |
226 | return remove( t.uid() ); | 239 | return remove( t.uid() ); |
227 | } | 240 | } |
228 | template <class T> | 241 | template <class T> |
229 | bool OPimAccessTemplate<T>::remove( int uid ) { | 242 | bool OPimAccessTemplate<T>::remove( int uid ) { |
230 | m_cache.remove( uid ); | 243 | m_cache.remove( uid ); |
231 | return m_backEnd->remove( uid ); | 244 | return m_backEnd->remove( uid ); |
232 | } | 245 | } |
233 | template <class T> | 246 | template <class T> |
247 | bool OPimAccessTemplate<T>::remove( const OPimRecord& rec) { | ||
248 | return remove( rec.uid() ); | ||
249 | } | ||
250 | template <class T> | ||
234 | bool OPimAccessTemplate<T>::replace( const T& t ) { | 251 | bool OPimAccessTemplate<T>::replace( const T& t ) { |
235 | m_cache.replace( t ); | 252 | m_cache.replace( t ); |
236 | return m_backEnd->replace( t ); | 253 | return m_backEnd->replace( t ); |
237 | } | 254 | } |
238 | template <class T> | 255 | template <class T> |
239 | void OPimAccessTemplate<T>::invalidateCache() { | 256 | void OPimAccessTemplate<T>::invalidateCache() { |
240 | m_cache.invalidate(); | 257 | m_cache.invalidate(); |
241 | } | 258 | } |
242 | template <class T> | 259 | template <class T> |
243 | typename OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() { | 260 | typename OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() { |
244 | return m_backEnd; | 261 | return m_backEnd; |
245 | } | 262 | } |
246 | template <class T> | 263 | template <class T> |
247 | bool OPimAccessTemplate<T>::wasChangedExternally()const { | 264 | bool OPimAccessTemplate<T>::wasChangedExternally()const { |
248 | return false; | 265 | return false; |
249 | } | 266 | } |
250 | template <class T> | 267 | template <class T> |
251 | void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) { | 268 | void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) { |
252 | m_backEnd = end; | 269 | m_backEnd = end; |
253 | if (m_backEnd ) | 270 | if (m_backEnd ) |
254 | m_backEnd->setFrontend( this ); | 271 | m_backEnd->setFrontend( this ); |
255 | } | 272 | } |
256 | template <class T> | 273 | template <class T> |
257 | void OPimAccessTemplate<T>::cache( const T& t ) const{ | 274 | void OPimAccessTemplate<T>::cache( const T& t ) const{ |
diff --git a/libopie2/opiepim/core/opimcache.h b/libopie2/opiepim/core/opimcache.h index 839550c..73414e5 100644 --- a/libopie2/opiepim/core/opimcache.h +++ b/libopie2/opiepim/core/opimcache.h | |||
@@ -1,55 +1,61 @@ | |||
1 | #ifndef OPIE_PIM_CACHE_H | 1 | #ifndef OPIE_PIM_CACHE_H |
2 | #define OPIE_PIM_CACHE_H | 2 | #define OPIE_PIM_CACHE_H |
3 | 3 | ||
4 | #include <qintcache.h> | 4 | #include <qintcache.h> |
5 | 5 | ||
6 | #include "opimrecord.h" | 6 | #include "opimrecord.h" |
7 | 7 | ||
8 | template <class T = OPimRecord> | 8 | template <class T = OPimRecord> |
9 | class OPimCacheItem { | 9 | class OPimCacheItem { |
10 | public: | 10 | public: |
11 | OPimCacheItem( const T& t = T() ); | 11 | OPimCacheItem( const T& t = T() ); |
12 | OPimCacheItem( const OPimCacheItem& ); | ||
12 | ~OPimCacheItem(); | 13 | ~OPimCacheItem(); |
13 | 14 | ||
15 | OPimCacheItem &operator=( const OPimCacheItem& ); | ||
16 | |||
14 | T record()const; | 17 | T record()const; |
15 | void setRecord( const T& ); | 18 | void setRecord( const T& ); |
16 | private: | 19 | private: |
17 | T m_t; | 20 | T m_t; |
18 | }; | 21 | }; |
19 | 22 | ||
20 | /** | 23 | /** |
21 | * OPimCache for caching the items | 24 | * OPimCache for caching the items |
22 | * We support adding, removing | 25 | * We support adding, removing |
23 | * and finding | 26 | * and finding |
24 | */ | 27 | */ |
25 | template <class T = OPimRecord> | 28 | template <class T = OPimRecord> |
26 | class OPimCache { | 29 | class OPimCache { |
27 | public: | 30 | public: |
28 | typedef OPimCacheItem<T> Item; | 31 | typedef OPimCacheItem<T> Item; |
29 | OPimCache(); | 32 | OPimCache(); |
33 | OPimCache( const OPimCache& ); | ||
30 | ~OPimCache(); | 34 | ~OPimCache(); |
31 | 35 | ||
36 | OPimCache &operator=( const OPimCache& ); | ||
37 | |||
32 | bool contains(int uid)const; | 38 | bool contains(int uid)const; |
33 | void invalidate(); | 39 | void invalidate(); |
34 | void setSize( int size ); | 40 | void setSize( int size ); |
35 | 41 | ||
36 | T find(int uid )const; | 42 | T find(int uid )const; |
37 | void add( const T& ); | 43 | void add( const T& ); |
38 | void remove( int uid ); | 44 | void remove( int uid ); |
39 | void replace( const T& ); | 45 | void replace( const T& ); |
40 | 46 | ||
41 | private: | 47 | private: |
42 | QIntCache<Item> m_cache; | 48 | QIntCache<Item> m_cache; |
43 | }; | 49 | }; |
44 | 50 | ||
45 | // Implementation | 51 | // Implementation |
46 | template <class T> | 52 | template <class T> |
47 | OPimCacheItem<T>::OPimCacheItem( const T& t ) | 53 | OPimCacheItem<T>::OPimCacheItem( const T& t ) |
48 | : m_t(t) { | 54 | : m_t(t) { |
49 | } | 55 | } |
50 | template <class T> | 56 | template <class T> |
51 | OPimCacheItem<T>::~OPimCacheItem() { | 57 | OPimCacheItem<T>::~OPimCacheItem() { |
52 | 58 | ||
53 | } | 59 | } |
54 | template <class T> | 60 | template <class T> |
55 | T OPimCacheItem<T>::record()const { | 61 | T OPimCacheItem<T>::record()const { |
diff --git a/libopie2/opiepim/core/opimrecord.cpp b/libopie2/opiepim/core/opimrecord.cpp index 49b5bf9..ac0f4a9 100644 --- a/libopie2/opiepim/core/opimrecord.cpp +++ b/libopie2/opiepim/core/opimrecord.cpp | |||
@@ -1,24 +1,26 @@ | |||
1 | #include <qarray.h> | ||
2 | |||
1 | #include <qpe/categories.h> | 3 | #include <qpe/categories.h> |
2 | #include <qpe/categoryselect.h> | 4 | #include <qpe/categoryselect.h> |
3 | 5 | ||
4 | #include "opimrecord.h" | 6 | #include "opimrecord.h" |
5 | 7 | ||
6 | Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia ); | 8 | Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia ); |
7 | 9 | ||
8 | 10 | ||
9 | OPimRecord::OPimRecord( int uid ) | 11 | OPimRecord::OPimRecord( int uid ) |
10 | : Qtopia::Record() { | 12 | : Qtopia::Record() { |
11 | 13 | ||
12 | setUid( uid ); | 14 | setUid( uid ); |
13 | } | 15 | } |
14 | OPimRecord::~OPimRecord() { | 16 | OPimRecord::~OPimRecord() { |
15 | } | 17 | } |
16 | OPimRecord::OPimRecord( const OPimRecord& rec ) | 18 | OPimRecord::OPimRecord( const OPimRecord& rec ) |
17 | : Qtopia::Record( rec ) | 19 | : Qtopia::Record( rec ) |
18 | { | 20 | { |
19 | (*this) = rec; | 21 | (*this) = rec; |
20 | } | 22 | } |
21 | 23 | ||
22 | OPimRecord &OPimRecord::operator=( const OPimRecord& rec) { | 24 | OPimRecord &OPimRecord::operator=( const OPimRecord& rec) { |
23 | Qtopia::Record::operator=( rec ); | 25 | Qtopia::Record::operator=( rec ); |
24 | m_xrefman = rec.m_xrefman; | 26 | m_xrefman = rec.m_xrefman; |
@@ -61,24 +63,104 @@ bool OPimRecord::isEmpty()const { | |||
61 | str += it.key() + "," + QString::number( i ) + ";"; | 63 | str += it.key() + "," + QString::number( i ) + ";"; |
62 | } | 64 | } |
63 | } | 65 | } |
64 | str = str.remove( str.length()-1, 1); // strip the ; | 66 | str = str.remove( str.length()-1, 1); // strip the ; |
65 | //qWarning("IDS " + str ); | 67 | //qWarning("IDS " + str ); |
66 | 68 | ||
67 | return str; | 69 | return str; |
68 | }*/ | 70 | }*/ |
69 | /* if uid = 1 assign a new one */ | 71 | /* if uid = 1 assign a new one */ |
70 | void OPimRecord::setUid( int uid ) { | 72 | void OPimRecord::setUid( int uid ) { |
71 | if ( uid == 1) | 73 | if ( uid == 1) |
72 | uid = uidGen().generate(); | 74 | uid = uidGen().generate(); |
73 | 75 | ||
74 | Qtopia::Record::setUid( uid ); | 76 | Qtopia::Record::setUid( uid ); |
75 | }; | 77 | }; |
76 | Qtopia::UidGen &OPimRecord::uidGen() { | 78 | Qtopia::UidGen &OPimRecord::uidGen() { |
77 | return m_uidGen; | 79 | return m_uidGen; |
78 | } | 80 | } |
79 | OPimXRefManager &OPimRecord::xrefmanager() { | 81 | OPimXRefManager &OPimRecord::xrefmanager() { |
80 | return m_xrefman; | 82 | return m_xrefman; |
81 | } | 83 | } |
82 | int OPimRecord::rtti(){ | 84 | int OPimRecord::rtti(){ |
83 | return 0; | 85 | return 0; |
84 | } | 86 | } |
87 | |||
88 | /** | ||
89 | * now let's put our data into the stream | ||
90 | */ | ||
91 | /* | ||
92 | * First read UID | ||
93 | * Categories | ||
94 | * XRef | ||
95 | */ | ||
96 | bool OPimRecord::loadFromStream( QDataStream& stream ) { | ||
97 | int Int; | ||
98 | uint UInt; | ||
99 | stream >> Int; | ||
100 | setUid(Int); | ||
101 | |||
102 | /** Categories */ | ||
103 | stream >> UInt; | ||
104 | QArray<int> array(UInt); | ||
105 | for (uint i = 0; i < UInt; i++ ) { | ||
106 | stream >> array[i]; | ||
107 | } | ||
108 | setCategories( array ); | ||
109 | |||
110 | /* | ||
111 | * now we do the X-Ref stuff | ||
112 | */ | ||
113 | OPimXRef xref; | ||
114 | stream >> UInt; | ||
115 | for ( uint i = 0; i < UInt; i++ ) { | ||
116 | xref.setPartner( OPimXRef::One, partner( stream ) ); | ||
117 | xref.setPartner( OPimXRef::Two, partner( stream ) ); | ||
118 | m_xrefman.add( xref ); | ||
119 | } | ||
120 | |||
121 | return true; | ||
122 | } | ||
123 | bool OPimRecord::saveToStream( QDataStream& stream )const { | ||
124 | /** UIDs */ | ||
125 | |||
126 | stream << uid(); | ||
127 | |||
128 | /** Categories */ | ||
129 | stream << categories().count(); | ||
130 | for ( uint i = 0; i < categories().count(); i++ ) { | ||
131 | stream << categories()[i]; | ||
132 | } | ||
133 | |||
134 | /* | ||
135 | * first the XRef count | ||
136 | * then the xrefs | ||
137 | */ | ||
138 | stream << m_xrefman.list().count(); | ||
139 | for ( OPimXRef::ValueList::ConstIterator it = m_xrefman.list().begin(); | ||
140 | it != m_xrefman.list().end(); ++it ) { | ||
141 | flush( (*it).partner( OPimXRef::One), stream ); | ||
142 | flush( (*it).partner( OPimXRef::Two), stream ); | ||
143 | } | ||
144 | return true; | ||
145 | } | ||
146 | void OPimRecord::flush( const OPimXRefPartner& par, QDataStream& str ) const{ | ||
147 | str << par.service(); | ||
148 | str << par.uid(); | ||
149 | str << par.field(); | ||
150 | } | ||
151 | OPimXRefPartner OPimRecord::partner( QDataStream& stream ) { | ||
152 | OPimXRefPartner par; | ||
153 | QString str; | ||
154 | int i; | ||
155 | |||
156 | stream >> str; | ||
157 | par.setService( str ); | ||
158 | |||
159 | stream >> i; | ||
160 | par.setUid( i ); | ||
161 | |||
162 | stream >> i ; | ||
163 | par.setField( i ); | ||
164 | |||
165 | return par; | ||
166 | } | ||
diff --git a/libopie2/opiepim/core/opimrecord.h b/libopie2/opiepim/core/opimrecord.h index ec99a13..665530f 100644 --- a/libopie2/opiepim/core/opimrecord.h +++ b/libopie2/opiepim/core/opimrecord.h | |||
@@ -1,27 +1,28 @@ | |||
1 | #ifndef OPIE_PIM_RECORD_H | 1 | #ifndef OPIE_PIM_RECORD_H |
2 | #define OPIE_PIM_RECORD_H | 2 | #define OPIE_PIM_RECORD_H |
3 | 3 | ||
4 | #include <qdatastream.h> | ||
4 | #include <qmap.h> | 5 | #include <qmap.h> |
5 | #include <qstring.h> | 6 | #include <qstring.h> |
6 | #include <qstringlist.h> | 7 | #include <qstringlist.h> |
7 | 8 | ||
8 | #include <qpe/palmtoprecord.h> | 9 | #include <qpe/palmtoprecord.h> |
9 | 10 | ||
10 | #include <opie/opimxrefmanager.h> | 11 | #include <opie/opimxrefmanager.h> |
11 | 12 | ||
12 | /** | 13 | /** |
13 | * This is the base class for | 14 | * This is the base class for |
14 | * all PIM Records | 15 | * all PIM Records |
15 | * | 16 | * |
16 | */ | 17 | */ |
17 | class OPimRecord : public Qtopia::Record { | 18 | class OPimRecord : public Qtopia::Record { |
18 | public: | 19 | public: |
19 | /** | 20 | /** |
20 | * c'tor | 21 | * c'tor |
21 | * uid of 0 isEmpty | 22 | * uid of 0 isEmpty |
22 | * uid of 1 will be assigned a new one | 23 | * uid of 1 will be assigned a new one |
23 | */ | 24 | */ |
24 | OPimRecord(int uid = 0); | 25 | OPimRecord(int uid = 0); |
25 | ~OPimRecord(); | 26 | ~OPimRecord(); |
26 | 27 | ||
27 | /** | 28 | /** |
@@ -84,39 +85,50 @@ public: | |||
84 | /** | 85 | /** |
85 | * the name for a recordField | 86 | * the name for a recordField |
86 | */ | 87 | */ |
87 | virtual QString recordField(int)const = 0; | 88 | virtual QString recordField(int)const = 0; |
88 | 89 | ||
89 | /** | 90 | /** |
90 | * returns a reference of the | 91 | * returns a reference of the |
91 | * Cross Reference Manager | 92 | * Cross Reference Manager |
92 | * Partner 'One' is THIS PIM RECORD! | 93 | * Partner 'One' is THIS PIM RECORD! |
93 | * 'Two' is the Partner where we link to | 94 | * 'Two' is the Partner where we link to |
94 | */ | 95 | */ |
95 | OPimXRefManager& xrefmanager(); | 96 | OPimXRefManager& xrefmanager(); |
96 | 97 | ||
97 | /** | 98 | /** |
98 | * set the uid | 99 | * set the uid |
99 | */ | 100 | */ |
100 | virtual void setUid( int uid ); | 101 | virtual void setUid( int uid ); |
101 | 102 | ||
102 | /* | 103 | /* |
103 | * used inside the Templates for casting | 104 | * used inside the Templates for casting |
104 | * REIMPLEMENT in your .... | 105 | * REIMPLEMENT in your .... |
105 | */ | 106 | */ |
106 | static int rtti(); | 107 | static int rtti(); |
107 | 108 | ||
109 | /** | ||
110 | * some marshalling and de marshalling code | ||
111 | * saves the OPimRecord | ||
112 | * to and from a DataStream | ||
113 | */ | ||
114 | virtual bool loadFromStream(QDataStream& ); | ||
115 | virtual bool saveToStream( QDataStream& stream )const; | ||
116 | |||
108 | protected: | 117 | protected: |
109 | Qtopia::UidGen &uidGen(); | 118 | Qtopia::UidGen &uidGen(); |
110 | // QString crossToString()const; | 119 | // QString crossToString()const; |
111 | 120 | ||
112 | private: | 121 | private: |
113 | class OPimRecordPrivate; | 122 | class OPimRecordPrivate; |
114 | OPimRecordPrivate *d; | 123 | OPimRecordPrivate *d; |
115 | OPimXRefManager m_xrefman; | 124 | OPimXRefManager m_xrefman; |
116 | static Qtopia::UidGen m_uidGen; | 125 | static Qtopia::UidGen m_uidGen; |
117 | 126 | ||
127 | private: | ||
128 | void flush( const OPimXRefPartner&, QDataStream& stream )const; | ||
129 | OPimXRefPartner partner( QDataStream& ); | ||
118 | }; | 130 | }; |
119 | 131 | ||
120 | 132 | ||
121 | 133 | ||
122 | #endif | 134 | #endif |
diff --git a/libopie2/opiepim/core/opimresolver.cpp b/libopie2/opiepim/core/opimresolver.cpp new file mode 100644 index 0000000..4ebbd6e --- a/dev/null +++ b/libopie2/opiepim/core/opimresolver.cpp | |||
@@ -0,0 +1,198 @@ | |||
1 | #include <qcopchannel_qws.h> | ||
2 | |||
3 | #include <qpe/qcopenvelope_qws.h> | ||
4 | |||
5 | #include "otodoaccess.h" | ||
6 | #include "ocontactaccess.h" | ||
7 | |||
8 | //#include "opimfactory.h" | ||
9 | #include "opimresolver.h" | ||
10 | |||
11 | OPimResolver* OPimResolver::m_self = 0l; | ||
12 | |||
13 | OPimResolver::OPimResolver() { | ||
14 | /* the built in channels */ | ||
15 | m_builtIns << "Todolist" << "Addressbook" << "Datebook"; | ||
16 | } | ||
17 | OPimResolver* OPimResolver::self() { | ||
18 | if (!m_self) | ||
19 | m_self = new OPimResolver(); | ||
20 | |||
21 | return m_self; | ||
22 | } | ||
23 | |||
24 | /* | ||
25 | * FIXME use a cache here too | ||
26 | */ | ||
27 | OPimRecord* OPimResolver::record( const QString& service, int uid ) { | ||
28 | OPimRecord* rec = 0l; | ||
29 | OPimBase* base = backend( service ); | ||
30 | |||
31 | if ( base ) | ||
32 | rec = base->record( uid ); | ||
33 | delete base; | ||
34 | |||
35 | return rec; | ||
36 | } | ||
37 | OPimRecord* OPimResolver::record( const QString& service ) { | ||
38 | return record( serviceId( service ) ); | ||
39 | } | ||
40 | OPimRecord* OPimResolver::record( int rtti ) { | ||
41 | OPimRecord* rec = 0l; | ||
42 | switch( rtti ) { | ||
43 | case 1: /* todolist */ | ||
44 | rec = new OTodo(); | ||
45 | case 2: /* contact */ | ||
46 | rec = new OContact(); | ||
47 | default: | ||
48 | break; | ||
49 | } | ||
50 | /* | ||
51 | * FIXME resolve externally | ||
52 | */ | ||
53 | if (!rec ) { | ||
54 | ; | ||
55 | } | ||
56 | return 0l; | ||
57 | } | ||
58 | bool OPimResolver::isBuiltIn( const QString& str) const{ | ||
59 | return m_builtIns.contains( str ); | ||
60 | } | ||
61 | QCString OPimResolver::qcopChannel( enum BuiltIn& built)const { | ||
62 | QCString str("QPE/"); | ||
63 | switch( built ) { | ||
64 | case TodoList: | ||
65 | str += "Todolist"; | ||
66 | break; | ||
67 | case DateBook: | ||
68 | str += "Datebook"; | ||
69 | break; | ||
70 | case AddressBook: | ||
71 | str += "Addressbook"; | ||
72 | break; | ||
73 | default: | ||
74 | break; | ||
75 | } | ||
76 | |||
77 | return str; | ||
78 | } | ||
79 | QCString OPimResolver::qcopChannel( const QString& service )const { | ||
80 | QCString str("QPE/"); | ||
81 | str += service.latin1(); | ||
82 | return str; | ||
83 | } | ||
84 | /* | ||
85 | * Implement services!! | ||
86 | * FIXME | ||
87 | */ | ||
88 | QCString OPimResolver::applicationChannel( enum BuiltIn& built)const { | ||
89 | QCString str("QPE/Application/"); | ||
90 | switch( built ) { | ||
91 | case TodoList: | ||
92 | str += "todolist"; | ||
93 | break; | ||
94 | case DateBook: | ||
95 | str += "datebook"; | ||
96 | break; | ||
97 | case AddressBook: | ||
98 | str += "addressbook"; | ||
99 | break; | ||
100 | } | ||
101 | |||
102 | return str; | ||
103 | } | ||
104 | QCString OPimResolver::applicationChannel( const QString& service )const { | ||
105 | QCString str("QPE/Application/"); | ||
106 | |||
107 | if ( isBuiltIn( service ) ) { | ||
108 | if ( service == "Todolist" ) | ||
109 | str += "todolist"; | ||
110 | else if ( service == "Datebook" ) | ||
111 | str += "datebook"; | ||
112 | else if ( service == "Addressbook" ) | ||
113 | str += "addressbook"; | ||
114 | }else | ||
115 | ; // FIXME for additional stuff | ||
116 | |||
117 | return str; | ||
118 | } | ||
119 | QStringList OPimResolver::services()const { | ||
120 | return m_builtIns; | ||
121 | } | ||
122 | QString OPimResolver::serviceName( int rtti ) const{ | ||
123 | QString str; | ||
124 | switch ( rtti ) { | ||
125 | case TodoList: | ||
126 | str = "Todolist"; | ||
127 | break; | ||
128 | case DateBook: | ||
129 | str = "Datebook"; | ||
130 | break; | ||
131 | case AddressBook: | ||
132 | str = "Addressbook"; | ||
133 | break; | ||
134 | default: | ||
135 | break; | ||
136 | } | ||
137 | return str; | ||
138 | // FIXME me for 3rd party | ||
139 | } | ||
140 | int OPimResolver::serviceId( const QString& service ) { | ||
141 | int rtti = 0; | ||
142 | if ( service == "Todolist" ) | ||
143 | rtti = TodoList; | ||
144 | else if ( service == "Datebook" ) | ||
145 | rtti = DateBook; | ||
146 | else if ( service == "Addressbook" ) | ||
147 | rtti = AddressBook; | ||
148 | |||
149 | return rtti; | ||
150 | } | ||
151 | /** | ||
152 | * check if the 'service' is registered and if so we'll | ||
153 | */ | ||
154 | bool OPimResolver::add( const QString& service, const OPimRecord& rec) { | ||
155 | if ( QCopChannel::isRegistered( applicationChannel( service ) ) ) { | ||
156 | QByteArray data; | ||
157 | QDataStream arg(data, IO_WriteOnly ); | ||
158 | if ( rec.saveToStream( arg ) ) { | ||
159 | QCopEnvelope env( applicationChannel( service ), "add(int,QByteArray)" ); | ||
160 | env << rec.rtti(); | ||
161 | env << data; | ||
162 | }else | ||
163 | return false; | ||
164 | }else{ | ||
165 | OPimBase* base = backend( service ); | ||
166 | if (!base ) return false; | ||
167 | |||
168 | base->load(); | ||
169 | base->add( rec ); | ||
170 | base->save(); | ||
171 | delete base; | ||
172 | } | ||
173 | |||
174 | return true; | ||
175 | } | ||
176 | OPimBase* OPimResolver::backend( const QString& service ) { | ||
177 | return backend( serviceId( service ) ); | ||
178 | } | ||
179 | OPimBase* OPimResolver::backend( int rtti ) { | ||
180 | OPimBase* base = 0l; | ||
181 | switch( rtti ) { | ||
182 | case TodoList: | ||
183 | base = new OTodoAccess(); | ||
184 | break; | ||
185 | case DateBook: | ||
186 | break; | ||
187 | case AddressBook: | ||
188 | base = new OContactAccess("Resolver"); | ||
189 | break; | ||
190 | default: | ||
191 | break; | ||
192 | } | ||
193 | // FIXME for 3rd party | ||
194 | if (!base ) | ||
195 | ; | ||
196 | |||
197 | return base; | ||
198 | } | ||
diff --git a/libopie2/opiepim/core/opimresolver.h b/libopie2/opiepim/core/opimresolver.h index 86ae3eb..1ce1619 100644 --- a/libopie2/opiepim/core/opimresolver.h +++ b/libopie2/opiepim/core/opimresolver.h | |||
@@ -1,56 +1,90 @@ | |||
1 | #ifndef OPIE_PIM_RESOLVER | 1 | #ifndef OPIE_PIM_RESOLVER |
2 | #define OPIE_PIM_RESOLVER | 2 | #define OPIE_PIM_RESOLVER |
3 | 3 | ||
4 | #include <qstring.h> | 4 | #include <qstring.h> |
5 | #include <qvaluelist.h> | 5 | #include <qvaluelist.h> |
6 | 6 | ||
7 | #include <opie/otemplatebase.h> | ||
8 | |||
7 | /** | 9 | /** |
8 | * OPimResolver is a MetaClass to access | 10 | * OPimResolver is a MetaClass to access |
9 | * available backends read only. | 11 | * available backends read only. |
10 | * It will be used to resolve uids + app names | 12 | * It will be used to resolve uids + app names |
11 | * to full informations | 13 | * to full informations |
12 | * to traverse through a list of alarms, reminders | 14 | * to traverse through a list of alarms, reminders |
13 | * to get access to built in PIM functionality | 15 | * to get access to built in PIM functionality |
14 | * and to more stuff | 16 | * and to more stuff |
15 | * THE PERFORMANCE will depend on THE BACKEND | 17 | * THE PERFORMANCE will depend on THE BACKEND |
16 | * USING XML is a waste of memory!!!!! | 18 | * USING XML is a waste of memory!!!!! |
17 | */ | 19 | */ |
18 | class OPimResolver : public QObject { | 20 | class OPimResolver { |
19 | public: | 21 | public: |
20 | enum BuiltIn { TodoList = 0, | 22 | enum BuiltIn { TodoList = 0, |
21 | DateBook, | 23 | DateBook, |
22 | AddressBook | 24 | AddressBook |
23 | }; | 25 | }; |
24 | static OPimResolver* self(); | 26 | static OPimResolver* self(); |
25 | 27 | ||
26 | 28 | ||
27 | /* | 29 | /** |
28 | * return a record for a uid | 30 | * return a record for a uid |
29 | * and an app | 31 | * and an service |
32 | * You've THE OWNERSHIP NOW! | ||
30 | */ | 33 | */ |
31 | OPimRecord &record( const QString& service, int uid ); | 34 | OPimRecord *record( const QString& service, int uid ); |
32 | 35 | ||
33 | /** | 36 | /** |
34 | * return the QCopChannel for service | 37 | * return the QCopChannel for service |
35 | * When we will use Qtopia Services it will be used here | 38 | * When we will use Qtopia Services it will be used here |
36 | */ | 39 | */ |
37 | QString qcopChannel( enum BuiltIn& )const; | 40 | QCString qcopChannel( enum BuiltIn& )const; |
38 | QString qcopChannel( const QString& service ); | 41 | QCString qcopChannel( const QString& service )const; |
42 | |||
43 | /** | ||
44 | * The Application channel (QPE/Application/name) | ||
45 | */ | ||
46 | QCString applicationChannel( enum BuiltIn& )const; | ||
47 | QCString applicationChannel( const QString& service )const; | ||
39 | 48 | ||
40 | /** | 49 | /** |
41 | * return a list of available services | 50 | * return a list of available services |
42 | */ | 51 | */ |
43 | QStringList services()const; | 52 | QStringList services()const; |
44 | 53 | inline QString serviceName(int rrti )const; | |
54 | int serviceId( const QString& Service); | ||
45 | /** | 55 | /** |
46 | * add a record to a service... ;) | 56 | * add a record to a service... ;) |
47 | */ | 57 | */ |
48 | bool add( const QString& service, const OPimRecord& ); | 58 | bool add( const QString& service, const OPimRecord& ); |
49 | 59 | ||
60 | |||
61 | /** | ||
62 | * record returns an empty record for a given service. | ||
63 | * Be sure to delete it!!! | ||
64 | * | ||
65 | */ | ||
66 | OPimRecord* record( const QString& service ); | ||
67 | OPimRecord* record( int rtti ); | ||
68 | |||
69 | /** | ||
70 | * you can cast to your | ||
71 | */ | ||
72 | OPimBase* backend( const QString& service ); | ||
73 | OPimBase* backend( int rtti ); | ||
50 | private: | 74 | private: |
51 | OPimResolver(); | 75 | OPimResolver(); |
52 | OPimRecord *m_last; | 76 | void loadData(); |
77 | inline bool isBuiltIn( const QString& )const; | ||
78 | OPimRecord* recordExtern( const QString&, int ); | ||
79 | OPimRecord* recordExtern( const QString& ); | ||
80 | |||
81 | static OPimResolver* m_self; | ||
82 | struct Data; | ||
83 | class Private; | ||
53 | 84 | ||
54 | }: | 85 | Data* data; |
86 | Private* d; | ||
87 | QStringList m_builtIns; | ||
88 | }; | ||
55 | 89 | ||
56 | #endif | 90 | #endif |
diff --git a/libopie2/opiepim/core/otemplatebase.h b/libopie2/opiepim/core/otemplatebase.h index b855919..29fb6ec 100644 --- a/libopie2/opiepim/core/otemplatebase.h +++ b/libopie2/opiepim/core/otemplatebase.h | |||
@@ -1,32 +1,91 @@ | |||
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 <qarray.h> | 4 | #include <qarray.h> |
5 | 5 | ||
6 | #include "opimrecord.h" | 6 | #include <opie/opimrecord.h> |
7 | |||
7 | 8 | ||
8 | /** | 9 | /** |
10 | * Templates do not have a base class, This is why | ||
11 | * we've this class | ||
12 | * this is here to give us the possibility | ||
13 | * to have a common base class | ||
14 | * You may not want to use that interface internaly | ||
15 | * POOR mans interface | ||
16 | */ | ||
17 | struct OPimBase { | ||
18 | /** | ||
19 | * return the rtti | ||
20 | */ | ||
21 | virtual int rtti()= 0; | ||
22 | virtual OPimRecord* record()const = 0; | ||
23 | virtual OPimRecord* record(int uid)const = 0; | ||
24 | virtual bool add( const OPimRecord& ) = 0; | ||
25 | virtual bool remove( int uid ) = 0; | ||
26 | virtual bool remove( const OPimRecord& ) = 0; | ||
27 | virtual void clear() = 0; | ||
28 | virtual bool load() = 0; | ||
29 | virtual bool save() = 0; | ||
30 | virtual QArray<int> records()const = 0; | ||
31 | /* | ||
32 | * ADD editing here? | ||
33 | * -zecke | ||
34 | */ | ||
35 | |||
36 | }; | ||
37 | /** | ||
9 | * internal template base | 38 | * internal template base |
39 | * T needs to implement the copy c'tor!!! | ||
10 | */ | 40 | */ |
11 | template <class T = OPimRecord> | 41 | template <class T = OPimRecord> |
12 | class OTemplateBase { | 42 | class OTemplateBase : public OPimBase { |
13 | public: | 43 | public: |
14 | enum CacheDirection { Forward=0, Reverse }; | 44 | enum CacheDirection { Forward=0, Reverse }; |
15 | OTemplateBase() { | 45 | OTemplateBase() { |
16 | }; | 46 | }; |
17 | virtual ~OTemplateBase() { | 47 | virtual ~OTemplateBase() { |
18 | } | 48 | } |
19 | virtual T find( int uid )const = 0; | 49 | virtual T find( int uid )const = 0; |
20 | 50 | ||
21 | /** | 51 | /** |
22 | * read ahead find | 52 | * read ahead find |
23 | */ | 53 | */ |
24 | virtual T find( int uid, const QArray<int>& items, | 54 | virtual T find( int uid, const QArray<int>& items, |
25 | uint current, CacheDirection dir = Forward )const = 0; | 55 | uint current, CacheDirection dir = Forward )const = 0; |
26 | virtual void cache( const T& )const = 0; | 56 | virtual void cache( const T& )const = 0; |
27 | virtual void setSaneCacheSize( int ) = 0; | 57 | virtual void setSaneCacheSize( int ) = 0; |
28 | 58 | ||
59 | /* reimplement of OPimBase */ | ||
60 | int rtti(); | ||
61 | OPimRecord* record()const; | ||
62 | OPimRecord* record(int uid )const; | ||
63 | static T* rec(); | ||
29 | }; | 64 | }; |
30 | 65 | ||
66 | /* | ||
67 | * implementation | ||
68 | */ | ||
69 | template <class T> | ||
70 | int | ||
71 | OTemplateBase<T>::rtti() { | ||
72 | return T::rtti(); | ||
73 | } | ||
74 | template <class T> | ||
75 | OPimRecord* OTemplateBase<T>::record()const { | ||
76 | T* t = new T; | ||
77 | return t; | ||
78 | } | ||
79 | template <class T> | ||
80 | OPimRecord* OTemplateBase<T>::record(int uid )const { | ||
81 | T t2 = find(uid ); | ||
82 | T* t1 = new T(t2); | ||
83 | |||
84 | return t1; | ||
85 | }; | ||
86 | template <class T> | ||
87 | T* OTemplateBase<T>::rec() { | ||
88 | return new T; | ||
89 | } | ||
31 | 90 | ||
32 | #endif | 91 | #endif |
diff --git a/libopie2/opiepim/core/otodoaccess.cpp b/libopie2/opiepim/core/otodoaccess.cpp index d860411..5e89a1b 100644 --- a/libopie2/opiepim/core/otodoaccess.cpp +++ b/libopie2/opiepim/core/otodoaccess.cpp | |||
@@ -1,86 +1,56 @@ | |||
1 | #include <qdatetime.h> | 1 | #include <qdatetime.h> |
2 | 2 | ||
3 | #include <qpe/alarmserver.h> | 3 | #include <qpe/alarmserver.h> |
4 | 4 | ||
5 | // #include "otodoaccesssql.h" | 5 | // #include "otodoaccesssql.h" |
6 | #include "otodoaccess.h" | 6 | #include "otodoaccess.h" |
7 | #include "obackendfactory.h" | 7 | #include "obackendfactory.h" |
8 | 8 | ||
9 | OTodoAccess::OTodoAccess( OTodoAccessBackend* end ) | 9 | OTodoAccess::OTodoAccess( OTodoAccessBackend* end, enum Access ) |
10 | : QObject(), OPimAccessTemplate<OTodo>( end ), m_todoBackEnd( end ) | 10 | : QObject(), OPimAccessTemplate<OTodo>( end ), m_todoBackEnd( end ) |
11 | { | 11 | { |
12 | // if (end == 0l ) | 12 | // if (end == 0l ) |
13 | // m_todoBackEnd = new OTodoAccessBackendSQL( QString::null); | 13 | // m_todoBackEnd = new OTodoAccessBackendSQL( QString::null); |
14 | 14 | ||
15 | // Zecke: Du musst hier noch für das XML-Backend einen Appnamen übergeben ! | 15 | // Zecke: Du musst hier noch für das XML-Backend einen Appnamen übergeben ! |
16 | if (end == 0l ) | 16 | if (end == 0l ) |
17 | m_todoBackEnd = OBackendFactory<OTodoAccessBackend>::Default ("todo", QString::null); | 17 | m_todoBackEnd = OBackendFactory<OTodoAccessBackend>::Default ("todo", QString::null); |
18 | 18 | ||
19 | setBackEnd( m_todoBackEnd ); | 19 | setBackEnd( m_todoBackEnd ); |
20 | } | 20 | } |
21 | OTodoAccess::~OTodoAccess() { | 21 | OTodoAccess::~OTodoAccess() { |
22 | // qWarning("~OTodoAccess"); | 22 | // qWarning("~OTodoAccess"); |
23 | } | 23 | } |
24 | void OTodoAccess::mergeWith( const QValueList<OTodo>& list ) { | 24 | void OTodoAccess::mergeWith( const QValueList<OTodo>& list ) { |
25 | QValueList<OTodo>::ConstIterator it; | 25 | QValueList<OTodo>::ConstIterator it; |
26 | for ( it = list.begin(); it != list.end(); ++it ) { | 26 | for ( it = list.begin(); it != list.end(); ++it ) { |
27 | replace( (*it) ); | 27 | replace( (*it) ); |
28 | } | 28 | } |
29 | } | 29 | } |
30 | OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start, | 30 | OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start, |
31 | const QDate& end, | 31 | const QDate& end, |
32 | bool includeNoDates ) { | 32 | bool includeNoDates ) { |
33 | QArray<int> ints = m_todoBackEnd->effectiveToDos( start, end, includeNoDates ); | 33 | QArray<int> ints = m_todoBackEnd->effectiveToDos( start, end, includeNoDates ); |
34 | 34 | ||
35 | List lis( ints, this ); | 35 | List lis( ints, this ); |
36 | return lis; | 36 | return lis; |
37 | } | 37 | } |
38 | OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start, | 38 | OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start, |
39 | bool includeNoDates ) { | 39 | bool includeNoDates ) { |
40 | return effectiveToDos( start, QDate::currentDate(), | 40 | return effectiveToDos( start, QDate::currentDate(), |
41 | includeNoDates ); | 41 | includeNoDates ); |
42 | } | 42 | } |
43 | OTodoAccess::List OTodoAccess::overDue() { | 43 | OTodoAccess::List OTodoAccess::overDue() { |
44 | List lis( m_todoBackEnd->overDue(), this ); | 44 | List lis( m_todoBackEnd->overDue(), this ); |
45 | return lis; | 45 | return lis; |
46 | } | 46 | } |
47 | void OTodoAccess::addAlarm( const OTodo& event) { | ||
48 | /* FIXME use the new notifier architecture | ||
49 | if (!event.hasAlarmDateTime() ) | ||
50 | return; | ||
51 | |||
52 | QDateTime now = QDateTime::currentDateTime(); | ||
53 | QDateTime schedule = event.alarmDateTime(); | ||
54 | |||
55 | if ( schedule > now ){ | ||
56 | AlarmServer::addAlarm( schedule, | ||
57 | "QPE/Application/todolist", | ||
58 | "alarm(QDateTime,int)", event.uid() ); | ||
59 | |||
60 | } | ||
61 | */ | ||
62 | } | ||
63 | void OTodoAccess::delAlarm( int uid) { | ||
64 | |||
65 | QDateTime schedule; // Create null DateTime | ||
66 | |||
67 | // I hope this will remove all scheduled alarms | ||
68 | // with the given uid !? | ||
69 | // If not: I have to rethink how to remove already | ||
70 | // scheduled events... (se) | ||
71 | // it should be fine -zecke | ||
72 | // qWarning("Removing alarm for event with uid %d", uid ); | ||
73 | AlarmServer::deleteAlarm( schedule , | ||
74 | "QPE/Application/todolist", | ||
75 | "alarm(QDateTime,int)", uid ); | ||
76 | } | ||
77 | /* sort order */ | 47 | /* sort order */ |
78 | OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) { | 48 | OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) { |
79 | QArray<int> ints = m_todoBackEnd->sorted( ascending, sort, | 49 | QArray<int> ints = m_todoBackEnd->sorted( ascending, sort, |
80 | filter, cat ); | 50 | filter, cat ); |
81 | OTodoAccess::List list( ints, this ); | 51 | OTodoAccess::List list( ints, this ); |
82 | return list; | 52 | return list; |
83 | } | 53 | } |
84 | void OTodoAccess::removeAllCompleted() { | 54 | void OTodoAccess::removeAllCompleted() { |
85 | m_todoBackEnd->removeAllCompleted(); | 55 | m_todoBackEnd->removeAllCompleted(); |
86 | } | 56 | } |
diff --git a/libopie2/opiepim/core/otodoaccess.h b/libopie2/opiepim/core/otodoaccess.h index c079155..2bb87dc 100644 --- a/libopie2/opiepim/core/otodoaccess.h +++ b/libopie2/opiepim/core/otodoaccess.h | |||
@@ -8,91 +8,80 @@ | |||
8 | #include "otodoaccessbackend.h" | 8 | #include "otodoaccessbackend.h" |
9 | #include "opimaccesstemplate.h" | 9 | #include "opimaccesstemplate.h" |
10 | 10 | ||
11 | 11 | ||
12 | /** | 12 | /** |
13 | * OTodoAccess | 13 | * OTodoAccess |
14 | * the class to get access to | 14 | * the class to get access to |
15 | * the todolist | 15 | * the todolist |
16 | */ | 16 | */ |
17 | class OTodoAccess : public QObject, public OPimAccessTemplate<OTodo> { | 17 | class OTodoAccess : public QObject, public OPimAccessTemplate<OTodo> { |
18 | Q_OBJECT | 18 | Q_OBJECT |
19 | public: | 19 | public: |
20 | enum SortOrder { Completed = 0, | 20 | enum SortOrder { Completed = 0, |
21 | Priority, | 21 | Priority, |
22 | Description, | 22 | Description, |
23 | Deadline }; | 23 | Deadline }; |
24 | enum SortFilter{ Category =1, | 24 | enum SortFilter{ Category =1, |
25 | OnlyOverDue= 2, | 25 | OnlyOverDue= 2, |
26 | DoNotShowCompleted =4 }; | 26 | DoNotShowCompleted =4 }; |
27 | /** | 27 | /** |
28 | * if you use 0l | 28 | * if you use 0l |
29 | * the default resource will be | 29 | * the default resource will be |
30 | * picked up | 30 | * picked up |
31 | */ | 31 | */ |
32 | OTodoAccess( OTodoAccessBackend* = 0l); | 32 | OTodoAccess( OTodoAccessBackend* = 0l, enum Access acc = Random ); |
33 | ~OTodoAccess(); | 33 | ~OTodoAccess(); |
34 | 34 | ||
35 | 35 | ||
36 | /* our functions here */ | 36 | /* our functions here */ |
37 | /** | 37 | /** |
38 | * include todos from start to end | 38 | * include todos from start to end |
39 | * includeNoDates whether or not to include | 39 | * includeNoDates whether or not to include |
40 | * events with no dates | 40 | * events with no dates |
41 | */ | 41 | */ |
42 | List effectiveToDos( const QDate& start, | 42 | List effectiveToDos( const QDate& start, |
43 | const QDate& end, | 43 | const QDate& end, |
44 | bool includeNoDates = true ); | 44 | bool includeNoDates = true ); |
45 | 45 | ||
46 | /** | 46 | /** |
47 | * start | 47 | * start |
48 | * end date taken from the currentDate() | 48 | * end date taken from the currentDate() |
49 | */ | 49 | */ |
50 | List effectiveToDos( const QDate& start, | 50 | List effectiveToDos( const QDate& start, |
51 | bool includeNoDates = true ); | 51 | bool includeNoDates = true ); |
52 | 52 | ||
53 | 53 | ||
54 | /** | 54 | /** |
55 | * return overdue OTodos | 55 | * return overdue OTodos |
56 | */ | 56 | */ |
57 | List overDue(); | 57 | List overDue(); |
58 | 58 | ||
59 | /** | 59 | /** |
60 | * | 60 | * |
61 | */ | 61 | */ |
62 | List sorted( bool ascending, int sortOrder, int sortFilter, int cat ); | 62 | List sorted( bool ascending, int sortOrder, int sortFilter, int cat ); |
63 | 63 | ||
64 | /** | 64 | /** |
65 | * merge a list of OTodos into | 65 | * merge a list of OTodos into |
66 | * the resource | 66 | * the resource |
67 | */ | 67 | */ |
68 | void mergeWith( const QValueList<OTodo>& ); | 68 | void mergeWith( const QValueList<OTodo>& ); |
69 | 69 | ||
70 | /** | 70 | /** |
71 | * delete all already completed items | 71 | * delete all already completed items |
72 | */ | 72 | */ |
73 | void removeAllCompleted(); | 73 | void removeAllCompleted(); |
74 | 74 | ||
75 | signals: | 75 | signals: |
76 | /** | 76 | /** |
77 | * if the OTodoAccess was changed | 77 | * if the OTodoAccess was changed |
78 | */ | 78 | */ |
79 | void signalChanged( const OTodoAccess* ); | 79 | void signalChanged( const OTodoAccess* ); |
80 | private: | 80 | private: |
81 | /** | ||
82 | * add an Alarm to the AlarmServer | ||
83 | */ | ||
84 | void addAlarm( const OTodo& ); | ||
85 | |||
86 | /** | ||
87 | * delete an alarm with the uid from | ||
88 | * the alarm server | ||
89 | */ | ||
90 | void delAlarm( int uid ); | ||
91 | |||
92 | int m_cat; | 81 | int m_cat; |
93 | OTodoAccessBackend* m_todoBackEnd; | 82 | OTodoAccessBackend* m_todoBackEnd; |
94 | class OTodoAccessPrivate; | 83 | class OTodoAccessPrivate; |
95 | OTodoAccessPrivate* d; | 84 | OTodoAccessPrivate* d; |
96 | }; | 85 | }; |
97 | 86 | ||
98 | #endif | 87 | #endif |