44 class KCal::FreeBusy::Private
52 Private(
const KCal::FreeBusy::Private &other,
FreeBusy *qq ) : q( qq )
56 : q( qq ), mBusyPeriods( busyPeriods )
59 void init(
const KCal::FreeBusy::Private &other );
60 void init(
const Event::List &events,
const KDateTime &start,
const KDateTime &end );
66 bool addLocalPeriod(
FreeBusy *fb,
const KDateTime &start,
const KDateTime &end );
69 void KCal::FreeBusy::Private::init(
const KCal::FreeBusy::Private &other )
71 mDtEnd = other.mDtEnd;
72 mBusyPeriods = other.mBusyPeriods;
77 : d( new KCal::
FreeBusy::Private( this ) )
83 d( new KCal::
FreeBusy::Private( *other.d, this ) )
88 : d( new KCal::
FreeBusy::Private( this ) )
95 : d( new KCal::
FreeBusy::Private( this ) )
100 d->init( events, start, end );
103 void FreeBusy::Private::init(
const Event::List &eventList,
104 const KDateTime &start,
const KDateTime &end )
106 int extraDays, i, x, duration;
107 duration = start.daysTo( end );
113 Event::List::ConstIterator it;
114 for ( it = eventList.constBegin(); it != eventList.constEnd(); ++it ) {
126 Event *allDayEvent = 0;
127 if ( event->allDay() ) {
129 kDebug() <<
"All-day event";
130 allDayEvent =
new Event( *event );
133 KDateTime st = allDayEvent->
dtStart();
134 st.setTime( QTime( 0, 0 ) );
135 KDateTime nd = allDayEvent->
dtEnd();
136 nd.setTime( QTime( 23, 59, 59, 999 ) );
141 kDebug() <<
"Use:" << st.toString() <<
"to" << nd.toString();
149 for ( i = 0; i <= duration; ++i ) {
150 day = start.addDays(i).date();
151 tmpStart.setDate( day );
152 tmpEnd.setDate( day );
154 if ( event->recurs() ) {
155 if ( event->isMultiDay() ) {
158 extraDays =
event->
dtStart().daysTo( event->dtEnd() );
159 for ( x = 0; x <= extraDays; ++x ) {
160 if ( event->recursOn( day.addDays(-x), start.timeSpec() ) ) {
161 tmpStart.setDate( day.addDays(-x) );
162 tmpStart.setTime( event->dtStart().time() );
163 tmpEnd =
event->duration().end( tmpStart );
165 addLocalPeriod( q, tmpStart, tmpEnd );
170 if ( event->recursOn( day, start.timeSpec() ) ) {
171 tmpStart.setTime( event->dtStart().time() );
172 tmpEnd.setTime( event->dtEnd().time() );
174 addLocalPeriod ( q, tmpStart, tmpEnd );
181 addLocalPeriod( q, event->dtStart(),
event->dtEnd() );
191 : d( new KCal::
FreeBusy::Private( this ) )
198 d->init( calendar ? calendar->
rawEvents( start.date(), end.date() ) :
Event::List(), start, end );
202 : d( new KCal::
FreeBusy::Private( this ) )
208 : d( new KCal::
FreeBusy::Private( busyPeriods, this ) )
257 return d->mBusyPeriods;
262 qSort( d->mBusyPeriods );
268 foreach (
const Period &p, list ) {
276 d->mBusyPeriods += list;
303 Period::List::ConstIterator it;
304 for ( it = periods.constBegin(); it != periods.constEnd(); ++it ) {
305 d->mBusyPeriods.append(
FreeBusyPeriod( (*it).start(), (*it).end() ) );
311 const KDateTime::Spec &newSpec )
313 if ( oldSpec.isValid() && newSpec.isValid() && oldSpec != newSpec ) {
315 d->mDtEnd = d->mDtEnd.toTimeSpec( oldSpec );
316 d->mDtEnd.setTimeSpec( newSpec );
326 if ( &other ==
this ) {
340 d->mBusyPeriods == freebusy.d->mBusyPeriods;
344 bool FreeBusy::Private::addLocalPeriod(
FreeBusy *fb,
345 const KDateTime &eventStart,
346 const KDateTime &eventEnd )
353 KDateTime start = fb->
dtStart();
354 if ( !( ( ( start.secsTo(eventStart) >= 0 ) &&
355 ( eventStart.secsTo(mDtEnd) >= 0 ) ) ||
356 ( ( start.secsTo(eventEnd) >= 0 ) &&
357 ( eventEnd.secsTo(mDtEnd) >= 0 ) ) ) ) {
361 if ( eventStart.secsTo( start ) >= 0 ) {
364 tmpStart = eventStart;
367 if ( eventEnd.secsTo( mDtEnd ) <= 0 ) {
374 mBusyPeriods.append( p );