Fix Bug 411836 - Folder settings for expired message stores bad values (maildir)

FIXED-IN: 5.12.2
BUG: 411836
wilder
Laurent Montel 7 years ago
parent e93fe44f8e
commit 32245181b7
  1. 30
      src/collectionpage/attributes/expirecollectionattribute.cpp
  2. 18
      src/collectionpage/attributes/expirecollectionattribute.h
  3. 11
      src/collectionpage/collectionexpirypage.cpp
  4. 9
      src/folder/foldercollectionmonitor.cpp
  5. 31
      src/job/expirejob.cpp
  6. 29
      src/util/mailutil.cpp
  7. 1
      src/util/mailutil.h

@ -160,7 +160,7 @@ int ExpireCollectionAttribute::daysToExpire(int number, ExpireCollectionAttribut
return -1; return -1;
} }
void ExpireCollectionAttribute::daysToExpire(int &unreadDays, int &readDays) void ExpireCollectionAttribute::daysToExpire(int &unreadDays, int &readDays) const
{ {
unreadDays = ExpireCollectionAttribute::daysToExpire(unreadExpireAge(), unreadExpireUnits()); unreadDays = ExpireCollectionAttribute::daysToExpire(unreadExpireAge(), unreadExpireUnits());
readDays = ExpireCollectionAttribute::daysToExpire(readExpireAge(), readExpireUnits()); readDays = ExpireCollectionAttribute::daysToExpire(readExpireAge(), readExpireUnits());
@ -172,10 +172,10 @@ QByteArray ExpireCollectionAttribute::serialized() const
QDataStream s(&result, QIODevice::WriteOnly); QDataStream s(&result, QIODevice::WriteOnly);
s << mExpireToFolderId; s << mExpireToFolderId;
s << (int)mExpireAction; s << static_cast<int>(mExpireAction);
s << (int)mReadExpireUnits; s << static_cast<int>(mReadExpireUnits);
s << mReadExpireAge; s << mReadExpireAge;
s << (int)mUnreadExpireUnits; s << static_cast<int>(mUnreadExpireUnits);
s << mUnreadExpireAge; s << mUnreadExpireAge;
s << mExpireMessages; s << mExpireMessages;
@ -188,14 +188,26 @@ void ExpireCollectionAttribute::deserialize(const QByteArray &data)
s >> mExpireToFolderId; s >> mExpireToFolderId;
int action; int action;
s >> action; s >> action;
mExpireAction = (ExpireCollectionAttribute::ExpireAction)action; mExpireAction = static_cast<ExpireCollectionAttribute::ExpireAction>(action);
int valUnitRead; int valUnitRead;
s >> valUnitRead; s >> valUnitRead;
mReadExpireUnits = (ExpireCollectionAttribute::ExpireUnits)valUnitRead; mReadExpireUnits = static_cast<ExpireCollectionAttribute::ExpireUnits>(valUnitRead);
s >> mReadExpireAge; s >> mReadExpireAge;
int valUnitUread; int valUnitUnread;
s >> valUnitUread; s >> valUnitUnread;
mUnreadExpireUnits = (ExpireCollectionAttribute::ExpireUnits)valUnitUread; mUnreadExpireUnits = static_cast<ExpireCollectionAttribute::ExpireUnits>(valUnitUnread);
s >> mUnreadExpireAge; s >> mUnreadExpireAge;
s >> mExpireMessages; s >> mExpireMessages;
} }
QDebug operator <<(QDebug d, const ExpireCollectionAttribute &t)
{
d << " mExpireMessages " << t.isAutoExpire();
d << " mUnreadExpireAge " << t.unreadExpireAge();
d << " mReadExpireAge " << t.readExpireAge();
d << " mUnreadExpireUnits " << t.unreadExpireUnits();
d << " mReadExpireUnits " << t.readExpireUnits();
d << " mExpireAction " << t.expireAction();
d << " mExpireToFolderId " << t.expireToFolderId();
return d;
}

