From a1b12ac205a8d2365435b086ec4877b77c4acefb Mon Sep 17 00:00:00 2001 From: Don Sanders Date: Mon, 6 Jun 2011 16:00:58 +0300 Subject: Ignore spurious exists notifications in imap idle code. Fix for NB#260769 --- CHANGES | 5 +++-- src/plugins/messageservices/imap/imapprotocol.cpp | 13 ++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 54a60c98..26068a97 100644 --- a/CHANGES +++ b/CHANGES @@ -6,8 +6,9 @@ Latest Changes * Fixes: NB#249858 Random crash observed with assert * Fixes: NB#207864 Protocol plugin services should only be restarted when necessary * Fixes: NB#217492 "Unable to retrieve message list for unconfigured accounts" is displayed as title in Inbox - * Fixes: NB#261611 - Random messageserver crash observed when disabling IMAP accounts - * Fixes: NB#252787 - Unable to send an invitation if location is selected for the event + * Fixes: NB#261611 Random messageserver crash observed when disabling IMAP accounts + * Fixes: NB#252787 Unable to send an invitation if location is selected for the event + * Fixes: NB#260769 gmail sync triggered every 10 minutes in "Always upto date" mode 201121 * Fixes: NB#232541 Calendar icon not displayed diff --git a/src/plugins/messageservices/imap/imapprotocol.cpp b/src/plugins/messageservices/imap/imapprotocol.cpp index 628a060c..94aae732 100644 --- a/src/plugins/messageservices/imap/imapprotocol.cpp +++ b/src/plugins/messageservices/imap/imapprotocol.cpp @@ -336,6 +336,7 @@ public: // Update the protocol's mailbox properties void setMailbox(const QMailFolder &mailbox) { mProtocol->_mailbox = ImapMailboxProperties(mailbox); } void setExists(quint32 n) { mProtocol->_mailbox.exists = n; emit mProtocol->exists(n); } + quint32 exists() { return mProtocol->_mailbox.exists; } void setRecent(quint32 n) { mProtocol->_mailbox.recent = n; emit mProtocol->recent(n); } void setUnseen(quint32 n) { mProtocol->_mailbox.unseen = n; } void setUidValidity(const QString &validity) { mProtocol->_mailbox.uidValidity = validity; emit mProtocol->uidValidity(validity); } @@ -2461,12 +2462,12 @@ void EnableState::taggedResponse(ImapContext *c, const QString &line) ImapState::taggedResponse(c, line); } -class NoopState : public ImapState +class NoopState : public SelectedState { Q_OBJECT public: - NoopState() : ImapState(IMAP_Noop, "Noop") {} + NoopState() : SelectedState(IMAP_Noop, "Noop") {} virtual bool permitsPipelining() const { return true; } virtual QString transmit(ImapContext *c); @@ -2487,12 +2488,12 @@ public: }; -class IdleState : public ImapState +class IdleState : public SelectedState { Q_OBJECT public: - IdleState() : ImapState(IMAP_Idle, "Idle") {} + IdleState() : SelectedState(IMAP_Idle, "Idle") {} void done(ImapContext *c); @@ -2521,9 +2522,11 @@ void IdleState::untaggedResponse(ImapContext *c, const QString &line) { QString str = line; QRegExp idleResponsePattern("\\*\\s+\\d+\\s+(\\w+)"); + quint32 previousExists = c->exists(); + SelectedState::untaggedResponse(c, line); if (idleResponsePattern.indexIn(str) == 0) { // Treat this event as a continuation point - if (idleResponsePattern.cap(1).compare("EXISTS", Qt::CaseInsensitive) == 0) { + if (previousExists != c->exists()) { c->continuation(command(), QString("newmail")); } else if (idleResponsePattern.cap(1).compare("FETCH", Qt::CaseInsensitive) == 0) { c->continuation(command(), QString("flagschanged")); -- cgit v1.2.3