41 using namespace KCalCore;
44 class KCalCore::FreeBusy::Private
52 Private(
const KCalCore::FreeBusy::Private &other,
FreeBusy *qq) : q(qq)
58 : q(qq), mBusyPeriods(busyPeriods)
61 void init(
const KCalCore::FreeBusy::Private &other);
62 void init(
const Event::List &events,
const KDateTime &start,
const KDateTime &end);
68 bool addLocalPeriod(
FreeBusy *fb,
const KDateTime &start,
const KDateTime &end);
71 void KCalCore::FreeBusy::Private::init(
const KCalCore::FreeBusy::Private &other)
73 mDtEnd = other.mDtEnd;
74 mBusyPeriods = other.mBusyPeriods;
79 : d(new KCalCore::
FreeBusy::Private(this))
85 d(new KCalCore::
FreeBusy::Private(*other.d, this))
90 : d(new KCalCore::
FreeBusy::Private(this))
97 : d(new KCalCore::
FreeBusy::Private(this))
102 d->init(events, start, end);
106 void FreeBusy::Private::init(
const Event::List &eventList,
107 const KDateTime &start,
const KDateTime &end)
109 int extraDays, i, x, duration;
110 duration = start.daysTo(end);
116 Event::List::ConstIterator it;
117 for (it = eventList.constBegin(); it != eventList.constEnd(); ++it) {
130 if (event->allDay()) {
132 kDebug() <<
"All-day event";
136 KDateTime st = allDayEvent->dtStart();
137 st.setTime(QTime(0, 0));
138 KDateTime nd = allDayEvent->dtEnd();
139 nd.setTime(QTime(23, 59, 59, 999));
140 allDayEvent->setAllDay(
false);
141 allDayEvent->setDtStart(st);
142 allDayEvent->setDtEnd(nd);
144 kDebug() <<
"Use:" << st.toString() <<
"to" << nd.toString();
152 for (i = 0; i <= duration; ++i) {
153 day = start.addDays(i).date();
154 tmpStart.setDate(day);
157 if (event->recurs()) {
158 if (event->isMultiDay()) {
161 extraDays =
event->dtStart().daysTo(event->dtEnd());
162 for (x = 0; x <= extraDays; ++x) {
163 if (event->recursOn(day.addDays(-x), start.timeSpec())) {
164 tmpStart.setDate(day.addDays(-x));
165 tmpStart.setTime(event->dtStart().time());
166 tmpEnd =
event->duration().end(tmpStart);
168 addLocalPeriod(q, tmpStart, tmpEnd);
173 if (event->recursOn(day, start.timeSpec())) {
174 tmpStart.setTime(event->dtStart().time());
175 tmpEnd.setTime(event->dtEnd().time());
177 addLocalPeriod(q, tmpStart, tmpEnd);
184 addLocalPeriod(q, event->dtStart(),
event->dtEnd());
192 : d(new KCalCore::
FreeBusy::Private(this))
198 : d(new KCalCore::
FreeBusy::Private(busyPeriods, this))
246 return d->mBusyPeriods;
251 qSort(d->mBusyPeriods);
257 foreach(
const Period &p, list) {
265 d->mBusyPeriods += list;
283 if (freeBusy->dtStart() <
dtStart()) {
287 if (freeBusy->dtEnd() >
dtEnd()) {
292 Period::List::ConstIterator it;
293 for (it = periods.constBegin(); it != periods.constEnd(); ++it) {
294 d->mBusyPeriods.append(
FreeBusyPeriod((*it).start(), (*it).end()));
300 const KDateTime::Spec &newSpec)
302 if (oldSpec.isValid() && newSpec.isValid() && oldSpec != newSpec) {
304 d->mDtEnd = d->mDtEnd.toTimeSpec(oldSpec);
305 d->mDtEnd.setTimeSpec(newSpec);
314 if (&other !=
this) {
331 d->mBusyPeriods == fb->d->mBusyPeriods;
361 bool FreeBusy::Private::addLocalPeriod(
FreeBusy *fb,
362 const KDateTime &eventStart,
363 const KDateTime &eventEnd)
370 KDateTime start = fb->
dtStart();
371 if (!(((start.secsTo(eventStart) >= 0) &&
372 (eventStart.secsTo(mDtEnd) >= 0)) ||
373 ((start.secsTo(eventEnd) >= 0) &&
374 (eventEnd.secsTo(mDtEnd) >= 0)))) {
378 if (eventStart.secsTo(start) >= 0) {
381 tmpStart = eventStart;
384 if (eventEnd.secsTo(mDtEnd) <= 0) {
391 mBusyPeriods.append(p);
404 return QLatin1String(
"application/x-vnd.akonadi.calendar.freebusy");
411 return stream << data;
416 QString freeBusyVCal;
417 stream >> freeBusyVCal;
423 kDebug() <<
"Error parsing free/busy";
424 kDebug() << freeBusyVCal;