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;
}
void ExpireCollectionAttribute::daysToExpire(int &unreadDays, int &readDays)
void ExpireCollectionAttribute::daysToExpire(int &unreadDays, int &readDays) const
{
unreadDays = ExpireCollectionAttribute::daysToExpire(unreadExpireAge(), unreadExpireUnits());
readDays = ExpireCollectionAttribute::daysToExpire(readExpireAge(), readExpireUnits());
@ -172,10 +172,10 @@ QByteArray ExpireCollectionAttribute::serialized() const
QDataStream s(&result, QIODevice::WriteOnly);
s << mExpireToFolderId;
s << (int)mExpireAction;
s << (int)mReadExpireUnits;
s << static_cast<int>(mExpireAction);
s << static_cast<int>(mReadExpireUnits);
s << mReadExpireAge;
s << (int)mUnreadExpireUnits;
s << static_cast<int>(mUnreadExpireUnits);
s << mUnreadExpireAge;
s << mExpireMessages;
@ -188,14 +188,26 @@ void ExpireCollectionAttribute::deserialize(const QByteArray &data)
s >> mExpireToFolderId;
int action;
s >> action;
mExpireAction = (ExpireCollectionAttribute::ExpireAction)action;
mExpireAction = static_cast<ExpireCollectionAttribute::ExpireAction>(action);
int valUnitRead;
s >> valUnitRead;
mReadExpireUnits = (ExpireCollectionAttribute::ExpireUnits)valUnitRead;
mReadExpireUnits = static_cast<ExpireCollectionAttribute::ExpireUnits>(valUnitRead);
s >> mReadExpireAge;
int valUnitUread;
s >> valUnitUread;
mUnreadExpireUnits = (ExpireCollectionAttribute::ExpireUnits)valUnitUread;
int valUnitUnread;
s >> valUnitUnread;
mUnreadExpireUnits = static_cast<ExpireCollectionAttribute::ExpireUnits>(valUnitUnread);
s >> mUnreadExpireAge;
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 <Collection>
#include <QDebug>
namespace MailCommon {
class MAILCOMMON_EXPORT ExpireCollectionAttribute : public Akonadi::Attribute
@ -37,16 +38,16 @@ public:
* must always be the last in the list (for bounds checking).
*/
enum ExpireUnits {
ExpireNever,
ExpireDays,
ExpireWeeks,
ExpireMonths,
ExpireMaxUnits
ExpireNever = 0,
ExpireDays = 1,
ExpireWeeks = 2,
ExpireMonths = 3,
ExpireMaxUnits = 4
};
enum ExpireAction {
ExpireDelete,
ExpireMove
ExpireDelete = 0,
ExpireMove = 1
};
QByteArray type() const override;
@ -54,7 +55,7 @@ public:
QByteArray serialized() const 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.
@ -140,4 +141,5 @@ private:
Akonadi::Collection::Id mExpireToFolderId;
};
}
MAILCOMMON_EXPORT QDebug operator <<(QDebug d, const MailCommon::ExpireCollectionAttribute &t);
#endif /* EXPIRATIONCOLLECTIONATTRIBUTE_H */

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

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

@ -84,16 +84,11 @@ void ExpireJob::execute()
mMaxUnreadTime = 0;
mMaxReadTime = 0;
int unreadDays, readDays;
bool mustDeleteExpirationAttribute = false;
MailCommon::ExpireCollectionAttribute *expirationAttribute
= MailCommon::Util::expirationCollectionAttribute(
mSrcFolder, mustDeleteExpirationAttribute);
const MailCommon::ExpireCollectionAttribute *expirationAttribute = mSrcFolder.attribute<MailCommon::ExpireCollectionAttribute>();
if (expirationAttribute) {
expirationAttribute->daysToExpire(unreadDays, readDays);
if (mustDeleteExpirationAttribute) {
delete expirationAttribute;
}
if (unreadDays > 0) {
qCDebug(MAILCOMMON_LOG) << "ExpireJob: deleting unread older than" << unreadDays << "days";
@ -109,6 +104,10 @@ void ExpireJob::execute()
deleteLater();
return;
}
} else {
deleteLater();
return;
}
qCDebug(MAILCOMMON_LOG) << "ExpireJob: starting to expire in folder" << mSrcFolder.name();
slotDoWork();
// 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
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) {
// Expire by deletion, i.e. move to null target folder
qCDebug(MAILCOMMON_LOG) << "ExpireJob: finished expiring in folder"
@ -205,8 +201,6 @@ void ExpireJob::done()
count, mSrcFolder.name(), mMoveToFolder.name());
}
}
if (mustDeleteExpirationAttribute) {
delete expirationAttribute;
}
}
if (!str.isEmpty()) {
@ -255,12 +249,9 @@ void ExpireJob::slotExpireDone(KJob *job)
QString msg;
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) {
case KJob::NoError:
if (expirationAttribute->expireAction() == MailCommon::ExpireCollectionAttribute::ExpireDelete) {
@ -298,8 +289,6 @@ void ExpireJob::slotExpireDone(KJob *job)
}
BroadcastStatus::instance()->setStatusMsg(msg);
if (mustDeleteExpirationAttribute) {
delete expirationAttribute;
}
deleteLater();
}

@ -277,32 +277,3 @@ QStringList MailCommon::Util::foundMailer()
}
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);
Q_REQUIRED_RESULT MAILCOMMON_EXPORT QStringList foundMailer();
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