Create a private operator= so compiler doesn't generate an unsafe one. Only Incidence...
[extendedkcal:kdab-developers-kcalsplit.git] / kcalcore / src / freebusy.h
1 /*
2   This file is part of the kcalcore library.
3
4   Copyright (c) 2001-2003 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 */
22 /**
23   @file
24   This file is part of the API for handling calendar data and
25   defines the FreeBusy class.
26
27   @author Cornelius Schumacher \<schumacher@kde.org\>
28   @author Reinhold Kainhofer \<reinhold@kainhofer.com\>
29 */
30
31 #ifndef KCALCORE_FREEBUSY_H
32 #define KCALCORE_FREEBUSY_H
33
34 #include "kcalcore_export.h"
35 #include "event.h"
36 #include "freebusyperiod.h"
37 #include "incidencebase.h"
38 #include "period.h"
39
40 namespace KCalCore {
41
42 class Calendar;
43 class FreeBusy;
44
45 /**
46   @brief
47   Provides information about the free/busy time of a calendar.
48
49   A free/busy is a collection of Periods (@see Period).
50 */
51 class KCALCORE_EXPORT FreeBusy : public IncidenceBase
52 {
53   public:
54
55     /**
56       A shared pointer to a FreeBusy object.
57     */
58     typedef QSharedPointer<FreeBusy> Ptr;
59
60     /**
61       A shared pointer to a non-mutable FreeBusy.
62     */
63     typedef QSharedPointer<const FreeBusy> ConstPtr;
64
65     /**
66       List of FreeBusy objects.
67     */
68     typedef QList<Ptr> List;
69
70     /**
71       Constructs an free/busy without any periods.
72     */
73     FreeBusy();
74
75     /**
76       Copy constructor.
77       @param other is the free/busy to copy.
78     */
79     FreeBusy( const FreeBusy &other );
80
81     /**
82       Constructs a free/busy from a list of periods.
83       @param busyPeriods is a QList of periods.
84     */
85     explicit FreeBusy( const Period::List &busyPeriods );
86
87     /**
88       Constructs a free/busy from a list of periods.
89       @param busyPeriods is a QList of periods.
90     */
91     explicit FreeBusy( const FreeBusyPeriod::List &busyPeriods );
92
93     /**
94       Constructs a free/busy from a single period.
95
96       @param start is the start datetime of the period.
97       @param end is the end datetime of the period.
98     */
99     FreeBusy( const KDateTime &start, const KDateTime &end );
100
101     /**
102       Constructs a freebusy for a specified list of events given a single period.
103
104       @param events list of events.
105       @param start is the start datetime of the period.
106       @param end is the end datetime of the period.
107       @since 4.4
108     */
109     FreeBusy( const Event::List &events, const KDateTime &start, const KDateTime &end );
110
111     /**
112       Destroys a free/busy.
113     */
114     ~FreeBusy();
115
116     /**
117       @copydoc
118       IncidenceBase::type()
119     */
120     IncidenceType type() const;
121
122     /**
123       @copydoc
124       IncidenceBase::typeStr()
125     */
126     QByteArray typeStr() const;
127
128     /**
129       Sets the start datetime for the free/busy. Note that this datetime
130       may be later or earlier than all periods within the free/busy.
131
132       @param start is a KDateTime specifying an start datetime.
133       @see IncidenceBase::dtStart(), setDtEnd().
134     */
135     virtual void setDtStart( const KDateTime &start );
136
137     /**
138       Sets the end datetime for the free/busy. Note that this datetime
139       may be later or earlier than all periods within the free/busy.
140
141       @param end is a KDateTime specifying an end datetime.
142       @see dtEnd(), setDtStart().
143     */
144     void setDtEnd( const KDateTime &end );
145
146     /**
147       Returns the end datetime for the free/busy.
148       FIXME: calling addPeriod() does not change mDtEnd. Is that incorrect?
149       @see setDtEnd().
150     */
151     virtual KDateTime dtEnd() const;
152
153     /**
154       @copydoc
155       IncidenceBase::shiftTimes()
156     */
157     virtual void shiftTimes( const KDateTime::Spec &oldSpec,
158                              const KDateTime::Spec &newSpec );
159
160     /**
161       Returns the list of all periods within the free/busy.
162     */
163     Period::List busyPeriods() const;
164
165     /**
166       Returns the list of all periods within the free/busy.
167     */
168     FreeBusyPeriod::List fullBusyPeriods() const;
169
170     /**
171       Adds a period to the freebusy list and sorts the list.
172
173       @param start is the start datetime of the period.
174       @param end is the end datetime of the period.
175     */
176     void addPeriod( const KDateTime &start, const KDateTime &end );
177
178     /**
179       Adds a period to the freebusy list and sorts the list.
180
181       @param start is the start datetime of the period.
182       @param duration is the Duration of the period.
183     */
184     void addPeriod( const KDateTime &start, const Duration &duration );
185
186     /**
187       Adds a list of periods to the freebusy object and then sorts that list.
188       Use this if you are adding many items, instead of the addPeriod method,
189       to avoid sorting repeatedly.
190
191       @param list is a QList of Period objects.
192     */
193     void addPeriods( const Period::List &list );
194
195     /**
196       Adds a list of periods to the freebusy object and then sorts that list.
197       Use this if you are adding many items, instead of the addPeriod method,
198       to avoid sorting repeatedly.
199
200       @param list is a QList of FreeBusyPeriod objects.
201     */
202     void addPeriods( const FreeBusyPeriod::List &list );
203
204     /**
205       Sorts the list of free/busy periods into ascending order.
206     */
207     void sortList();
208
209     /**
210       Merges another free/busy into this free/busy.
211
212       @param freebusy is a pointer to a valid FreeBusy object.
213     */
214     void merge( FreeBusy::Ptr freebusy );
215
216     /**
217       @copydoc
218       IncidenceBase::dateTime()
219     */
220     KDateTime dateTime( DateTimeRole role ) const;
221
222     /**
223        @copydoc
224        IncidenceBase::mimeType()
225     */
226     QLatin1String mimeType() const;
227
228   protected:
229     /**
230       Compare this with @p freebusy for equality.
231       @param freebusy is the FreeBusy to compare.
232     */
233     virtual bool equals( const IncidenceBase &freebusy ) const;
234
235     /**
236       @copydoc
237       IncidenceBase::assign()
238     */
239     virtual IncidenceBase &assign( const IncidenceBase &other );
240
241     /**
242       @copydoc
243       IncidenceBase::virtual_hook()
244     */
245     virtual void virtual_hook( int id, void *data );
246
247   private:
248     /**
249      @copydoc
250      IncidenceBase::accept()
251     */
252     bool accept( Visitor &v, IncidenceBase::Ptr incidence );
253
254     /**
255        Disabled, otherwise could be dangerous if you subclass FreeBusy.
256        Use IncidenceBase::operator= which is safe because it calls
257        virtual function assign().
258      */
259     FreeBusy &operator=( const FreeBusy &other );
260
261     //@cond PRIVATE
262     class Private;
263     Private *const d;
264     //@endcond
265 };
266
267 }
268
269 #endif