summaryrefslogtreecommitdiff
path: root/src/leap/mail/imap
diff options
context:
space:
mode:
authorKali Kaneko <kali@leap.se>2015-01-21 00:50:27 -0400
committerKali Kaneko <kali@leap.se>2015-02-11 14:05:43 -0400
commitff57477e5ef84f85985f0531d6d745aa45529145 (patch)
treedbc2eca3a767b887f5d35fb5453a59fca91373e5 /src/leap/mail/imap
parent7542de6aeb370d647840a0b78b71f69c6fdacf8e (diff)
imap: implement setting of message flags
Diffstat (limited to 'src/leap/mail/imap')
-rw-r--r--src/leap/mail/imap/mailbox.py51
-rw-r--r--src/leap/mail/imap/messages.py23
-rw-r--r--src/leap/mail/imap/server.py6
3 files changed, 28 insertions, 52 deletions
diff --git a/src/leap/mail/imap/mailbox.py b/src/leap/mail/imap/mailbox.py
index a000133..58fc514 100644
--- a/src/leap/mail/imap/mailbox.py
+++ b/src/leap/mail/imap/mailbox.py
@@ -231,7 +231,7 @@ class IMAPMailbox(object):
"""
return self.collection.get_mbox_attr("created")
- def getUID(self, message):
+ def getUID(self, message_number):
"""
Return the UID of a message in the mailbox
@@ -239,15 +239,15 @@ class IMAPMailbox(object):
but in the future will be useful to get absolute UIDs from
message sequence numbers.
- :param message: the message uid
+ :param message: the message sequence number.
:type message: int
:rtype: int
+ :return: the UID of the message.
"""
- # TODO --- return the uid if it has it!!!
- d = self.collection.get_msg_by_uid(message)
- d.addCallback(lambda m: m.getUID())
- return d
+ # TODO support relative sequences. The (imap) message should
+ # receive a sequence number attribute: a deferred is not expected
+ return message_number
def getUIDNext(self):
"""
@@ -451,15 +451,6 @@ class IMAPMailbox(object):
def _close_cb(self, result):
self.closed = True
- # TODO server already calls expunge for closing
- #def close(self):
- #"""
- #Expunge and mark as closed
- #"""
- #d = self.expunge()
- #d.addCallback(self._close_cb)
- #return d
-
def expunge(self):
"""
Remove all messages flagged \\Deleted
@@ -641,9 +632,6 @@ class IMAPMailbox(object):
return map(str, self.flags)
def pack_flags(result):
- #if result is None:
- #print "No result"
- #return
_uid, _flags = result
return _uid, flagsPart(_uid, _flags)
@@ -790,14 +778,31 @@ class IMAPMailbox(object):
:type observer: deferred
"""
# XXX implement also sequence (uid = 0)
- # XXX we should prevent client from setting Recent flag?
+ # TODO we should prevent client from setting Recent flag
leap_assert(not isinstance(flags, basestring),
"flags cannot be a string")
flags = tuple(flags)
- messages_asked = self._bound_seq(messages_asked)
- seq_messg = self._filter_msg_seq(messages_asked)
- self.collection.set_flags(
- self.mbox_name, seq_messg, flags, mode, observer)
+
+ def set_flags_for_seq(sequence):
+
+ def return_result_dict(list_of_flags):
+ result = dict(zip(list(sequence), list_of_flags))
+ observer.callback(result)
+ return result
+
+ d_all_set = []
+ for msgid in sequence:
+ d = self.collection.get_message_by_uid(msgid)
+ d.addCallback(lambda msg: self.collection.update_flags(
+ msg, flags, mode))
+ d_all_set.append(d)
+ got_flags_setted = defer.gatherResults(d_all_set)
+ got_flags_setted.addCallback(return_result_dict)
+ return got_flags_setted
+
+ d_seq = self._get_sequence_of_messages(messages_asked)
+ d_seq.addCallback(set_flags_for_seq)
+ return d_seq
# ISearchableMailbox
diff --git a/src/leap/mail/imap/messages.py b/src/leap/mail/imap/messages.py
index d4b5d1f..df50323 100644
--- a/src/leap/mail/imap/messages.py
+++ b/src/leap/mail/imap/messages.py
@@ -73,29 +73,6 @@ class IMAPMessage(object):
"""
return self.message.get_flags()
- # setFlags not in the interface spec but we use it with store command.
-
- # XXX if we can move it to a collection method, we don't need to pass
- # collection to the IMAPMessage
-
- # lookup method? IMAPMailbox?
-
- #def setFlags(self, flags, mode):
- #"""
- #Sets the flags for this message
-#
- #:param flags: the flags to update in the message.
- #:type flags: tuple of str
- #:param mode: the mode for setting. 1 is append, -1 is remove, 0 set.
- #:type mode: int
- #"""
- #leap_assert(isinstance(flags, tuple), "flags need to be a tuple")
- # XXX
- # return new flags
- # map to str
- #self.message.set_flags(flags, mode)
- #self.collection.update_flags(self.message, flags, mode)
-
def getInternalDate(self):
"""
Retrieve the date internally associated with this message
diff --git a/src/leap/mail/imap/server.py b/src/leap/mail/imap/server.py
index 38a3fd4..f294f42 100644
--- a/src/leap/mail/imap/server.py
+++ b/src/leap/mail/imap/server.py
@@ -112,7 +112,6 @@ class LEAPIMAPServer(imap4.IMAP4Server):
ebFetch = self._IMAP4Server__ebFetch
if len(query) == 1 and str(query[0]) == "flags":
- print ">>>>>>>>> fetching flags"
self._oldTimeout = self.setTimeout(None)
# no need to call iter, we get a generator
maybeDeferred(
@@ -122,7 +121,6 @@ class LEAPIMAPServer(imap4.IMAP4Server):
).addErrback(ebFetch, tag)
elif len(query) == 1 and str(query[0]) == "rfc822.header":
- print ">>>>>>>> fetching headers"
self._oldTimeout = self.setTimeout(None)
# no need to call iter, we get a generator
maybeDeferred(
@@ -131,7 +129,6 @@ class LEAPIMAPServer(imap4.IMAP4Server):
cbFetch, tag, query, uid
).addErrback(ebFetch, tag)
else:
- print ">>>>>>> Fetching other"
self._oldTimeout = self.setTimeout(None)
# no need to call iter, we get a generator
maybeDeferred(
@@ -370,7 +367,6 @@ class LEAPIMAPServer(imap4.IMAP4Server):
# TODO subscribe method had also to be changed to accomodate deferred
def do_SUBSCRIBE(self, tag, name):
- print "DOING SUBSCRIBE"
name = self._parseMbox(name)
def _subscribeCb(_):
@@ -433,8 +429,6 @@ class LEAPIMAPServer(imap4.IMAP4Server):
def _renameEb(failure):
m = failure.value
- print "SERVER rename failure!"
- print m
if failure.check(TypeError):
self.sendBadResponse(tag, 'Invalid command syntax')
elif failure.check(imap4.MailboxException):