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"