added GET/SETANNOTATION methods
diff --git a/Doc/lib/libimaplib.tex b/Doc/lib/libimaplib.tex
index 3448ba6..2c4555d 100644
--- a/Doc/lib/libimaplib.tex
+++ b/Doc/lib/libimaplib.tex
@@ -222,6 +222,11 @@
   The method is non-standard, but is supported by the \samp{Cyrus} server.
 \end{methoddesc}
 
+\begin{methoddesc}{getannotation}{mailbox, entry, attribute}
+  Retrieve the specified \samp{ANNOTATION}s for \var{mailbox}.
+  The method is non-standard, but is supported by the \samp{Cyrus} server.
+\end{methoddesc}
+
 \begin{methoddesc}{getquota}{root}
   Get the \samp{quota} \var{root}'s resource usage and limits.
   This method is part of the IMAP4 QUOTA extension defined in rfc2087.
@@ -357,6 +362,11 @@
   The method is non-standard, but is supported by the \samp{Cyrus} server.
 \end{methoddesc}
 
+\begin{methoddesc}{setannotation}{mailbox, entry, attribute\optional{, ...}}
+  Set \samp{ANNOTATION}s for \var{mailbox}.
+  The method is non-standard, but is supported by the \samp{Cyrus} server.
+\end{methoddesc}
+
 \begin{methoddesc}{setquota}{root, limits}
   Set the \samp{quota} \var{root}'s resource \var{limits}.
   This method is part of the IMAP4 QUOTA extension defined in rfc2087.
diff --git a/Lib/imaplib.py b/Lib/imaplib.py
index 6b0576f..3914c39 100644
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -18,8 +18,9 @@
 # IMAP4_SSL contributed by Tino Lange <Tino.Lange@isg.de> March 2002.
 # GET/SETQUOTA contributed by Andreas Zeidler <az@kreativkombinat.de> June 2002.
 # PROXYAUTH contributed by Rick Holbert <holbert.13@osu.edu> November 2002.
+# GET/SETANNOTATION contributed by Tomas Lindroos <skitta@abo.fi> June 2005.
 
-__version__ = "2.55"
+__version__ = "2.56"
 
 import binascii, os, random, re, socket, sys, time
 
@@ -51,6 +52,7 @@
         'EXPUNGE':      ('SELECTED',),
         'FETCH':        ('SELECTED',),
         'GETACL':       ('AUTH', 'SELECTED'),
+        'GETANNOTATION':('AUTH', 'SELECTED'),
         'GETQUOTA':     ('AUTH', 'SELECTED'),
         'GETQUOTAROOT': ('AUTH', 'SELECTED'),
         'MYRIGHTS':     ('AUTH', 'SELECTED'),
@@ -66,6 +68,7 @@
         'SEARCH':       ('SELECTED',),
         'SELECT':       ('AUTH', 'SELECTED'),
         'SETACL':       ('AUTH', 'SELECTED'),
+        'SETANNOTATION':('AUTH', 'SELECTED'),
         'SETQUOTA':     ('AUTH', 'SELECTED'),
         'SORT':         ('SELECTED',),
         'STATUS':       ('AUTH', 'SELECTED'),
@@ -133,10 +136,10 @@
             the command re-tried.
     "readonly" exceptions imply the command should be re-tried.
 
-    Note: to use this module, you must read the RFCs pertaining
-    to the IMAP4 protocol, as the semantics of the arguments to
-    each IMAP4 command are left to the invoker, not to mention
-    the results.
+    Note: to use this module, you must read the RFCs pertaining to the
+    IMAP4 protocol, as the semantics of the arguments to each IMAP4
+    command are left to the invoker, not to mention the results. Also,
+    most IMAP servers implement a sub-set of the commands available here.
     """
 
     class error(Exception): pass    # Logical errors - debug required
@@ -186,11 +189,10 @@
         else:
             raise self.error(self.welcome)
 
-        cap = 'CAPABILITY'
-        self._simple_command(cap)
-        if not cap in self.untagged_responses:
+        typ, dat = self.capability()
+        if dat == [None]:
             raise self.error('no CAPABILITY response from server')
-        self.capabilities = tuple(self.untagged_responses[cap][-1].upper().split())
+        self.capabilities = tuple(dat[-1].upper().split())
 
         if __debug__:
             if self.debug >= 3:
@@ -345,6 +347,15 @@
         return typ, dat
 
 
+    def capability(self):
+        """(typ, [data]) = <instance>.capability()
+        Fetch capabilities list from server."""
+
+        name = 'CAPABILITY'
+        typ, dat = self._simple_command(name)
+        return self._untagged_response(typ, dat, name)
+
+
     def check(self):
         """Checkpoint mailbox on server.
 
@@ -436,6 +447,14 @@
         return self._untagged_response(typ, dat, 'ACL')
 
 
+    def getannotation(self, mailbox, entry, attribute):
+        """(typ, [data]) = <instance>.getannotation(mailbox, entry, attribute)
+        Retrieve ANNOTATIONs."""
+
+        typ, dat = self._simple_command('GETANNOTATION', mailbox, entry, attribute)
+        return self._untagged_response(typ, dat, 'ANNOTATION')
+
+
     def getquota(self, root):
         """Get the quota root's resource usage and limits.
 
@@ -643,6 +662,14 @@
         return self._simple_command('SETACL', mailbox, who, what)
 
 
+    def setannotation(self, *args):
+        """(typ, [data]) = <instance>.setannotation(mailbox[, entry, attribute]+)
+        Set ANNOTATIONs."""
+
+        typ, dat = self._simple_command('SETANNOTATION', *args)
+        return self._untagged_response(typ, dat, 'ANNOTATION')
+
+
     def setquota(self, root, limits):
         """Set the quota root's resource limits.