]> code.delx.au - offlineimap/blobdiff - offlineimap/imapserver.py
Merge commit 'origin' into v7
[offlineimap] / offlineimap / imapserver.py
index 7d99e19de2c7e9d6b13aa36f88db25ea425ab62a..b0830c704d4b4ccd275713eefee5c9a736f3aef2 100644 (file)
@@ -20,9 +20,12 @@ import imaplib
 from offlineimap import imaplibutil, imaputil, threadutil
 from offlineimap.ui import UIBase
 from threading import *
-import thread, hmac, os
+import thread, hmac, os, time
 import base64
 
+from StringIO import StringIO
+from platform import system
+
 try:
     # do we have a recent pykerberos?
     have_gss = False
@@ -60,10 +63,42 @@ class UsefulIMAP4(UsefulIMAPMixIn, imaplib.IMAP4):
     def open(self, host = '', port = imaplib.IMAP4_PORT):
         imaplibutil.new_open(self, host, port)
 
+    # This is a hack around Darwin's implementation of realloc() (which
+    # Python uses inside the socket code). On Darwin, we split the
+    # message into 100k chunks, which should be small enough - smaller
+    # might start seriously hurting performance ...
+
+    def read(self, size):
+        if (system() == 'Darwin') and (size>0) :
+            read = 0
+            io = StringIO()
+            while read < size:
+                data = imaplib.IMAP4.read (self, min(size-read,8192))
+                read += len(data)
+                io.write(data)
+            return io.getvalue()
+        else:
+            return imaplib.IMAP4.read (self, size)
+
 class UsefulIMAP4_SSL(UsefulIMAPMixIn, imaplibutil.WrappedIMAP4_SSL):
     def open(self, host = '', port = imaplib.IMAP4_SSL_PORT):
         imaplibutil.new_open_ssl(self, host, port)
 
+    # This is the same hack as above, to be used in the case of an SSL
+    # connexion.
+
+    def read(self, size):
+        if (system() == 'Darwin') and (size>0) :
+            read = 0
+            io = StringIO()
+            while read < size:
+                data = imaplibutil.WrappedIMAP4_SSL.read (self, min(size-read,8192))
+                read += len(data)
+                io.write(data)
+            return io.getvalue()
+        else:
+            return imaplibutil.WrappedIMAP4_SSL.read (self,size)
+
 class UsefulIMAP4_Tunnel(UsefulIMAPMixIn, imaplibutil.IMAP4_Tunnel): pass
 
 class IMAPServer:
@@ -309,7 +344,7 @@ class IMAPServer:
         ui.debug('imap', 'keepalive thread started')
         while 1:
             ui.debug('imap', 'keepalive: top of loop')
-            event.wait(timeout)
+            time.sleep(timeout)
             ui.debug('imap', 'keepalive: after wait')
             if event.isSet():
                 ui.debug('imap', 'keepalive: event is set; exiting')