• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.14.10 API Reference
  • KDE Home
  • Contact Us
 

KCal Library

  • kcal
freebusy.cpp
Go to the documentation of this file.
1/*
2 This file is part of the kcal library.
3
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Library General Public
9 License as published by the Free Software Foundation; either
10 version 2 of the License, or (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Library General Public License for more details.
16
17 You should have received a copy of the GNU Library General Public License
18 along with this library; see the file COPYING.LIB. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
21*/
34#include "freebusy.h"
35#include "calendar.h"
36#include "event.h"
37
38#include <kdebug.h>
39#include <klocalizedstring.h>
40
41using namespace KCal;
42
43//@cond PRIVATE
44class KCal::FreeBusy::Private
45{
46 private:
47 FreeBusy *const q;
48 public:
49 Private( FreeBusy *qq ) : q( qq )
50 {}
51
52 Private( const KCal::FreeBusy::Private &other, FreeBusy *qq ) : q( qq )
53 { init( other ); }
54
55 Private( const FreeBusyPeriod::List &busyPeriods, FreeBusy *qq )
56 : q( qq ), mBusyPeriods( busyPeriods )
57 {}
58
59 void init( const KCal::FreeBusy::Private &other );
60 void init( const Event::List &events, const KDateTime &start, const KDateTime &end );
61
62 KDateTime mDtEnd; // end datetime
63 FreeBusyPeriod::List mBusyPeriods; // list of periods
64
65 // This is used for creating a freebusy object for the current user
66 bool addLocalPeriod( FreeBusy *fb, const KDateTime &start, const KDateTime &end );
67};
68
69void KCal::FreeBusy::Private::init( const KCal::FreeBusy::Private &other )
70{
71 mDtEnd = other.mDtEnd;
72 mBusyPeriods = other.mBusyPeriods;
73}
74//@endcond
75
76FreeBusy::FreeBusy()
77 : d( new KCal::FreeBusy::Private( this ) )
78{
79}
80
81FreeBusy::FreeBusy( const FreeBusy &other )
82 : IncidenceBase( other ),
83 d( new KCal::FreeBusy::Private( *other.d, this ) )
84{
85}
86
87FreeBusy::FreeBusy( const KDateTime &start, const KDateTime &end )
88 : d( new KCal::FreeBusy::Private( this ) )
89{
90 setDtStart( start );
91 setDtEnd( end );
92}
93
94FreeBusy::FreeBusy( const Event::List &events, const KDateTime &start, const KDateTime &end )
95 : d( new KCal::FreeBusy::Private( this ) )
96{
97 setDtStart( start );
98 setDtEnd( end );
99
100 d->init( events, start, end );
101}
102
103void FreeBusy::Private::init( const Event::List &eventList,
104 const KDateTime &start, const KDateTime &end )
105{
106 int extraDays, i, x, duration;
107 duration = start.daysTo( end );
108 QDate day;
109 KDateTime tmpStart;
110 KDateTime tmpEnd;
111
112 // Loops through every event in the calendar
113 Event::List::ConstIterator it;
114 for ( it = eventList.constBegin(); it != eventList.constEnd(); ++it ) {
115 Event *event = *it;
116
117 // If this event is transparent it shouldn't be in the freebusy list.
118 if ( event->transparency() == Event::Transparent ) {
119 continue;
120 }
121
122 // The code below can not handle all-day events. Fixing this resulted
123 // in a lot of duplicated code. Instead, make a copy of the event and
124 // set the period to the full day(s). This trick works for recurring,
125 // multiday, and single day all-day events.
126 Event *allDayEvent = 0;
127 if ( event->allDay() ) {
128 // addDay event. Do the hack
129 kDebug() << "All-day event";
130 allDayEvent = new Event( *event );
131
132 // Set the start and end times to be on midnight
133 KDateTime st = allDayEvent->dtStart();
134 st.setTime( QTime( 0, 0 ) );
135 KDateTime nd = allDayEvent->dtEnd();
136 nd.setTime( QTime( 23, 59, 59, 999 ) );
137 allDayEvent->setAllDay( false );
138 allDayEvent->setDtStart( st );
139 allDayEvent->setDtEnd( nd );
140
141 kDebug() << "Use:" << st.toString() << "to" << nd.toString();
142 // Finally, use this event for the setting below
143 event = allDayEvent;
144 }
145
146 // This whole for loop is for recurring events, it loops through
147 // each of the days of the freebusy request
148
149 for ( i = 0; i <= duration; ++i ) {
150 day = start.addDays(i).date();
151 tmpStart.setDate( day );
152 tmpEnd.setDate( day );
153
154 if ( event->recurs() ) {
155 if ( event->isMultiDay() ) {
156 // FIXME: This doesn't work for sub-daily recurrences or recurrences with
157 // a different time than the original event.
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 );
164
165 addLocalPeriod( q, tmpStart, tmpEnd );
166 break;
167 }
168 }
169 } else {
170 if ( event->recursOn( day, start.timeSpec() ) ) {
171 tmpStart.setTime( event->dtStart().time() );
172 tmpEnd.setTime( event->dtEnd().time() );
173
174 addLocalPeriod ( q, tmpStart, tmpEnd );
175 }
176 }
177 }
178
179 }
180 // Non-recurring events
181 addLocalPeriod( q, event->dtStart(), event->dtEnd() );
182
183 // Clean up
184 delete allDayEvent;
185 }
186
187 q->sortList();
188}
189
190FreeBusy::FreeBusy( Calendar *calendar, const KDateTime &start, const KDateTime &end )
191 : d( new KCal::FreeBusy::Private( this ) )
192{
193 kDebug();
194
195 setDtStart( start );
196 setDtEnd( end );
197
198 d->init( calendar ? calendar->rawEvents( start.date(), end.date() ) : Event::List(), start, end );
199}
200
201FreeBusy::FreeBusy( const Period::List &busyPeriods )
202 : d( new KCal::FreeBusy::Private( this ) )
203{
204 addPeriods(busyPeriods);
205}
206
207FreeBusy::FreeBusy( const FreeBusyPeriod::List &busyPeriods )
208 : d( new KCal::FreeBusy::Private( busyPeriods, this ) )
209{
210}
211
212FreeBusy::~FreeBusy()
213{
214 delete d;
215}
216
217QByteArray FreeBusy::type() const
218{
219 return "FreeBusy";
220}
221
222//KDE5:
223//QString FreeBusy::typeStr() const
224//{
225// return i18nc( "incidence type is freebusy", "free/busy" );
226//}
227
228void FreeBusy::setDtStart( const KDateTime &start )
229{
230 IncidenceBase::setDtStart( start.toUtc() );
231 updated();
232}
233
234void FreeBusy::setDtEnd( const KDateTime &end )
235{
236 d->mDtEnd = end;
237}
238
239KDateTime FreeBusy::dtEnd() const
240{
241 return d->mDtEnd;
242}
243
244Period::List FreeBusy::busyPeriods() const
245{
246 Period::List res;
247
248 foreach ( const FreeBusyPeriod &p, d->mBusyPeriods ) {
249 res << p;
250 }
251
252 return res;
253}
254
255FreeBusyPeriod::List FreeBusy::fullBusyPeriods() const
256{
257 return d->mBusyPeriods;
258}
259
260void FreeBusy::sortList()
261{
262 qSort( d->mBusyPeriods );
263 return;
264}
265
266void FreeBusy::addPeriods( const Period::List &list )
267{
268 foreach ( const Period &p, list ) {
269 d->mBusyPeriods << FreeBusyPeriod( p );
270 }
271 sortList();
272}
273
274void FreeBusy::addPeriods( const FreeBusyPeriod::List &list )
275{
276 d->mBusyPeriods += list;
277 sortList();
278}
279
280void FreeBusy::addPeriod( const KDateTime &start, const KDateTime &end )
281{
282 d->mBusyPeriods.append( FreeBusyPeriod( start, end ) );
283 sortList();
284}
285
286void FreeBusy::addPeriod( const KDateTime &start, const Duration &duration )
287{
288 d->mBusyPeriods.append( FreeBusyPeriod( start, duration ) );
289 sortList();
290}
291
292void FreeBusy::merge( FreeBusy *freeBusy )
293{
294 if ( freeBusy->dtStart() < dtStart() ) {
295 setDtStart( freeBusy->dtStart() );
296 }
297
298 if ( freeBusy->dtEnd() > dtEnd() ) {
299 setDtEnd( freeBusy->dtEnd() );
300 }
301
302 Period::List periods = freeBusy->busyPeriods();
303 Period::List::ConstIterator it;
304 for ( it = periods.constBegin(); it != periods.constEnd(); ++it ) {
305 d->mBusyPeriods.append( FreeBusyPeriod( (*it).start(), (*it).end() ) );
306 }
307 sortList();
308}
309
310void FreeBusy::shiftTimes( const KDateTime::Spec &oldSpec,
311 const KDateTime::Spec &newSpec )
312{
313 if ( oldSpec.isValid() && newSpec.isValid() && oldSpec != newSpec ) {
314 IncidenceBase::shiftTimes( oldSpec, newSpec );
315 d->mDtEnd = d->mDtEnd.toTimeSpec( oldSpec );
316 d->mDtEnd.setTimeSpec( newSpec );
317 foreach ( FreeBusyPeriod p, d->mBusyPeriods ) { //krazy:exclude=foreach
318 p.shiftTimes( oldSpec, newSpec );
319 }
320 }
321}
322
323FreeBusy &FreeBusy::operator=( const FreeBusy &other )
324{
325 // check for self assignment
326 if ( &other == this ) {
327 return *this;
328 }
329
330 IncidenceBase::operator=( other );
331 d->init( *other.d );
332 return *this;
333}
334
335bool FreeBusy::operator==( const FreeBusy &freebusy ) const
336{
337 return
338 IncidenceBase::operator==( freebusy ) &&
339 dtEnd() == freebusy.dtEnd() &&
340 d->mBusyPeriods == freebusy.d->mBusyPeriods;
341}
342
343//@cond PRIVATE
344bool FreeBusy::Private::addLocalPeriod( FreeBusy *fb,
345 const KDateTime &eventStart,
346 const KDateTime &eventEnd )
347{
348 KDateTime tmpStart;
349 KDateTime tmpEnd;
350
351 //Check to see if the start *or* end of the event is
352 //between the start and end of the freebusy dates.
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 ) ) ) ) {
358 return false;
359 }
360
361 if ( eventStart.secsTo( start ) >= 0 ) {
362 tmpStart = start;
363 } else {
364 tmpStart = eventStart;
365 }
366
367 if ( eventEnd.secsTo( mDtEnd ) <= 0 ) {
368 tmpEnd = mDtEnd;
369 } else {
370 tmpEnd = eventEnd;
371 }
372
373 FreeBusyPeriod p( tmpStart, tmpEnd );
374 mBusyPeriods.append( p );
375
376 return true;
377}
378//@endcond
calendar.h
This file is part of the API for handling calendar data and defines the Calendar class.
KCal::Calendar
Represents the main calendar class.
Definition: calendar.h:121
KCal::Calendar::rawEvents
virtual Event::List rawEvents(EventSortField sortField=EventSortUnsorted, SortDirection sortDirection=SortDirectionAscending)=0
Returns a sorted, unfiltered list of all Events for this Calendar.
KCal::Duration
Represents a span of time measured in seconds or days.
Definition: duration.h:53
KCal::Event
This class provides an Event in the sense of RFC2445.
Definition: event.h:42
KCal::Event::setDtEnd
void setDtEnd(const KDateTime &dtEnd)
Sets the event end date and time.
Definition: event.cpp:119
KCal::Event::dtEnd
virtual KDateTime dtEnd() const
Returns the event end date and time.
Definition: event.cpp:132
KCal::Event::Transparent
@ Transparent
Event does not appear in free/busy time.
Definition: event.h:49
KCal::FreeBusyPeriod
The period can be defined by either a start time and an end time or by a start time and a duration.
Definition: freebusyperiod.h:49
KCal::FreeBusyPeriod::List
QList< FreeBusyPeriod > List
List of periods.
Definition: freebusyperiod.h:54
KCal::FreeBusy
Provides information about the free/busy time of a calendar.
Definition: freebusy.h:51
KCal::FreeBusy::merge
void merge(FreeBusy *freebusy)
Merges another free/busy into this free/busy.
Definition: freebusy.cpp:292
KCal::FreeBusy::dtEnd
virtual KDateTime dtEnd() const
Returns the end datetime for the free/busy.
Definition: freebusy.cpp:239
KCal::FreeBusy::busyPeriods
Period::List busyPeriods() const
Returns the list of all periods within the free/busy.
Definition: freebusy.cpp:244
KCal::FreeBusy::sortList
void sortList()
Sorts the list of free/busy periods into ascending order.
Definition: freebusy.cpp:260
KCal::FreeBusy::fullBusyPeriods
FreeBusyPeriod::List fullBusyPeriods() const
Returns the list of all periods within the free/busy.
Definition: freebusy.cpp:255
KCal::FreeBusy::addPeriods
void addPeriods(const Period::List &list)
Adds a list of periods to the freebusy object and then sorts that list.
Definition: freebusy.cpp:266
KCal::FreeBusy::setDtEnd
void setDtEnd(const KDateTime &end)
Sets the end datetime for the free/busy.
Definition: freebusy.cpp:234
KCal::FreeBusy::type
QByteArray type() const
Definition: freebusy.cpp:217
KCal::FreeBusy::operator==
bool operator==(const FreeBusy &freebusy) const
Compare this with freebusy for equality.
Definition: freebusy.cpp:335
KCal::FreeBusy::~FreeBusy
~FreeBusy()
Destroys a free/busy.
Definition: freebusy.cpp:212
KCal::FreeBusy::FreeBusy
FreeBusy()
Constructs an free/busy without any periods.
Definition: freebusy.cpp:76
KCal::FreeBusy::setDtStart
virtual void setDtStart(const KDateTime &start)
Definition: freebusy.cpp:228
KCal::FreeBusy::operator=
FreeBusy & operator=(const FreeBusy &other)
Assignment operator.
Definition: freebusy.cpp:323
KCal::FreeBusy::shiftTimes
virtual void shiftTimes(const KDateTime::Spec &oldSpec, const KDateTime::Spec &newSpec)
Definition: freebusy.cpp:310
KCal::FreeBusy::addPeriod
void addPeriod(const KDateTime &start, const KDateTime &end)
Adds a period to the freebusy list and sorts the list.
Definition: freebusy.cpp:280
KCal::IncidenceBase
An abstract class that provides a common base for all calendar incidence classes.
Definition: incidencebase.h:103
KCal::IncidenceBase::updated
void updated()
Call this to notify the observers after the IncidenceBase object has changed.
Definition: incidencebase.cpp:475
KCal::IncidenceBase::shiftTimes
virtual void shiftTimes(const KDateTime::Spec &oldSpec, const KDateTime::Spec &newSpec)
Shift the times of the incidence so that they appear at the same clock time as before but in a new ti...
Definition: incidencebase.cpp:324
KCal::IncidenceBase::duration
Duration duration() const
Returns the length of the incidence duration.
Definition: incidencebase.cpp:448
KCal::IncidenceBase::dtStart
virtual KDateTime dtStart() const
Returns an incidence's starting date/time as a KDateTime.
Definition: incidencebase.cpp:248
KCal::IncidenceBase::operator=
IncidenceBase & operator=(const IncidenceBase &other)
Assignment operator.
Definition: incidencebase.cpp:131
KCal::IncidenceBase::operator==
bool operator==(const IncidenceBase &ib) const
Compares this with IncidenceBase ib for equality.
Definition: incidencebase.cpp:144
KCal::IncidenceBase::setDtStart
virtual void setDtStart(const KDateTime &dtStart)
Sets the incidence's starting date/time with a KDateTime.
Definition: incidencebase.cpp:240
KCal::Incidence::setAllDay
void setAllDay(bool allDay)
Definition: incidence.cpp:305
KCal::Incidence::setDtStart
virtual void setDtStart(const KDateTime &dt)
Sets the incidence starting date/time.
Definition: incidence.cpp:349
KCal::ListBase
This class provides a template for lists of pointers.
Definition: listbase.h:45
KCal::Period
The period can be defined by either a start time and an end time or by a start time and a duration.
Definition: period.h:48
KCal::Period::List
QList< Period > List
List of periods.
Definition: period.h:53
KCal::Period::shiftTimes
void shiftTimes(const KDateTime::Spec &oldSpec, const KDateTime::Spec &newSpec)
Shift the times of the period so that they appear at the same clock time as before but in a new time ...
Definition: period.cpp:136
event.h
This file is part of the API for handling calendar data and defines the Event class.
freebusy.h
This file is part of the API for handling calendar data and defines the FreeBusy class.
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Thu Jul 21 2022 00:00:00 by doxygen 1.9.5 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KCal Library

Skip menu "KCal Library"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepimlibs-4.14.10 API Reference

Skip menu "kdepimlibs-4.14.10 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal