File indexing completed on 2025-04-27 08:12:26
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 }