summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/backend/odatebookaccessbackend.cpp
Unidiff
Diffstat (limited to 'libopie2/opiepim/backend/odatebookaccessbackend.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/backend/odatebookaccessbackend.cpp58
1 files changed, 55 insertions, 3 deletions
diff --git a/libopie2/opiepim/backend/odatebookaccessbackend.cpp b/libopie2/opiepim/backend/odatebookaccessbackend.cpp
index e44912a..6da0170 100644
--- a/libopie2/opiepim/backend/odatebookaccessbackend.cpp
+++ b/libopie2/opiepim/backend/odatebookaccessbackend.cpp
@@ -1,81 +1,83 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de) 3 Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de)
4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5 .=l. 5 .=l.
6 .>+-= 6 .>+-=
7 _;:, .> :=|. This program is free software; you can 7 _;:, .> :=|. This program is free software; you can
8.> <`_, > . <= redistribute it and/or modify it under 8.> <`_, > . <= redistribute it and/or modify it under
9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public 9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
10.="- .-=="i, .._ License as published by the Free Software 10.="- .-=="i, .._ License as published by the Free Software
11 - . .-<_> .<> Foundation; either version 2 of the License, 11 - . .-<_> .<> Foundation; either version 2 of the License,
12 ._= =} : or (at your option) any later version. 12 ._= =} : or (at your option) any later version.
13 .%`+i> _;_. 13 .%`+i> _;_.
14 .i_,=:_. -<s. This program is distributed in the hope that 14 .i_,=:_. -<s. This program is distributed in the hope that
15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
16 : .. .:, . . . without even the implied warranty of 16 : .. .:, . . . without even the implied warranty of
17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU 18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.= = ; Library General Public License for more 19..}^=.= = ; Library General Public License for more
20++= -. .` .: details. 20++= -. .` .: details.
21 : = ...= . :.=- 21 : = ...= . :.=-
22 -. .:....=;==+<; You should have received a copy of the GNU 22 -. .:....=;==+<; You should have received a copy of the GNU
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29#include <qtl.h> 29#include <qtl.h>
30 30
31#include <opie2/odebug.h>
31#include <opie2/opimrecurrence.h> 32#include <opie2/opimrecurrence.h>
32 33#include <opie2/odatebookaccess.h>
33#include <opie2/odatebookaccessbackend.h> 34#include <opie2/odatebookaccessbackend.h>
35#include <opie2/private/opimeventsortvector.h>
34 36
35using namespace Opie; 37using namespace Opie;
36 38
37namespace { 39namespace {
38/* a small helper to get all NonRepeating events for a range of time */ 40/* a small helper to get all NonRepeating events for a range of time */
39void events( OPimBackendOccurrence::List& tmpList, 41void events( OPimBackendOccurrence::List& tmpList,
40 const OPimEvent::ValueList& events, 42 const OPimEvent::ValueList& events,
41 const QDate& from, const QDate& to ) { 43 const QDate& from, const QDate& to ) {
42 QDateTime dtStart, dtEnd; 44 QDateTime dtStart, dtEnd;
43 45
44 for ( OPimEvent::ValueList::ConstIterator it = events.begin(); it != events.end(); ++it ) { 46 for ( OPimEvent::ValueList::ConstIterator it = events.begin(); it != events.end(); ++it ) {
45 dtStart = (*it).startDateTime(); 47 dtStart = (*it).startDateTime();
46 dtEnd = (*it).endDateTime(); 48 dtEnd = (*it).endDateTime();
47 49
48 /* 50 /*
49 * If in range 51 * If in range
50 */ 52 */
51 if (dtStart.date() >= from && dtEnd.date() <= to ) { 53 if (dtStart.date() >= from && dtEnd.date() <= to ) {
52 OPimBackendOccurrence eff( dtStart, dtEnd, (*it).uid() );; 54 OPimBackendOccurrence eff( dtStart, dtEnd, (*it).uid() );;
53 tmpList.append( eff ); 55 tmpList.append( eff );
54 } 56 }
55 } 57 }
56} 58}
57 59
58void repeat( OPimBackendOccurrence::List& tmpList, const OPimEvent::ValueList& list, 60void repeat( OPimBackendOccurrence::List& tmpList, const OPimEvent::ValueList& list,
59 const QDate& from, const QDate& to ) { 61 const QDate& from, const QDate& to ) {
60 QDate repeat; 62 QDate repeat;
61 for ( OPimEvent::ValueList::ConstIterator it = list.begin(); it != list.end(); ++it ) { 63 for ( OPimEvent::ValueList::ConstIterator it = list.begin(); it != list.end(); ++it ) {
62 int dur = (*it).startDateTime().date().daysTo( (*it).endDateTime().date() ); 64 int dur = (*it).startDateTime().date().daysTo( (*it).endDateTime().date() );
63 QDate itDate = from.addDays(-dur ); 65 QDate itDate = from.addDays(-dur );
64 OPimRecurrence rec = (*it).recurrence(); 66 OPimRecurrence rec = (*it).recurrence();
65 if ( !rec.hasEndDate() || rec.endDate() > to ) { 67 if ( !rec.hasEndDate() || rec.endDate() > to ) {
66 rec.setEndDate( to ); 68 rec.setEndDate( to );
67 rec.setHasEndDate( true ); 69 rec.setHasEndDate( true );
68 } 70 }
69 71
70 QDateTime start, end; 72 QDateTime start, end;
71 while (rec.nextOcurrence(itDate, repeat ) ) { 73 while (rec.nextOcurrence(itDate, repeat ) ) {
72 if (repeat > to ) break; 74 if (repeat > to ) break;
73 75
74 OPimEvent event = *it; 76 OPimEvent event = *it;
75 start = QDateTime( repeat, event.startDateTime().time() ); 77 start = QDateTime( repeat, event.startDateTime().time() );
76 end = QDateTime( repeat.addDays(dur), event.endDateTime().time() ); 78 end = QDateTime( repeat.addDays(dur), event.endDateTime().time() );
77 OPimBackendOccurrence eff(start, end, event.uid() ); 79 OPimBackendOccurrence eff(start, end, event.uid() );
78 tmpList.append( eff ); 80 tmpList.append( eff );
79 } 81 }
80 } 82 }
81} 83}
@@ -99,83 +101,133 @@ OPimBackendOccurrence::List ODateBookAccessBackend::occurrences( const QDate& fr
99 repeat( tmpList, directRawRepeats(),from,to ); 101 repeat( tmpList, directRawRepeats(),from,to );
100 102
101 return tmpList; 103 return tmpList;
102} 104}
103 105
104OPimBackendOccurrence::List ODateBookAccessBackend::occurrences( const QDateTime& dt )const 106OPimBackendOccurrence::List ODateBookAccessBackend::occurrences( const QDateTime& dt )const
105{ 107{
106 OPimBackendOccurrence::List day = occurrences( dt.date(), dt.date() ); 108 OPimBackendOccurrence::List day = occurrences( dt.date(), dt.date() );
107 109
108 return filterOccurrences( day, dt ); 110 return filterOccurrences( day, dt );
109} 111}
110 112
111OPimBackendOccurrence::List ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDate& from, 113OPimBackendOccurrence::List ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDate& from,
112 const QDate& to )const 114 const QDate& to )const
113{ 115{
114 OPimBackendOccurrence::List tmpList; 116 OPimBackendOccurrence::List tmpList;
115 OPimEvent::ValueList list = directNonRepeats(); 117 OPimEvent::ValueList list = directNonRepeats();
116 118
117 events( tmpList, list, from, to ); 119 events( tmpList, list, from, to );
118 120
119 return tmpList; 121 return tmpList;
120} 122}
121 123
122OPimBackendOccurrence::List ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDateTime& dt )const 124OPimBackendOccurrence::List ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDateTime& dt )const
123{ 125{
124 OPimBackendOccurrence::List day = effectiveNonRepeatingEvents( dt.date(), dt.date() ); 126 OPimBackendOccurrence::List day = effectiveNonRepeatingEvents( dt.date(), dt.date() );
125 return filterOccurrences( day,dt ); 127 return filterOccurrences( day,dt );
126} 128}
127 129
128const uint ODateBookAccessBackend::querySettings() const 130const uint ODateBookAccessBackend::querySettings() const
129{ 131{
130 return 0; 132 return 0;
131} 133}
132 134
133bool ODateBookAccessBackend::hasQuerySettings (uint querySettings) const 135bool ODateBookAccessBackend::hasQuerySettings (uint querySettings) const
134{ 136{
135 return false; 137 return false;
136} 138}
137 139
138 140
139 141
140UIDArray ODateBookAccessBackend::queryByExample( const UIDArray& uidlist, const OPimEvent&, int settings, 142UIDArray ODateBookAccessBackend::queryByExample( const UIDArray& uidlist, const OPimEvent&, int settings,
141 const QDateTime& d )const 143 const QDateTime& d )const
142{ 144{
143 qDebug( "Accessing ODateBookAccessBackend::queryByExample() which is not implemented!" ); 145 qDebug( "Accessing ODateBookAccessBackend::queryByExample() which is not implemented!" );
144 return UIDArray(); 146 return UIDArray();
145} 147}
146 148
147UIDArray ODateBookAccessBackend::sorted( const UIDArray&, bool asc, int, int, const QArray<int>& )const { 149UIDArray ODateBookAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, int filter, const QArray<int>& categories )const {
148 return UIDArray(); 150 odebug << "Using Unaccelerated ODateBookAccessBackend sorted Implementation" << oendl;
151
152 Internal::OPimEventSortVector vector( ar.count(), asc, sortOrder );
153 int item = 0;
154
155 for ( uint i = 0; i < ar.count(); ++i ){
156 OPimEvent event = find( ar[i], ar, i, Frontend::Forward );
157 if ( event.isEmpty() )
158 continue;
159
160 bool catPassed = true;
161 if ( filter & ODateBookAccess::FilterCategory ){
162 catPassed = false;
163 // Filter Categories
164 for ( uint cat_idx = 0; cat_idx < categories.count(); ++cat_idx ){
165 int cat = categories[cat_idx];
166 if ( cat == -1 || cat == 0 ){
167 // Unfiled. Check next category if list is not empty.
168 // Else: take it as we will not filter unfiled events..
169 if ( !event.categories().isEmpty() )
170 continue;
171 else
172 catPassed = true;
173 } else {
174 if ( !event.categories().contains( cat ) )
175 continue;
176 else{
177 catPassed = true;
178 break;
179 }
180 }
181 }
182 }
183
184 // Continue to next event if the category filter removed this item
185 if ( !catPassed )
186 continue;
187
188 vector.insert( item++, event );
189 }
190
191 // Now sort the vector and return the list of UID's
192 vector.resize( item );
193 vector.sort();
194
195 UIDArray array( vector.count() );
196 for ( uint i= 0; i < vector.count(); i++ )
197 array[i] = vector.uidAt( i );
198
199 return array;
200
149} 201}
150 202
151OPimBackendOccurrence::List ODateBookAccessBackend::filterOccurrences( const OPimBackendOccurrence::List dayList, 203OPimBackendOccurrence::List ODateBookAccessBackend::filterOccurrences( const OPimBackendOccurrence::List dayList,
152 const QDateTime& dt ) { 204 const QDateTime& dt ) {
153 OPimBackendOccurrence::List tmpList; 205 OPimBackendOccurrence::List tmpList;
154 OPimBackendOccurrence::List::ConstIterator it; 206 OPimBackendOccurrence::List::ConstIterator it;
155 207
156 for ( it = dayList.begin(); it != dayList.end(); ++it ) { 208 for ( it = dayList.begin(); it != dayList.end(); ++it ) {
157 OPimBackendOccurrence occ = *it; 209 OPimBackendOccurrence occ = *it;
158 210
159 /* 211 /*
160 * Let us find occurrences that are 'now'! 212 * Let us find occurrences that are 'now'!
161 * If the dt.date() is on the same day as start or end of the Occurrence 213 * If the dt.date() is on the same day as start or end of the Occurrence
162 * check how near start/end are. 214 * check how near start/end are.
163 * If it is in the middle of a multiday occurrence list it. 215 * If it is in the middle of a multiday occurrence list it.
164 * 216 *
165 * We might want to 'lose' the sixty second offset and list 217 * We might want to 'lose' the sixty second offset and list
166 * all Events which are active at that time. 218 * all Events which are active at that time.
167 */ 219 */
168 if ( dt.date() == occ.startDateTime().date() ) { 220 if ( dt.date() == occ.startDateTime().date() ) {
169 if ( QABS( dt.time().secsTo( occ.startDateTime().time() ) ) < 60 ) 221 if ( QABS( dt.time().secsTo( occ.startDateTime().time() ) ) < 60 )
170 tmpList.append( occ ); 222 tmpList.append( occ );
171 }else if ( dt.date() == occ.endDateTime().date() ) { 223 }else if ( dt.date() == occ.endDateTime().date() ) {
172 if ( QABS( dt.time().secsTo( occ.endDateTime().time() ) ) < 60 ) 224 if ( QABS( dt.time().secsTo( occ.endDateTime().time() ) ) < 60 )
173 tmpList.append( occ ); 225 tmpList.append( occ );
174 }else if ( dt.date() >= occ.startDateTime().date() && 226 }else if ( dt.date() >= occ.startDateTime().date() &&
175 dt.date() >= occ.endDateTime().date() ) 227 dt.date() >= occ.endDateTime().date() )
176 tmpList.append( occ ); 228 tmpList.append( occ );
177 } 229 }
178 230
179 return tmpList; 231 return tmpList;
180} 232}
181} 233}