summaryrefslogtreecommitdiff
path: root/src/leap/mail/imap/service/imap.py
diff options
context:
space:
mode:
authorKali Kaneko <kali@leap.se>2014-01-16 22:01:20 -0400
committerKali Kaneko <kali@leap.se>2014-01-17 03:09:57 -0400
commit9f9701d42be385aa9a6d7e72fd10104b0025971b (patch)
treec32f67f225761fe7a4016b6b0d44f49aa3248a99 /src/leap/mail/imap/service/imap.py
parente3692d50ca2fa4110ba37322b1f46d71d93ac135 (diff)
Separate RECENT Flag to a mailbox document.
this way we avoid a bunch of writes.
Diffstat (limited to 'src/leap/mail/imap/service/imap.py')
-rw-r--r--src/leap/mail/imap/service/imap.py28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/leap/mail/imap/service/imap.py b/src/leap/mail/imap/service/imap.py
index 6e03456..a3ef098 100644
--- a/src/leap/mail/imap/service/imap.py
+++ b/src/leap/mail/imap/service/imap.py
@@ -24,6 +24,7 @@ import logging
from twisted.internet.protocol import ServerFactory
from twisted.internet.defer import maybeDeferred
from twisted.internet.error import CannotListenError
+from twisted.internet.task import deferLater
from twisted.mail import imap4
from twisted.python import log
from twisted import cred
@@ -116,6 +117,7 @@ class LeapIMAPServer(imap4.IMAP4Server):
Overwritten fetch dispatcher to use the fast fetch_flags
method
"""
+ from twisted.internet import reactor
log.msg("LEAP Overwritten fetch...")
if not query:
self.sendPositiveResponse(tag, 'FETCH complete')
@@ -124,8 +126,6 @@ class LeapIMAPServer(imap4.IMAP4Server):
cbFetch = self._IMAP4Server__cbFetch
ebFetch = self._IMAP4Server__ebFetch
- print "QUERY: ", query
-
if len(query) == 1 and str(query[0]) == "flags":
self._oldTimeout = self.setTimeout(None)
# no need to call iter, we get a generator
@@ -141,11 +141,32 @@ class LeapIMAPServer(imap4.IMAP4Server):
self.mbox.fetch, messages, uid=uid
).addCallback(
cbFetch, tag, query, uid
- ).addErrback(ebFetch, tag)
+ ).addErrback(
+ ebFetch, tag)
+
+ deferLater(reactor,
+ 2, self.mbox.unset_recent_flags, messages)
+ deferLater(reactor, 1, self.mbox.signal_unread_to_ui)
select_FETCH = (do_FETCH, imap4.IMAP4Server.arg_seqset,
imap4.IMAP4Server.arg_fetchatt)
+ def do_COPY(self, tag, messages, mailbox, uid=0):
+ from twisted.internet import reactor
+ imap4.IMAP4Server.do_COPY(self, tag, messages, mailbox, uid)
+ deferLater(reactor,
+ 2, self.mbox.unset_recent_flags, messages)
+ deferLater(reactor, 1, self.mbox.signal_unread_to_ui)
+
+ select_COPY = (do_COPY, imap4.IMAP4Server.arg_seqset,
+ imap4.IMAP4Server.arg_astring)
+
+ def notifyNew(self, ignored):
+ """
+ Notify new messages to listeners.
+ """
+ self.mbox.notify_new()
+
def _cbSelectWork(self, mbox, cmdName, tag):
"""
Callback for selectWork, patched to avoid conformance errors due to
@@ -177,6 +198,7 @@ class LeapIMAPServer(imap4.IMAP4Server):
self.mbox = mbox
+
class IMAPAuthRealm(object):
"""
Dummy authentication realm. Do not use in production!