1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2015 The Qt Company Ltd. |
4 | ** Contact: http://www.qt.io/licensing/ |
5 | ** |
6 | ** This file is part of the QtOrganizer module of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL21$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and The Qt Company. For licensing terms |
14 | ** and conditions see http://www.qt.io/terms-conditions. For further |
15 | ** information use the contact form at http://www.qt.io/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 2.1 or version 3 as published by the Free |
20 | ** Software Foundation and appearing in the file LICENSE.LGPLv21 and |
21 | ** LICENSE.LGPLv3 included in the packaging of this file. Please review the |
22 | ** following information to ensure the GNU Lesser General Public License |
23 | ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and |
24 | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
25 | ** |
26 | ** As a special exception, The Qt Company gives you certain additional |
27 | ** rights. These rights are described in The Qt Company LGPL Exception |
28 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
29 | ** |
30 | ** $QT_END_LICENSE$ |
31 | ** |
32 | ****************************************************************************/ |
33 | |
34 | #include "qorganizerrecurrencerule.h" |
35 | #include "qorganizerrecurrencerule_p.h" |
36 | |
37 | #ifndef QT_NO_DEBUG_STREAM |
38 | #include <QtCore/qdebug.h> |
39 | #endif |
40 | |
41 | QT_BEGIN_NAMESPACE_ORGANIZER |
42 | |
43 | /*! |
44 | \class QOrganizerRecurrenceRule |
45 | \brief The QOrganizerRecurrenceRule class describes the a rule by which a QOrganizerItem repeats. |
46 | \inmodule QtOrganizer |
47 | \ingroup organizer-main |
48 | |
49 | This class is a mapping of a subset of the iCalendar RRULE property value, and each field in this |
50 | class corresponds to a fragment of iCalendar's RRULE. This class supports the same fragments as |
51 | those supported by RRULE, except for describing recurrences on a higher frequency than Daily. |
52 | That is, this class doesn't support hourly, minutely or secondly recurrences, nor does it support |
53 | specifying which hour, minute or second of a day to recur on. These types of rules are |
54 | unsupported because most calendaring backends don't support them, and it simplifies recurrences |
55 | by enforcing that there can be at most one occurrence of an item per day. |
56 | |
57 | The general rules for interaction between the fields when generating the occurence dates is as |
58 | follows: |
59 | \list |
60 | \li When a criterion takes a list, the items in the list are unioned together. |
61 | \list |
62 | \li e.g. with [dayOfWeek == Tuesday,Thursday], the event occurs if it is Tuesday or Thursday. |
63 | \endlist |
64 | |
65 | \li Frequency and specific criteria interact in a more complicated fashion. For each criterion on a |
66 | larger timespan than the frequency, the dates matching the criterion are intersected with the |
67 | dates resulting from the frequency. |
68 | \list |
69 | \li e.g. [frequency = Daily, month = January] means every day in January. For each criterion |
70 | on a shorter timespan than the frequency, the criterion is unioned. |
71 | \li e.g. [frequency = Weekly, dayOfWeek = Wednesday,Friday] means every Wednesday and Friday of |
72 | every week. |
73 | \endlist |
74 | This makes the frequency field superfluous in many cases when other criteria are present. |
75 | e.g. all of the below mean the same thing: |
76 | \list |
77 | \li [frequency = Daily, dayOfWeek = Monday,Tuesday] |
78 | \li [frequency = Weekly, dayOfWeek = Monday,Tuesday] |
79 | \li [frequency = Monthly, dayOfWeek = Monday,Tuesday] |
80 | \li [frequency = Yearly, dayOfWeek = Monday,Tuesday] |
81 | \endlist |
82 | However, the frequency field may start affecting the result differently when other fields are |
83 | added like interval and positions. |
84 | |
85 | \li For the purpose of calculating occurrence dates, information not contained in the rule is in some |
86 | cases derived from the startDateTime field of the event that the detail is associated with. |
87 | There are three cases where such derivation is necessary. |
88 | \list |
89 | \li Case 1: frequency == Weekly. If dayOfWeek is not specified, derive it from the week day that |
90 | the startDateTime occurs on. |
91 | \li Case 2: frequency == Monthly. If neither dayOfWeek or dayOfMonth is specified, dayOfMonth should |
92 | be derived from the startDateTime |
93 | \li Case 3: frequency == Yearly. If none of monthOfYear, weekOfYear, dayOfYear, dayOfMonth or dayOfWeek |
94 | are specified, derive monthOfYear and dayOfMonth. If monthOfYear is specified but not weekOfYear, dayOfYear, |
95 | dayOfMonth or dayOfWeek, then derive dayOfMonth. If weekOfYear is specified but not dayOfYear, |
96 | dayOfWeek or dayOfMonth, derive dayOfWeek from the startDateTime. |
97 | For any cases not covered here, do not derive any of the fields. |
98 | \endlist |
99 | \endlist |
100 | |
101 | A recurrence rule may be limited by either count or date, or it may be unlimited. |
102 | If limited by count, the series generated by the rule will have at most \c count |
103 | occurrences. If limited by date, the series generated by the rule may have occurrences |
104 | up to (and including) the limit \c date. See \l setLimit() for more information on |
105 | this topic. |
106 | */ |
107 | |
108 | /*! |
109 | \enum QOrganizerRecurrenceRule::Frequency |
110 | |
111 | This enumeration describes how often an item recurs. |
112 | \value Invalid The entire recurrence rule is invalid. |
113 | \value Daily The item recurs every day. |
114 | \value Weekly The item recurs every week. |
115 | \value Monthly The item recurs every month. |
116 | \value Yearly The item recurs every year. |
117 | */ |
118 | |
119 | /*! |
120 | \enum QOrganizerRecurrenceRule::Month |
121 | |
122 | This enumeration describes which month an item recurs on. |
123 | \value January |
124 | \value February |
125 | \value March |
126 | \value April |
127 | \value May |
128 | \value June |
129 | \value July |
130 | \value August |
131 | \value September |
132 | \value October |
133 | \value November |
134 | \value December |
135 | */ |
136 | |
137 | /*! |
138 | \enum QOrganizerRecurrenceRule::LimitType |
139 | |
140 | This enumeration describes the limitation of this recurrence rule. |
141 | \value NoLimit The recurrence rule has no limit specified. |
142 | \value CountLimit The recurrence rule specifies a certain count of repetitions in the series. |
143 | \value DateLimit The recurrence rule specifies that the series ends after a particular date. |
144 | */ |
145 | |
146 | /*! |
147 | Constructs a QOrganizerRecurrenceRule object describing a weekly recurrence. |
148 | */ |
149 | QOrganizerRecurrenceRule::QOrganizerRecurrenceRule() |
150 | : d(new QOrganizerRecurrenceRulePrivate) |
151 | { |
152 | } |
153 | |
154 | /*! |
155 | Destroys the QOrganizerRecurrenceRule object. |
156 | */ |
157 | QOrganizerRecurrenceRule::~QOrganizerRecurrenceRule() |
158 | { |
159 | } |
160 | |
161 | /*! |
162 | Constructs a QOrganizerRecurrenceRule object as a copy of \a other. |
163 | */ |
164 | QOrganizerRecurrenceRule::QOrganizerRecurrenceRule(const QOrganizerRecurrenceRule &other) |
165 | : d(other.d) |
166 | { |
167 | } |
168 | |
169 | /*! |
170 | Assigns this detail to be equal to \a other. |
171 | */ |
172 | QOrganizerRecurrenceRule &QOrganizerRecurrenceRule::operator=(const QOrganizerRecurrenceRule &other) |
173 | { |
174 | d = other.d; |
175 | return *this; |
176 | } |
177 | |
178 | /*! |
179 | Returns true if this recurrence rule is equal to the \a other; otherwise returns false. |
180 | |
181 | \sa operator!=() |
182 | */ |
183 | bool QOrganizerRecurrenceRule::operator==(const QOrganizerRecurrenceRule &other) const |
184 | { |
185 | if (d == other.d) |
186 | return true; |
187 | |
188 | return d->firstDayOfWeek == other.d->firstDayOfWeek |
189 | && d->frequency == other.d->frequency |
190 | && d->interval == other.d->interval |
191 | && d->limitCount == other.d->limitCount |
192 | && d->limitDate == other.d->limitDate |
193 | && d->limitType == other.d->limitType |
194 | && d->positions == other.d->positions |
195 | && d->daysOfMonth == other.d->daysOfMonth |
196 | && d->daysOfWeek == other.d->daysOfWeek |
197 | && d->daysOfYear == other.d->daysOfYear |
198 | && d->monthsOfYear == other.d->monthsOfYear |
199 | && d->weeksOfYear == other.d->weeksOfYear; |
200 | } |
201 | |
202 | /*! |
203 | \fn bool QOrganizerRecurrenceRule::operator!=(const QOrganizerRecurrenceRule &other) const |
204 | |
205 | Returns true if this recurrence rule is not equal to the \a other; otherwise returns false. |
206 | |
207 | \sa operator==() |
208 | */ |
209 | |
210 | /*! |
211 | Sets the frequency with which the item recurs to \a freq. |
212 | |
213 | This corresponds to the FREQ fragment in iCalendar's RRULE. |
214 | */ |
215 | void QOrganizerRecurrenceRule::setFrequency(Frequency freq) |
216 | { |
217 | d->frequency = freq; |
218 | } |
219 | |
220 | /*! |
221 | Returns the frequency with which the item recurs. The default frequency is Invalid. |
222 | */ |
223 | QOrganizerRecurrenceRule::Frequency QOrganizerRecurrenceRule::frequency() const |
224 | { |
225 | return d->frequency; |
226 | } |
227 | |
228 | /*! |
229 | Sets the "count" condition of the recurrence rule to \a count. If an end-date was previously |
230 | set, it is removed as count and endDate are mutually exclusive. |
231 | |
232 | The "count" condition is the maximum number of times the item should recur. Calling clearLimit() |
233 | or setting this to a negative value removes the count condition. |
234 | |
235 | This corresponds to the COUNT fragment in iCalendar's RRULE. |
236 | */ |
237 | void QOrganizerRecurrenceRule::setLimit(int count) |
238 | { |
239 | if (count < 0) { |
240 | clearLimit(); |
241 | } else { |
242 | d->limitType = QOrganizerRecurrenceRule::CountLimit; |
243 | d->limitCount = count; |
244 | d->limitDate = QDate(); |
245 | } |
246 | } |
247 | |
248 | /*! |
249 | Sets the end-date condition of the recurrence rule to \a date. If a "count" condition was |
250 | previously set, it is removed as count and endDate are mutually exclusive. |
251 | |
252 | The end-date condition is the date after which the item should not recur. Calling clearLimit() |
253 | or setting this to an invalid date removes the end-date condition. |
254 | |
255 | This corresponds to the UNTIL fragment in iCalendar's RRULE. |
256 | */ |
257 | void QOrganizerRecurrenceRule::setLimit(const QDate &date) |
258 | { |
259 | if (!date.isValid()) { |
260 | clearLimit(); |
261 | } else { |
262 | d->limitType = QOrganizerRecurrenceRule::DateLimit; |
263 | d->limitDate = date; |
264 | d->limitCount = -1; |
265 | } |
266 | } |
267 | |
268 | /*! |
269 | Clear any recurrence rule limitation conditions. |
270 | */ |
271 | void QOrganizerRecurrenceRule::clearLimit() |
272 | { |
273 | d->limitType = QOrganizerRecurrenceRule::NoLimit; |
274 | d->limitCount = -1; |
275 | d->limitDate = QDate(); |
276 | } |
277 | |
278 | /*! |
279 | Returns the type of limitation specified by the recurrence rule. The default limit type is NoLimit |
280 | (i.e. unlimited). |
281 | */ |
282 | QOrganizerRecurrenceRule::LimitType QOrganizerRecurrenceRule::limitType() const |
283 | { |
284 | return d->limitType; |
285 | } |
286 | |
287 | /*! |
288 | Returns the "count" condition specified by the recurrence rule. -1 is returned if the "count" |
289 | condition is not set or an end-date condition is currently set. |
290 | */ |
291 | int QOrganizerRecurrenceRule::limitCount() const |
292 | { |
293 | if (d->limitType == QOrganizerRecurrenceRule::CountLimit) |
294 | return d->limitCount; |
295 | return -1; |
296 | } |
297 | |
298 | /*! |
299 | Returns the end-date condition specified by the recurrence rule. An invalid date is returned if |
300 | the end-date condition is not set or a "count" condition is currently set. |
301 | */ |
302 | QDate QOrganizerRecurrenceRule::limitDate() const |
303 | { |
304 | if (d->limitType == QOrganizerRecurrenceRule::DateLimit) |
305 | return d->limitDate; |
306 | return QDate(); |
307 | } |
308 | |
309 | /*! |
310 | Sets the interval, between cycles of length given by frequency(), in which the item should recur |
311 | to \a interval. |
312 | |
313 | For example, if the frequency() is QOrganizerRecurrenceRule::Daily and the interval is set to 2, |
314 | the item should recur every second day. |
315 | |
316 | This corresponds to the INTERVAL fragment in iCalendar's RRULE. |
317 | */ |
318 | void QOrganizerRecurrenceRule::setInterval(int interval) |
319 | { |
320 | if (interval > 0) |
321 | d->interval = interval; |
322 | } |
323 | |
324 | /*! |
325 | Returns the interval of recurrence. The default interval is 1. |
326 | */ |
327 | int QOrganizerRecurrenceRule::interval() const |
328 | { |
329 | return d->interval; |
330 | } |
331 | |
332 | /*! |
333 | Sets the days of week on which the item should recur to \a days. |
334 | |
335 | This corresponds to the BYDAY fragment in iCalendar's RRULE. |
336 | */ |
337 | void QOrganizerRecurrenceRule::setDaysOfWeek(const QSet<Qt::DayOfWeek> &days) |
338 | { |
339 | d->daysOfWeek = days; |
340 | } |
341 | |
342 | /*! |
343 | Returns a set of the days of week that the item should recur on, or an empty set if not specified. |
344 | */ |
345 | QSet<Qt::DayOfWeek> QOrganizerRecurrenceRule::daysOfWeek() const |
346 | { |
347 | return d->daysOfWeek; |
348 | } |
349 | |
350 | /*! |
351 | Sets the days of the month on which the item should recur to \a days. Negative values in the set |
352 | represent the number of days from the end of the month. e.g. 1 represents the first day of the |
353 | month and -1 represents the last day of the month. |
354 | |
355 | This corresponds to the BYMONTHDAY fragment in iCalendar's RRULE. |
356 | */ |
357 | void QOrganizerRecurrenceRule::setDaysOfMonth(const QSet<int> &days) |
358 | { |
359 | d->daysOfMonth = days; |
360 | } |
361 | |
362 | /*! |
363 | Returns a set of the days of the month that the item should recur on, or an empty set if not specified. |
364 | */ |
365 | QSet<int> QOrganizerRecurrenceRule::daysOfMonth() const |
366 | { |
367 | return d->daysOfMonth; |
368 | } |
369 | |
370 | /*! |
371 | Sets the days of the year on which the item should recur to \a days. Negative values in the set |
372 | represent the number of days from the end of the year. e.g. 1 represents the first day of the |
373 | year and -1 represents the last day of the year. |
374 | |
375 | This corresponds to the BYYEARDAY fragment in iCalendar's RRULE. |
376 | */ |
377 | void QOrganizerRecurrenceRule::setDaysOfYear(const QSet<int> &days) |
378 | { |
379 | d->daysOfYear = days; |
380 | } |
381 | |
382 | /*! |
383 | Returns a set of the days of the year that the item should recur on, or an empty set if not specified. |
384 | */ |
385 | QSet<int> QOrganizerRecurrenceRule::daysOfYear() const |
386 | { |
387 | return d->daysOfYear; |
388 | } |
389 | |
390 | /*! |
391 | Sets the months on which the item should recur to \a months. |
392 | |
393 | This corresponds to the BYMONTHDAY fragment in iCalendar's RRULE. |
394 | */ |
395 | void QOrganizerRecurrenceRule::setMonthsOfYear(const QSet<Month> &months) |
396 | { |
397 | d->monthsOfYear = months; |
398 | } |
399 | |
400 | /*! |
401 | Returns a set of the months of the year that the item should recur on, or an empty set if not |
402 | specified. |
403 | */ |
404 | QSet<QOrganizerRecurrenceRule::Month> QOrganizerRecurrenceRule::monthsOfYear() const |
405 | { |
406 | return d->monthsOfYear; |
407 | } |
408 | |
409 | /*! |
410 | Sets the weeks of the year on which the item should recur to \a weeks. Negative values in the |
411 | set represent the number of weeks from the end of the year. e.g. 1 represents the first week of |
412 | the year and -1 represents the last week of the year. |
413 | |
414 | This corresponds to the BYWEEK fragment in iCalendar's RRULE. |
415 | */ |
416 | void QOrganizerRecurrenceRule::setWeeksOfYear(const QSet<int> &weeks) |
417 | { |
418 | d->weeksOfYear = weeks; |
419 | } |
420 | |
421 | /*! |
422 | Returns a set of the weeks of the year that the item should recur on, or an empty set if not |
423 | specified. |
424 | */ |
425 | QSet<int> QOrganizerRecurrenceRule::weeksOfYear() const |
426 | { |
427 | return d->weeksOfYear; |
428 | } |
429 | |
430 | /*! |
431 | Sets the set of positions that the item should recur on to \a pos. This specifies that the item |
432 | should only recur on the nth occurrence within the set of events otherwise specified by the rule, |
433 | for the values of n in \a pos. |
434 | |
435 | Negative values in the list represnet a position counting from the end of the set. |
436 | |
437 | For example, if frequency() == Monthly and months() is the list Monday, Tuesday, Wednesday, |
438 | Thursday, Friday, and positions() == -1, this specifies that the item should recur on the last |
439 | weekday of each month. |
440 | |
441 | This corresponds to the BYSETPOS fragment in iCalendar's RRULE. |
442 | */ |
443 | void QOrganizerRecurrenceRule::setPositions(const QSet<int> &pos) |
444 | { |
445 | d->positions = pos; |
446 | } |
447 | |
448 | /*! |
449 | Returns the position-set of the recurrence rule, or an empty set if not specified. |
450 | */ |
451 | QSet<int> QOrganizerRecurrenceRule::positions() const |
452 | { |
453 | return d->positions; |
454 | } |
455 | |
456 | /*! |
457 | Sets the day that the week starts on to \a day, for the purposes of calculating recurrences. |
458 | This is significant when the frequency is Weekly and the interval is greater than 1, or when |
459 | weekOfYear is set. See the iCalendar spec for examples of its significance. |
460 | |
461 | If not set, Monday is the first day of a week. |
462 | |
463 | This corresponds to the BYWKST fragment in iCalendar's RRULE. |
464 | */ |
465 | void QOrganizerRecurrenceRule::setFirstDayOfWeek(Qt::DayOfWeek day) |
466 | { |
467 | d->firstDayOfWeek = day; |
468 | } |
469 | |
470 | /*! |
471 | Returns the day that the week starts on. |
472 | */ |
473 | Qt::DayOfWeek QOrganizerRecurrenceRule::firstDayOfWeek() const |
474 | { |
475 | return d->firstDayOfWeek; |
476 | } |
477 | |
478 | /*! |
479 | \relates QOrganizerRecurrenceRule |
480 | Returns the hash value for \a key. |
481 | */ |
482 | uint qHash(const QOrganizerRecurrenceRule &key) |
483 | { |
484 | uint hash(0); |
485 | static const unsigned int prime1 = 11; |
486 | static const unsigned int prime2 = 31; |
487 | static const unsigned int prime3 = 47; |
488 | |
489 | foreach (int day, key.daysOfMonth()) |
490 | hash += day; |
491 | hash *= prime1; |
492 | |
493 | foreach (Qt::DayOfWeek day, key.daysOfWeek()) |
494 | hash += day; |
495 | hash *= prime2; |
496 | |
497 | foreach (int day, key.daysOfYear()) |
498 | hash += day; |
499 | hash *= prime3; |
500 | |
501 | foreach (QOrganizerRecurrenceRule::Month month, key.monthsOfYear()) |
502 | hash += month; |
503 | hash *= prime1; |
504 | |
505 | foreach (int week, key.weeksOfYear()) |
506 | hash += week; |
507 | hash *= prime2; |
508 | |
509 | foreach (int pos, key.positions()) |
510 | hash += pos; |
511 | hash *= prime3; |
512 | |
513 | hash += static_cast<uint>(key.firstDayOfWeek()) |
514 | + static_cast<uint>(key.frequency()) |
515 | + key.interval() |
516 | + key.limitCount() |
517 | + qHash(key: key.limitDate()) |
518 | + static_cast<uint>(key.limitType()); |
519 | |
520 | return hash * prime1; |
521 | } |
522 | |
523 | #ifndef QT_NO_DEBUG_STREAM |
524 | /*! |
525 | \relates QOrganizerRecurrenceRule |
526 | Outputs \a rule to the debug stream \a dbg. |
527 | */ |
528 | QDebug operator<<(QDebug dbg, const QOrganizerRecurrenceRule &rule) |
529 | { |
530 | dbg.nospace() << "QOrganizerRecurrenceRule(frequency=" ; |
531 | dbg.nospace() << rule.frequency(); |
532 | dbg.nospace() << "," ; |
533 | dbg.nospace() << "interval=" ; |
534 | dbg.nospace() << rule.interval(); |
535 | dbg.nospace() << "," ; |
536 | switch (rule.limitType()) { |
537 | case QOrganizerRecurrenceRule::CountLimit: |
538 | dbg.nospace() << "limitCount=" ; |
539 | dbg.nospace() << rule.limitCount(); |
540 | break; |
541 | case QOrganizerRecurrenceRule::DateLimit: |
542 | dbg.nospace() << "limitDate=" ; |
543 | dbg.nospace() << rule.limitDate().toString(); |
544 | break; |
545 | case QOrganizerRecurrenceRule::NoLimit: |
546 | dbg.nospace() << "no limit" ; |
547 | break; |
548 | default: |
549 | break; |
550 | } |
551 | dbg.nospace() << ",daysOfWeek=\"" ; |
552 | QList<Qt::DayOfWeek> wdays(rule.daysOfWeek().toList()); |
553 | std::sort(first: wdays.begin(), last: wdays.end()); |
554 | foreach (Qt::DayOfWeek day, wdays) { |
555 | dbg.nospace() << static_cast<quint32>(day); |
556 | dbg.space(); |
557 | } |
558 | dbg.nospace() << "\"" ; |
559 | |
560 | dbg.nospace() << ",daysOfMonth=\"" ; |
561 | QList<int> mdays(rule.daysOfMonth().toList()); |
562 | std::sort(first: mdays.begin(), last: mdays.end()); |
563 | foreach (int day, mdays) { |
564 | dbg.nospace() << day; |
565 | dbg.space(); |
566 | } |
567 | dbg.nospace() << "\"" ; |
568 | |
569 | dbg.nospace() << ",daysOfYear=\"" ; |
570 | QList<int> ydays(rule.daysOfYear().toList()); |
571 | std::sort(first: ydays.begin(), last: ydays.end()); |
572 | foreach (int day, ydays) { |
573 | dbg.nospace() << day; |
574 | dbg.space(); |
575 | } |
576 | dbg.nospace() << "\"" ; |
577 | |
578 | dbg.nospace() << ",monthsOfYear=\"" ; |
579 | QList<QOrganizerRecurrenceRule::Month> months(rule.monthsOfYear().toList()); |
580 | std::sort(first: months.begin(), last: months.end()); |
581 | foreach (QOrganizerRecurrenceRule::Month month, months) { |
582 | dbg.nospace() << static_cast<quint32>(month); |
583 | dbg.space(); |
584 | } |
585 | dbg.nospace() << "\"" ; |
586 | |
587 | dbg.nospace() << ",positions=\"" ; |
588 | QList<int> positions(rule.positions().toList()); |
589 | std::sort(first: positions.begin(), last: positions.end()); |
590 | foreach (int position, positions) { |
591 | dbg.nospace() << position; |
592 | dbg.space(); |
593 | } |
594 | dbg.nospace() << "\"," ; |
595 | |
596 | dbg.nospace() << "firstDayOfWeek=" ; |
597 | dbg.nospace() << static_cast<quint32>(rule.firstDayOfWeek()); |
598 | dbg.nospace() << ')'; |
599 | return dbg.maybeSpace(); |
600 | } |
601 | #endif // QT_NO_DEBUG_STREAM |
602 | |
603 | QT_END_NAMESPACE_ORGANIZER |
604 | |