File indexing completed on 2024-05-05 05:28:20

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "calindoriconfig.h"
0008 #include <KLocalizedString>
0009 #include <KConfig>
0010 #include <KConfigGroup>
0011 #include <QDebug>
0012 #include <QRegularExpression>
0013 #include <QDir>
0014 #include <QUrl>
0015 
0016 CalindoriConfig & CalindoriConfig::instance()
0017 {
0018     static CalindoriConfig i;
0019     return i;
0020 }
0021 
0022 
0023 class CalindoriConfig::Private
0024 {
0025 public:
0026     Private()
0027         : config(QStringLiteral("calindorirc"))
0028     {};
0029     KConfig config;
0030 };
0031 
0032 CalindoriConfig::CalindoriConfig(QObject *parent)
0033     : QObject(parent)
0034     , d(new Private)
0035 {
0036     if (internalCalendars().isEmpty() && (d->config.group(QStringLiteral("general")).readEntry("externalCalendars", QString())).isEmpty()) {
0037         qDebug() << "No calendar found, creating a default one";
0038         addInternalCalendar(QStringLiteral("personal"));
0039         setActiveCalendar(QStringLiteral("personal"));
0040         d->config.sync();
0041     }
0042 }
0043 
0044 CalindoriConfig::~CalindoriConfig() = default;
0045 
0046 QStringList CalindoriConfig::internalCalendars() const
0047 {
0048     auto cals = d->config.group(QStringLiteral("general")).readEntry("calendars", QString());
0049 
0050     return cals.isEmpty() ? QStringList() : cals.split(QStringLiteral(";"));
0051 }
0052 
0053 QStringList CalindoriConfig::externalCalendars() const
0054 {
0055     auto cals = d->config.group(QStringLiteral("general")).readEntry("externalCalendars", QString());
0056 
0057     return cals.isEmpty() ? QStringList() : cals.split(QStringLiteral(";"));
0058 }
0059 
0060 QString CalindoriConfig::activeCalendar() const
0061 {
0062     return d->config.group(QStringLiteral("general")).readEntry("activeCalendar", QString());
0063 }
0064 
0065 void CalindoriConfig::setActiveCalendar(const QString &calendar)
0066 {
0067     d->config.group(QStringLiteral("general")).writeEntry("activeCalendar", calendar);
0068     d->config.sync();
0069     Q_EMIT activeCalendarChanged();
0070 }
0071 
0072 QVariantMap CalindoriConfig::canAddCalendar(const QString &calendar)
0073 {
0074     QRegularExpression invalidChars(QStringLiteral("[\\;\\\\/<>:\\?\\*|\"\']"));
0075     if (calendar.contains(invalidChars)) {
0076         return QVariantMap({
0077             {QStringLiteral("success"), false},
0078             {QStringLiteral("reason"), i18n("Calendar name contains invalid characters")}
0079         });
0080     }
0081 
0082     auto externalCalendars = d->config.group(QStringLiteral("general")).readEntry("externalCalendars", QString());
0083 
0084     if (internalCalendars().isEmpty() && externalCalendars.isEmpty()) {
0085         return QVariantMap({
0086             {QStringLiteral("success"), true},
0087             {QStringLiteral("reason"), QString()}
0088         });
0089     }
0090 
0091     auto calendarsList = internalCalendars();
0092     if (!(externalCalendars.isEmpty())) {
0093         calendarsList.append(externalCalendars.split(QStringLiteral(";")));
0094     }
0095 
0096     if (calendarsList.contains(calendar)) {
0097         return QVariantMap({
0098             {QStringLiteral("success"), false},
0099             {QStringLiteral("reason"), i18n("Calendar already exists")}
0100         });
0101     }
0102 
0103     return QVariantMap({
0104         {QStringLiteral("success"), true},
0105         {QStringLiteral("reason"), QString()}
0106     });
0107 }
0108 
0109 QVariantMap CalindoriConfig::addInternalCalendar(const QString &calendar, const QString &ownerName, const QString &ownerEmail)
0110 {
0111     QVariantMap canAddResult = canAddCalendar(calendar);
0112 
0113     if (!(canAddResult[QStringLiteral("success")].toBool())) {
0114         return QVariantMap({
0115             {QStringLiteral("success"), false}, 
0116             {QStringLiteral("reason "), canAddResult[QStringLiteral("reason")].toString()}
0117         });
0118     }
0119 
0120     QStringList calendars = internalCalendars();
0121     calendars.append(calendar);
0122     d->config.group(QStringLiteral("general")).writeEntry("calendars", calendars.join(QStringLiteral(";")));
0123 
0124     d->config.sync();
0125     setOwnerInfo(calendar, ownerName, ownerEmail);
0126 
0127     Q_EMIT internalCalendarsChanged();
0128 
0129     return QVariantMap({
0130         {QStringLiteral("success"), true}, 
0131         {QStringLiteral("reason "), QString()}
0132     });
0133 }
0134 
0135 QVariantMap CalindoriConfig::addExternalCalendar(const QString &calendar, const QString &ownerName, const QString &ownerEmail, const QUrl &calendarPathUrl)
0136 {
0137     QVariantMap canAddResult = canAddCalendar(calendar);
0138 
0139     if (!(canAddResult[QStringLiteral("success")].toBool())) {
0140         return QVariantMap({
0141             {QStringLiteral("success"), false}, 
0142             {QStringLiteral("reason "), canAddResult[QStringLiteral("reason")].toString()}
0143         });
0144     }
0145 
0146     auto eCals = d->config.group(QStringLiteral("general")).readEntry("externalCalendars", QString());
0147     if (eCals.isEmpty()) {
0148         d->config.group(QStringLiteral("general")).writeEntry("externalCalendars", calendar);
0149     } else {
0150         QStringList calendarsList = eCals.split(QStringLiteral(";"));
0151         calendarsList.append(calendar);
0152         d->config.group(QStringLiteral("general")).writeEntry("externalCalendars", calendarsList.join(QStringLiteral(";")));
0153     }
0154     d->config.group(calendar).writeEntry("file", calendarPathUrl.toString(QUrl::RemoveScheme));
0155     d->config.group(calendar).writeEntry("external", true);
0156     d->config.sync();
0157 
0158     setOwnerInfo(calendar, ownerName, ownerEmail);
0159     Q_EMIT externalCalendarsChanged();
0160 
0161     return QVariantMap({
0162         {QStringLiteral("success"), true}, 
0163         {QStringLiteral("reason "), QString()}
0164     });
0165 }
0166 
0167 void CalindoriConfig::removeCalendar(const QString &calendar)
0168 {
0169     d->config.reparseConfiguration();
0170 
0171     QStringList iCalendarsList = internalCalendars();
0172     auto eCalendarsStr = d->config.group(QStringLiteral("general")).readEntry("externalCalendars", QString());
0173     auto eCalendarsList = eCalendarsStr.isEmpty() ? QStringList() : eCalendarsStr.split(QStringLiteral(";"));
0174 
0175     if (iCalendarsList.contains(calendar)) {
0176         iCalendarsList.removeAll(calendar);
0177         d->config.group(QStringLiteral("general")).writeEntry("calendars", iCalendarsList.join(QStringLiteral(";")));
0178 
0179         Q_EMIT internalCalendarsChanged();
0180     }
0181 
0182     if (eCalendarsList.contains(calendar)) {
0183         eCalendarsList.removeAll(calendar);
0184         d->config.group(QStringLiteral("general")).writeEntry("externalCalendars", eCalendarsList.join(QStringLiteral(";")));
0185 
0186         Q_EMIT externalCalendarsChanged();
0187     }
0188 
0189     d->config.deleteGroup(calendar);
0190     d->config.sync();
0191 }
0192 
0193 QString CalindoriConfig::calendarFile(const QString &calendarName)
0194 {
0195     d->config.reparseConfiguration();
0196 
0197     qDebug() << "calendar: " << calendarName;
0198 
0199     if (d->config.hasGroup(calendarName) && d->config.group(calendarName).hasKey("file")) {
0200         return d->config.group(calendarName).readEntry("file");
0201     }
0202     d->config.group(calendarName).writeEntry("file", filenameToPath(calendarName));
0203     d->config.sync();
0204 
0205     return filenameToPath(calendarName);
0206 }
0207 
0208 QString CalindoriConfig::filenameToPath(const QString &calendarName)
0209 {
0210     QString basePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
0211     QDir baseFolder(basePath);
0212     baseFolder.mkpath(QStringLiteral("."));
0213 
0214     return basePath + QStringLiteral("/calindori_") + calendarName + QStringLiteral(".ics");
0215 }
0216 
0217 int CalindoriConfig::eventsDuration() const
0218 {
0219     return d->config.group(QStringLiteral("events")).readEntry("duration", 60);
0220 }
0221 
0222 void CalindoriConfig::setEventsDuration(int duration)
0223 {
0224     d->config.group(QStringLiteral("events")).writeEntry("duration", duration);
0225     d->config.sync();
0226 
0227     Q_EMIT eventsDurationChanged();
0228 }
0229 
0230 int CalindoriConfig::preEventRemindTime() const
0231 {
0232     return d->config.group(QStringLiteral("events")).readEntry("preEventRemindTime", 15);
0233 }
0234 
0235 void CalindoriConfig::setPreEventRemindTime(int remindBefore)
0236 {
0237     d->config.group(QStringLiteral("events")).writeEntry("preEventRemindTime", remindBefore);
0238     d->config.sync();
0239 
0240     Q_EMIT preEventRemindTimeChanged();
0241 }
0242 
0243 bool CalindoriConfig::alwaysRemind() const
0244 {
0245     return d->config.group(QStringLiteral("events")).readEntry("alwaysRemind", true);
0246 }
0247 
0248 void CalindoriConfig::setAlwaysRemind(bool remind)
0249 {
0250     d->config.group(QStringLiteral("events")).writeEntry("alwaysRemind", remind);
0251     d->config.sync();
0252 
0253     Q_EMIT alwaysRemindChanged();
0254 }
0255 
0256 bool CalindoriConfig::isExternal(const QString &calendarName)
0257 {
0258     if (d->config.hasGroup(calendarName) && d->config.group(calendarName).hasKey("external")) {
0259         return d->config.group(calendarName).readEntry("external", false);
0260     }
0261 
0262     return false;
0263 }
0264 
0265 void CalindoriConfig::setOwnerInfo(const QString &calendar, const QString &ownerName, const QString &ownerEmail)
0266 {
0267     setOwnerName(calendar, ownerName);
0268     setOwnerEmail(calendar, ownerEmail);
0269 }
0270 
0271 QString CalindoriConfig::ownerName(const QString &calendarName)
0272 {
0273     if (d->config.hasGroup(calendarName) && d->config.group(calendarName).hasKey("ownerName")) {
0274         return d->config.group(calendarName).readEntry("ownerName", QString());
0275     }
0276 
0277     return QString();
0278 }
0279 
0280 QString CalindoriConfig::ownerEmail(const QString &calendarName)
0281 {
0282     if (d->config.hasGroup(calendarName) && d->config.group(calendarName).hasKey("ownerEmail")) {
0283         return d->config.group(calendarName).readEntry("ownerEmail", QString());
0284     }
0285 
0286     return QString();
0287 }
0288 
0289 void CalindoriConfig::setOwnerName(const QString &calendar, const QString &ownerName)
0290 {
0291     d->config.group(calendar).writeEntry("ownerName", ownerName);
0292     d->config.sync();
0293 
0294     if (isExternal(calendar)) {
0295         Q_EMIT externalCalendarsChanged();
0296 
0297         return;
0298     }
0299 
0300     Q_EMIT internalCalendarsChanged();
0301 }
0302 
0303 void CalindoriConfig::setOwnerEmail(const QString &calendar, const QString &ownerEmail)
0304 {
0305     d->config.group(calendar).writeEntry("ownerEmail", ownerEmail);
0306     d->config.sync();
0307 
0308     if (isExternal(calendar)) {
0309         Q_EMIT externalCalendarsChanged();
0310 
0311         return;
0312     }
0313 
0314     Q_EMIT internalCalendarsChanged();
0315 }