summaryrefslogtreecommitdiffstats
path: root/libmail/imaphandler.H
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/imaphandler.H')
-rw-r--r--libmail/imaphandler.H86
1 files changed, 86 insertions, 0 deletions
diff --git a/libmail/imaphandler.H b/libmail/imaphandler.H
new file mode 100644
index 0000000..222b791
--- /dev/null
+++ b/libmail/imaphandler.H
@@ -0,0 +1,86 @@
+/*
+** Copyright 2002, Double Precision Inc.
+**
+** See COPYING for distribution information.
+*/
+#ifndef libmail_imaphandler_H
+#define libmail_imaphandler_H
+
+#include "libmail_config.h"
+#include "imap.H"
+
+LIBMAIL_START
+
+//////////////////////////////////////////////////////////////////////////
+//
+// Something that tokenizes server response.
+//
+
+class imapHandlerStructured : public imapHandler {
+
+ int errormode;
+ int donemode;
+ int stringmode;
+
+ size_t largestringleft;
+ std::string errbuf;
+ std::string stringbuffer;
+
+protected:
+ size_t largestringsize;
+public:
+ imapHandlerStructured(int timeoutVal=60)
+ : imapHandler(timeoutVal), errormode(0),
+ donemode(0), stringmode(0), largestringleft(0)
+ {
+ }
+
+ enum TokenType {
+ EOL=256,
+ ATOM,
+ STRING,
+ LARGESTRING, // Another LARGESTRING, or STRING will follow
+ NIL
+ };
+
+ class Token {
+ public:
+ int token;
+ std::string text;
+
+ Token(enum TokenType t, std::string s) : token(t), text(s) {}
+ Token(int t, std::string s) : token(t), text(s) {}
+ Token(enum TokenType t) : token((int)t) {}
+ Token(int t) : token(t) {}
+
+ operator int() { return token; }
+
+ bool operator== (int t) { return t == token; }
+ bool operator== (enum TokenType t) { return (int)t == token; }
+ bool operator!= (int t) { return t != token; }
+ bool operator!= (enum TokenType t) { return (int)t != token; }
+
+ operator std::string();
+ };
+
+ virtual void error(imap &);
+ virtual void done();
+protected:
+
+ virtual int process(imap &imapAccount, std::string &buffer);
+private:
+ virtual void process(imap &imapAccount, Token t)=0;
+
+ virtual bool wantLargeString();
+
+ // Subclass should return true if it's willing to accept {nnn}\r\n
+ // piecemeal, using LARGESTRING tokens.
+ // Otherwise, any {nnn}\r\n is converted to a string (up to some
+ // reasonable limit)
+
+
+};
+
+LIBMAIL_END
+
+#endif