File indexing completed on 2024-05-12 05:13:15

0001 /*
0002   SPDX-FileCopyrightText: 2001, 2003 Cornelius Schumacher <schumacher@kde.org>
0003   SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
0004 
0005   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0006 */
0007 
0008 #include "kcalprefs.h"
0009 #include "calendarsupport_debug.h"
0010 #include "identitymanager.h"
0011 
0012 #include <Akonadi/TagAttribute>
0013 #include <Akonadi/TagCache>
0014 #include <Akonadi/TagModifyJob>
0015 
0016 #include <KMime/HeaderParsing>
0017 
0018 #include <KEmailAddress>
0019 #include <KIdentityManagementCore/Identity>
0020 
0021 #include <KEMailSettings>
0022 
0023 using namespace CalendarSupport;
0024 
0025 Q_GLOBAL_STATIC(KCalPrefs, globalPrefs)
0026 
0027 class CalendarSupport::KCalPrefsPrivate
0028 {
0029 public:
0030     KCalPrefsPrivate()
0031         : mDefaultCalendarId(-1)
0032         , mDefaultCategoryColor(QColor(151, 235, 121))
0033     {
0034     }
0035 
0036     ~KCalPrefsPrivate() = default;
0037 
0038     Akonadi::Collection::Id mDefaultCalendarId;
0039 
0040     const QColor mDefaultCategoryColor;
0041     QDateTime mDayBegins;
0042 };
0043 
0044 KCalPrefs::KCalPrefs()
0045     : KCalPrefsBase()
0046     , d(new KCalPrefsPrivate())
0047 {
0048     Akonadi::TagCache::instance();
0049 }
0050 
0051 KCalPrefs::~KCalPrefs() = default;
0052 
0053 KCalPrefs *KCalPrefs::instance()
0054 {
0055     static bool firstCall = true;
0056 
0057     if (firstCall) {
0058         firstCall = false;
0059         globalPrefs->load();
0060     }
0061 
0062     return globalPrefs;
0063 }
0064 
0065 void KCalPrefs::usrSetDefaults()
0066 {
0067     // Default should be set a bit smarter, respecting username and locale
0068     // settings for example.
0069 
0070     KEMailSettings settings;
0071     QString tmp = settings.getSetting(KEMailSettings::RealName);
0072     if (!tmp.isEmpty()) {
0073         setUserName(tmp);
0074     }
0075     tmp = settings.getSetting(KEMailSettings::EmailAddress);
0076     if (!tmp.isEmpty()) {
0077         setUserEmail(tmp);
0078     }
0079     fillMailDefaults();
0080 
0081     KConfigSkeleton::usrSetDefaults();
0082 }
0083 
0084 Akonadi::Collection::Id KCalPrefs::defaultCalendarId() const
0085 {
0086     return d->mDefaultCalendarId;
0087 }
0088 
0089 void KCalPrefs::setDefaultCalendarId(Akonadi::Collection::Id id)
0090 {
0091     d->mDefaultCalendarId = id;
0092 }
0093 
0094 void KCalPrefs::fillMailDefaults()
0095 {
0096     userEmailItem()->swapDefault();
0097     QString defEmail = userEmailItem()->value();
0098     userEmailItem()->swapDefault();
0099 
0100     if (userEmail() == defEmail) {
0101         // No korg settings - but maybe there's a kcontrol[/kmail] setting available
0102         KEMailSettings settings;
0103         if (!settings.getSetting(KEMailSettings::EmailAddress).isEmpty()) {
0104             mEmailControlCenter = true;
0105         }
0106     }
0107 }
0108 
0109 void KCalPrefs::usrRead()
0110 {
0111     KConfigGroup generalConfig(config(), QStringLiteral("General"));
0112 
0113     KConfigGroup defaultCalendarConfig(config(), QStringLiteral("Calendar"));
0114     d->mDefaultCalendarId = defaultCalendarConfig.readEntry("Default Calendar", -1);
0115 
0116 #if 0
0117     config()->setGroup("FreeBusy");
0118     if (mRememberRetrievePw) {
0119         d->mRetrievePassword
0120             = KStringHandler::obscure(config()->readEntry("Retrieve Server Password"));
0121     }
0122 #endif
0123 
0124     KConfigSkeleton::usrRead();
0125     fillMailDefaults();
0126 }
0127 
0128 bool KCalPrefs::usrSave()
0129 {
0130     KConfigGroup generalConfig(config(), QStringLiteral("General"));
0131 
0132 #if 0
0133     if (mRememberRetrievePw) {
0134         config()->writeEntry("Retrieve Server Password",
0135                              KStringHandler::obscure(d->mRetrievePassword));
0136     } else {
0137         config()->deleteEntry("Retrieve Server Password");
0138     }
0139 #endif
0140 
0141     KConfigGroup defaultCalendarConfig(config(), QStringLiteral("Calendar"));
0142     defaultCalendarConfig.writeEntry("Default Calendar", defaultCalendarId());
0143 
0144     return KConfigSkeleton::usrSave();
0145 }
0146 
0147 QString KCalPrefs::fullName()
0148 {
0149     QString tusername;
0150     if (mEmailControlCenter) {
0151         KEMailSettings settings;
0152         tusername = settings.getSetting(KEMailSettings::RealName);
0153     } else {
0154         tusername = userName();
0155     }
0156 
0157     // Quote the username as it might contain commas and other quotable chars.
0158     tusername = KEmailAddress::quoteNameIfNecessary(tusername);
0159 
0160     QString tname;
0161     QString temail;
0162     // ignore the return value from extractEmailAddressAndName() because
0163     // it will always be false since tusername does not contain "@domain".
0164     KEmailAddress::extractEmailAddressAndName(tusername, temail, tname);
0165     return tname;
0166 }
0167 
0168 QString KCalPrefs::email()
0169 {
0170     if (mEmailControlCenter) {
0171         KEMailSettings settings;
0172         return settings.getSetting(KEMailSettings::EmailAddress);
0173     } else {
0174         return userEmail();
0175     }
0176 }
0177 
0178 QStringList KCalPrefs::allEmails()
0179 {
0180     // Grab emails from the email identities
0181     QStringList lst = CalendarSupport::identityManager()->allEmails();
0182     // Add emails configured in korganizer
0183     lst += mAdditionalMails;
0184     // Add the email entered as the userEmail here
0185     lst += email();
0186 
0187     // Warning, this list could contain duplicates.
0188     return lst;
0189 }
0190 
0191 QStringList KCalPrefs::fullEmails()
0192 {
0193     QStringList fullEmails;
0194 
0195     // Grab emails from the email identities
0196     KIdentityManagementCore::IdentityManager *idmanager = CalendarSupport::identityManager();
0197     QStringList lst = idmanager->identities();
0198 
0199     fullEmails.reserve(1 + mAdditionalMails.count() + lst.count());
0200     // The user name and email from the config dialog:
0201     fullEmails << QStringLiteral("%1 <%2>").arg(fullName(), email());
0202 
0203     QStringList::Iterator it;
0204     KIdentityManagementCore::IdentityManager::ConstIterator it1;
0205     KIdentityManagementCore::IdentityManager::ConstIterator end1(idmanager->end());
0206     for (it1 = idmanager->begin(); it1 != end1; ++it1) {
0207         fullEmails << (*it1).fullEmailAddr();
0208     }
0209     // Add emails configured in korganizer
0210     lst = mAdditionalMails;
0211     for (it = lst.begin(); it != lst.end(); ++it) {
0212         fullEmails << QStringLiteral("%1 <%2>").arg(fullName(), *it);
0213     }
0214 
0215     // Warning, this list could contain duplicates.
0216     return fullEmails;
0217 }
0218 
0219 bool KCalPrefs::thatIsMe(const QString &_email)
0220 {
0221     // NOTE: this method is called for every created agenda view item,
0222     // so we need to keep performance in mind
0223 
0224     /* identityManager()->thatIsMe() is quite expensive since it does parsing of
0225        _email in a way which is unnecessarily complex for what we can have here,
0226        so we do that ourselves. This makes sense since this
0227 
0228     if ( Akonadi::identityManager()->thatIsMe( _email ) ) {
0229       return true;
0230     }
0231     */
0232 
0233     // in case email contains a full name, strip it out.
0234     // the below is the simpler but slower version of the following code:
0235     // const QString email = CalendarSupport::getEmailAddress( _email );
0236     const QByteArray tmp = _email.toUtf8();
0237     const char *cursor = tmp.constData();
0238     const char *end = tmp.data() + tmp.length();
0239     KMime::Types::Mailbox mbox;
0240     KMime::HeaderParsing::parseMailbox(cursor, end, mbox);
0241     const QString email = mbox.addrSpec().asString();
0242 
0243     if (this->email() == email) {
0244         return true;
0245     }
0246 
0247     CalendarSupport::IdentityManager::ConstIterator it;
0248     CalendarSupport::IdentityManager::ConstIterator endId(CalendarSupport::identityManager()->end());
0249     for (it = CalendarSupport::identityManager()->begin(); it != endId; ++it) {
0250         if ((*it).matchesEmailAddress(email)) {
0251             return true;
0252         }
0253     }
0254 
0255     if (mAdditionalMails.contains(email)) {
0256         return true;
0257     }
0258 
0259     return false;
0260 }
0261 
0262 void KCalPrefs::setDayBegins(const QDateTime &dateTime)
0263 {
0264     d->mDayBegins = dateTime;
0265 }
0266 
0267 QDateTime KCalPrefs::dayBegins() const
0268 {
0269     return d->mDayBegins;
0270 }
0271 
0272 #include "moc_kcalprefs.cpp"