-rw-r--r-- | libkcal/icalformatimpl.cpp | 8 | ||||
-rw-r--r-- | libkcal/recurrence.cpp | 17 | ||||
-rw-r--r-- | libkcal/recurrence.h | 6 |
3 files changed, 24 insertions, 7 deletions
diff --git a/libkcal/icalformatimpl.cpp b/libkcal/icalformatimpl.cpp index 32a1337..964ffe3 100644 --- a/libkcal/icalformatimpl.cpp +++ b/libkcal/icalformatimpl.cpp | |||
@@ -1371,49 +1371,49 @@ void ICalFormatImpl::readRecurrenceRule(struct icalrecurrencetype rrule,Incidenc | |||
1371 | struct icalrecurrencetype r = rrule; | 1371 | struct icalrecurrencetype r = rrule; |
1372 | 1372 | ||
1373 | dumpIcalRecurrence(r); | 1373 | dumpIcalRecurrence(r); |
1374 | readRecurrence( r, recur, incidence); | 1374 | readRecurrence( r, recur, incidence); |
1375 | } | 1375 | } |
1376 | 1376 | ||
1377 | void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurrence* recur, Incidence *incidence) | 1377 | void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurrence* recur, Incidence *incidence) |
1378 | { | 1378 | { |
1379 | int wkst; | 1379 | int wkst; |
1380 | int index = 0; | 1380 | int index = 0; |
1381 | short day = 0; | 1381 | short day = 0; |
1382 | QBitArray qba(7); | 1382 | QBitArray qba(7); |
1383 | int frequ = r.freq; | 1383 | int frequ = r.freq; |
1384 | int interv = r.interval; | 1384 | int interv = r.interval; |
1385 | // preprocessing for odd recurrence definitions | 1385 | // preprocessing for odd recurrence definitions |
1386 | 1386 | ||
1387 | if ( r.freq == ICAL_MONTHLY_RECURRENCE ) { | 1387 | if ( r.freq == ICAL_MONTHLY_RECURRENCE ) { |
1388 | if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) { | 1388 | if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) { |
1389 | interv = 12; | 1389 | interv = 12; |
1390 | } | 1390 | } |
1391 | } | 1391 | } |
1392 | if ( r.freq == ICAL_YEARLY_RECURRENCE ) { | 1392 | if ( r.freq == ICAL_YEARLY_RECURRENCE ) { |
1393 | if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) { | 1393 | if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) { |
1394 | frequ = ICAL_MONTHLY_RECURRENCE; | 1394 | frequ = ICAL_MONTHLY_RECURRENCE; |
1395 | interv = 12; | 1395 | interv = 12* r.interval; |
1396 | } | 1396 | } |
1397 | } | 1397 | } |
1398 | 1398 | ||
1399 | switch (frequ) { | 1399 | switch (frequ) { |
1400 | case ICAL_MINUTELY_RECURRENCE: | 1400 | case ICAL_MINUTELY_RECURRENCE: |
1401 | if (!icaltime_is_null_time(r.until)) { | 1401 | if (!icaltime_is_null_time(r.until)) { |
1402 | recur->setMinutely(interv,readICalDateTime(r.until)); | 1402 | recur->setMinutely(interv,readICalDateTime(r.until)); |
1403 | } else { | 1403 | } else { |
1404 | if (r.count == 0) | 1404 | if (r.count == 0) |
1405 | recur->setMinutely(interv,-1); | 1405 | recur->setMinutely(interv,-1); |
1406 | else | 1406 | else |
1407 | recur->setMinutely(interv,r.count); | 1407 | recur->setMinutely(interv,r.count); |
1408 | } | 1408 | } |
1409 | break; | 1409 | break; |
1410 | case ICAL_HOURLY_RECURRENCE: | 1410 | case ICAL_HOURLY_RECURRENCE: |
1411 | if (!icaltime_is_null_time(r.until)) { | 1411 | if (!icaltime_is_null_time(r.until)) { |
1412 | recur->setHourly(interv,readICalDateTime(r.until)); | 1412 | recur->setHourly(interv,readICalDateTime(r.until)); |
1413 | } else { | 1413 | } else { |
1414 | if (r.count == 0) | 1414 | if (r.count == 0) |
1415 | recur->setHourly(interv,-1); | 1415 | recur->setHourly(interv,-1); |
1416 | else | 1416 | else |
1417 | recur->setHourly(interv,r.count); | 1417 | recur->setHourly(interv,r.count); |
1418 | } | 1418 | } |
1419 | break; | 1419 | break; |
@@ -1478,111 +1478,115 @@ void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurre | |||
1478 | } | 1478 | } |
1479 | if (useSetPos) { | 1479 | if (useSetPos) { |
1480 | if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { | 1480 | if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { |
1481 | recur->addMonthlyPos(r.by_set_pos[0],qba); | 1481 | recur->addMonthlyPos(r.by_set_pos[0],qba); |
1482 | } | 1482 | } |
1483 | } | 1483 | } |
1484 | } else if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { | 1484 | } else if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { |
1485 | if (!icaltime_is_null_time(r.until)) { | 1485 | if (!icaltime_is_null_time(r.until)) { |
1486 | recur->setMonthly(Recurrence::rMonthlyDay,interv, | 1486 | recur->setMonthly(Recurrence::rMonthlyDay,interv, |
1487 | readICalDate(r.until)); | 1487 | readICalDate(r.until)); |
1488 | } else { | 1488 | } else { |
1489 | if (r.count == 0) | 1489 | if (r.count == 0) |
1490 | recur->setMonthly(Recurrence::rMonthlyDay,interv,-1); | 1490 | recur->setMonthly(Recurrence::rMonthlyDay,interv,-1); |
1491 | else | 1491 | else |
1492 | recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count); | 1492 | recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count); |
1493 | } | 1493 | } |
1494 | while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { | 1494 | while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { |
1495 | // kdDebug(5800) << "----b " << day << endl; | 1495 | // kdDebug(5800) << "----b " << day << endl; |
1496 | recur->addMonthlyDay(day); | 1496 | recur->addMonthlyDay(day); |
1497 | } | 1497 | } |
1498 | } | 1498 | } |
1499 | break; | 1499 | break; |
1500 | case ICAL_YEARLY_RECURRENCE: | 1500 | case ICAL_YEARLY_RECURRENCE: |
1501 | if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { | 1501 | if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { |
1502 | qDebug(" YEARLY DAY OF YEAR"); | ||
1502 | if (!icaltime_is_null_time(r.until)) { | 1503 | if (!icaltime_is_null_time(r.until)) { |
1503 | recur->setYearly(Recurrence::rYearlyDay,interv, | 1504 | recur->setYearly(Recurrence::rYearlyDay,interv, |
1504 | readICalDate(r.until)); | 1505 | readICalDate(r.until)); |
1505 | } else { | 1506 | } else { |
1506 | if (r.count == 0) | 1507 | if (r.count == 0) |
1507 | recur->setYearly(Recurrence::rYearlyDay,interv,-1); | 1508 | recur->setYearly(Recurrence::rYearlyDay,interv,-1); |
1508 | else | 1509 | else |
1509 | recur->setYearly(Recurrence::rYearlyDay,interv,r.count); | 1510 | recur->setYearly(Recurrence::rYearlyDay,interv,r.count); |
1510 | } | 1511 | } |
1511 | while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { | 1512 | while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { |
1512 | recur->addYearlyNum(day); | 1513 | recur->addYearlyNum(day); |
1513 | } | 1514 | } |
1514 | } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) { | 1515 | } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) { |
1515 | if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { | 1516 | if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { |
1517 | qDebug("YEARLY POS NOT SUPPORTED BY GUI"); | ||
1516 | if (!icaltime_is_null_time(r.until)) { | 1518 | if (!icaltime_is_null_time(r.until)) { |
1517 | recur->setYearly(Recurrence::rYearlyPos,interv, | 1519 | recur->setYearly(Recurrence::rYearlyPos,interv, |
1518 | readICalDate(r.until)); | 1520 | readICalDate(r.until)); |
1519 | } else { | 1521 | } else { |
1520 | if (r.count == 0) | 1522 | if (r.count == 0) |
1521 | recur->setYearly(Recurrence::rYearlyPos,interv,-1); | 1523 | recur->setYearly(Recurrence::rYearlyPos,interv,-1); |
1522 | else | 1524 | else |
1523 | recur->setYearly(Recurrence::rYearlyPos,interv,r.count); | 1525 | recur->setYearly(Recurrence::rYearlyPos,interv,r.count); |
1524 | } | 1526 | } |
1525 | bool useSetPos = false; | 1527 | bool useSetPos = false; |
1526 | short pos = 0; | 1528 | short pos = 0; |
1527 | while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { | 1529 | while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { |
1528 | // kdDebug(5800) << "----a " << index << ": " << day << endl; | 1530 | // kdDebug(5800) << "----a " << index << ": " << day << endl; |
1529 | pos = icalrecurrencetype_day_position(day); | 1531 | pos = icalrecurrencetype_day_position(day); |
1530 | if (pos) { | 1532 | if (pos) { |
1531 | day = icalrecurrencetype_day_day_of_week(day); | 1533 | day = icalrecurrencetype_day_day_of_week(day); |
1532 | QBitArray ba(7); // don't wipe qba | 1534 | QBitArray ba(7); // don't wipe qba |
1533 | ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 | 1535 | ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 |
1534 | recur->addYearlyMonthPos(pos,ba); | 1536 | recur->addYearlyMonthPos(pos,ba); |
1535 | } else { | 1537 | } else { |
1536 | qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 | 1538 | qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 |
1537 | useSetPos = true; | 1539 | useSetPos = true; |
1538 | } | 1540 | } |
1539 | } | 1541 | } |
1540 | if (useSetPos) { | 1542 | if (useSetPos) { |
1541 | if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { | 1543 | if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { |
1542 | recur->addYearlyMonthPos(r.by_set_pos[0],qba); | 1544 | recur->addYearlyMonthPos(r.by_set_pos[0],qba); |
1543 | } | 1545 | } |
1544 | } | 1546 | } |
1545 | } else { | 1547 | } else { |
1548 | qDebug("YEARLY MONTH "); | ||
1546 | if (!icaltime_is_null_time(r.until)) { | 1549 | if (!icaltime_is_null_time(r.until)) { |
1547 | recur->setYearly(Recurrence::rYearlyMonth,interv, | 1550 | recur->setYearly(Recurrence::rYearlyMonth,interv, |
1548 | readICalDate(r.until)); | 1551 | readICalDate(r.until)); |
1549 | } else { | 1552 | } else { |
1550 | if (r.count == 0) | 1553 | if (r.count == 0) |
1551 | recur->setYearly(Recurrence::rYearlyMonth,interv,-1); | 1554 | recur->setYearly(Recurrence::rYearlyMonth,interv,-1); |
1552 | else | 1555 | else |
1553 | recur->setYearly(Recurrence::rYearlyMonth,interv,r.count); | 1556 | recur->setYearly(Recurrence::rYearlyMonth,interv,r.count); |
1554 | } | 1557 | } |
1555 | } | ||
1556 | if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) { | 1558 | if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) { |
1557 | index = 0; | 1559 | index = 0; |
1558 | while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { | 1560 | while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { |
1559 | recur->addYearlyNum(day); | 1561 | recur->addYearlyNum(day); |
1560 | } | 1562 | } |
1561 | } else { | 1563 | } else { |
1562 | recur->addYearlyNum(incidence->dtStart().date().month()); | 1564 | recur->addYearlyNum(incidence->dtStart().date().month()); |
1563 | } | 1565 | } |
1564 | } | 1566 | } |
1567 | |||
1568 | } | ||
1565 | break; | 1569 | break; |
1566 | default: | 1570 | default: |
1567 | ; | 1571 | ; |
1568 | break; | 1572 | break; |
1569 | } | 1573 | } |
1570 | } | 1574 | } |
1571 | 1575 | ||
1572 | void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence) | 1576 | void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence) |
1573 | { | 1577 | { |
1574 | //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl; | 1578 | //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl; |
1575 | 1579 | ||
1576 | Alarm* ialarm = incidence->newAlarm(); | 1580 | Alarm* ialarm = incidence->newAlarm(); |
1577 | ialarm->setRepeatCount(0); | 1581 | ialarm->setRepeatCount(0); |
1578 | ialarm->setEnabled(true); | 1582 | ialarm->setEnabled(true); |
1579 | 1583 | ||
1580 | // Determine the alarm's action type | 1584 | // Determine the alarm's action type |
1581 | icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY); | 1585 | icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY); |
1582 | if ( !p ) { | 1586 | if ( !p ) { |
1583 | return; | 1587 | return; |
1584 | } | 1588 | } |
1585 | 1589 | ||
1586 | icalproperty_action action = icalproperty_get_action(p); | 1590 | icalproperty_action action = icalproperty_get_action(p); |
1587 | Alarm::Type type = Alarm::Display; | 1591 | Alarm::Type type = Alarm::Display; |
1588 | switch ( action ) { | 1592 | switch ( action ) { |
diff --git a/libkcal/recurrence.cpp b/libkcal/recurrence.cpp index 5fc5d1f..dd74e10 100644 --- a/libkcal/recurrence.cpp +++ b/libkcal/recurrence.cpp | |||
@@ -633,49 +633,49 @@ void Recurrence::addMonthlyPos_(short _rPos, const QBitArray &_rDays) | |||
633 | } else { | 633 | } else { |
634 | tmpPos->rPos = -_rPos; // take abs() | 634 | tmpPos->rPos = -_rPos; // take abs() |
635 | tmpPos->negative = true; | 635 | tmpPos->negative = true; |
636 | } | 636 | } |
637 | tmpPos->rDays = _rDays; | 637 | tmpPos->rDays = _rDays; |
638 | tmpPos->rDays.detach(); | 638 | tmpPos->rDays.detach(); |
639 | rMonthPositions.append(tmpPos); | 639 | rMonthPositions.append(tmpPos); |
640 | 640 | ||
641 | if (mCompatVersion < 310 && mCompatDuration > 0) { | 641 | if (mCompatVersion < 310 && mCompatDuration > 0) { |
642 | // Backwards compatibility for KDE < 3.1. | 642 | // Backwards compatibility for KDE < 3.1. |
643 | // rDuration was set to the number of time periods to recur. | 643 | // rDuration was set to the number of time periods to recur. |
644 | // Convert this to the number of occurrences. | 644 | // Convert this to the number of occurrences. |
645 | int monthsAhead = (mCompatDuration-1+mRecurExDatesCount) * rFreq; | 645 | int monthsAhead = (mCompatDuration-1+mRecurExDatesCount) * rFreq; |
646 | int month = mRecurStart.date().month() - 1 + monthsAhead; | 646 | int month = mRecurStart.date().month() - 1 + monthsAhead; |
647 | QDate end(mRecurStart.date().year() + month/12, month%12 + 1, 31); | 647 | QDate end(mRecurStart.date().year() + month/12, month%12 + 1, 31); |
648 | rDuration = INT_MAX; // ensure that recurCalc() does its job correctly | 648 | rDuration = INT_MAX; // ensure that recurCalc() does its job correctly |
649 | rDuration = recurCalc(COUNT_TO_DATE, end); | 649 | rDuration = recurCalc(COUNT_TO_DATE, end); |
650 | } | 650 | } |
651 | 651 | ||
652 | if (mParent) mParent->updated(); | 652 | if (mParent) mParent->updated(); |
653 | } | 653 | } |
654 | 654 | ||
655 | void Recurrence::addMonthlyDay(short _rDay) | 655 | void Recurrence::addMonthlyDay(short _rDay) |
656 | { | 656 | { |
657 | if (mRecurReadOnly || recurs != rMonthlyDay | 657 | if (mRecurReadOnly || (recurs != rMonthlyDay && recurs != rYearlyMonth) |
658 | || _rDay == 0 || _rDay > 31 || _rDay < -31) // invalid day number | 658 | || _rDay == 0 || _rDay > 31 || _rDay < -31) // invalid day number |
659 | return; | 659 | return; |
660 | for (int* it = rMonthDays.first(); it; it = rMonthDays.next()) { | 660 | for (int* it = rMonthDays.first(); it; it = rMonthDays.next()) { |
661 | if (_rDay == *it) | 661 | if (_rDay == *it) |
662 | return; // this day is already in the list - avoid duplication | 662 | return; // this day is already in the list - avoid duplication |
663 | } | 663 | } |
664 | int *tmpDay = new int; | 664 | int *tmpDay = new int; |
665 | *tmpDay = _rDay; | 665 | *tmpDay = _rDay; |
666 | rMonthDays.append(tmpDay); | 666 | rMonthDays.append(tmpDay); |
667 | 667 | ||
668 | if (mCompatVersion < 310 && mCompatDuration > 0) { | 668 | if (mCompatVersion < 310 && mCompatDuration > 0) { |
669 | // Backwards compatibility for KDE < 3.1. | 669 | // Backwards compatibility for KDE < 3.1. |
670 | // rDuration was set to the number of time periods to recur. | 670 | // rDuration was set to the number of time periods to recur. |
671 | // Convert this to the number of occurrences. | 671 | // Convert this to the number of occurrences. |
672 | int monthsAhead = (mCompatDuration-1+mRecurExDatesCount) * rFreq; | 672 | int monthsAhead = (mCompatDuration-1+mRecurExDatesCount) * rFreq; |
673 | int month = mRecurStart.date().month() - 1 + monthsAhead; | 673 | int month = mRecurStart.date().month() - 1 + monthsAhead; |
674 | QDate end(mRecurStart.date().year() + month/12, month%12 + 1, 31); | 674 | QDate end(mRecurStart.date().year() + month/12, month%12 + 1, 31); |
675 | rDuration = INT_MAX; // ensure that recurCalc() does its job correctly | 675 | rDuration = INT_MAX; // ensure that recurCalc() does its job correctly |
676 | rDuration = recurCalc(COUNT_TO_DATE, end); | 676 | rDuration = recurCalc(COUNT_TO_DATE, end); |
677 | } | 677 | } |
678 | 678 | ||
679 | if (mParent) mParent->updated(); | 679 | if (mParent) mParent->updated(); |
680 | } | 680 | } |
681 | 681 | ||
@@ -704,49 +704,62 @@ void Recurrence::setYearlyByDate(Feb29Type type, int _rFreq, int _rDuration) | |||
704 | if (mCompatVersion < 310) | 704 | if (mCompatVersion < 310) |
705 | mCompatDuration = (_rDuration > 0) ? _rDuration : 0; | 705 | mCompatDuration = (_rDuration > 0) ? _rDuration : 0; |
706 | setYearly_(rYearlyMonth, type, _rFreq, _rDuration); | 706 | setYearly_(rYearlyMonth, type, _rFreq, _rDuration); |
707 | } | 707 | } |
708 | 708 | ||
709 | void Recurrence::setYearlyByDate(Feb29Type type, int _rFreq, const QDate &_rEndDate) | 709 | void Recurrence::setYearlyByDate(Feb29Type type, int _rFreq, const QDate &_rEndDate) |
710 | { | 710 | { |
711 | if (mRecurReadOnly) return; | 711 | if (mRecurReadOnly) return; |
712 | rEndDateTime.setDate(_rEndDate); | 712 | rEndDateTime.setDate(_rEndDate); |
713 | rEndDateTime.setTime(mRecurStart.time()); | 713 | rEndDateTime.setTime(mRecurStart.time()); |
714 | mCompatDuration = 0; | 714 | mCompatDuration = 0; |
715 | setYearly_(rYearlyMonth, type, _rFreq, 0); | 715 | setYearly_(rYearlyMonth, type, _rFreq, 0); |
716 | } | 716 | } |
717 | 717 | ||
718 | void Recurrence::addYearlyMonthPos(short _rPos, const QBitArray &_rDays) | 718 | void Recurrence::addYearlyMonthPos(short _rPos, const QBitArray &_rDays) |
719 | { | 719 | { |
720 | if (recurs == rYearlyPos) | 720 | if (recurs == rYearlyPos) |
721 | addMonthlyPos_(_rPos, _rDays); | 721 | addMonthlyPos_(_rPos, _rDays); |
722 | } | 722 | } |
723 | 723 | ||
724 | const QPtrList<int> &Recurrence::yearNums() const | 724 | const QPtrList<int> &Recurrence::yearNums() const |
725 | { | 725 | { |
726 | return rYearNums; | 726 | return rYearNums; |
727 | } | 727 | } |
728 | 728 | void Recurrence::addYearlyMonth(short _rPos ) | |
729 | { | ||
730 | if (mRecurReadOnly || recurs != rYearlyMonth) // invalid day/month number | ||
731 | return; | ||
732 | rMonthPos *tmpPos = new rMonthPos; | ||
733 | if ( _rPos > 0) { | ||
734 | tmpPos->rPos = _rPos; | ||
735 | tmpPos->negative = false; | ||
736 | } else { | ||
737 | tmpPos->rPos = -_rPos; // take abs() | ||
738 | tmpPos->negative = true; | ||
739 | } | ||
740 | rMonthPositions.append(tmpPos); | ||
741 | } | ||
729 | void Recurrence::addYearlyNum(short _rNum) | 742 | void Recurrence::addYearlyNum(short _rNum) |
730 | { | 743 | { |
731 | if (mRecurReadOnly | 744 | if (mRecurReadOnly |
732 | || (recurs != rYearlyMonth && recurs != rYearlyDay && recurs != rYearlyPos) | 745 | || (recurs != rYearlyMonth && recurs != rYearlyDay && recurs != rYearlyPos) |
733 | || _rNum <= 0) // invalid day/month number | 746 | || _rNum <= 0) // invalid day/month number |
734 | return; | 747 | return; |
735 | 748 | ||
736 | if (mCompatVersion < 310 && mCompatRecurs == rYearlyDay) { | 749 | if (mCompatVersion < 310 && mCompatRecurs == rYearlyDay) { |
737 | // Backwards compatibility for KDE < 3.1. | 750 | // Backwards compatibility for KDE < 3.1. |
738 | // Dates were stored as day numbers, with a fiddle to take account of leap years. | 751 | // Dates were stored as day numbers, with a fiddle to take account of leap years. |
739 | // Convert the day number to a month. | 752 | // Convert the day number to a month. |
740 | if (_rNum <= 0 || _rNum > 366 || (_rNum == 366 && mRecurStart.date().daysInYear() < 366)) | 753 | if (_rNum <= 0 || _rNum > 366 || (_rNum == 366 && mRecurStart.date().daysInYear() < 366)) |
741 | return; // invalid day number | 754 | return; // invalid day number |
742 | _rNum = QDate(mRecurStart.date().year(), 1, 1).addDays(_rNum - 1).month(); | 755 | _rNum = QDate(mRecurStart.date().year(), 1, 1).addDays(_rNum - 1).month(); |
743 | } else | 756 | } else |
744 | if ((recurs == rYearlyMonth || recurs == rYearlyPos) && _rNum > 12 | 757 | if ((recurs == rYearlyMonth || recurs == rYearlyPos) && _rNum > 12 |
745 | || recurs == rYearlyDay && _rNum > 366) | 758 | || recurs == rYearlyDay && _rNum > 366) |
746 | return; // invalid day number | 759 | return; // invalid day number |
747 | 760 | ||
748 | uint i = 0; | 761 | uint i = 0; |
749 | for (int* it = rYearNums.first(); it && _rNum >= *it; it = rYearNums.next()) { | 762 | for (int* it = rYearNums.first(); it && _rNum >= *it; it = rYearNums.next()) { |
750 | if (_rNum == *it) | 763 | if (_rNum == *it) |
751 | return; // this day/month is already in the list - avoid duplication | 764 | return; // this day/month is already in the list - avoid duplication |
752 | ++i; | 765 | ++i; |
diff --git a/libkcal/recurrence.h b/libkcal/recurrence.h index a0f6d84..b13d14f 100644 --- a/libkcal/recurrence.h +++ b/libkcal/recurrence.h | |||
@@ -267,54 +267,56 @@ class Recurrence | |||
267 | * @var duration the number of times the event is to occur, or -1 to recur indefinitely. | 267 | * @var duration the number of times the event is to occur, or -1 to recur indefinitely. |
268 | */ | 268 | */ |
269 | void setYearlyByDate(Feb29Type type, int freq, int duration); | 269 | void setYearlyByDate(Feb29Type type, int freq, int duration); |
270 | /** Sets an event to recur yearly ending at \a endDate. */ | 270 | /** Sets an event to recur yearly ending at \a endDate. */ |
271 | void setYearlyByDate(Feb29Type type, int freq, const QDate &endDate); | 271 | void setYearlyByDate(Feb29Type type, int freq, const QDate &endDate); |
272 | /** Adds position of day or month in year. | 272 | /** Adds position of day or month in year. |
273 | * N.B. for recursYearlyPos, addYearlyMonthPos() must also be called | 273 | * N.B. for recursYearlyPos, addYearlyMonthPos() must also be called |
274 | * to add positions within the month. */ | 274 | * to add positions within the month. */ |
275 | void addYearlyNum(short _rNum); | 275 | void addYearlyNum(short _rNum); |
276 | /** Adds a position to the recursYearlyPos recurrence rule, if it is set. | 276 | /** Adds a position to the recursYearlyPos recurrence rule, if it is set. |
277 | * N.B. addYearlyNum() must also be called to add recurrence months. | 277 | * N.B. addYearlyNum() must also be called to add recurrence months. |
278 | * Parameters are the same as for addMonthlyPos(). | 278 | * Parameters are the same as for addMonthlyPos(). |
279 | */ | 279 | */ |
280 | void addYearlyMonthPos(short _rPos, const QBitArray &_rDays); | 280 | void addYearlyMonthPos(short _rPos, const QBitArray &_rDays); |
281 | /** Returns positions of days or months in year. */ | 281 | /** Returns positions of days or months in year. */ |
282 | const QPtrList<int> &yearNums() const; | 282 | const QPtrList<int> &yearNums() const; |
283 | /** Returns list of day positions in months, for a recursYearlyPos recurrence rule. */ | 283 | /** Returns list of day positions in months, for a recursYearlyPos recurrence rule. */ |
284 | const QPtrList<rMonthPos> &yearMonthPositions() const; | 284 | const QPtrList<rMonthPos> &yearMonthPositions() const; |
285 | /** Returns how yearly recurrences of February 29th are handled. */ | 285 | /** Returns how yearly recurrences of February 29th are handled. */ |
286 | Feb29Type feb29YearlyType() const { return mFeb29YearlyType; } | 286 | Feb29Type feb29YearlyType() const { return mFeb29YearlyType; } |
287 | /** Sets the default method for handling yearly recurrences of February 29th. */ | 287 | /** Sets the default method for handling yearly recurrences of February 29th. */ |
288 | static void setFeb29YearlyTypeDefault(Feb29Type t) { mFeb29YearlyDefaultType = t; } | 288 | static void setFeb29YearlyTypeDefault(Feb29Type t) { mFeb29YearlyDefaultType = t; } |
289 | /** Returns the default method for handling yearly recurrences of February 29th. */ | 289 | /** Returns the default method for handling yearly recurrences of February 29th. */ |
290 | static Feb29Type setFeb29YearlyTypeDefault() { return mFeb29YearlyDefaultType; } | 290 | static Feb29Type setFeb29YearlyTypeDefault() { return mFeb29YearlyDefaultType; } |
291 | 291 | void addYearlyMonth(short _rPos ); // added LR | |
292 | /** | 292 | /** |
293 | Debug output. | 293 | Debug output. |
294 | */ | 294 | */ |
295 | void dump() const; | 295 | void dump() const; |
296 | QString recurrenceText() const; | 296 | QString recurrenceText() const; |
297 | bool getYearlyMonthMonths(int day, QValueList<int>&, | ||
298 | QValueList<int> &leaplist) const; | ||
297 | 299 | ||
298 | protected: | 300 | protected: |
299 | enum PeriodFunc { END_DATE_AND_COUNT, COUNT_TO_DATE, NEXT_AFTER_DATE }; | 301 | enum PeriodFunc { END_DATE_AND_COUNT, COUNT_TO_DATE, NEXT_AFTER_DATE }; |
300 | struct MonthlyData; friend struct MonthlyData; | 302 | struct MonthlyData; friend struct MonthlyData; |
301 | struct YearlyMonthData; friend struct YearlyMonthData; | 303 | struct YearlyMonthData; friend struct YearlyMonthData; |
302 | struct YearlyPosData; friend struct YearlyPosData; | 304 | struct YearlyPosData; friend struct YearlyPosData; |
303 | struct YearlyDayData; friend struct YearlyDayData; | 305 | struct YearlyDayData; friend struct YearlyDayData; |
304 | 306 | ||
305 | bool recursSecondly(const QDate &, int secondFreq) const; | 307 | bool recursSecondly(const QDate &, int secondFreq) const; |
306 | bool recursMinutelyAt(const QDateTime &dt, int minuteFreq) const; | 308 | bool recursMinutelyAt(const QDateTime &dt, int minuteFreq) const; |
307 | bool recursDaily(const QDate &) const; | 309 | bool recursDaily(const QDate &) const; |
308 | bool recursWeekly(const QDate &) const; | 310 | bool recursWeekly(const QDate &) const; |
309 | bool recursMonthly(const QDate &) const; | 311 | bool recursMonthly(const QDate &) const; |
310 | bool recursYearlyByMonth(const QDate &) const; | 312 | bool recursYearlyByMonth(const QDate &) const; |
311 | bool recursYearlyByPos(const QDate &) const; | 313 | bool recursYearlyByPos(const QDate &) const; |
312 | bool recursYearlyByDay(const QDate &) const; | 314 | bool recursYearlyByDay(const QDate &) const; |
313 | 315 | ||
314 | QDate getNextDateNoTime(const QDate& preDate, bool* last) const; | 316 | QDate getNextDateNoTime(const QDate& preDate, bool* last) const; |
315 | QDate getPreviousDateNoTime(const QDate& afterDate, bool* last) const; | 317 | QDate getPreviousDateNoTime(const QDate& afterDate, bool* last) const; |
316 | 318 | ||
317 | void addMonthlyPos_(short _rPos, const QBitArray &_rDays); | 319 | void addMonthlyPos_(short _rPos, const QBitArray &_rDays); |
318 | void setDailySub(short type, int freq, int duration); | 320 | void setDailySub(short type, int freq, int duration); |
319 | void setYearly_(short type, Feb29Type, int freq, int duration); | 321 | void setYearly_(short type, Feb29Type, int freq, int duration); |
320 | int recurCalc(PeriodFunc, QDate &enddate) const; | 322 | int recurCalc(PeriodFunc, QDate &enddate) const; |
@@ -325,50 +327,48 @@ class Recurrence | |||
325 | int weeklyCalcEndDate(QDate& enddate, int daysPerWeek) const; | 327 | int weeklyCalcEndDate(QDate& enddate, int daysPerWeek) const; |
326 | int weeklyCalcToDate(const QDate& enddate, int daysPerWeek) const; | 328 | int weeklyCalcToDate(const QDate& enddate, int daysPerWeek) const; |
327 | int weeklyCalcNextAfter(QDate& enddate, int daysPerWeek) const; | 329 | int weeklyCalcNextAfter(QDate& enddate, int daysPerWeek) const; |
328 | int monthlyCalc(PeriodFunc, QDate &enddate) const; | 330 | int monthlyCalc(PeriodFunc, QDate &enddate) const; |
329 | int monthlyCalcEndDate(QDate& enddate, MonthlyData&) const; | 331 | int monthlyCalcEndDate(QDate& enddate, MonthlyData&) const; |
330 | int monthlyCalcToDate(const QDate& enddate, MonthlyData&) const; | 332 | int monthlyCalcToDate(const QDate& enddate, MonthlyData&) const; |
331 | int monthlyCalcNextAfter(QDate& enddate, MonthlyData&) const; | 333 | int monthlyCalcNextAfter(QDate& enddate, MonthlyData&) const; |
332 | int yearlyMonthCalc(PeriodFunc, QDate &enddate) const; | 334 | int yearlyMonthCalc(PeriodFunc, QDate &enddate) const; |
333 | int yearlyMonthCalcEndDate(QDate& enddate, YearlyMonthData&) const; | 335 | int yearlyMonthCalcEndDate(QDate& enddate, YearlyMonthData&) const; |
334 | int yearlyMonthCalcToDate(const QDate& enddate, YearlyMonthData&) const; | 336 | int yearlyMonthCalcToDate(const QDate& enddate, YearlyMonthData&) const; |
335 | int yearlyMonthCalcNextAfter(QDate& enddate, YearlyMonthData&) const; | 337 | int yearlyMonthCalcNextAfter(QDate& enddate, YearlyMonthData&) const; |
336 | int yearlyPosCalc(PeriodFunc, QDate &enddate) const; | 338 | int yearlyPosCalc(PeriodFunc, QDate &enddate) const; |
337 | int yearlyPosCalcEndDate(QDate& enddate, YearlyPosData&) const; | 339 | int yearlyPosCalcEndDate(QDate& enddate, YearlyPosData&) const; |
338 | int yearlyPosCalcToDate(const QDate& enddate, YearlyPosData&) const; | 340 | int yearlyPosCalcToDate(const QDate& enddate, YearlyPosData&) const; |
339 | int yearlyPosCalcNextAfter(QDate& enddate, YearlyPosData&) const; | 341 | int yearlyPosCalcNextAfter(QDate& enddate, YearlyPosData&) const; |
340 | int yearlyDayCalc(PeriodFunc, QDate &enddate) const; | 342 | int yearlyDayCalc(PeriodFunc, QDate &enddate) const; |
341 | int yearlyDayCalcEndDate(QDate& enddate, YearlyDayData&) const; | 343 | int yearlyDayCalcEndDate(QDate& enddate, YearlyDayData&) const; |
342 | int yearlyDayCalcToDate(const QDate& enddate, YearlyDayData&) const; | 344 | int yearlyDayCalcToDate(const QDate& enddate, YearlyDayData&) const; |
343 | int yearlyDayCalcNextAfter(QDate& enddate, YearlyDayData&) const; | 345 | int yearlyDayCalcNextAfter(QDate& enddate, YearlyDayData&) const; |
344 | 346 | ||
345 | int countMonthlyPosDays() const; | 347 | int countMonthlyPosDays() const; |
346 | void getMonthlyPosDays(QValueList<int>&, int daysInMonth, | 348 | void getMonthlyPosDays(QValueList<int>&, int daysInMonth, |
347 | int startDayOfWeek) const; | 349 | int startDayOfWeek) const; |
348 | bool getMonthlyDayDays(QValueList<int>&, int daysInMonth) const; | 350 | bool getMonthlyDayDays(QValueList<int>&, int daysInMonth) const; |
349 | bool getYearlyMonthMonths(int day, QValueList<int>&, | ||
350 | QValueList<int> &leaplist) const; | ||
351 | 351 | ||
352 | int getFirstDayInWeek(int startDay, bool useWeekStart = true) const; | 352 | int getFirstDayInWeek(int startDay, bool useWeekStart = true) const; |
353 | int getLastDayInWeek(int endDay, bool useWeekStart = true) const; | 353 | int getLastDayInWeek(int endDay, bool useWeekStart = true) const; |
354 | QDate getFirstDateInMonth(const QDate& earliestDate) const; | 354 | QDate getFirstDateInMonth(const QDate& earliestDate) const; |
355 | QDate getLastDateInMonth(const QDate& latestDate) const; | 355 | QDate getLastDateInMonth(const QDate& latestDate) const; |
356 | QDate getFirstDateInYear(const QDate& earliestDate) const; | 356 | QDate getFirstDateInYear(const QDate& earliestDate) const; |
357 | QDate getLastDateInYear(const QDate& latestDate) const; | 357 | QDate getLastDateInYear(const QDate& latestDate) const; |
358 | 358 | ||
359 | private: | 359 | private: |
360 | // Prohibit copying | 360 | // Prohibit copying |
361 | Recurrence(const Recurrence&); | 361 | Recurrence(const Recurrence&); |
362 | Recurrence &operator=(const Recurrence&); | 362 | Recurrence &operator=(const Recurrence&); |
363 | 363 | ||
364 | short recurs; // should be one of the enums. | 364 | short recurs; // should be one of the enums. |
365 | 365 | ||
366 | int rWeekStart; // day which starts the week, Monday=1 .. Sunday=7 | 366 | int rWeekStart; // day which starts the week, Monday=1 .. Sunday=7 |
367 | QBitArray rDays; // array of days during week it recurs | 367 | QBitArray rDays; // array of days during week it recurs |
368 | 368 | ||
369 | QPtrList<rMonthPos> rMonthPositions; // list of positions during a month | 369 | QPtrList<rMonthPos> rMonthPositions; // list of positions during a month |
370 | // on which an event recurs | 370 | // on which an event recurs |
371 | 371 | ||
372 | QPtrList<int> rMonthDays; // list of days during a month on | 372 | QPtrList<int> rMonthDays; // list of days during a month on |
373 | // which the event recurs | 373 | // which the event recurs |
374 | 374 | ||