5 * $TOG: DtMailServer.hh /main/11 1999/01/29 11:49:00 mgreess $
7 * RESTRICTED CONFIDENTIAL INFORMATION:
9 * The information in this document is subject to special
10 * restrictions in a confidential disclosure agreement bertween
11 * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
12 * document outside HP, IBM, Sun, USL, SCO, or Univel wihtout
13 * Sun's specific written approval. This documment and all copies
14 * and derivative works thereof must be returned or destroyed at
17 * Copyright 1993 Sun Microsystems, Inc. All rights reserved.
22 #ifndef I_HAVE_NO_IDENT
25 #ifndef _DTMAIL_SERVER_HH
26 #define _DTMAIL_SERVER_HH
31 #include <DtMail/DtMail.hh>
32 #include <DtMail/DtMailTypes.h>
33 #include <DtMail/DtVirtArray.hh>
35 #define DTMAS_INBOX "INBOX"
37 #define DTMAS_PROTO_NONE "NONE"
38 #define DTMAS_PROTO_APOP "APOP"
39 #define DTMAS_PROTO_AUTO "AUTO"
40 #define DTMAS_PROTO_IMAP "IMAP"
41 #define DTMAS_PROTO_POP2 "POP2"
42 #define DTMAS_PROTO_POP3 "POP3"
44 /* definitions for buffer sizes -- somewhat arbitrary */
45 #define DTMAS_TIMEOUT 10 /* timeout with server */
46 #define DTMAS_IDSIZE 128 /* length of UIDL message ID */
47 #define DTMAS_MSGBUFSIZE 4096 /* size of msg read buffer */
48 #define DTMAS_POPBUFSIZE 512 /* per RFC 937 */
49 #define DTMAS_TAGSIZE 6 /* len of tagged proto tag */
51 #define DTMAS_PROPKEY_GETMAILCOMMAND "getmailcommand"
52 #define DTMAS_PROPKEY_GETMAILVIACOMMAND "getmailviacommand"
53 #define DTMAS_PROPKEY_GETMAILVIASERVER "getmailviaserver"
54 #define DTMAS_PROPKEY_GETMAILVIASYSTEM "getmailviasystem"
55 #define DTMAS_PROPKEY_INBOXPATH "inboxpath"
56 #define DTMAS_PROPKEY_PASSWORD "password"
57 #define DTMAS_PROPKEY_PROTOCOL "protocol"
58 #define DTMAS_PROPKEY_PROTOLOGGING "protologging"
59 #define DTMAS_PROPKEY_PROTOLOGGINGPLUS "protologgingplus"
60 #define DTMAS_PROPKEY_REMEMBERPASSWORD "rememberpassword"
61 #define DTMAS_PROPKEY_REMOTENAME "remotename"
62 #define DTMAS_PROPKEY_REMOVEAFTERDELIVERY "removeafterdelivery"
63 #define DTMAS_PROPKEY_RETRIEVEOLD "retrieveold"
64 #define DTMAS_PROPKEY_SERVERNAME "servername"
65 #define DTMAS_PROPKEY_SHOWCONFIRMATION "showretrievalconfirmation"
66 #define DTMAS_PROPKEY_TIMEOUT "timeout"
67 #define DTMAS_PROPKEY_USERNAME "username"
69 #define DTMAS_PROPDFLT_GETMAILCOMMAND ""
70 #define DTMAS_PROPDFLT_GETMAILVIACOMMAND "f"
71 #define DTMAS_PROPDFLT_GETMAILVIASERVER "f"
72 #define DTMAS_PROPDFLT_GETMAILVIASYSTEM ""
73 #define DTMAS_PROPDFLT_PASSWORD ""
74 #define DTMAS_PROPDFLT_PROTOCOL DTMAS_PROTO_POP3
75 #define DTMAS_PROPDFLT_PROTOLOGGING "f"
76 #define DTMAS_PROPDFLT_PROTOLOGGINGPLUS "f"
77 #define DTMAS_PROPDFLT_REMEMBERPASSWORD "f"
78 #define DTMAS_PROPDFLT_REMOVEAFTERDELIVERY ""
79 #define DTMAS_PROPDFLT_RETRIEVEOLD ""
80 #define DTMAS_PROPDFLT_SERVERNAME ""
81 #define DTMAS_PROPDFLT_SHOWCONFIRMATION "f"
82 #define DTMAS_PROPDFLT_TIMEOUT "30"
85 #define DTMAS_PROTOCOL_ERROR(pname) \
90 error.logError(DTM_FALSE, (const char*) "%s: protocol error\n", pname); \
95 #define DTMAS_CONCAT_MAILRC_KEY(buf, pfx, key) \
96 { if (NULL==(pfx)) (void) sprintf((buf), "%s", (key)); \
97 else (void) sprintf((buf), "%s_%s", (pfx), (key)); }
99 typedef void (*DtMailAppendCallback)(DtMailEnv&, char*, int, void*);
101 class DtMailServer : public DtCPlusPlusAllocator
104 friend class AUTOServer;
106 DtMailServer(char*, DtMail::Session*, DtMail::MailBox*,
107 DtMailAppendCallback, void*);
110 static int get_mailrc_value(
114 static char *get_mailrc_value(
118 DtMailBoolean decrypt = DTM_FALSE);
119 static Boolean get_mailrc_value(
122 Boolean dflt = False);
123 void set_password(char *);
124 virtual void retrieve_messages(DtMailEnv&);
128 // Protocol specific access methods
130 virtual DTMailError_t ptrans_authorize(char*) = 0;
131 virtual DTMailError_t ptrans_delete(int) = 0;
132 virtual int ptrans_msgisold(int) = 0;
133 virtual DTMailError_t ptrans_fldstate_expunge() = 0;
134 virtual DTMailError_t ptrans_fldstate_read(int*, int*)= 0;
135 virtual DTMailError_t ptrans_msgsizes(int, int*) = 0;
136 virtual DTMailError_t ptrans_parse_response(char*) = 0;
137 virtual DTMailError_t ptrans_quit() = 0;
138 virtual DTMailError_t ptrans_retrieve_start(int, int*) = 0;
139 virtual DTMailError_t ptrans_retrieve_end(int) = 0;
142 // Protocol specific characteristics
144 virtual int proto_is_delimited() = 0;
145 virtual int proto_is_peek_capable() = 0;
146 virtual int proto_is_tagged() = 0;
147 virtual char *proto_name() = 0;
148 virtual int proto_port() = 0;
149 virtual int proto_requires_password() = 0;
152 // Server related Access Protocol data
154 DtMailAppendCallback _append_mailbox_cb;
155 void *_append_mailbox_cb_data;
160 char _msgbuf[DTMAS_MSGBUFSIZE];
162 Boolean _protologging;
163 Boolean _protologgingplus;
164 Boolean _removeafterdelivery;
165 Boolean _retrieveold;
168 DtMail::Session *_session;
169 DtMail::MailBox *_mailbox;
172 char *_shroud; // String to shroud in debug output.
173 char _transtag[DTMAS_TAGSIZE];
174 // Tag of the current transaction.
175 int _transnum; // Number of the current transaction.
176 int _timeout; // Timeout seconds waiting for server.
180 // Generic Access Protocol methods
182 DTMailError_t do_send(char *fmt, ...);
183 DTMailError_t do_transaction(char *fmt, ...);
185 DTMailError_t ptrans_retrieve_readandappend(DtMailEnv&, long);
186 void send_info_message(DtMailCallbackOp);
187 static void vtalarm_handler(int);
188 void vtalarm_setitimer(int);
191 class AUTOServer : public DtMailServer
194 AUTOServer(char*, DtMail::Session*, DtMail::MailBox*,
195 DtMailAppendCallback, void*);
198 virtual void retrieve_messages(DtMailEnv&);
202 // Protocol specific methods
204 virtual DTMailError_t ptrans_authorize(char*);
205 virtual DTMailError_t ptrans_delete(int);
206 virtual int ptrans_msgisold(int);
207 virtual DTMailError_t ptrans_fldstate_expunge();
208 virtual DTMailError_t ptrans_fldstate_read(int*, int*);
209 virtual DTMailError_t ptrans_msgsizes(int, int*);
210 virtual DTMailError_t ptrans_parse_response(char*);
211 virtual DTMailError_t ptrans_quit();
212 virtual DTMailError_t ptrans_retrieve_start(int, int*);
213 virtual DTMailError_t ptrans_retrieve_end(int);
216 // Protocol characteristics
218 virtual int proto_is_delimited()
219 { return _server->proto_is_delimited(); }
220 virtual int proto_is_peek_capable()
221 { return _server->proto_is_peek_capable(); }
222 virtual int proto_is_tagged()
223 { return _server->proto_is_tagged(); }
224 virtual char *proto_name()
225 { return _server->proto_name(); }
226 virtual int proto_port()
227 { return _server->proto_port(); }
228 virtual int proto_requires_password()
229 { return _server->proto_requires_password(); }
235 #define AUTO_NPROTOCOLS 4
237 DtMailServer *_server;
240 class IMAPServer : public DtMailServer
243 IMAPServer(char*, DtMail::Session*, DtMail::MailBox*,
244 DtMailAppendCallback, void*);
247 virtual void retrieve_messages(DtMailEnv&);
251 // Protocol specific methods
253 virtual DTMailError_t ptrans_authorize(char*);
254 virtual DTMailError_t ptrans_delete(int);
255 virtual int ptrans_msgisold(int);
256 virtual DTMailError_t ptrans_fldstate_expunge()
257 { return do_transaction("EXPUNGE"); }
258 virtual DTMailError_t ptrans_fldstate_read(int*, int*);
259 virtual DTMailError_t ptrans_msgsizes(int, int*);
260 virtual DTMailError_t ptrans_parse_response(char*);
261 virtual DTMailError_t ptrans_quit()
262 { return do_transaction("LOGOUT"); }
263 virtual DTMailError_t ptrans_retrieve_start(int, int*);
264 virtual DTMailError_t ptrans_retrieve_end(int);
267 // Protocol characteristics
269 virtual int proto_is_delimited() { return FALSE; }
270 virtual int proto_is_peek_capable() { return TRUE; }
271 virtual int proto_is_tagged() { return TRUE; }
272 virtual char *proto_name() { return strdup(DTMAS_PROTO_IMAP); }
273 virtual int proto_port() { return 143; }
274 virtual int proto_requires_password() { return TRUE; }
283 class POP2Server : public DtMailServer
286 POP2Server(char*, DtMail::Session*, DtMail::MailBox*,
287 DtMailAppendCallback, void*);
290 virtual void retrieve_messages(DtMailEnv&);
294 // Protocol specific methods
296 virtual DTMailError_t ptrans_authorize(char*);
297 virtual DTMailError_t ptrans_delete(int)
298 { return DTME_NoError; }
299 virtual int ptrans_msgisold(int);
300 virtual DTMailError_t ptrans_fldstate_expunge()
301 { return DTME_NoError; }
302 virtual DTMailError_t ptrans_fldstate_read(int*, int*);
303 virtual DTMailError_t ptrans_msgsizes(int, int*);
304 virtual DTMailError_t ptrans_parse_response(char*);
305 virtual DTMailError_t ptrans_quit()
306 { return do_transaction("QUIT"); }
307 virtual DTMailError_t ptrans_retrieve_start(int, int*);
308 virtual DTMailError_t ptrans_retrieve_end(int);
311 // Protocol characteristics
313 virtual int proto_is_delimited() { return FALSE; }
314 virtual int proto_is_peek_capable() { return FALSE; }
315 virtual int proto_is_tagged() { return FALSE; }
316 virtual char *proto_name() { return strdup(DTMAS_PROTO_POP2); }
317 virtual int proto_port() { return 109; }
318 virtual int proto_requires_password() { return TRUE; }
325 class POP3Server : public DtMailServer
328 POP3Server(char*, DtMail::Session*, DtMail::MailBox*,
329 DtMailAppendCallback, void*);
332 virtual void retrieve_messages(DtMailEnv&);
336 // Protocol specific methods
338 virtual DTMailError_t ptrans_authorize(char*);
339 virtual DTMailError_t ptrans_delete(int);
340 virtual int ptrans_msgisold(int);
341 virtual DTMailError_t ptrans_fldstate_expunge()
342 { return DTME_NoError; }
343 virtual DTMailError_t ptrans_fldstate_read(int*, int*);
344 virtual DTMailError_t ptrans_msgsizes(int, int*);
345 virtual DTMailError_t ptrans_parse_response(char*);
346 virtual DTMailError_t ptrans_quit()
347 { return do_transaction("QUIT"); }
348 virtual DTMailError_t ptrans_retrieve_start(int, int*);
349 virtual DTMailError_t ptrans_retrieve_end(int)
350 { return DTME_NoError; }
353 // Protocol characteristics
355 virtual int proto_is_delimited() { return TRUE; }
356 virtual int proto_is_peek_capable() { return FALSE; }
357 virtual int proto_is_tagged() { return FALSE; }
358 virtual char *proto_name() { return strdup(DTMAS_PROTO_POP3); }
359 virtual int proto_port() { return 110; }
360 virtual int proto_requires_password() { return TRUE; }
363 DtVirtArray<char*> *_uidlist_current;
364 DtVirtArray<char*> *_uidlist_old;
367 DtVirtArray<char*> *uidlist_create();
368 void uidlist_destroy(DtVirtArray<char*> *uidlist);
370 DtVirtArray<char*> *uidlist,
373 void uidlist_read(DtVirtArray<char*> *uidlist);
374 void uidlist_write(DtVirtArray<char*> *uidlist);
377 class APOPServer : public POP3Server
380 APOPServer(char*, DtMail::Session*, DtMail::MailBox*,
381 DtMailAppendCallback, void*);
386 // Protocol specific methods
388 virtual DTMailError_t ptrans_authorize(char*);
391 // Protocol characteristics
393 virtual char *proto_name() { return strdup(DTMAS_PROTO_APOP); }
394 virtual int proto_requires_password() { return TRUE; }
397 #endif // _DTMAIL_SERVER_HH