Fix typo in license headers
[oweals/cde.git] / cde / programs / dtmail / include / DtMail / DtMailServer.hh
1 /*
2  *+SNOTICE
3  *
4  *
5  *      $TOG: DtMailServer.hh /main/11 1999/01/29 11:49:00 mgreess $
6  *
7  *      RESTRICTED CONFIDENTIAL INFORMATION:
8  *      
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
15  *      Sun's request.
16  *
17  *      Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
18  *
19  *+ENOTICE
20  */
21
22 #ifndef I_HAVE_NO_IDENT
23 #endif
24
25 #ifndef _DTMAIL_SERVER_HH
26 #define _DTMAIL_SERVER_HH
27
28 #include <stdio.h>
29 #include <stdarg.h>
30
31 #include <DtMail/DtMail.hh>
32 #include <DtMail/DtMailTypes.h>
33 #include <DtMail/DtVirtArray.hh>
34
35 #define         DTMAS_INBOX             "INBOX"
36
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"
43
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 */
50
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"
68
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"
83
84
85 #define         DTMAS_PROTOCOL_ERROR(pname) \
86 { \
87   if (_errorlogging) \
88   { \
89     DtMailEnv   error; \
90     error.logError(DTM_FALSE, (const char*) "%s:  protocol error\n", pname); \
91   } \
92   return PS_ERROR; \
93 }
94
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)); }
98
99 typedef void    (*DtMailAppendCallback)(DtMailEnv&, char*, int, void*);
100
101 class DtMailServer : public DtCPlusPlusAllocator
102 {
103 public:
104     friend class AUTOServer;
105
106     DtMailServer(char*, DtMail::Session*, DtMail::MailBox*,
107                  DtMailAppendCallback, void*);
108     ~DtMailServer();
109
110     static int           get_mailrc_value(
111                                         DtMail::Session*,
112                                         char*, char*,
113                                         int dflt = 0);
114     static char         *get_mailrc_value(
115                                         DtMail::Session*,
116                                         char*, char*,
117                                         char*dflt = NULL,
118                                         DtMailBoolean decrypt = DTM_FALSE);
119     static Boolean       get_mailrc_value(
120                                         DtMail::Session*,
121                                         char*, char*,
122                                         Boolean dflt = False);
123     void                 set_password(char *);
124     virtual void         retrieve_messages(DtMailEnv&);
125
126 protected:
127     //
128     // Protocol specific access methods
129     //
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;
140
141     //
142     // Protocol specific characteristics
143     //
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;
150
151     //
152     // Server related Access Protocol data
153     //
154     DtMailAppendCallback _append_mailbox_cb;
155     void                *_append_mailbox_cb_data;
156     char                *_errorstring;
157     char                *_folder;
158     DtMailEnv            _info;
159     DtMailEnv            _logger;
160     char                 _msgbuf[DTMAS_MSGBUFSIZE];
161     char                *_password;
162     Boolean              _protologging;
163     Boolean              _protologgingplus;
164     Boolean              _removeafterdelivery;
165     Boolean              _retrieveold;
166     int                  _retrieveerrors;
167     char                *_servername;
168     DtMail::Session     *_session;
169     DtMail::MailBox     *_mailbox;
170     int                  _sizelimit;
171     void                *_sockfp;
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.
177     char                *_username;
178
179     //
180     // Generic Access Protocol methods
181     //
182     DTMailError_t       do_send(char *fmt, ...);
183     DTMailError_t       do_transaction(char *fmt, ...);
184     Boolean             is_inbox();
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);
189 };
190
191 class AUTOServer : public DtMailServer
192 {
193 public:
194     AUTOServer(char*, DtMail::Session*, DtMail::MailBox*,
195                DtMailAppendCallback, void*);
196     ~AUTOServer();
197
198     virtual void                retrieve_messages(DtMailEnv&);
199
200 protected:
201     //
202     // Protocol specific methods
203     //
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);
214
215     //
216     // Protocol characteristics
217     //
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(); }
230
231 #define AUTO_POP3       0
232 #define AUTO_APOP       1
233 #define AUTO_IMAP       2
234 #define AUTO_POP2       3
235 #define AUTO_NPROTOCOLS 4
236
237     DtMailServer        *_server;
238 };
239
240 class IMAPServer : public DtMailServer
241 {
242 public:
243     IMAPServer(char*, DtMail::Session*, DtMail::MailBox*,
244                DtMailAppendCallback, void*);
245     ~IMAPServer();
246
247     virtual void                retrieve_messages(DtMailEnv&);
248
249 protected:
250     //
251     // Protocol specific methods
252     //
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);
265
266     //
267     // Protocol characteristics
268     //
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; }
275
276     int                  _count;
277     int                  _imap4;
278     int                  _recent;
279     int                  _seen;
280     int                  _unseen;
281 };
282
283 class POP2Server : public DtMailServer
284 {
285 public:
286     POP2Server(char*, DtMail::Session*, DtMail::MailBox*,
287                DtMailAppendCallback, void*);
288     ~POP2Server();
289
290     virtual void                retrieve_messages(DtMailEnv&);
291
292 protected:
293     //
294     // Protocol specific methods
295     //
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);
309
310     //
311     // Protocol characteristics
312     //
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; }
319
320     int                  _pound_arg;
321     int                  _equal_arg;
322 };
323
324
325 class POP3Server : public DtMailServer
326 {
327 public:
328     POP3Server(char*, DtMail::Session*, DtMail::MailBox*,
329                DtMailAppendCallback, void*);
330     ~POP3Server();
331
332     virtual void                retrieve_messages(DtMailEnv&);
333
334 protected:
335     //
336     // Protocol specific methods
337     //
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; }
351
352     //
353     // Protocol characteristics
354     //
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; }
361
362     int                  _lastretrieved;
363     DtVirtArray<char*>  *_uidlist_current;
364     DtVirtArray<char*>  *_uidlist_old;
365     char                *_uidlist_file;
366
367     DtVirtArray<char*>  *uidlist_create();
368     void                 uidlist_destroy(DtVirtArray<char*> *uidlist);
369     char                *uidlist_find(
370                                 DtVirtArray<char*> *uidlist,
371                                 int             msg,
372                                 char            *uid);
373     void                 uidlist_read(DtVirtArray<char*> *uidlist);
374     void                 uidlist_write(DtVirtArray<char*> *uidlist);
375 };
376
377 class APOPServer : public POP3Server
378 {
379 public:
380     APOPServer(char*, DtMail::Session*, DtMail::MailBox*,
381                DtMailAppendCallback, void*);
382     ~APOPServer();
383
384 protected:
385     //
386     // Protocol specific methods
387     //
388     virtual DTMailError_t       ptrans_authorize(char*);
389
390     //
391     // Protocol characteristics
392     //
393     virtual char        *proto_name() { return strdup(DTMAS_PROTO_APOP); }
394     virtual int          proto_requires_password() { return TRUE; }
395 };
396
397 #endif // _DTMAIL_SERVER_HH