/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2013 - 2020, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. * This project including source code and documentation is protected by * copyright law, and remains the property of nymea GmbH. All rights, including * reproduction, publication, editing and translation, are reserved. The use of * this project is subject to the terms of a license agreement to be concluded * with nymea GmbH in accordance with the terms of use of nymea GmbH, available * under https://nymea.io/license * * GNU Lesser General Public License Usage * Alternatively, this project may be redistributed and/or modified under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation; version 3. This project is distributed in the hope that * it will be useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this project. If not, see . * * For any further details and any questions please contact us under * contact@nymea.io or see our FAQ/Licensing Information on * https://nymea.io/license/faq * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /*! \class nymeaserver::RepeatingOption \brief Describes the repeating option of a time item. \ingroup rules \inmodule core The list of \l{weekDays()} can contain following values: \table \header \li Weekday \li int \row \li Monday \li 1 \row \li Tuesday \li 2 \row \li Wednesday \li 3 \row \li Thursday \li 4 \row \li Friday \li 5 \row \li Saturday \li 6 \row \li Sunday \li 7 \endtable \sa Rule, TimeDescriptor */ /*! \enum nymeaserver::RepeatingOption::RepeatingMode This enum type specifies the mode of a \l{RepeatingOption}. \value RepeatingModeNone There is no special repeating mode. The \l{RuleEngine} will assume a daily repeating. \value RepeatingModeHourly The time item should be repeated hourly. The \l{monthDays()} and \l{weekDays()} list has to be empty. \value RepeatingModeDaily The time item should be repeated daily. The \l{monthDays()} and \l{weekDays()} list has to be empty. \value RepeatingModeWeekly The time item should be repeated weekly. A week starts at Monday. This mode needs a list of \l{weekDays()}. The \l{monthDays()} list has to empty. \value RepeatingModeMonthly The time item should be repeated every month. This mode needs a list of \l{monthDays()}. The \l{monthDays()} list has to be empty. \value RepeatingModeYearly The time item should be repeated every year. The \l{monthDays()} and \l{weekDays()} list has to be empty. */ #include "repeatingoption.h" #include "loggingcategories.h" #include /*! Constructs an empty \l{RepeatingOption}. */ RepeatingOption::RepeatingOption() : m_mode(RepeatingModeNone) { } /*! Constructs a \l{RepeatingOption} with the given \a mode, \a weekDays list and \a monthDays list. */ RepeatingOption::RepeatingOption(const RepeatingMode &mode, const QList &weekDays, const QList &monthDays) : m_mode(mode), m_weekDays(weekDays), m_monthDays(monthDays) { } /*! Returns the mode of this \l{RepeatingOption}. */ RepeatingOption::RepeatingMode RepeatingOption::mode() const { return m_mode; } void RepeatingOption::setMode(RepeatingOption::RepeatingMode mode) { m_mode = mode; } /*! Returns the list of week days on which this \l{RepeatingOption} should be valid. */ QList RepeatingOption::weekDays() const { return m_weekDays; } void RepeatingOption::setWeekDays(const QList &weekDays) { m_weekDays = weekDays; } /*! Returns the list of month days on which this \l{RepeatingOption} should be valid. */ QList RepeatingOption::monthDays() const { return m_monthDays; } void RepeatingOption::setMonthDays(const QList &monthDays) { m_monthDays = monthDays; } /*! Returns true if this \l{RepeatingOption} is empty. */ bool RepeatingOption::isEmtpy() const { return m_mode == RepeatingModeNone && m_weekDays.isEmpty() && m_monthDays.isEmpty(); } /*! Returns true if this \l{RepeatingOption} is valid. */ bool RepeatingOption::isValid() const { // Validate weekdays range foreach (const uint &weekDay, m_weekDays) { if (weekDay <= 0 || weekDay > 7) { qCWarning(dcRuleEngine()) << "Invalid week day value:" << weekDay << ". Value out of range [1,7]."; return false; } } // Validate monthdays range foreach (const uint &monthDay, m_monthDays) { if (monthDay <= 0 || monthDay > 31) { qCWarning(dcRuleEngine()) << "Invalid month day value:" << monthDay << ". Value out of range [1,31]."; return false; } } // Validate the lists switch (m_mode) { case RepeatingModeNone: return m_weekDays.isEmpty() && m_monthDays.isEmpty(); case RepeatingModeHourly: return m_weekDays.isEmpty() && m_monthDays.isEmpty(); case RepeatingModeDaily: return m_weekDays.isEmpty() && m_monthDays.isEmpty(); case RepeatingModeWeekly: return !m_weekDays.isEmpty() && m_monthDays.isEmpty(); case RepeatingModeMonthly: return m_weekDays.isEmpty() && !m_monthDays.isEmpty(); case RepeatingModeYearly: return m_weekDays.isEmpty() && m_monthDays.isEmpty(); default: return false; } } /*! Returns true if the week day of the given \a dateTime matches this \l{RepeatingOption}. */ bool RepeatingOption::evaluateWeekDay(const QDateTime &dateTime) const { // If there is no weekday specified it's always true if (m_weekDays.isEmpty()) return true; // Check if dateTime week day matches one of the specified week days if (m_weekDays.contains(dateTime.date().dayOfWeek())) return true; return false; } /*! Returns true if the month day of the given \a dateTime matches this \l{RepeatingOption}. */ bool RepeatingOption::evaluateMonthDay(const QDateTime &dateTime) const { // If there is no month days specified it's always true if (m_monthDays.isEmpty()) return true; // Check if dateTime month day matches one of the specified month days if (m_monthDays.contains(dateTime.date().day())) return true; return false; } /*! Print a RepeatingOption to QDebug. */ QDebug operator<<(QDebug dbg, const RepeatingOption &repeatingOption) { dbg.nospace() << "RepeatingOption(Mode:" << repeatingOption.mode() << ", Monthdays:" << repeatingOption.monthDays() << "Weekdays:" << repeatingOption.weekDays() << ")"; return dbg; }