summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/ChangeLog2
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend.cpp35
2 files changed, 25 insertions, 12 deletions
diff --git a/libopie2/opiepim/ChangeLog b/libopie2/opiepim/ChangeLog
index e94fa59..52b3f6b 100644
--- a/libopie2/opiepim/ChangeLog
+++ b/libopie2/opiepim/ChangeLog
@@ -1,29 +1,31 @@
12005-03-18 Stefan Eilers <stefan@eilers-online.net>
2 * Rewrote generic sorted filter and added filter for "DoNotShowWithCategory", needed by addressbook (other filters need to be added!)
12005-01-16 Stefan Eilers <stefan@eilers-online.net> 32005-01-16 Stefan Eilers <stefan@eilers-online.net>
2 * Added new OPimEventSortVector class, improved OPimSortVector 4 * Added new OPimEventSortVector class, improved OPimSortVector
3 * OPimAccessBackend now supports generic sorting. 5 * OPimAccessBackend now supports generic sorting.
42005-01-03 Stefan Eilers <stefan@eilers-online.net> 62005-01-03 Stefan Eilers <stefan@eilers-online.net>
5 * Fixing bug in API documentation 7 * Fixing bug in API documentation
6 * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends 8 * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends
72004-12-28 Stefan Eilers <stefan@eilers-online.net> 92004-12-28 Stefan Eilers <stefan@eilers-online.net>
8 * Make improved query by example accessable via frontend 10 * Make improved query by example accessable via frontend
9 * Some API documentation improvement 11 * Some API documentation improvement
10 * Cleanup of backend api.. 12 * Cleanup of backend api..
11 * Fixing bug #1501 13 * Fixing bug #1501
122004-11-23 Stefan Eilers <stefan@eilers-online.net> 142004-11-23 Stefan Eilers <stefan@eilers-online.net>
13 * Implement fast and full featured version of sorted() for addressbook 15 * Implement fast and full featured version of sorted() for addressbook
14 * Implement generic queryByExample for all Addressboook backends. It allows incremental search. 16 * Implement generic queryByExample for all Addressboook backends. It allows incremental search.
15 * Update of API Documentation 17 * Update of API Documentation
162004-11-18 Holger Freyther <freyther@handhelds.org> 182004-11-18 Holger Freyther <freyther@handhelds.org>
17 * Every Access can give a set of Occurrences for a period or a datetime 19 * Every Access can give a set of Occurrences for a period or a datetime
18 * QueryByExample, Find, Sort can be generically accessed by OPimBase 20 * QueryByExample, Find, Sort can be generically accessed by OPimBase
19 pointer interface 21 pointer interface
20 * OPimBackendOccurrence gets split up to OPimOccurrences by 22 * OPimBackendOccurrence gets split up to OPimOccurrences by
21 OPimTemplateBase 23 OPimTemplateBase
22 * Add safeCast to various OPimRecords 24 * Add safeCast to various OPimRecords
23 * Kill memleak in OPimTodo 25 * Kill memleak in OPimTodo
24 * Add SortVector implementations for OPimTodo and OPimContact 26 * Add SortVector implementations for OPimTodo and OPimContact
25 27
26 2004-??-??The Opie Team <opie@handhelds.org> 28 2004-??-??The Opie Team <opie@handhelds.org>
27 * Implemented some important modifications to allow to use OPimRecords as it is, without 29 * Implemented some important modifications to allow to use OPimRecords as it is, without
28 have to cast them. This makes it possible to write applications which handling pim 30 have to cast them. This makes it possible to write applications which handling pim
29 data in a generic manner (see opimconvertion tool) (eilers) \ No newline at end of file 31 data in a generic manner (see opimconvertion tool) (eilers) \ No newline at end of file
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend.cpp b/libopie2/opiepim/backend/ocontactaccessbackend.cpp
index c09427c..6ac9934 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend.cpp
@@ -57,259 +57,270 @@ UIDArray OPimContactAccessBackend::queryByExample( const UIDArray& uid_array, co
57 // Birthday and anniversary are special nonstring fields and should 57 // Birthday and anniversary are special nonstring fields and should
58 // be handled specially 58 // be handled specially
59 switch ( i ){ 59 switch ( i ){
60 case Qtopia::Birthday: 60 case Qtopia::Birthday:
61 queryDate = new QDate( query.birthday() ); 61 queryDate = new QDate( query.birthday() );
62 checkDate = new QDate( find( uid_array[it] ).birthday() ); 62 checkDate = new QDate( find( uid_array[it] ).birthday() );
63 // fall through 63 // fall through
64 case Qtopia::Anniversary: 64 case Qtopia::Anniversary:
65 if ( queryDate == 0l ){ 65 if ( queryDate == 0l ){
66 queryDate = new QDate( query.anniversary() ); 66 queryDate = new QDate( query.anniversary() );
67 checkDate = new QDate( find( uid_array[it] ).anniversary() ); 67 checkDate = new QDate( find( uid_array[it] ).anniversary() );
68 } 68 }
69 69
70 if ( queryDate->isValid() ){ 70 if ( queryDate->isValid() ){
71 if( checkDate->isValid() ){ 71 if( checkDate->isValid() ){
72 if ( settings & OPimContactAccess::DateYear ){ 72 if ( settings & OPimContactAccess::DateYear ){
73 if ( queryDate->year() != checkDate->year() ) 73 if ( queryDate->year() != checkDate->year() )
74 allcorrect = false; 74 allcorrect = false;
75 } 75 }
76 if ( settings & OPimContactAccess::DateMonth ){ 76 if ( settings & OPimContactAccess::DateMonth ){
77 if ( queryDate->month() != checkDate->month() ) 77 if ( queryDate->month() != checkDate->month() )
78 allcorrect = false; 78 allcorrect = false;
79 } 79 }
80 if ( settings & OPimContactAccess::DateDay ){ 80 if ( settings & OPimContactAccess::DateDay ){
81 if ( queryDate->day() != checkDate->day() ) 81 if ( queryDate->day() != checkDate->day() )
82 allcorrect = false; 82 allcorrect = false;
83 } 83 }
84 if ( settings & OPimContactAccess::DateDiff ) { 84 if ( settings & OPimContactAccess::DateDiff ) {
85 QDate current; 85 QDate current;
86 // If we get an additional date, we 86 // If we get an additional date, we
87 // will take this date instead of 87 // will take this date instead of
88 // the current one.. 88 // the current one..
89 if ( !d.date().isValid() ) 89 if ( !d.date().isValid() )
90 current = QDate::currentDate(); 90 current = QDate::currentDate();
91 else 91 else
92 current = d.date(); 92 current = d.date();
93 93
94 // We have to equalize the year, otherwise 94 // We have to equalize the year, otherwise
95 // the search will fail.. 95 // the search will fail..
96 checkDate->setYMD( current.year(), 96 checkDate->setYMD( current.year(),
97 checkDate->month(), 97 checkDate->month(),
98 checkDate->day() ); 98 checkDate->day() );
99 if ( *checkDate < current ) 99 if ( *checkDate < current )
100 checkDate->setYMD( current.year()+1, 100 checkDate->setYMD( current.year()+1,
101 checkDate->month(), 101 checkDate->month(),
102 checkDate->day() ); 102 checkDate->day() );
103 103
104 // Check whether the birthday/anniversary date is between 104 // Check whether the birthday/anniversary date is between
105 // the current/given date and the maximum date 105 // the current/given date and the maximum date
106 // ( maximum time range ) ! 106 // ( maximum time range ) !
107 if ( current.daysTo( *queryDate ) >= 0 ){ 107 if ( current.daysTo( *queryDate ) >= 0 ){
108 if ( !( ( *checkDate >= current ) && 108 if ( !( ( *checkDate >= current ) &&
109 ( *checkDate <= *queryDate ) ) ){ 109 ( *checkDate <= *queryDate ) ) ){
110 allcorrect = false; 110 allcorrect = false;
111 } 111 }
112 } 112 }
113 } 113 }
114 } else{ 114 } else{
115 // checkDate is invalid. Therefore this entry is always rejected 115 // checkDate is invalid. Therefore this entry is always rejected
116 allcorrect = false; 116 allcorrect = false;
117 } 117 }
118 } 118 }
119 119
120 delete queryDate; 120 delete queryDate;
121 queryDate = 0l; 121 queryDate = 0l;
122 delete checkDate; 122 delete checkDate;
123 checkDate = 0l; 123 checkDate = 0l;
124 break; 124 break;
125 default: 125 default:
126 /* Just compare fields which are not empty in the query object */ 126 /* Just compare fields which are not empty in the query object */
127 if ( !query.field(i).isEmpty() ){ 127 if ( !query.field(i).isEmpty() ){
128 switch ( settings & ~( OPimContactAccess::IgnoreCase 128 switch ( settings & ~( OPimContactAccess::IgnoreCase
129 | OPimContactAccess::DateDiff 129 | OPimContactAccess::DateDiff
130 | OPimContactAccess::DateYear 130 | OPimContactAccess::DateYear
131 | OPimContactAccess::DateMonth 131 | OPimContactAccess::DateMonth
132 | OPimContactAccess::DateDay 132 | OPimContactAccess::DateDay
133 | OPimContactAccess::MatchOne 133 | OPimContactAccess::MatchOne
134 ) ){ 134 ) ){
135 135
136 case OPimContactAccess::RegExp:{ 136 case OPimContactAccess::RegExp:{
137 QRegExp expr ( query.field(i), 137 QRegExp expr ( query.field(i),
138 !(settings & OPimContactAccess::IgnoreCase), 138 !(settings & OPimContactAccess::IgnoreCase),
139 false ); 139 false );
140 if ( expr.find ( find( uid_array[it] ).field(i), 0 ) == -1 ) 140 if ( expr.find ( find( uid_array[it] ).field(i), 0 ) == -1 )
141 allcorrect = false; 141 allcorrect = false;
142 } 142 }
143 break; 143 break;
144 case OPimContactAccess::WildCards:{ 144 case OPimContactAccess::WildCards:{
145 QRegExp expr ( query.field(i), 145 QRegExp expr ( query.field(i),
146 !(settings & OPimContactAccess::IgnoreCase), 146 !(settings & OPimContactAccess::IgnoreCase),
147 true ); 147 true );
148 if ( expr.find ( find( uid_array[it] ).field(i), 0 ) == -1 ) 148 if ( expr.find ( find( uid_array[it] ).field(i), 0 ) == -1 )
149 allcorrect = false; 149 allcorrect = false;
150 } 150 }
151 break; 151 break;
152 case OPimContactAccess::ExactMatch:{ 152 case OPimContactAccess::ExactMatch:{
153 if (settings & OPimContactAccess::IgnoreCase){ 153 if (settings & OPimContactAccess::IgnoreCase){
154 if ( query.field(i).upper() != 154 if ( query.field(i).upper() !=
155 find( uid_array[it] ).field(i).upper() ) 155 find( uid_array[it] ).field(i).upper() )
156 allcorrect = false; 156 allcorrect = false;
157 }else{ 157 }else{
158 if ( query.field(i) != find( uid_array[it] ).field(i) ) 158 if ( query.field(i) != find( uid_array[it] ).field(i) )
159 allcorrect = false; 159 allcorrect = false;
160 } 160 }
161 } 161 }
162 break; 162 break;
163 } 163 }
164 } 164 }
165 } 165 }
166 } 166 }
167 if ( allcorrect ){ 167 if ( allcorrect ){
168 m_currentQuery[arraycounter++] = uid_array[it]; 168 m_currentQuery[arraycounter++] = uid_array[it];
169 } 169 }
170 } 170 }
171 171
172 // Shrink to fit.. 172 // Shrink to fit..
173 m_currentQuery.resize(arraycounter); 173 m_currentQuery.resize(arraycounter);
174 174
175 return m_currentQuery; 175 return m_currentQuery;
176 176
177} 177}
178 178
179const uint OPimContactAccessBackend::querySettings() const 179const uint OPimContactAccessBackend::querySettings() const
180{ 180{
181 return ( OPimContactAccess::WildCards 181 return ( OPimContactAccess::WildCards
182 | OPimContactAccess::IgnoreCase 182 | OPimContactAccess::IgnoreCase
183 | OPimContactAccess::RegExp 183 | OPimContactAccess::RegExp
184 | OPimContactAccess::ExactMatch 184 | OPimContactAccess::ExactMatch
185 | OPimContactAccess::DateDiff 185 | OPimContactAccess::DateDiff
186 | OPimContactAccess::DateYear 186 | OPimContactAccess::DateYear
187 | OPimContactAccess::DateMonth 187 | OPimContactAccess::DateMonth
188 | OPimContactAccess::DateDay 188 | OPimContactAccess::DateDay
189 ); 189 );
190} 190}
191 191
192bool OPimContactAccessBackend::hasQuerySettings (uint querySettings) const 192bool OPimContactAccessBackend::hasQuerySettings (uint querySettings) const
193{ 193{
194 /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay 194 /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay
195 * may be added with any of the other settings. IgnoreCase should never used alone. 195 * may be added with any of the other settings. IgnoreCase should never used alone.
196 * Wildcards, RegExp, ExactMatch should never used at the same time... 196 * Wildcards, RegExp, ExactMatch should never used at the same time...
197 */ 197 */
198 198
199 // Step 1: Check whether the given settings are supported by this backend 199 // Step 1: Check whether the given settings are supported by this backend
200 if ( ( querySettings & ( 200 if ( ( querySettings & (
201 OPimContactAccess::IgnoreCase 201 OPimContactAccess::IgnoreCase
202 | OPimContactAccess::WildCards 202 | OPimContactAccess::WildCards
203 | OPimContactAccess::DateDiff 203 | OPimContactAccess::DateDiff
204 | OPimContactAccess::DateYear 204 | OPimContactAccess::DateYear
205 | OPimContactAccess::DateMonth 205 | OPimContactAccess::DateMonth
206 | OPimContactAccess::DateDay 206 | OPimContactAccess::DateDay
207 | OPimContactAccess::RegExp 207 | OPimContactAccess::RegExp
208 | OPimContactAccess::ExactMatch 208 | OPimContactAccess::ExactMatch
209 ) ) != querySettings ) 209 ) ) != querySettings )
210 return false; 210 return false;
211 211
212 // Step 2: Check whether the given combinations are ok.. 212 // Step 2: Check whether the given combinations are ok..
213 213
214 // IngoreCase alone is invalid 214 // IngoreCase alone is invalid
215 if ( querySettings == OPimContactAccess::IgnoreCase ) 215 if ( querySettings == OPimContactAccess::IgnoreCase )
216 return false; 216 return false;
217 217
218 // WildCards, RegExp and ExactMatch should never used at the same time 218 // WildCards, RegExp and ExactMatch should never used at the same time
219 switch ( querySettings & ~( OPimContactAccess::IgnoreCase 219 switch ( querySettings & ~( OPimContactAccess::IgnoreCase
220 | OPimContactAccess::DateDiff 220 | OPimContactAccess::DateDiff
221 | OPimContactAccess::DateYear 221 | OPimContactAccess::DateYear
222 | OPimContactAccess::DateMonth 222 | OPimContactAccess::DateMonth
223 | OPimContactAccess::DateDay 223 | OPimContactAccess::DateDay
224 ) 224 )
225 ){ 225 ){
226 case OPimContactAccess::RegExp: 226 case OPimContactAccess::RegExp:
227 return ( true ); 227 return ( true );
228 case OPimContactAccess::WildCards: 228 case OPimContactAccess::WildCards:
229 return ( true ); 229 return ( true );
230 case OPimContactAccess::ExactMatch: 230 case OPimContactAccess::ExactMatch:
231 return ( true ); 231 return ( true );
232 case 0: // one of the upper removed bits were set.. 232 case 0: // one of the upper removed bits were set..
233 return ( true ); 233 return ( true );
234 default: 234 default:
235 return ( false ); 235 return ( false );
236 } 236 }
237} 237}
238 238
239 239
240UIDArray OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, 240UIDArray OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder,
241 int filter, const QArray<int>& categories )const { 241 int filter, const QArray<int>& categories )const {
242 odebug << "Using Unaccelerated OPimContactAccessBackend sorted Implementation" << oendl; 242 odebug << "Using Unaccelerated OPimContactAccessBackend sorted Implementation" << oendl;
243 243
244 Internal::OPimContactSortVector vector(ar.count(), asc, sortOrder ); 244 Internal::OPimContactSortVector vector(ar.count(), asc, sortOrder );
245 245
246 int item = 0; 246 int item = 0;
247 uint cat_count = categories.count(); 247 uint cat_count = categories.count();
248 uint eve_count = ar.count(); 248 uint eve_count = ar.count();
249 bool bCat = filter & OPimContactAccess::FilterCategory ? true : false; 249 bool contactPassed = false;
250 bool catPassed = false;
251 int cat; 250 int cat;
252 251
253 for ( uint i = 0; i < eve_count; ++i ) { 252 for ( uint i = 0; i < eve_count; ++i ) {
254 OPimContact contact = find( ar[i], ar, i, Frontend::Forward ); 253 OPimContact contact = find( ar[i], ar, i, Frontend::Forward );
255 if ( contact.isEmpty() ) 254 if ( contact.isEmpty() )
256 continue; 255 continue;
257 256
257 contactPassed = true;
258
259 // Filter all Contacts which have any category
260 if ( (filter & OPimContactAccess::DoNotShowWithCategory) ? true : false ){
261 if ( !contact.categories().isEmpty() )
262 continue;
263 }
264
258 /* show category */ 265 /* show category */
259 /* -1 == unfiled */ 266 /* -1 == unfiled */
260 catPassed = false;
261 for ( uint cat_nu = 0; cat_nu < cat_count; ++cat_nu ) { 267 for ( uint cat_nu = 0; cat_nu < cat_count; ++cat_nu ) {
262 cat = categories[cat_nu]; 268 cat = categories[cat_nu];
263 if ( bCat && cat == -1 ) { 269
264 if(!contact.categories().isEmpty() ) 270 if ( (filter & OPimContactAccess::FilterCategory) ? true : false ){
265 continue; 271 if ( cat == -1 ) {
266 } else if ( bCat && cat != 0) 272 // We should search unfiled contacts.
267 if (!contact.categories().contains( cat ) ) 273 // Unfiled categories have no category set, thus continue if
268 continue; 274 // this contact has no empty category.
269 catPassed = true; 275 if( !contact.categories().isEmpty() )
270 break; 276 contactPassed = false;
277 } else if ( cat != 0 )
278 if ( !contact.categories().contains( cat ) )
279 contactPassed = false;
280 }
281
271 } 282 }
272 283
273 /* 284 /*
274 * If none of the Categories matched 285 * If none of the Categories matched
275 * continue 286 * continue
276 */ 287 */
277 if ( !catPassed ) 288 if ( !contactPassed )
278 continue; 289 continue;
279 290
280 vector.insert(item++, contact ); 291 vector.insert(item++, contact );
281 } 292 }
282 293
283 vector.resize( item ); 294 vector.resize( item );
284 /* sort it now */ 295 /* sort it now */
285 vector.sort(); 296 vector.sort();
286 /* now get the uids */ 297 /* now get the uids */
287 UIDArray array( vector.count() ); 298 UIDArray array( vector.count() );
288 for (uint i= 0; i < vector.count(); i++ ) 299 for (uint i= 0; i < vector.count(); i++ )
289 array[i] = vector.uidAt( i ); 300 array[i] = vector.uidAt( i );
290 301
291 return array; 302 return array;
292} 303}
293 304
294OPimBackendOccurrence::List OPimContactAccessBackend::occurrences( const QDate& start, 305OPimBackendOccurrence::List OPimContactAccessBackend::occurrences( const QDate& start,
295 const QDate& end)const { 306 const QDate& end)const {
296 OPimBackendOccurrence::List lst; 307 OPimBackendOccurrence::List lst;
297 308
298 UIDArray records = allRecords(); 309 UIDArray records = allRecords();
299 const uint count = records.count(); 310 const uint count = records.count();
300 int uid; 311 int uid;
301 312
302 for ( uint i = 0; i < count; ++i ) { 313 for ( uint i = 0; i < count; ++i ) {
303 uid = records[i]; 314 uid = records[i];
304 OPimContact contact = find(uid, records, i, Frontend::Forward ); 315 OPimContact contact = find(uid, records, i, Frontend::Forward );
305 316
306 QDate date = contact.anniversary(); 317 QDate date = contact.anniversary();
307 date = QDate( start.year(), date.month(),date.day() ); 318 date = QDate( start.year(), date.month(),date.day() );
308 319
309// if ( date.isValid() && date.) { 320// if ( date.isValid() && date.) {
310// } 321// }
311 } 322 }
312 323
313 return lst; 324 return lst;
314} 325}
315} 326}