eudora-mac/CrispinIMAP/Include/mail.h

1 line
42 KiB
C
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Copyright (c) 2017, Computer History Museum
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted (subject to
the limitations in the disclaimer below) provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of Computer History Museum nor the names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE
COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE. */
#ifndef MAIL_H
#define MAIL_H
/*
* Program: Mailbox Access routines
*
* Author: Mark Crispin
* Networks and Distributed Computing
* Computing & Communications
* University of Washington
* Administration Building, AG-44
* Seattle, WA 98195
* Internet: MRC@CAC.Washington.EDU
*
* Date: 22 November 1989
* Last Edited: 3 March 1997
*
* Copyright 1997 by the University of Washington
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appears in all copies and that both the
* above copyright notice and this permission notice appear in supporting
* documentation, and that the name of the University of Washington not be
* used in advertising or publicity pertaining to distribution of the software
* without specific, written prior permission. This software is made
* available "as is", and
* THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
* WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
* NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
* (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#include "imapnetlib.h"
/* Build parameters */
#define CACHEINCREMENT 250 /* cache growth increments */
#define MAILTMPLEN 1024 /* size of a temporary buffer */
#define MAXMESSAGESIZE 65000 /* MS-DOS: maximum text buffer size
* other: initial text buffer size */
#define NUSERFLAGS 30 /* # of user flags (current servers 30 max) */
#define BASEYEAR 1970 /* the year time began on Unix (note: mx
* driver depends upon this matching Unix) */
/* default for unqualified addresses */
#define BADHOST ".MISSING-HOST-NAME."
/* default for syntax errors in addresses */
#define ERRHOST ".SYNTAX-ERROR."
/* Coddle certain compilers' 6-character symbol limitation */
#ifdef __COMPILER_KCC__
#include "shortsym.h"
#endif
/* Constants */
#define NIL 0 /* convenient name */
#define T 1 /* opposite of NIL */
#define LONGT (long) 1 /* long T */
#define WARN (long) 1 /* mm_log warning type */
#define IMAP_ERROR (long) 2 /* mm_log error type */
#define PARSE (long) 3 /* mm_log parse error type */
#define BYE (long) 4 /* mm_notify stream dying */
#define DELIM '\377' /* strtok delimiter character */
/* Bits from mail_parse_flags(). Don't change these, since the IMAPheader format
* used by tenex, mtx, dawz, and tenexdos corresponds to these bits.
*/
#define fSEEN 1
#define fDELETED 2
#define fFLAGGED 4
#define fANSWERED 8
#define fOLD 16
#define fDRAFT 32
/* Global and Driver Parameters */
/* 0xx: driver flags */
#define ENABLE_DRIVER (long) 1
#define DISABLE_DRIVER (long) 2
/* 1xx: c-client globals */
#define GET_DRIVERS (long) 101
#define SET_DRIVERS (long) 102
#define GET_GETS (long) 103
#define SET_GETS (long) 104
#define GET_CACHE (long) 105
#define SET_CACHE (long) 106
#define GET_SMTPVERBOSE (long) 107
#define SET_SMTPVERBOSE (long) 108
#define GET_RFC822OUTPUT (long) 109
#define SET_RFC822OUTPUT (long) 110
#define GET_READPROGRESS (long) 111
#define SET_READPROGRESS (long) 112
/* 2xx: environment */
#define GET_USERNAME (long) 201
#define SET_USERNAME (long) 202
#define GET_HOMEDIR (long) 203
#define SET_HOMEDIR (long) 204
#define GET_LOCALHOST (long) 205
#define SET_LOCALHOST (long) 206
#define GET_SYSINBOX (long) 207
#define SET_SYSINBOX (long) 208
/* 3xx: TCP/IP */
#define GET_OPENTIMEOUT (long) 300
#define SET_OPENTIMEOUT (long) 301
#define GET_READTIMEOUT (long) 302
#define SET_READTIMEOUT (long) 303
#define GET_WRITETIMEOUT (long) 304
#define SET_WRITETIMEOUT (long) 305
#define GET_CLOSETIMEOUT (long) 306
#define SET_CLOSETIMEOUT (long) 307
#define GET_TIMEOUT (long) 308
#define SET_TIMEOUT (long) 309
#define GET_RSHTIMEOUT (long) 310
#define SET_RSHTIMEOUT (long) 311
/* 4xx: network drivers */
#define GET_MAXLOGINTRIALS (long) 400
#define SET_MAXLOGINTRIALS (long) 401
#define GET_LOOKAHEAD (long) 402
#define SET_LOOKAHEAD (long) 403
#define GET_IMAPPORT (long) 404
#define SET_IMAPPORT (long) 405
#define GET_PREFETCH (long) 406
#define SET_PREFETCH (long) 407
#define GET_CLOSEONERROR (long) 408
#define SET_CLOSEONERROR (long) 409
#define GET_POP3PORT (long) 410
#define SET_POP3PORT (long) 411
#define GET_UIDLOOKAHEAD (long) 412
#define SET_UIDLOOKAHEAD (long) 413
#define GET_NNTPPORT (long) 414
#define SET_NNTPPORT (long) 415
#define GET_IMAPENVELOPE (long) 416
#define SET_IMAPENVELOPE (long) 417
/* 5xx: local file drivers */
#define GET_MBXPROTECTION (long) 500
#define SET_MBXPROTECTION (long) 501
#define GET_DIRPROTECTION (long) 502
#define SET_DIRPROTECTION (long) 503
#define GET_LOCKPROTECTION (long) 504
#define SET_LOCKPROTECTION (long) 505
#define GET_FROMWIDGET (long) 506
#define SET_FROMWIDGET (long) 507
#define GET_NEWSACTIVE (long) 508
#define SET_NEWSACTIVE (long) 509
#define GET_NEWSSPOOL (long) 510
#define SET_NEWSSPOOL (long) 511
#define GET_NEWSRC (long) 512
#define SET_NEWSRC (long) 513
#define GET_EXTENSION (long) 514
#define SET_EXTENSION (long) 515
#define GET_DISABLEFCNTLLOCK (long) 516
#define SET_DISABLEFCNTLLOCK (long) 517
#define GET_LOCKEACCESERROR (long) 518
#define SET_LOCKEACCESERROR (long) 519
#define GET_LISTMAXLEVEL (long) 520
#define SET_LISTMAXLEVEL (long) 521
#define GET_ANONYMOUSHOME (long) 522
#define SET_ANONYMOUSHOME (long) 523
#define GET_FTPHOME (long) 524
#define SET_FTPHOME (long) 525
#define GET_PUBLICHOME (long) 526
#define SET_PUBLICHOME (long) 527
#define GET_SHAREDHOME (long) 528
#define SET_SHAREDHOME (long) 529
#define GET_MHPROFILE (long) 530
#define SET_MHPROFILE (long) 531
#define GET_MHPATH (long) 532
#define SET_MHPATH (long) 533
/* Driver flags */
#define DR_DISABLE (long) 1 /* driver is disabled */
#define DR_LOCAL (long) 2 /* local file driver */
#define DR_MAIL (long) 4 /* supports mail */
#define DR_NEWS (long) 8 /* supports news */
#define DR_READONLY (long) 16 /* driver only allows readonly access */
#define DR_NOFAST (long) 32 /* "fast" data is slow (whole msg fetch) */
#define DR_NAMESPACE (long) 64 /* driver has a special namespace */
#define DR_LOWMEM (long) 128 /* low amounts of memory available */
/* Cache management function codes */
#define CH_INIT (long) 10 /* initialize cache */
#define CH_SIZE (long) 11 /* (re-)size the cache */
#define CH_MAKEELT (long) 30 /* return elt, make if needed */
#define CH_ELT (long) 31 /* return elt if exists */
#define CH_FREE (long) 40 /* free space used by elt */
#define CH_EXPUNGE (long) 45 /* delete elt pointer from list */
/* Open options */
#define OP_DEBUG (long) 1 /* debug protocol negotiations */
#define OP_READONLY (long) 2 /* read-only open */
#define OP_ANONYMOUS (long) 4 /* anonymous open of newsgroup */
#define OP_SHORTCACHE (long) 8 /* short (elt-only) caching */
#define OP_SILENT (long) 16 /* don't pass up events (internal use) */
#define OP_PROTOTYPE (long) 32 /* return driver prototype */
#define OP_HALFOPEN (long) 64 /* half-open (IMAP connect but no select) */
#define OP_EXPUNGE (long) 128 /* silently expunge recycle stream */
/* Close options */
#define CL_EXPUNGE (long) 1 /* expunge silently */
/* Fetch options */
#define FT_UID (long) 1 /* argument is a UID */
#define FT_PEEK (long) 2 /* peek at data */
#define FT_NOT (long) 4 /* NOT flag for IMAPheader lines fetch */
#define FT_INTERNAL (long) 8 /* text can be internal strings */
#define FT_PREFETCHTEXT (long) 16 /* IMAP prefetch text when fetching IMAPheader */
/* Flagging options */
#define ST_UID (long) 1 /* argument is a UID sequence */
#define ST_SILENT (long) 2 /* don't return results */
#define ST_SET (long) 4 /* set vs. clear */
/* Copy options */
#define CP_UID (long) 1 /* argument is a UID sequence */
#define CP_MOVE (long) 2 /* delete from source after copying */
/* Search/sort options */
#define SE_UID (long) 1 /* return UID */
#define SE_FREE (long) 2 /* free search program after finished */
#define SE_NOPREFETCH (long) 4 /* no search prefetching */
#define SO_FREE (long) 8 /* free sort program after finished */
/* Status options */
#define SA_MESSAGES (long) 1 /* number of messages */
#define SA_RECENT (long) 2 /* number of recent messages */
#define SA_UNSEEN (long) 4 /* number of unseen messages */
#define SA_UIDNEXT (long) 8 /* next UID to be assigned */
#define SA_UIDVALIDITY (long) 16/* UID validity value */
/* Mailgets flags */
#define MG_UID (long) 1 /* message number is a UID */
#define MG_COPY (long) 2 /* must return copy of argument */
/* Garbage collection flags */
#define GC_ELT (long) 1 /* message cache elements */
#define GC_ENV (long) 2 /* envelopes and bodies */
#define GC_TEXTS (long) 4 /* cached texts */
/* Bits for mm_list() and mm_lsub() */
/* defined in imapnetlib.h now -JDB
#define LATT_NOINFERIORS (long) 1
#define LATT_NOSELECT (long) 2
#define LATT_MARKED (long) 4
#define LATT_UNMARKED (long) 8
*/
/* Sort functions */
#define SORTDATE 0 /* date */
#define SORTARRIVAL 1 /* arrival date */
#define SORTFROM 2 /* from */
#define SORTSUBJECT 3 /* subject */
#define SORTTO 4 /* to */
#define SORTCC 5 /* cc */
#define SORTSIZE 6 /* size */
#define NETMAXHOST 65
#define NETMAXUSER 65
#define NETMAXMBX 255
#define NETMAXSRV 21
/* In-memory sized-text */
#ifdef ORIGINAL //Now defined in imapnetlib.h
#define SIZEDTEXT struct mail_text
/* Sized text */
SIZEDTEXT
{
char *data; // text
unsigned long size; // size of text in octets
};
/* String list */
#define STRINGLIST struct string_list
STRINGLIST
{
SIZEDTEXT text; // string text
STRINGLIST *next;
};
#endif //ORIGINAL
/* Sort program */
#define SORTPGM struct sort_program
SORTPGM
{
unsigned int reverse : 1; // sort function is to be reversed
short function; // sort function
SORTPGM *next; // next function
};
#ifdef ORIGINAL //Now defined in imapnetlib.h
/* Item in an address list */
#define ADDRESS struct mail_address
ADDRESS
{
char *personal; // personal name phrase
char *adl; // at-domain-list source route
char *mailbox; // mailbox name
char *host; // domain name of mailbox's host
char *error; // error in address from SMTP module
ADDRESS *next; // pointer to next address in list
};
/* Message envelope */
typedef struct mail_envelope
{
char *remail; // remail IMAPheader if any
ADDRESS *return_path; // error return address
char *date; // message composition date string
ADDRESS *from; // originator address list
ADDRESS *sender; // sender address list
ADDRESS *reply_to; // reply address list
char *subject; // message subject string
ADDRESS *to; // primary recipient list
ADDRESS *cc; // secondary recipient list
ADDRESS *bcc; // blind secondary recipient list
char *in_reply_to; // replied message ID
char *message_id; // message ID
char *newsgroups; // USENET newsgroups
char *followup_to; // USENET reply newsgroups
char *references; // USENET references
} ENVELOPE;
#endif //ORIGINAL
/* Primary body types */
/* If you change any of these you must also change body_types in rfc822.c */
extern char *body_types[]; /* defined body type strings */
#define TYPETEXT 0 /* unformatted text */
#define TYPEMULTIPART 1 /* multiple part */
#define TYPEMESSAGE 2 /* encapsulated message */
#define TYPEAPPLICATION 3 /* application data */
#define TYPEAUDIO 4 /* audio */
#define TYPEIMAGE 5 /* static image */
#define TYPEVIDEO 6 /* video */
#define TYPEMODEL 7 /* model */
#define TYPEOTHER 8 /* unknown */
#define TYPEMAX 15 /* maximum type code */
/* Body encodings */
/* If you change any of these you must also change body_encodings in rfc822.c
*/
extern char *body_encodings[]; /* defined body encoding strings */
#define ENC7BIT 0 /* 7 bit SMTP semantic data */
#define ENC8BIT 1 /* 8 bit SMTP semantic data */
#define ENCBINARY 2 /* 8 bit binary data */
#define ENCBASE64 3 /* base-64 encoded data */
#define ENCQUOTEDPRINTABLE 4 /* human-readable 8-as-7 bit data */
#define ENCOTHER 5 /* unknown */
#define ENCMAX 10 /* maximum encoding code */
/* Body contents */
#define IMAPBODY struct mail_bodystruct
#define MESSAGE struct mail_body_message
#define PARAMETER struct mail_body_parameter
#define PART struct mail_body_part
#define PARTTEXT struct mail_body_text
#ifdef ORIGINAL //Now defined in imapnetlib.h
/* Message body text */
PARTTEXT
{
unsigned long offset; // offset from body origin
SIZEDTEXT text; // text
};
/* Message body structure */
IMAPBODY
{
unsigned short type; // body primary type
unsigned short encoding; // body transfer encoding
char *subtype; // subtype string
PARAMETER *parameter; // parameter list
char *id; // body identifier
char *description; // body description
struct // body disposition
{
char *type; // disposition type
PARAMETER *parameter; // disposition parameters
} disposition;
STRINGLIST *language; // body language
PARTTEXT mime; // MIME IMAPheader
PARTTEXT contents; // body part contents
union // different ways of accessing contents
{
PART *part; // body part list
MESSAGE *msg; // body encapsulated message
} nested;
struct
{
unsigned long lines; // size of text in lines
unsigned long bytes; // size of text in octets
} size;
char *md5; // MD5 checksum
};
/* Parameter list */
PARAMETER
{
char *attribute; // parameter attribute name
char *value; // parameter value
PARAMETER *next; // next parameter in list
};
/* Multipart content list */
PART
{
IMAPBODY body; // body information for this part
PART *next; // next body part
};
/* RFC-822 Message */
MESSAGE
{
ENVELOPE *env; // message envelope
IMAPBODY *body; // message body
PARTTEXT full; // full message
STRINGLIST *lines; // lines used to filter IMAPheader
PARTTEXT IMAPheader; // IMAPheader text
PARTTEXT text; // body text
};
#endif //ORIGINAL
/* Entry in the message cache array */
typedef struct message_cache
{
unsigned long msgno; // message number
unsigned int lockcount : 8; // non-zero if multiple references
unsigned long rfc822_size; // # of bytes of message as raw RFC822
struct // c-client internal use only
{
unsigned long uid; // message unique ID
PARTTEXT special; // special text pointers
MESSAGE msg; // internal message pointers
} privat;
/* internal date */
unsigned int day : 5; // day of month (1-31)
unsigned int month : 4; // month of year (1-12)
unsigned int year : 7; // year since BASEYEAR (expires in 127 yrs)
unsigned int hours: 5; // hours (0-23)
unsigned int minutes: 6; // minutes (0-59)
unsigned int seconds: 6; // seconds (0-59)
unsigned int zoccident : 1; // non-zero if west of UTC
unsigned int zhours : 4; // hours from UTC (0-12)
unsigned int zminutes: 6; // minutes (0-59)
/* system flags */
unsigned int seen : 1; // system Seen flag
unsigned int deleted : 1; // system Deleted flag
unsigned int flagged : 1; // system Flagged flag
unsigned int answered : 1; // system Answered flag
unsigned int draft : 1; // system Draft flag
unsigned int recent : 1; // system Recent flag
/* message status */
unsigned int valid : 1; // elt has valid flags
unsigned int searched : 1; // message was searched
unsigned int sequence : 1; // message is in sequence
/* reserved for use by main program */
unsigned int spare : 1; // first spare bit
unsigned int spare2 : 1; // second spare bit
unsigned int spare3 : 1; // third spare bit
void *sparep; // spare pointer
unsigned long sent:1; // user defined //Sent flag
unsigned long user_flags:31; // user-assignable flags
} MESSAGECACHE;
#ifdef ORIGINAL //Now defined in imapnetlib.h
/* String structure */
#define STRINGDRIVER struct string_driver
typedef struct mailstring
{
void *data; // driver-dependent data
unsigned long data1; // driver-dependent data
unsigned long size; // total length of string
char *chunk; // base address of chunk
unsigned long chunksize; // size of chunk
unsigned long offset; // offset of this chunk in base
char *curpos; // current position in chunk
unsigned long cursize; // number of bytes remaining in chunk
STRINGDRIVER *dtb; // driver that handles this type of string
} STRING;
/* Dispatch table for string driver */
STRINGDRIVER
{
/* initialize string driver */
void (*init) (STRING *s,void *data,unsigned long size);
/* get next character in string */
char (*next) (STRING *s);
/* set position in string */
void (*setpos) (STRING *s,unsigned long i);
};
#endif //ORIGINAL
/* Stringstruct access routines */
#define INIT(s,d,data,size) ((*((s)->dtb = &d)->init) (s,data,size))
#define SIZE(s) ((s)->size - GETPOS (s))
#define CHR(s) (*(s)->curpos)
#define SNX(s) (--(s)->cursize ? *(s)->curpos++ : (*(s)->dtb->next) (s))
#define GETPOS(s) ((s)->offset + ((s)->curpos - (s)->chunk))
#define SETPOS(s,i) (*(s)->dtb->setpos) (s,i)
/* Search program */
#define SEARCHPGM struct search_program
#define SEARCHHEADER struct search_header
#define SEARCHSET struct search_set
#define SEARCHOR struct search_or
#define SEARCHPGMLIST struct search_pgm_list
SEARCHHEADER // IMAPheader search
{
char *line; // IMAPheader line
char *text; // text in IMAPheader
SEARCHHEADER *next; // next in list
};
SEARCHSET // message set
{
unsigned long first; // sequence number
unsigned long last; // last value, if a range
SEARCHSET *next; // next in list
};
SEARCHOR
{
SEARCHPGM *first; // first program
SEARCHPGM *second; // second program
SEARCHOR *next; // next in list
};
SEARCHPGMLIST
{
SEARCHPGM *pgm; // search program
SEARCHPGMLIST *next; // next in list
};
SEARCHPGM // search program
{
SEARCHSET *msgno; // message numbers
SEARCHSET *uid; // unique identifiers
SEARCHOR *or; // or'ed in programs
SEARCHPGMLIST *not; // and'ed not program
SEARCHHEADER *IMAPheader; // list of headers
STRINGLIST *bcc; // bcc recipients
STRINGLIST *body; // text in message body
STRINGLIST *cc; // cc recipients
STRINGLIST *from; // originator
STRINGLIST *keyword; // keywords
STRINGLIST *unkeyword; // unkeywords
STRINGLIST *subject; // text in subject
STRINGLIST *text; // text in headers and body
STRINGLIST *to; // to recipients
unsigned long larger; // larger than this size
unsigned long smaller; // smaller than this size
unsigned short sentbefore; // sent before this date
unsigned short senton; // sent on this date
unsigned short sentsince; // sent since this date
unsigned short before; // before this date
unsigned short on; // on this date
unsigned short since; // since this date
unsigned int answered : 1; // answered messages
unsigned int unanswered : 1;// unanswered messages
unsigned int deleted : 1; // deleted messages
unsigned int undeleted : 1; // undeleted messages
unsigned int draft : 1; // message draf
unsigned int undraft : 1; // message undraft
unsigned int flagged : 1; // flagged messages
unsigned int unflagged : 1; // unflagged messages
unsigned int recent : 1; // recent messages
unsigned int old : 1; // old messages
unsigned int seen : 1; // seen messages
unsigned int unseen : 1; // unseen messages
};
/* Mailbox status */
typedef struct mbx_status
{
long flags; // validity flags
unsigned long messages; // number of messages
unsigned long recent; // number of recent messages
unsigned long unseen; // number of unseen messages
unsigned long uidnext; // next UID to be assigned
unsigned long uidvalidity; // UID validity value
} MAILSTATUS;
/* Mail Access I/O stream */
/* Parse results from mail_valid_net_parse */
typedef struct net_mailbox
{
char host[NETMAXHOST]; // host name
char user[NETMAXUSER]; // user name
char mailbox[NETMAXMBX]; // mailbox name
char service[NETMAXSRV]; // service name
unsigned long port; // TCP port number
unsigned int anoflag : 1; // anonymous
unsigned int dbgflag : 1; // debug flag
} NETMBX;
/* Network access I/O stream */
/* Mailgets data identifier */
typedef struct GETS_DATA
{
MAILSTREAM *stream;
unsigned long msgno;
char *what;
STRINGLIST *stl;
unsigned long first;
unsigned long last;
long flags;
} GETS_DATA;
#define INIT_GETS(md,s,m,w,f,l) \
md.stream = s, md.msgno = m, md.what = w, md.first = f, md.last = l, \
md.stl = NIL, md.flags = NIL;
/* Jacket into external interfaces */
typedef long (*readfn_t) (void *stream,unsigned long size,char *buffer);
typedef char *(*mailgets_t) (readfn_t f,void *stream,unsigned long size,
GETS_DATA *md);
typedef char *(*readprogress_t) (GETS_DATA *md,unsigned long octets);
typedef void *(*mailcache_t) (MAILSTREAM *stream,unsigned long msgno,long op);
typedef long (*tcptimeout_t) (long time);
typedef void *(*authchallenge_t) (void *stream,unsigned long *len);
typedef long (*authrespond_t) (void *stream,char *s,unsigned long size);
typedef long (*authclient_t) (authchallenge_t challenger,
authrespond_t responder,NETMBX *mb,void *s,
unsigned long *trial,char *user);
typedef char *(*authresponse_t) (void *challenge,unsigned long clen,
unsigned long *rlen);
typedef char *(*authserver_t) (authresponse_t responder,int argc,char *argv[]);
typedef void (*smtpverbose_t) (char *buffer);
typedef void (*imapenvelope_t) (MAILSTREAM *stream,unsigned long msgno,
ENVELOPE *env);
#define AUTHENTICATOR struct mail_authenticator
AUTHENTICATOR
{
char *name; // name of this authenticator
authclient_t client; // client function that supports it
authserver_t server; // server function that supports it
AUTHENTICATOR *next; // next authenticator
};
/* Structure for mail driver dispatch */
#define DRIVER struct driver
/* Mail I/O stream handle */
typedef struct mail_stream_handle
{
MAILSTREAM *stream; // pointer to mail stream
unsigned short sequence; // sequence of what we expect stream to be
} MAILHANDLE;
/* Mail I/O stream */
typedef struct mail_stream
{
DRIVER *dtb; // dispatch table for this driver
void *local; // pointer to driver local data
char *mailbox; // mailbox name
unsigned short use; // stream use count
unsigned short sequence; // stream sequence
unsigned int lock : 1; // stream lock flag
unsigned int debug : 1; // stream debug flag
unsigned int silent : 1; // silent stream from Tenex
unsigned int rdonly : 1; // stream read-only flag
unsigned int anonymous : 1; // stream anonymous access flag
unsigned int scache : 1; // stream short cache flAG
unsigned int halfopen : 1; // stream half-open flag
unsigned int perm_seen : 1; // permanent Seen flag
unsigned int perm_deleted : 1; // permanent Deleted flag
unsigned int perm_flagged : 1; // permanent Flagged flag
unsigned int perm_answered :1; // permanent Answered flag
unsigned int perm_draft : 1; // permanent Draft flag
unsigned int kwd_create : 1; // can create new keywords
unsigned long perm_user_flags; // mask of permanent user flags
unsigned long gensym; // generated tag
unsigned long nmsgs; // # of associated msgs
unsigned long recent; // # of recent msgs
unsigned long uid_validity; // UID validity sequence
unsigned long uid_last; // last assigned UID
char *user_flags[NUSERFLAGS]; // pointers to user flags in bit order
unsigned long cachesize; // size of message cache
// NOTE: (JOK) The stream now has a "current elt". Fetch body and fetch envelope
// places stuff into elt.privat.msg.body and elt.privat.msg.env.
MESSAGECACHE *CurrentElt;
// END NOTE JOK.
//This can go away
MESSAGECACHE **cache; // message cache array
unsigned long msgno; // message number of `current' message
ENVELOPE *env; // scratch buffer for envelope
IMAPBODY *body; // scratch buffer for body
SIZEDTEXT IMAPheader; // scratch buffer for IMAPheader text
SIZEDTEXT text; // scratch buffer for text
union
{ // internal use only
struct
{ // search temporaries
char *charset; // character set
STRINGLIST *string; // string(s) to search
long result; // search result
} search;
} private;
// added by JDB
// stream to talk to do the network stuff
TransStream transStream; // Eudora network stream information
short bConnected; // Set to true once we're connected
short bAuthenticated; // Set to true once we're authenticated
short bSelected; // Set to true once we've selected an mbox
unsigned char pHost[NETMAXHOST+1];
unsigned long port;
Boolean errorred; // we already displayed an error
// mailbox list results
MailboxNodeHandle fListResultsHandle; // handle to tree of mailboxes
const char *fRef;
Boolean fIncludeInbox;
Boolean fProgress; // should we display progress as we're fetching mailboxes?
mailgets_t mailgets;
// fetch flags results
UIDNodeHandle fUIDResults;
// network traffic results handle
Handle fNetData; // header/message data read from network
// mailbox resync specific
Boolean chunkHeaders; // set to true to tell imap engine we're fetching minimal headers in chunks
unsigned long headerUID; // the uid of the message we just fetched headers for
Handle delivery; // place to put minimal headers
// used to save messages
short refN; // refNum of open file waiting to accept message
// progress
Boolean showProgress; // set to true to display progress
long totalTransfer; // total # of bytes to transfer
long currentTransfer; // current # of bytes transferred
long lastProgress; // last time some progress was displayed
// mailbox status
MAILSTATUS mailboxStatus; // place to store results of last STATUS command.
// logout options
Boolean fastLogout; // set to true if we don't want to wait for the server to respond to a LOGOUT
#ifdef DEBUG
short flagsRefN; // refNum of file to save flags to.
#endif
// ALERT status responses
Str255 alertStr; // string containing text returned from the IMAP server in an ALERT response.
Accumulator UIDPLUSResponse; // uids returned in a UIDPLUS response
long UIDPLUSuv; // the uidvalidity noted during a series of UIDPLUS responses.
// if this changes before messages are transferred, the responses are discarded.
//End added by JDB
} MAILSTREAM;
// Structure for allowing a callback to read from a string.
typedef struct {
char *s;
unsigned long size;
} ParenStrData;
/* Message overview */
typedef struct mail_overview
{
char *subject; // message subject string
ADDRESS *from; // originator address list
char *date; // message composition date string
char *message_id; // message ID
char *references; // USENET references
struct // may be 0 or NUL if unknown/undefined
{
unsigned long octets; // message octets (probably LF-newline form)
unsigned long lines; // message lines
char *xref; // cross references
} optional;
} OVERVIEW;
typedef void (*overview_t) (MAILSTREAM *stream,unsigned long uid,OVERVIEW *ov);
/* Mail driver dispatch */
DRIVER
{
char *name; // driver name
unsigned long flags; // driver flags
DRIVER *next; // next driver
// mailbox is valid for us
DRIVER *(*valid) (char *mailbox);
// manipulate driver parameters
void *(*parameters) (long function,void *value);
// scan mailboxes
void (*scan) (MAILSTREAM *stream,char *ref,char *pat,char *contents);
// list mailboxes
void (*list) (MAILSTREAM *stream,char *ref,char *pat);
// list subscribed mailboxes
void (*lsub) (MAILSTREAM *stream,char *ref,char *pat);
// subscribe to mailbox
long (*subscribe) (MAILSTREAM *stream,char *mailbox);
// unsubscribe from mailbox
long (*unsubscribe) (MAILSTREAM *stream,char *mailbox);
// create mailbox
long (*create) (MAILSTREAM *stream,char *mailbox);
// delete mailbox
long (*mbxdel) (MAILSTREAM *stream,char *mailbox);
// rename mailbox
long (*mbxren) (MAILSTREAM *stream,char *old,char *newname);
// status of mailbox
long (*status) (MAILSTREAM *stream,char *mbx,long flags);
// open mailbox
MAILSTREAM *(*open) (MAILSTREAM *stream);
// close mailbox
void (*close) (MAILSTREAM *stream,long options);
// fetch message "fast" attributes
Boolean (*fast) (MAILSTREAM *stream,char *sequence,long flags);
// fetch message flags
Boolean (*msgflags) (MAILSTREAM *stream,char *sequence,long flags);
// fetch message overview
Boolean (*overview) (MAILSTREAM *stream,char *sequence,overview_t ofn);
// Added by JOK!!!
ENVELOPE *(*envelope) (MAILSTREAM *stream,unsigned long msgno, long flags);
/* fetch message envelopes */
// Modified by JOK!!!
IMAPBODY *(*structure) (MAILSTREAM *stream,unsigned long msgno, long flags);
// fetch message envelopes
// ENVELOPE *(*structure) (MAILSTREAM *stream,unsigned long msgno,IMAPBODY **body,long flags);
// return RFC-822 IMAPheader
char *(*IMAPheader) (MAILSTREAM *stream,unsigned long msgno, unsigned long *length,long flags);
// return RFC-822 text
long (*text) (MAILSTREAM *stream,unsigned long msgno,STRING *bs,long flags);
// load cache
long (*msgdata) (MAILSTREAM *stream,unsigned long msgno,char *sequence,char *section, unsigned long first,unsigned long last,STRINGLIST *lines, long flags);
// return UID for message
unsigned long (*uid) (MAILSTREAM *stream,unsigned long msgno);
// return message number from UID
unsigned long (*msgno) (MAILSTREAM *stream,unsigned long uid);
// modify flags
Boolean (*flag) (MAILSTREAM *stream,char *sequence,char *flag,long flags);
// per-message modify flags
void (*flagmsg) (MAILSTREAM *stream,MESSAGECACHE *elt);
// search for message based on criteria was void, now Boolean JDB
Boolean (*search) (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,long flags);
// sort messages
unsigned long *(*sort) (MAILSTREAM *stream,char *charset,SEARCHPGM *spg, SORTPGM *pgm,long flags);
// thread messages
void *(*thread) (MAILSTREAM *stream,char *seq,long function,long flag);
// ping mailbox to see if still alive
long (*ping) (MAILSTREAM *stream);
// check for new messages
void (*check) (MAILSTREAM *stream);
// expunge deleted messages
long (*expunge) (MAILSTREAM *stream);
// copy messages to another mailbox
long (*copy) (MAILSTREAM *stream,char *sequence,char *mailbox,long options);
// append string message to mailbox
long (*append) (MAILSTREAM *stream,char *mailbox,char *flags,char *date, STRING *message);
// garbage collect stream
void (*gc) (MAILSTREAM *stream,long gcflags);
// see if the stream is connected.
Boolean (*connected) (MAILSTREAM *stream);
// resturn the rfc822size
unsigned long (*rfc822size) (MAILSTREAM *stream, unsigned long msgno, long flags);
};
/* Other symbols */
extern const char *days[]; /* day name strings */
extern const char *months[]; /* month name strings */
// Stuff that used to be in linkage.h
extern DRIVER imapdriver;
extern DRIVER dummydriver;
extern AUTHENTICATOR auth_log;
/* Function prototypes */
void mm_searched (MAILSTREAM *stream,unsigned long number);
void mm_exists (MAILSTREAM *stream,unsigned long number);
void mm_expunged (MAILSTREAM *stream,unsigned long number);
void mm_flags (MAILSTREAM *stream,unsigned long number);
void mm_elt_flags (MAILSTREAM *stream, MESSAGECACHE *elt); //added by JOK
void mm_notify (MAILSTREAM *stream,char *string,long errflg);
void mm_list (MAILSTREAM *stream,int delimiter,char *name,long attributes);
void mm_lsub (MAILSTREAM *stream,int delimiter,char *name,long attributes);
void mm_status (MAILSTREAM *stream,char *mailbox,MAILSTATUS *status);
void mm_alert (MAILSTREAM *stream, char *string);
void mm_log (char *string,long errflg);
void pmm_log(Str255 pErrorString,long errflg);
void mm_dlog (char *string);
void mm_login (NETMBX *mb,char *user,char *pwd,long trial);
void mm_critical (MAILSTREAM *stream);
void mm_nocritical (MAILSTREAM *stream);
long mm_diskerror (MAILSTREAM *stream,long errcode,long serious);
void mm_fatal (char *string);
void *mm_cache (MAILSTREAM *stream,unsigned long msgno,long op);
extern STRINGDRIVER mail_string;
void mail_string_init (STRING *s,void *data,unsigned long size);
char mail_string_next (STRING *s);
void mail_string_setpos (STRING *s,unsigned long i);
void mail_link (DRIVER *driver);
void *mail_parameters (MAILSTREAM *stream,long function,void *value);
DRIVER *mail_valid (MAILSTREAM *stream,char *mailbox,char *purpose);
DRIVER *mail_valid_net (char *name,DRIVER *drv,char *host,char *mailbox);
long mail_valid_net_parse (char *name,NETMBX *mb);
void mail_scan (MAILSTREAM *stream,char *ref,char *pat,char *contents);
void mail_list (MAILSTREAM *stream,char *ref,char *pat);
//void mail_lsub (MAILSTREAM *stream,char *ref,char *pat);
long mail_subscribe (MAILSTREAM *stream,char *mailbox);
long mail_unsubscribe (MAILSTREAM *stream,char *mailbox);
long mail_create (MAILSTREAM *stream,char *mailbox);
long mail_delete (MAILSTREAM *stream,char *mailbox);
long mail_rename (MAILSTREAM *stream,char *old,char *newname);
long mail_status (MAILSTREAM *stream,char *mbx,long flags);
MAILSTREAM *mail_open (MAILSTREAM *oldstream,char *name,long options);
MAILSTREAM *mail_close_full (MAILSTREAM *stream,long options);
MAILHANDLE *mail_makehandle (MAILSTREAM *stream);
void mail_free_handle (MAILHANDLE **handle);
MAILSTREAM *mail_stream (MAILHANDLE *handle);
Boolean mail_fetch_fast (MAILSTREAM *stream,char *sequence,long flags);
Boolean mail_fetch_flags (MAILSTREAM *stream,char *sequence,long flags);
//Modfified
Boolean mail_fetch_overview (MAILSTREAM *stream,char *sequence,overview_t ofn);
//Added by JOK
unsigned long mail_fetch_rfc822size (MAILSTREAM *stream, unsigned long msgno, long flags);
// JOK - These have been modified.
IMAPBODY *mail_fetch_structure (MAILSTREAM *stream,unsigned long msgno, long flags);
// JOK - THis is new.
ENVELOPE *mail_fetch_envelope (MAILSTREAM *stream,unsigned long msgno, long flags);
// END JOK
long mail_fetch_message (MAILSTREAM *stream,unsigned long msgno, long flags);
long mail_fetch_header (MAILSTREAM *stream, unsigned long msgno, char *sequence, char *section, STRINGLIST *lines, long flags);
long mail_fetch_text (MAILSTREAM *stream, unsigned long msgno, char *section, long flags);
long mail_fetch_mime (MAILSTREAM *stream, unsigned long msgno, char *section, long flags);
long mail_fetch_body (MAILSTREAM *stream, unsigned long msgno, char *section, long flags);
/*
char *mail_fetch_header (MAILSTREAM *stream,unsigned long msgno,char *section,STRINGLIST *lines,unsigned long *len,long flags);
char *mail_fetch_text (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long *len,long flags);
char *mail_fetch_mime (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long *len,long flags);
char *mail_fetch_body (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long *len,long flags);
*/
long mail_partial_text (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long first,unsigned long last,long flags);
long mail_partial_body (MAILSTREAM *stream,unsigned long msgno,char *section,unsigned long first,unsigned long last,long flags);
unsigned long mail_uid (MAILSTREAM *stream,unsigned long msgno);
unsigned long mail_msgno (MAILSTREAM *stream,unsigned long uid);
MESSAGECACHE *mail_elt (MAILSTREAM *stream);
//MESSAGECACHE *mail_elt (MAILSTREAM *stream,unsigned long msgno);
Boolean mail_flag (MAILSTREAM *stream,char *sequence,char *flag,long flags);
Boolean mail_search_full (MAILSTREAM *stream,char *charset,SEARCHPGM *pgm,long flags);
long mail_ping (MAILSTREAM *stream);
void mail_check (MAILSTREAM *stream);
long mail_expunge (MAILSTREAM *stream);
long mail_copy_full (MAILSTREAM *stream,char *sequence,char *mailbox,long options);
long mail_append_full (MAILSTREAM *stream,char *mailbox,char *flags,char *date,STRING *message);
void mail_gc (MAILSTREAM *stream,long gcflags);
void mail_gc_msg (MESSAGE *msg,long gcflags);
#if 0 // JOK - No longer used - replaced by mail_sub_body().
BODY *mail_body (MAILSTREAM *stream,unsigned long msgno,char *section);
#endif // JOK
// Added by JOK
IMAPBODY *mail_sub_body (IMAPBODY *body, char *section);
// END JOK
char *mail_date (char *string,MESSAGECACHE *elt);
char *mail_cdate (char *string,MESSAGECACHE *elt);
long mail_parse_date (MESSAGECACHE *elt,char *string);
void mail_exists (MAILSTREAM *stream,unsigned long nmsgs);
void mail_recent (MAILSTREAM *stream,unsigned long recent);
void mail_expunged (MAILSTREAM *stream,unsigned long msgno);
#ifdef NOT_NEEDED
void mail_lock (MAILSTREAM *stream);
void mail_unlock (MAILSTREAM *stream);
#endif //NOT_NEEDED
void mail_debug (MAILSTREAM *stream);
void mail_nodebug (MAILSTREAM *stream);
long mail_match_lines (STRINGLIST *lines,STRINGLIST *msglines,long flags);
unsigned long mail_filter (char *text,unsigned long len,STRINGLIST *lines,long flags);
long mail_search_msg (MAILSTREAM *stream,unsigned long msgno,char *charset,SEARCHPGM *pgm);
long mail_search_keyword (MAILSTREAM *stream,MESSAGECACHE *elt,STRINGLIST *st);
long mail_search_addr (ADDRESS *adr,char *charset,STRINGLIST *st);
long mail_search_string (char *txt,char *charset,STRINGLIST *st);
char *mail_search_gets (readfn_t f,void *stream,unsigned long size,MAILSTREAM *ms,unsigned long msgno,char *what,long flags);
long mail_search_text (char *txt,long len,char *charset,STRINGLIST *st);
SEARCHPGM *mail_criteria (char *criteria);
int mail_criteria_date (unsigned short *date);
int mail_criteria_string (STRINGLIST **s);
unsigned long *mail_sort (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,SORTPGM *pgm,long flags);
unsigned long *mail_sort_msgs (MAILSTREAM *stream,char *charset,SEARCHPGM *spg,SORTPGM *pgm,long flags);
int mail_sort_compare (const void *a1,const void *a2);
int mail_compare_msg (MAILSTREAM *stream,short function,unsigned long m1,unsigned long m2);
int mail_compare_ulong (unsigned long l1,unsigned long l2);
int mail_compare_cstring (char *s1,char *s2);
int mail_compare_sstring (char *s1,char *s2);
int mail_compare_address (ADDRESS *a1,ADDRESS *a2);
unsigned long mail_longdate (MESSAGECACHE *elt);
char *mail_skip_re (char *s);
char *mail_skip_fwd (char *s);
long mail_sequence (MAILSTREAM *stream,char *sequence);
long mail_uid_sequence (MAILSTREAM *stream,char *sequence);
long mail_parse_flags (MAILSTREAM *stream,char *flag,unsigned long *uf);
MESSAGECACHE *mail_new_cache_elt (void);
//MESSAGECACHE *mail_new_cache_elt (unsigned long msgno);
ENVELOPE *mail_newenvelope (void);
ADDRESS *mail_newaddr (void);
IMAPBODY *mail_newbody (void);
IMAPBODY *mail_initbody (IMAPBODY *body);
PARAMETER *mail_newbody_parameter (void);
PART *mail_newbody_part (void);
MESSAGE *mail_newmsg (void);
STRINGLIST *mail_newstringlist (void);
SEARCHPGM *mail_newsearchpgm (void);
SEARCHHEADER *mail_newsearchheader (char *line);
SEARCHSET *mail_newsearchset (void);
SEARCHOR *mail_newsearchor (void);
SEARCHPGMLIST *mail_newsearchpgmlist (void);
SORTPGM *mail_newsortpgm (void);
void mail_free_body (IMAPBODY **body);
void mail_free_body_data (IMAPBODY *body);
void mail_free_body_parameter (PARAMETER **parameter);
void mail_free_body_part (PART **part);
//void mail_free_cache (MAILSTREAM *stream);
void mail_free_elt (MESSAGECACHE **elt);
void mail_free_envelope (ENVELOPE **env);
void mail_free_address (ADDRESS **address);
void mail_free_stringlist (STRINGLIST **string);
void mail_free_searchpgm (SEARCHPGM **pgm);
void mail_free_searchheader (SEARCHHEADER **hdr);
void mail_free_searchset (SEARCHSET **set);
void mail_free_searchor (SEARCHOR **orl);
void mail_free_searchpgmlist (SEARCHPGMLIST **pgl);
void mail_free_sortpgm (SORTPGM **pgm);
AUTHENTICATOR *mail_lookup_auth (unsigned long i);
unsigned int mail_lookup_auth_name (char *mechanism);
TransStream net_open (MAILSTREAM *stream,char *host,char *service,unsigned long prt);
char *net_getline (TransStream stream);
/* stream must be void* for use as readfn_t */
long net_getbuffer (void *stream,unsigned long size,char *buffer);
long net_soutr (TransStream stream,char *string);
long net_sout (TransStream stream,char *string,unsigned long size);
void net_close (TransStream stream);
char *net_host (TransStream stream);
unsigned long net_port (TransStream stream);
char *net_localhost (TransStream stream);
// not used
#ifdef NOT_USED
long sm_subscribe (char *mailbox);
long sm_unsubscribe (char *mailbox);
char *sm_read (void **sdb);
#endif
//JDB
OSErr mail_new_stream (MAILSTREAM **stream, unsigned char *host, unsigned long *port, const char *user);
void mail_free_stream (MAILSTREAM **stream);
DRIVER *imapmail_valid_net (MAILSTREAM *stream, DRIVER *drv, char *host);
long imapmail_valid_net_parse (MAILSTREAM *stream, NETMBX *mb);
char *MyUpperCase(char *string);
// Callback routine to read from a string.
Boolean str_getbuffer (void *st,unsigned long size,char *buffer);
#endif //MAIL_H