@ -24,6 +24,7 @@
#include <Attribute> #include <Attribute>
#include <Collection> #include <Collection>
#include <QDebug>
namespace MailCommon { namespace MailCommon {
class MAILCOMMON_EXPORT ExpireCollectionAttribute : public Akonadi::Attribute class MAILCOMMON_EXPORT ExpireCollectionAttribute : public Akonadi::Attribute
@ -37,16 +38,16 @@ public:
* must always be the last in the list (for bounds checking). * must always be the last in the list (for bounds checking).
*/ */
enum ExpireUnits { enum ExpireUnits {
ExpireNever, ExpireNever = 0,
ExpireDays, ExpireDays = 1,
ExpireWeeks, ExpireWeeks = 2,
ExpireMonths, ExpireMonths = 3,
ExpireMaxUnits ExpireMaxUnits = 4
}; };
enum ExpireAction { enum ExpireAction {
ExpireDelete, ExpireDelete = 0,
ExpireMove ExpireMove = 1
}; };
QByteArray type() const override; QByteArray type() const override;
@ -54,7 +55,7 @@ public:
QByteArray serialized() const override; QByteArray serialized() const override;
void deserialize(const QByteArray &data) override; void deserialize(const QByteArray &data) override;
void daysToExpire(int &unreadDays, int &readDays); void daysToExpire(int &unreadDays, int &readDays) const;
/** /**
* Sets whether this folder automatically expires messages. * Sets whether this folder automatically expires messages.
@ -140,4 +141,5 @@ private:
Akonadi::Collection::Id mExpireToFolderId; Akonadi::Collection::Id mExpireToFolderId;
}; };
} }
MAILCOMMON_EXPORT QDebug operator <<(QDebug d, const MailCommon::ExpireCollectionAttribute &t);
#endif /* EXPIRATIONCOLLECTIONATTRIBUTE_H */ #endif /* EXPIRATIONCOLLECTIONATTRIBUTE_H */

@ -131,14 +131,12 @@ void CollectionExpiryPage::load(const Akonadi::Collection &collection)
mCollection = collection; mCollection = collection;
init(); init();
bool mustDeleteExpirationAttribute = false; const MailCommon::ExpireCollectionAttribute *attr = collection.attribute<MailCommon::ExpireCollectionAttribute>();
MailCommon::ExpireCollectionAttribute *attr = MailCommon::Util::expirationCollectionAttribute(mCollection, mustDeleteExpirationAttribute); if (attr) {
// Load the values from the folder // Load the values from the folder
bool expiryGloballyOn = attr->isAutoExpire(); bool expiryGloballyOn = attr->isAutoExpire();
int daysToExpireRead, daysToExpireUnread; int daysToExpireRead, daysToExpireUnread;
attr->daysToExpire(daysToExpireUnread, daysToExpireRead); attr->daysToExpire(daysToExpireUnread, daysToExpireRead);
if (expiryGloballyOn if (expiryGloballyOn
&& attr->readExpireUnits() != ExpireCollectionAttribute::ExpireNever && attr->readExpireUnits() != ExpireCollectionAttribute::ExpireNever
&& daysToExpireRead >= 0) { && daysToExpireRead >= 0) {
@ -165,9 +163,8 @@ void CollectionExpiryPage::load(const Akonadi::Collection &collection)
folderSelector->setCollection(destFolder); folderSelector->setCollection(destFolder);
} }
} }
} else {
if (mustDeleteExpirationAttribute) { deletePermanentlyRB->setChecked(true);
delete attr;
} }
slotUpdateControls(); slotUpdateControls();
mChanged = false; mChanged = false;

