IMAP: added better handling of asynchronous stream closing
authoradam <adam@megacz.com>
Sat, 9 Sep 2006 01:54:53 +0000 (01:54 +0000)
committeradam <adam@megacz.com>
Sat, 9 Sep 2006 01:54:53 +0000 (01:54 +0000)
darcs-hash:20060909015453-5007d-813b99af11ef995fae20ba5577120c28266dfc53.gz

src/org/ibex/mail/protocol/IMAP.java

index e00f2d5..9730436 100644 (file)
@@ -150,7 +150,6 @@ public class IMAP {
                                          if (s.charAt(0) != pre.charAt(0))                                          break;
                                          s = s.substring(1); pre = pre.substring(1);                                continue;
                     }
-                    break;
                 }
             }
         }
@@ -281,7 +280,7 @@ public class IMAP {
             parser = new Parser(conn);
             conn.setTimeout(30 * 60 * 1000);
             println("* OK " + conn.vhost + " " + IMAP.class.getName() + " IMAP4rev1 [RFC3501] v" + version + " server ready");
-            for(String tag = null;; newline()) try {
+            for(String tag = null;;) try {
                 conn.flush();
                 boolean uid = false;
                 tag = null; Parser.Token tok = token(); if (tok == null) return; tag = tok.astring();
@@ -369,9 +368,14 @@ public class IMAP {
                 }
                 println(tag+" OK "+command+" Completed. " +
                         (commandKey == LOGIN ? ("[CAPABILITY "+Printer.join(" ", api.capability())+"]") : ""));
-                Log.error("[imap]", conn.dumpLog());
-            } catch (Server.Bad b) { println(tag==null ? "* BAD Invalid tag":(tag + " Bad " + b.toString()));
-            } catch (Server.No n)  { println(tag==null?"* BAD Invalid tag":(tag+" No "  + n.toString())); }
+                try {
+                    newline();
+                } catch (Stream.EOF e) {
+                    Log.info(this, "connection closed");
+                    return;
+                }
+            } catch (Server.Bad b) { println(tag==null ? "* BAD Invalid tag":(tag + " Bad " + b.toString())); Log.warn(this,b);
+            } catch (Server.No n)  { println(tag==null?"* BAD Invalid tag":(tag+" No "  + n.toString())); Log.warn(this,n); }
         }
 
         private Parser.Token[] lastfetch = null; // hack
@@ -698,12 +702,7 @@ public class IMAP {
             }
         }
 
-        public void newline() {
-           while (stream.peekc() == '\r' || stream.peekc() == '\n' || stream.peekc() == ' ') {
-               for(char c = stream.peekc(); c == ' ';) { stream.getc(); c = stream.peekc(); };
-               for(char c = stream.peekc(); c == '\r' || c == '\n';) { stream.getc(); c = stream.peekc(); };
-           }
-        }
+        public void newline() { stream.readln(); }
 
         public Token token() { return token(true); }
         public Token token(boolean freak) {