summaryrefslogtreecommitdiff
authoreilers <eilers>2005-03-19 16:23:16 (UTC)
committer eilers <eilers>2005-03-19 16:23:16 (UTC)
commitea15abad0554edab0746f342fafddd461a0fb0eb (patch) (unidiff)
treed645b3d8655bab11f9685f1989a854b21468e1d5
parent34e42590a8ef21c1377f89c7b82f25bcf0aec3cb (diff)
downloadopie-ea15abad0554edab0746f342fafddd461a0fb0eb.zip
opie-ea15abad0554edab0746f342fafddd461a0fb0eb.tar.gz
opie-ea15abad0554edab0746f342fafddd461a0fb0eb.tar.bz2
Minor update for generic sorted(): It will now ignory any categories if filter "DoNotShowCategories" is used..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/ChangeLog2
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend.cpp41
2 files changed, 22 insertions, 21 deletions
diff --git a/libopie2/opiepim/ChangeLog b/libopie2/opiepim/ChangeLog
index 52b3f6b..a1b4db0 100644
--- a/libopie2/opiepim/ChangeLog
+++ b/libopie2/opiepim/ChangeLog
@@ -1,31 +1,33 @@
12005-03.19 Stefan Eilers <stefan@eilers-online.net>
2 * Minor update for sorted(). Now ignoring any category search if "DoNotShowWithCategory" filter is activated.
12005-03-18 Stefan Eilers <stefan@eilers-online.net> 32005-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!) 4 * Rewrote generic sorted filter and added filter for "DoNotShowWithCategory", needed by addressbook (other filters need to be added!)
32005-01-16 Stefan Eilers <stefan@eilers-online.net> 52005-01-16 Stefan Eilers <stefan@eilers-online.net>
4 * Added new OPimEventSortVector class, improved OPimSortVector 6 * Added new OPimEventSortVector class, improved OPimSortVector
5 * OPimAccessBackend now supports generic sorting. 7 * OPimAccessBackend now supports generic sorting.
62005-01-03 Stefan Eilers <stefan@eilers-online.net> 82005-01-03 Stefan Eilers <stefan@eilers-online.net>
7 * Fixing bug in API documentation 9 * Fixing bug in API documentation
8 * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends 10 * Moving hasQuerySettings() and querySettings() to OPimAccessTemplate to be available for all frontends
92004-12-28 Stefan Eilers <stefan@eilers-online.net> 112004-12-28 Stefan Eilers <stefan@eilers-online.net>
10 * Make improved query by example accessable via frontend 12 * Make improved query by example accessable via frontend
11 * Some API documentation improvement 13 * Some API documentation improvement
12 * Cleanup of backend api.. 14 * Cleanup of backend api..
13 * Fixing bug #1501 15 * Fixing bug #1501
142004-11-23 Stefan Eilers <stefan@eilers-online.net> 162004-11-23 Stefan Eilers <stefan@eilers-online.net>
15 * Implement fast and full featured version of sorted() for addressbook 17 * Implement fast and full featured version of sorted() for addressbook
16 * Implement generic queryByExample for all Addressboook backends. It allows incremental search. 18 * Implement generic queryByExample for all Addressboook backends. It allows incremental search.
17 * Update of API Documentation 19 * Update of API Documentation
182004-11-18 Holger Freyther <freyther@handhelds.org> 202004-11-18 Holger Freyther <freyther@handhelds.org>
19 * Every Access can give a set of Occurrences for a period or a datetime 21 * Every Access can give a set of Occurrences for a period or a datetime
20 * QueryByExample, Find, Sort can be generically accessed by OPimBase 22 * QueryByExample, Find, Sort can be generically accessed by OPimBase
21 pointer interface 23 pointer interface
22 * OPimBackendOccurrence gets split up to OPimOccurrences by 24 * OPimBackendOccurrence gets split up to OPimOccurrences by
23 OPimTemplateBase 25 OPimTemplateBase
24 * Add safeCast to various OPimRecords 26 * Add safeCast to various OPimRecords
25 * Kill memleak in OPimTodo 27 * Kill memleak in OPimTodo
26 * Add SortVector implementations for OPimTodo and OPimContact 28 * Add SortVector implementations for OPimTodo and OPimContact
27 29
28 2004-??-??The Opie Team <opie@handhelds.org> 30 2004-??-??The Opie Team <opie@handhelds.org>
29 * Implemented some important modifications to allow to use OPimRecords as it is, without 31 * Implemented some important modifications to allow to use OPimRecords as it is, without
30 have to cast them. This makes it possible to write applications which handling pim 32 have to cast them. This makes it possible to write applications which handling pim
31 data in a generic manner (see opimconvertion tool) (eilers) \ No newline at end of file 33 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 6ac9934..e942905 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend.cpp
@@ -1,326 +1,325 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) Holger Freyther <freyther@handhelds.org> 3 Copyright (C) Holger Freyther <freyther@handhelds.org>
4 Copyright (C) Stefan Eilers <stefan@eilers-online.net> 4 Copyright (C) Stefan Eilers <stefan@eilers-online.net>
5 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 5 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
6 .=l. 6 .=l.
7 .>+-= 7 .>+-=
8 _;:, .> :=|. This program is free software; you can 8 _;:, .> :=|. This program is free software; you can
9.> <`_, > . <= redistribute it and/or modify it under 9.> <`_, > . <= redistribute it and/or modify it under
10:`=1 )Y*s>-.-- : the terms of the GNU Library General Public 10:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
11.="- .-=="i, .._ License as published by the Free Software 11.="- .-=="i, .._ License as published by the Free Software
12 - . .-<_> .<> Foundation; either version 2 of the License, 12 - . .-<_> .<> Foundation; either version 2 of the License,
13 ._= =} : or (at your option) any later version. 13 ._= =} : or (at your option) any later version.
14 .%`+i> _;_. 14 .%`+i> _;_.
15 .i_,=:_. -<s. This program is distributed in the hope that 15 .i_,=:_. -<s. This program is distributed in the hope that
16 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 16 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
17 : .. .:, . . . without even the implied warranty of 17 : .. .:, . . . without even the implied warranty of
18 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 18 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
19 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU 19 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
20..}^=.= = ; Library General Public License for more 20..}^=.= = ; Library General Public License for more
21++= -. .` .: details. 21++= -. .` .: details.
22 : = ...= . :.=- 22 : = ...= . :.=-
23 -. .:....=;==+<; You should have received a copy of the GNU 23 -. .:....=;==+<; You should have received a copy of the GNU
24 -_. . . )=. = Library General Public License along with 24 -_. . . )=. = Library General Public License along with
25 -- :-=` this library; see the file COPYING.LIB. 25 -- :-=` this library; see the file COPYING.LIB.
26 If not, write to the Free Software Foundation, 26 If not, write to the Free Software Foundation,
27 Inc., 59 Temple Place - Suite 330, 27 Inc., 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA. 28 Boston, MA 02111-1307, USA.
29*/ 29*/
30 30
31#include "ocontactaccessbackend.h" 31#include "ocontactaccessbackend.h"
32#include <opie2/private/opimcontactsortvector.h> 32#include <opie2/private/opimcontactsortvector.h>
33#include <opie2/ocontactaccess.h> 33#include <opie2/ocontactaccess.h>
34 34
35#include <opie2/odebug.h> 35#include <opie2/odebug.h>
36 36
37#include <qdatetime.h> 37#include <qdatetime.h>
38 38
39namespace Opie { 39namespace Opie {
40OPimContactAccessBackend::OPimContactAccessBackend() {} 40OPimContactAccessBackend::OPimContactAccessBackend() {}
41 41
42UIDArray OPimContactAccessBackend::queryByExample( const UIDArray& uid_array, const OPimContact& query, int settings, 42UIDArray OPimContactAccessBackend::queryByExample( const UIDArray& uid_array, const OPimContact& query, int settings,
43 const QDateTime& d )const { 43 const QDateTime& d )const {
44 odebug << "Using Unaccelerated OPimContactAccessBackend implementation of queryByExample!" << oendl; 44 odebug << "Using Unaccelerated OPimContactAccessBackend implementation of queryByExample!" << oendl;
45 45
46 UIDArray m_currentQuery( uid_array.count() ); 46 UIDArray m_currentQuery( uid_array.count() );
47 uint arraycounter = 0; 47 uint arraycounter = 0;
48 48
49 for( uint it = 0; it < uid_array.count(); ++it ){ 49 for( uint it = 0; it < uid_array.count(); ++it ){
50 /* Search all fields and compare them with query object. Store them into list 50 /* Search all fields and compare them with query object. Store them into list
51 * if all fields matches. 51 * if all fields matches.
52 */ 52 */
53 QDate* queryDate = 0l; 53 QDate* queryDate = 0l;
54 QDate* checkDate = 0l; 54 QDate* checkDate = 0l;
55 bool allcorrect = true; 55 bool allcorrect = true;
56 for ( int i = 0; i < Qtopia::Groups; i++ ) { 56 for ( int i = 0; i < Qtopia::Groups; i++ ) {
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 contactPassed = false; 249 bool contactPassed = false;
250 int cat; 250 int cat;
251 251
252 for ( uint i = 0; i < eve_count; ++i ) { 252 for ( uint i = 0; i < eve_count; ++i ) {
253 OPimContact contact = find( ar[i], ar, i, Frontend::Forward ); 253 OPimContact contact = find( ar[i], ar, i, Frontend::Forward );
254 if ( contact.isEmpty() ) 254 if ( contact.isEmpty() )
255 continue; 255 continue;
256 256
257 contactPassed = true; 257 contactPassed = true;
258 258
259 // Filter all Contacts which have any category
260 if ( (filter & OPimContactAccess::DoNotShowWithCategory) ? true : false ){ 259 if ( (filter & OPimContactAccess::DoNotShowWithCategory) ? true : false ){
261 if ( !contact.categories().isEmpty() ) 260 if ( !contact.categories().isEmpty() )
262 continue; 261 continue;
262 } else {
263
264 if ( (filter & OPimContactAccess::FilterCategory) ? true : false ){
265 /* show category */
266 /* -1 == unfiled */
267 for ( uint cat_nu = 0; cat_nu < cat_count; ++cat_nu ) {
268 cat = categories[cat_nu];
269
270 if ( cat == -1 ) {
271 // We should search unfiled contacts.
272 // Unfiled categories have no category set, thus continue if
273 // this contact has no empty category.
274 if( !contact.categories().isEmpty() )
275 contactPassed = false;
276 } else if ( cat != 0 )
277 if ( !contact.categories().contains( cat ) )
278 contactPassed = false;
279 }
280
281 }
263 } 282 }
264
265 /* show category */
266 /* -1 == unfiled */
267 for ( uint cat_nu = 0; cat_nu < cat_count; ++cat_nu ) {
268 cat = categories[cat_nu];
269
270 if ( (filter & OPimContactAccess::FilterCategory) ? true : false ){
271 if ( cat == -1 ) {
272 // We should search unfiled contacts.
273 // Unfiled categories have no category set, thus continue if
274 // this contact has no empty category.
275 if( !contact.categories().isEmpty() )
276 contactPassed = false;
277 } else if ( cat != 0 )
278 if ( !contact.categories().contains( cat ) )
279 contactPassed = false;
280 }
281
282 }
283
284 /* 283 /*
285 * If none of the Categories matched 284 * If none of the Categories matched
286 * continue 285 * continue
287 */ 286 */
288 if ( !contactPassed ) 287 if ( !contactPassed )
289 continue; 288 continue;
290 289
291 vector.insert(item++, contact ); 290 vector.insert(item++, contact );
292 } 291 }
293 292
294 vector.resize( item ); 293 vector.resize( item );
295 /* sort it now */ 294 /* sort it now */
296 vector.sort(); 295 vector.sort();
297 /* now get the uids */ 296 /* now get the uids */
298 UIDArray array( vector.count() ); 297 UIDArray array( vector.count() );
299 for (uint i= 0; i < vector.count(); i++ ) 298 for (uint i= 0; i < vector.count(); i++ )
300 array[i] = vector.uidAt( i ); 299 array[i] = vector.uidAt( i );
301 300
302 return array; 301 return array;
303} 302}
304 303
305OPimBackendOccurrence::List OPimContactAccessBackend::occurrences( const QDate& start, 304OPimBackendOccurrence::List OPimContactAccessBackend::occurrences( const QDate& start,
306 const QDate& end)const { 305 const QDate& end)const {
307 OPimBackendOccurrence::List lst; 306 OPimBackendOccurrence::List lst;
308 307
309 UIDArray records = allRecords(); 308 UIDArray records = allRecords();
310 const uint count = records.count(); 309 const uint count = records.count();
311 int uid; 310 int uid;
312 311
313 for ( uint i = 0; i < count; ++i ) { 312 for ( uint i = 0; i < count; ++i ) {
314 uid = records[i]; 313 uid = records[i];
315 OPimContact contact = find(uid, records, i, Frontend::Forward ); 314 OPimContact contact = find(uid, records, i, Frontend::Forward );
316 315
317 QDate date = contact.anniversary(); 316 QDate date = contact.anniversary();
318 date = QDate( start.year(), date.month(),date.day() ); 317 date = QDate( start.year(), date.month(),date.day() );
319 318
320// if ( date.isValid() && date.) { 319// if ( date.isValid() && date.) {
321// } 320// }
322 } 321 }
323 322
324 return lst; 323 return lst;
325} 324}
326} 325}