summaryrefslogtreecommitdiffabout
path: root/libkcal
Unidiff
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/event.cpp75
1 files changed, 66 insertions, 9 deletions
diff --git a/libkcal/event.cpp b/libkcal/event.cpp
index 46e8174..5285559 100644
--- a/libkcal/event.cpp
+++ b/libkcal/event.cpp
@@ -168,151 +168,208 @@ Event::Transparency Event::transparency() const
168 168
169void Event::setDuration(int seconds) 169void Event::setDuration(int seconds)
170{ 170{
171 setHasEndDate(false); 171 setHasEndDate(false);
172 Incidence::setDuration(seconds); 172 Incidence::setDuration(seconds);
173} 173}
174bool Event::isOverlapping ( Event* testEvent, QDateTime* overlapDT, QDateTime* startDT ) 174bool Event::isOverlapping ( Event* testEvent, QDateTime* overlapDT, QDateTime* startDT )
175{ 175{
176 if ( testEvent == this ) 176 if ( testEvent == this )
177 return false; 177 return false;
178 if ( ! doesRecur() && !testEvent->doesRecur() ) { 178 if ( ! doesRecur() && !testEvent->doesRecur() ) {
179 QDateTime te; 179 QDateTime te;
180 if ( testEvent->doesFloat() ) 180 if ( testEvent->doesFloat() )
181 te = testEvent->mDtEnd.addDays( 1 ); 181 te = testEvent->mDtEnd.addDays( 1 );
182 else 182 else
183 te = testEvent->mDtEnd; 183 te = testEvent->mDtEnd;
184 QDateTime e; 184 QDateTime e;
185 if ( doesFloat() ) 185 if ( doesFloat() )
186 e = mDtEnd.addDays( 1 ); 186 e = mDtEnd.addDays( 1 );
187 else 187 else
188 e = mDtEnd; 188 e = mDtEnd;
189 if ( mDtStart < te && testEvent->mDtStart < e ) { 189 if ( mDtStart < te && testEvent->mDtStart < e ) {
190 if ( mDtStart < testEvent->mDtStart ) 190 if ( mDtStart < testEvent->mDtStart )
191 *overlapDT = testEvent->mDtStart; 191 *overlapDT = testEvent->mDtStart;
192 else 192 else
193 *overlapDT = mDtStart; 193 *overlapDT = mDtStart;
194 if ( startDT ) 194 if ( startDT )
195 return (*overlapDT >= *startDT ); 195 return (*overlapDT >= *startDT );
196 return true; 196 return true;
197 } 197 }
198 return false; 198 return false;
199 } 199 }
200 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) {
201 if ( mDtStart.time() >= testEvent->mDtEnd.time() || testEvent->mDtStart.time() >= mDtEnd.time() ) {
202 // no need to test. times mismatch
203 //fprintf(stderr,"timi ");
204 return false;
205 }
206 }
200 Event *nonRecur = 0; 207 Event *nonRecur = 0;
201 Event *recurEvent = 0; 208 Event *recurEvent = 0;
202 if ( ! doesRecur() ) { 209 if ( ! doesRecur() ) {
203 nonRecur = this; 210 nonRecur = this;
204 recurEvent = testEvent; 211 recurEvent = testEvent;
205 } 212 }
206 else if ( !testEvent->doesRecur() ) { 213 else if ( !testEvent->doesRecur() ) {
207 nonRecur = testEvent; 214 nonRecur = testEvent;
208 recurEvent = this; 215 recurEvent = this;
209 } 216 }
210 if ( nonRecur ) { 217 if ( nonRecur ) {
211 QDateTime enr; 218 QDateTime enr;
212 if ( nonRecur->doesFloat() ) 219 if ( nonRecur->doesFloat() )
213 enr = nonRecur->mDtEnd.addDays( 1 ); 220 enr = nonRecur->mDtEnd.addDays( 1 );
214 else 221 else
215 enr = nonRecur->mDtEnd; 222 enr = nonRecur->mDtEnd;
216 if ( enr < recurEvent->mDtStart ) 223 if ( enr < recurEvent->mDtStart )
217 return false; 224 return false;
218 if ( startDT && enr < *startDT ) 225 if ( startDT && enr < *startDT )
219 return false; 226 return false;
227
220 int recDuration = recurEvent->mDtStart.secsTo( recurEvent->mDtEnd ); 228 int recDuration = recurEvent->mDtStart.secsTo( recurEvent->mDtEnd );
221 if ( recurEvent->doesFloat() ) 229 if ( recurEvent->doesFloat() )
222 recDuration += 86400; 230 recDuration += 86400;
223 bool ok = true; 231 bool ok = false;
224 QDateTime recStart = recurEvent->mDtStart.addSecs( -300);; 232 QDateTime recStart;
233 if ( startDT ) {
234 recStart = recurEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
235 }
236 if ( recStart.isValid() ) {
237 //qDebug("%s start at %s ", startDT-> toString().latin1(), recStart.toString().latin1());
238 recStart = recStart.addSecs( -300);
239 }
240 else
241 recStart = recurEvent->mDtStart.addSecs( -300);
242 ok = true;
243
225 while ( ok ) { 244 while ( ok ) {
226 recStart = recurEvent->getNextOccurence( recStart.addSecs( 60 ), &ok ); 245 recStart = recurEvent->getNextOccurence( recStart.addSecs( 60 ), &ok );
227 if ( ok ) { 246 if ( ok ) {
228 if ( recStart > enr ) 247 if ( recStart > enr )
229 return false; 248 return false;
230 QDateTime recEnd = recStart.addSecs( recDuration ); 249 QDateTime recEnd = recStart.addSecs( recDuration );
231 if ( nonRecur->mDtStart < recEnd && recStart < nonRecur->mDtEnd ) { 250 if ( nonRecur->mDtStart < recEnd && recStart < nonRecur->mDtEnd ) {
232 if ( nonRecur->mDtStart < recStart ) 251 if ( nonRecur->mDtStart < recStart )
233 *overlapDT = recStart; 252 *overlapDT = recStart;
234 else 253 else
235 *overlapDT = nonRecur->mDtStart; 254 *overlapDT = nonRecur->mDtStart;
236 if ( startDT ) { 255 if ( startDT ) {
237 if ( *overlapDT >= *startDT ) 256 if ( *overlapDT >= *startDT )
238 return true; 257 return true;
239 } else 258 } else
240 return true; 259 return true;
241 } 260 }
242 } 261 }
243 } 262 }
244 return false; 263 return false;
245 } 264 }
246 265 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) {
247 QDateTime incidenceStart = mDtStart; 266 if ( recurrence()->doesRecur() == Recurrence::rWeekly && testEvent->recurrence()->doesRecur() == Recurrence::rWeekly ) {
267 bool found = false;
268 uint i;
269 for ( i=0; i< recurrence()->days().size();++i ) {
270 found = found || (recurrence()->days().testBit( i ) && testEvent->recurrence()->days().testBit( i ) );
271 }
272 if ( ! found ) {
273 //qDebug("recurring days mismatch %s -- %s", summary().latin1(),testEvent->summary().latin1());
274 return false;
275 }
276
277 }
278 }
279 bool ok = true;
280 QDateTime incidenceStart;// = mDtStart;
281 QDateTime testincidenceStart;// = testEvent->mDtStart;
282 if ( startDT ) {
283 incidenceStart = recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
284 testincidenceStart = testEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
285 }
286 if ( !testincidenceStart.isValid() )
287 testincidenceStart = testEvent->mDtStart;
288 if ( !incidenceStart.isValid() )
289 incidenceStart = mDtStart;
248 int duration = mDtStart.secsTo( mDtEnd ); 290 int duration = mDtStart.secsTo( mDtEnd );
249 if ( doesFloat() ) 291 if ( doesFloat() )
250 duration += 86400; 292 duration += 86400;
251 QDateTime testincidenceStart = testEvent->mDtStart;
252 int testduration = testEvent->mDtStart.secsTo( testEvent->mDtEnd ); 293 int testduration = testEvent->mDtStart.secsTo( testEvent->mDtEnd );
253 if ( testEvent->doesFloat() ) 294 if ( testEvent->doesFloat() )
254 testduration += 86400; 295 testduration += 86400;
255 bool computeThis = false; 296 bool computeThis = false;
256 if ( incidenceStart < testincidenceStart ) 297 if ( incidenceStart < testincidenceStart )
257 computeThis = true; 298 computeThis = true;
258 bool ok = true;
259 if ( computeThis ) 299 if ( computeThis )
260 incidenceStart = incidenceStart.addSecs( -300 ); 300 incidenceStart = incidenceStart.addSecs( -300 );
261 else 301 else
262 testincidenceStart = testincidenceStart.addSecs( -300 ); 302 testincidenceStart = testincidenceStart.addSecs( -300 );
263 int count = 0; 303 int count = 0;
304 ok = true;
305 int countbreak = 2000;
306 QDateTime stopSearch;
307 bool testStop = false;
308 if ( startDT ) {
309 stopSearch = startDT->addDays( 365*3 );
310 testStop = true;
311 }
264 while ( ok ) { 312 while ( ok ) {
265 ++count; 313 ++count;
266 if ( count > 1000 ) break; 314 if ( count > countbreak ) break;
267 if ( computeThis ) 315 if ( computeThis ) {
316 if ( testStop )
317 if ( testincidenceStart > stopSearch )
318 break;
268 incidenceStart = getNextOccurence( incidenceStart.addSecs( 60 ), &ok ); 319 incidenceStart = getNextOccurence( incidenceStart.addSecs( 60 ), &ok );
269 else 320 }
321 else {
322 if ( testStop )
323 if ( incidenceStart > stopSearch )
324 break;
270 testincidenceStart = testEvent->getNextOccurence( testincidenceStart.addSecs( 60 ), &ok ); 325 testincidenceStart = testEvent->getNextOccurence( testincidenceStart.addSecs( 60 ), &ok );
326 }
271 if ( ok ) { 327 if ( ok ) {
272 if ( incidenceStart < testincidenceStart.addSecs( testduration ) && testincidenceStart < incidenceStart.addSecs( duration ) ) { 328 if ( incidenceStart < testincidenceStart.addSecs( testduration ) && testincidenceStart < incidenceStart.addSecs( duration ) ) {
273 if ( incidenceStart < testincidenceStart ) 329 if ( incidenceStart < testincidenceStart )
274 *overlapDT = testincidenceStart; 330 *overlapDT = testincidenceStart;
275 else 331 else
276 *overlapDT = incidenceStart; 332 *overlapDT = incidenceStart;
277 if ( startDT ) { 333 if ( startDT ) {
278 if ( *overlapDT >= *startDT ) 334 if ( *overlapDT >= *startDT )
279 return true; 335 return true;
280 } else 336 } else
281 return true; 337 return true;
282 } 338 }
283 computeThis = ( incidenceStart < testincidenceStart ); 339 computeThis = ( incidenceStart < testincidenceStart );
284 } 340 }
285 341
286 } 342 }
343 //qDebug("%d rec counter stopped at %d - %s %s", ok ,count, summary().latin1(),testEvent->summary().latin1() );
287 return false; 344 return false;
288} 345}
289QDateTime Event::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const 346QDateTime Event::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const
290{ 347{
291 *ok = false; 348 *ok = false;
292 if ( !alarmEnabled() ) 349 if ( !alarmEnabled() )
293 return QDateTime (); 350 return QDateTime ();
294 bool yes; 351 bool yes;
295 QDateTime incidenceStart = getNextOccurence( start_dt, &yes ); 352 QDateTime incidenceStart = getNextOccurence( start_dt, &yes );
296 if ( ! yes || cancelled() ) { 353 if ( ! yes || cancelled() ) {
297 *ok = false; 354 *ok = false;
298 return QDateTime (); 355 return QDateTime ();
299 } 356 }
300 357
301 bool enabled = false; 358 bool enabled = false;
302 Alarm* alarm; 359 Alarm* alarm;
303 int off = 0; 360 int off = 0;
304 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 361 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
305 // if ( QDateTime::currentDateTime() > incidenceStart ){ 362 // if ( QDateTime::currentDateTime() > incidenceStart ){
306// *ok = false; 363// *ok = false;
307// return incidenceStart; 364// return incidenceStart;
308// } 365// }
309 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 366 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
310 if (alarm->enabled()) { 367 if (alarm->enabled()) {
311 if ( alarm->hasTime () ) { 368 if ( alarm->hasTime () ) {
312 if ( alarm->time() < alarmStart ) { 369 if ( alarm->time() < alarmStart ) {
313 alarmStart = alarm->time(); 370 alarmStart = alarm->time();
314 enabled = true; 371 enabled = true;
315 off = alarmStart.secsTo( incidenceStart ); 372 off = alarmStart.secsTo( incidenceStart );
316 } 373 }
317 374
318 } else { 375 } else {