Ticket #1105: twistedmail-imap-flags-anywhere.diff

File twistedmail-imap-flags-anywhere.diff, 2.2 KB (added by jhohm, 12 years ago)

Patch to handle FLAGS anywhere inside FETCH response

  • TwistedMail-0.4.0/twisted/mail/imap4.py

    old new  
    364364            names = parseNestedParens(L)
    365365            N = len(names)
    366366            if (N >= 1 and names[0] in self._1_RESPONSES or
     367                N >= 2 and names[1] in self._2_RESPONSES or
    367368                N >= 2 and names[0] == 'OK' and isinstance(names[1], types.ListType) and names[1][0] in self._OK_RESPONSES):
    368369                send.append(L)
    369             elif N >= 3 and names[1] in self._2_RESPONSES:
    370                 if isinstance(names[2], list) and len(names[2]) >= 1 and names[2][0] == 'FLAGS' and 'FLAGS' not in self.args:
    371                     unuse.append(L)
    372                 else:
    373                     send.append(L)
    374             elif N >= 2 and names[1] in self._2_RESPONSES:
    375                 send.append(L)
    376370            else:
    377371                unuse.append(L)
    378372        d, self.defer = self.defer, None
     
    33363330                            if len(data) < 2:
    33373331                                raise IllegalServerResponse("Not enough arguments", data)
    33383332                            flags.setdefault(id, {})[data[0]] = data[1]
     3333                            if data[0] == 'FLAGS':
     3334                                self.flagsChanged({id: data[1]})
    33393335                            del data[:2]
    33403336                else:
    33413337                    print '(2)Ignoring ', parts
     
    34313427                    except ValueError:
    34323428                        raise IllegalServerResponse, line
    34333429                    else:
    3434                         info[id] = parseNestedParens(parts[2])
     3430                        data = parseNestedParens(parts[2])[0]
     3431                        # XXX this will fail if 'FLAGS' is a retrieved part
     3432                        for i in range(len(data) - 1):
     3433                            if data[i] == 'FLAGS':
     3434                                self.flagsChanged({id: data[i+1]})
     3435                                del data[i:i+2]
     3436                                break
     3437                        if data:
     3438                            info.setdefault(id, []).append(data)
    34353439        return info
    34363440
    34373441    def _fetch(self, messages, useUID=0, **terms):