@ -97,10 +97,8 @@ void FolderCollectionMonitor::expireAllCollection(const QAbstractItemModel *mode
continue; continue;
} }
bool mustDeleteExpirationAttribute = false; const MailCommon::ExpireCollectionAttribute *attr = collection.attribute<MailCommon::ExpireCollectionAttribute>();
MailCommon::ExpireCollectionAttribute *attr if (attr) {
= MailCommon::Util::expirationCollectionAttribute(
collection, mustDeleteExpirationAttribute);
if (attr->isAutoExpire()) { if (attr->isAutoExpire()) {
MailCommon::Util::expireOldMessages(collection, immediate); MailCommon::Util::expireOldMessages(collection, immediate);
@ -109,9 +107,6 @@ void FolderCollectionMonitor::expireAllCollection(const QAbstractItemModel *mode
if (model->rowCount(index) > 0) { if (model->rowCount(index) > 0) {
expireAllCollection(model, immediate, index); expireAllCollection(model, immediate, index);
} }
if (mustDeleteExpirationAttribute) {
delete attr;
} }
} }
} }

@ -84,16 +84,11 @@ void ExpireJob::execute()
mMaxUnreadTime = 0; mMaxUnreadTime = 0;
mMaxReadTime = 0; mMaxReadTime = 0;
int unreadDays, readDays; int unreadDays, readDays;
bool mustDeleteExpirationAttribute = false;
MailCommon::ExpireCollectionAttribute *expirationAttribute const MailCommon::ExpireCollectionAttribute *expirationAttribute = mSrcFolder.attribute<MailCommon::ExpireCollectionAttribute>();
= MailCommon::Util::expirationCollectionAttribute( if (expirationAttribute) {
mSrcFolder, mustDeleteExpirationAttribute);
expirationAttribute->daysToExpire(unreadDays, readDays); expirationAttribute->daysToExpire(unreadDays, readDays);
if (mustDeleteExpirationAttribute) {
delete expirationAttribute;
}
if (unreadDays > 0) { if (unreadDays > 0) {
qCDebug(MAILCOMMON_LOG) << "ExpireJob: deleting unread older than" << unreadDays << "days"; qCDebug(MAILCOMMON_LOG) << "ExpireJob: deleting unread older than" << unreadDays << "days";
@ -109,6 +104,10 @@ void ExpireJob::execute()
deleteLater(); deleteLater();
return; return;
} }
} else {
deleteLater();
return;
}
qCDebug(MAILCOMMON_LOG) << "ExpireJob: starting to expire in folder" << mSrcFolder.name(); qCDebug(MAILCOMMON_LOG) << "ExpireJob: starting to expire in folder" << mSrcFolder.name();
slotDoWork(); slotDoWork();
// do nothing here, we might be deleted! // do nothing here, we might be deleted!
@ -167,12 +166,9 @@ void ExpireJob::done()
// The command shouldn't kill us because it opens the folder // The command shouldn't kill us because it opens the folder
mCancellable = false; mCancellable = false;
bool mustDeleteExpirationAttribute = false;
MailCommon::ExpireCollectionAttribute *expirationAttribute
= MailCommon::Util::expirationCollectionAttribute(
mSrcFolder, mustDeleteExpirationAttribute);
const MailCommon::ExpireCollectionAttribute *expirationAttribute = mSrcFolder.attribute<MailCommon::ExpireCollectionAttribute>();
if (expirationAttribute) {
if (expirationAttribute->expireAction() == MailCommon::ExpireCollectionAttribute::ExpireDelete) { if (expirationAttribute->expireAction() == MailCommon::ExpireCollectionAttribute::ExpireDelete) {
// Expire by deletion, i.e. move to null target folder // Expire by deletion, i.e. move to null target folder
qCDebug(MAILCOMMON_LOG) << "ExpireJob: finished expiring in folder" qCDebug(MAILCOMMON_LOG) << "ExpireJob: finished expiring in folder"
@ -205,8 +201,6 @@ void ExpireJob::done()
count, mSrcFolder.name(), mMoveToFolder.name()); count, mSrcFolder.name(), mMoveToFolder.name());
} }
} }
if (mustDeleteExpirationAttribute) {
delete expirationAttribute;
} }
} }
if (!str.isEmpty()) { if (!str.isEmpty()) {
@ -255,12 +249,9 @@ void ExpireJob::slotExpireDone(KJob *job)
QString msg; QString msg;
const int error = job->error(); const int error = job->error();
bool mustDeleteExpirationAttribute = false;
MailCommon::ExpireCollectionAttribute *expirationAttribute
= MailCommon::Util::expirationCollectionAttribute(
mSrcFolder, mustDeleteExpirationAttribute);
const MailCommon::ExpireCollectionAttribute *expirationAttribute = mSrcFolder.attribute<MailCommon::ExpireCollectionAttribute>();
if (expirationAttribute) {
switch (error) { switch (error) {
case KJob::NoError: case KJob::NoError:
if (expirationAttribute->expireAction() == MailCommon::ExpireCollectionAttribute::ExpireDelete) { if (expirationAttribute->expireAction() == MailCommon::ExpireCollectionAttribute::ExpireDelete) {
@ -298,8 +289,6 @@ void ExpireJob::slotExpireDone(KJob *job)
} }
BroadcastStatus::instance()->setStatusMsg(msg); BroadcastStatus::instance()->setStatusMsg(msg);
if (mustDeleteExpirationAttribute) {
delete expirationAttribute;
} }
deleteLater(); deleteLater();
} }

@ -277,32 +277,3 @@ QStringList MailCommon::Util::foundMailer()
} }
return lst; return lst;
} }
MailCommon::ExpireCollectionAttribute *MailCommon::Util::expirationCollectionAttribute(const Akonadi::Collection &collection, bool &mustDeleteExpirationAttribute)
{
Akonadi::Collection mutableCollection = collection;
MailCommon::ExpireCollectionAttribute *attr = nullptr;
if (mutableCollection.hasAttribute<MailCommon::ExpireCollectionAttribute>()) {
attr = mutableCollection.attribute<MailCommon::ExpireCollectionAttribute>();
mustDeleteExpirationAttribute = false;
} else {
attr = new MailCommon::ExpireCollectionAttribute();
KConfigGroup configGroup(KernelIf->config(),
MailCommon::FolderSettings::configGroupName(collection));
if (configGroup.hasKey("ExpireMessages")) {
attr->setAutoExpire(configGroup.readEntry("ExpireMessages", false));
attr->setReadExpireAge(configGroup.readEntry("ReadExpireAge", 3));
attr->setReadExpireUnits((MailCommon::ExpireCollectionAttribute::ExpireUnits)configGroup.readEntry("ReadExpireUnits", (int)MailCommon::ExpireCollectionAttribute::ExpireMonths));
attr->setUnreadExpireAge(configGroup.readEntry("UnreadExpireAge", 12));
attr->setUnreadExpireUnits((MailCommon::ExpireCollectionAttribute::ExpireUnits)configGroup.readEntry("UnreadExpireUnits", (int)MailCommon::ExpireCollectionAttribute::ExpireNever));
attr->setExpireAction(configGroup.readEntry("ExpireAction", "Delete") == QLatin1String("Move")
? MailCommon::ExpireCollectionAttribute::ExpireMove
: MailCommon::ExpireCollectionAttribute::ExpireDelete);
attr->setExpireToFolderId(configGroup.readEntry("ExpireToFolder", -1));
}
mustDeleteExpirationAttribute = true;
}
return attr;
}

@ -91,7 +91,6 @@ Q_REQUIRED_RESULT MAILCOMMON_EXPORT QString convertFolderPathToCollectionStr(con
MAILCOMMON_EXPORT void foundMailer(QStringList &lst, const QString &name); MAILCOMMON_EXPORT void foundMailer(QStringList &lst, const QString &name);
Q_REQUIRED_RESULT MAILCOMMON_EXPORT QStringList foundMailer(); Q_REQUIRED_RESULT MAILCOMMON_EXPORT QStringList foundMailer();
Q_REQUIRED_RESULT MAILCOMMON_EXPORT bool isLocalCollection(const QString &resource); Q_REQUIRED_RESULT MAILCOMMON_EXPORT bool isLocalCollection(const QString &resource);
Q_REQUIRED_RESULT MAILCOMMON_EXPORT MailCommon::ExpireCollectionAttribute *expirationCollectionAttribute(const Akonadi::Collection &collection, bool &mustDeleteExpirationAttribute);
} }
} }

Loading…
Cancel
Save