X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=citadel%2Fmsgbase.h;h=308c3aa335b8b4949b86b66343afcdecfa613d7c;hp=88c58ecaccf319ab46d7876400d27e8d07fb97fd;hb=5ac2920028e92a453c686c799327d7a66b3e7b49;hpb=8eac29db12e027867644fcac287a6b4c34e067c7 diff --git a/citadel/msgbase.h b/citadel/msgbase.h index 88c58ecac..308c3aa33 100644 --- a/citadel/msgbase.h +++ b/citadel/msgbase.h @@ -1,6 +1,6 @@ -/* $Id$ */ -#define aide_message(text) quickie_message("Citadel",NULL,AIDEROOM,text,0,NULL) +#ifndef MSGBASE_H +#define MSGBASE_H enum { MSGS_ALL, @@ -10,7 +10,16 @@ enum { MSGS_LAST, MSGS_GT, MSGS_EQ, - MSGS_SEARCH + MSGS_SEARCH, + MSGS_LT +}; + +enum { + MSG_HDRS_BRIEF = 0, + MSG_HDRS_ALL = 1, + MSG_HDRS_EUID = 4, + MSG_HDRS_BRIEFFILTER = 8, + MSG_HDRS_THREADS = 9 }; /* @@ -20,7 +29,8 @@ enum { om_ok, om_not_logged_in, om_no_such_msg, - om_mime_error + om_mime_error, + om_access_denied }; /* @@ -38,7 +48,9 @@ struct ma_info { * digging through a subsection */ int did_print; /* One alternative has been displayed */ char chosen_part[128]; /* Which part of a m/a did we choose? */ + int chosen_pref; /* Chosen part preference level (lower is better) */ int use_fo_hooks; /* Use fixed output hooks */ + int dont_decode; /* should we call the decoder or not? */ }; @@ -48,21 +60,6 @@ struct repl { /* Info for replication checking */ }; -/* Data structure returned by validate_recipients() */ -struct recptypes { - int num_local; - int num_internet; - int num_ignet; - int num_room; - int num_error; - char errormsg[SIZ]; - char recp_local[SIZ]; - char recp_internet[SIZ]; - char recp_ignet[SIZ]; - char recp_room[SIZ]; - char display_recp[SIZ]; -}; - /* * This is a list of "harvested" email addresses that we might want to * stick into someone's address book. But we defer this operaiton so @@ -76,69 +73,103 @@ struct addresses_to_be_filed { extern struct addresses_to_be_filed *atbf; -int alias (char *name); -void get_mm (void); -void cmd_msgs (char *cmdbuf); -void cmd_isme (char *cmdbuf); -void help_subst (char *strbuf, char *source, char *dest); -void do_help_subst (char *buffer); -void memfmout (char *mptr, char subst, char *nl); +int GetFieldFromMnemonic(eMsgField *f, const char* c); +void memfmout (char *mptr, const char *nl); void output_mime_parts(char *); -void cmd_msg0 (char *cmdbuf); -void cmd_msg2 (char *cmdbuf); -void cmd_msg3 (char *cmdbuf); -void cmd_msg4 (char *cmdbuf); -void cmd_msgp (char *cmdbuf); -void cmd_opna (char *cmdbuf); long send_message (struct CtdlMessage *); void loadtroom (void); -long CtdlSubmitMsg(struct CtdlMessage *, struct recptypes *, char *); -void quickie_message (char *, char *, char *, char *, int, char *); -void cmd_ent0 (char *entargs); -void cmd_dele (char *delstr); -void cmd_move (char *args); +long CtdlSubmitMsg(struct CtdlMessage *, recptypes *, const char *, int); +long quickie_message(const char *from, const char *fromaddr, const char *to, char *room, const char *text, int format_type, const char *subject); void GetMetaData(struct MetaData *, long); void PutMetaData(struct MetaData *); void AdjRefCount(long, int); +void TDAP_AdjRefCount(long, int); +int TDAP_ProcessAdjRefCountQueue(void); void simple_listing(long, void *); int CtdlMsgCmp(struct CtdlMessage *msg, struct CtdlMessage *template); +typedef void (*ForEachMsgCallback)(long MsgNumber, void *UserData); int CtdlForEachMessage(int mode, long ref, char *searchstring, char *content_type, struct CtdlMessage *compare, - void (*CallBack) (long, void *), + ForEachMsgCallback CallBack, void *userdata); -int CtdlDeleteMessages(char *, long *, int, char *, int); -void CtdlWriteObject(char *, char *, char *, struct ctdluser *, - int, int, unsigned int); -struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body); -void CtdlFreeMessage(struct CtdlMessage *msg); -void serialize_message(struct ser_ret *, struct CtdlMessage *); -int is_valid_message(struct CtdlMessage *); +int CtdlDeleteMessages(const char *, long *, int, char *); +void CtdlWriteObject(char *req_room, /* Room to stuff it in */ + char *content_type, /* MIME type of this object */ + char *raw_message, /* Data to be written */ + off_t raw_length, /* Size of raw_message */ + struct ctdluser *is_mailbox, /* Mailbox room? */ + int is_binary, /* Is encoding necessary? */ + int is_unique, /* Del others of this type? */ + unsigned int flags /* Internal save flags */ +); +struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body, int run_msg_hooks); +struct CtdlMessage * CM_Duplicate + (struct CtdlMessage *OrgMsg); +int CM_IsEmpty (struct CtdlMessage *Msg, eMsgField which); +void CM_SetField (struct CtdlMessage *Msg, eMsgField which, const char *buf, long length); +void CM_SetFieldLONG (struct CtdlMessage *Msg, eMsgField which, long lvalue); +void CM_CopyField (struct CtdlMessage *Msg, eMsgField WhichToPutTo, eMsgField WhichtToCopy); +void CM_CutFieldAt (struct CtdlMessage *Msg, eMsgField WhichToCut, long maxlen); +void CM_FlushField (struct CtdlMessage *Msg, eMsgField which); +void CM_Flush (struct CtdlMessage *Msg); +void CM_SetAsField (struct CtdlMessage *Msg, eMsgField which, char **buf, long length); +void CM_SetAsFieldSB (struct CtdlMessage *Msg, eMsgField which, StrBuf **buf); +void CM_GetAsField (struct CtdlMessage *Msg, eMsgField which, char **ret, long *retlen); +void CM_PrependToField (struct CtdlMessage *Msg, eMsgField which, const char *buf, long length); + +void CM_Free (struct CtdlMessage *msg); +void CM_FreeContents (struct CtdlMessage *msg); +int CM_IsValidMsg (struct CtdlMessage *msg); + +#define CM_KEY(Message, Which) Message->cm_fields[Which], Message->cm_lengths[Which] +#define CM_RANGE(Message, Which) Message->cm_fields[Which], \ + Message->cm_fields[Which] + Message->cm_lengths[Which] + +void CtdlSerializeMessage(struct ser_ret *, struct CtdlMessage *); +struct CtdlMessage *CtdlDeserializeMessage(long msgnum, int with_body, const char *Buffer, long Length); void ReplicationChecks(struct CtdlMessage *); int CtdlSaveMsgPointersInRoom(char *roomname, long newmsgidlist[], int num_newmsgs, - int do_repl_check, struct CtdlMessage *supplied_msg); + int do_repl_check, struct CtdlMessage *supplied_msg, int suppress_refcount_adj +); int CtdlSaveMsgPointerInRoom(char *roomname, long msgid, int do_repl_check, struct CtdlMessage *msg); -char *CtdlReadMessageBody(char *terminator, size_t maxlen, char *exist, int crlf); -char *CtdlGetSysConfig(char *sysconfname); -void CtdlPutSysConfig(char *sysconfname, char *sysconfdata); +long CtdlSaveThisMessage(struct CtdlMessage *msg, long msgid, int Reply); +char *CtdlReadMessageBody(char *terminator, long tlen, size_t maxlen, StrBuf *exist, int crlf); +StrBuf *CtdlReadMessageBodyBuf( + char *terminator, /* token signalling EOT */ + long tlen, + size_t maxlen, /* maximum message length */ + StrBuf *exist, /* if non-null, append to it; exist is ALWAYS freed */ + int crlf /* CRLF newlines instead of LF */ +); + int CtdlOutputMsg(long msg_num, /* message number (local) to fetch */ int mode, /* how would you like that message? */ int headers_only, /* eschew the message body? */ int do_proto, /* do Citadel protocol responses? */ int crlf, /* 0=LF, 1=CRLF */ - char *section /* output a message/rfc822 section */ + char *section, /* output a message/rfc822 section */ + int flags, /* should the bessage be exported clean? */ + char **Author, /* if you want to know the author of the message... */ + char **Address, /* if you want to know the sender address of the message... */ + char **MessageID /* if you want to know the Message-ID of the message... */ ); + +/* Flags which may be passed to CtdlOutputMsg() and CtdlOutputPreLoadedMsg() */ +#define QP_EADDR (1<<0) /* quoted-printable encode email addresses */ +#define CRLF (1<<1) +#define ESC_DOT (1<<2) /* output a line containing only "." as ".." instead */ +#define SUPPRESS_ENV_TO (1<<3) /* suppress Envelope-to: header (warning: destructive!) */ + int CtdlOutputPreLoadedMsg(struct CtdlMessage *, - int mode, /* how would you like that message? */ - int headers_only, /* eschew the message body? */ - int do_proto, /* do Citadel protocol responses? */ - int crlf /* 0=LF, 1=CRLF */ + int mode, /* how would you like that message? */ + int headers_only, /* eschew the message body? */ + int do_proto, /* do Citadel protocol responses? */ + int crlf, /* 0=LF, 1=CRLF */ + int flags /* should the bessage be exported clean? */ ); -int CtdlCopyMsgsToRoom(long *msgnum, int num_msgs, char *dest); -int CtdlDoIHavePermissionToDeleteMessagesFromThisRoom(void); -int CtdlDoIHavePermissionToPostInThisRoom(char *errmsgbuf, size_t n); /* values for which_set */ @@ -146,12 +177,15 @@ enum { ctdlsetseen_seen, ctdlsetseen_answered }; + void CtdlSetSeen(long *target_msgnums, int num_target_msgnums, - int target_setting, int which_set, - struct ctdluser *which_user, struct ctdlroom *which_room); + int target_setting, int which_set, + struct ctdluser *which_user, struct ctdlroom *which_room +); + void CtdlGetSeen(char *buf, int which_set); -struct recptypes *validate_recipients(char *recipients); + struct CtdlMessage *CtdlMakeMessage( struct ctdluser *author, /* author's user structure */ char *recipient, /* NULL if it's not mail */ @@ -160,9 +194,37 @@ struct CtdlMessage *CtdlMakeMessage( int type, /* see MES_ types in header file */ int format_type, /* variformat, plain text, MIME... */ char *fake_name, /* who we're masquerading as */ + char *my_email, /* which of my email addresses to use (empty is ok) */ char *subject, /* Subject (optional) */ char *supplied_euid, /* ...or NULL if this is irrelevant */ - char *preformatted_text /* ...or NULL to read text from client */ + char *preformatted_text, /* ...or NULL to read text from client */ + char *references /* Thread references */ ); -int CtdlCheckInternetMailPermission(struct ctdluser *who); -int CtdlIsMe(char *addr, int addr_buf_len); + +struct CtdlMessage *CtdlMakeMessageLen( + struct ctdluser *author, /* author's user structure */ + char *recipient, /* NULL if it's not mail */ + long rcplen, + char *recp_cc, /* NULL if it's not mail */ + long cclen, + char *room, /* room where it's going */ + long roomlen, + int type, /* see MES_ types in header file */ + int format_type, /* variformat, plain text, MIME... */ + char *fake_name, /* who we're masquerading as */ + long fnlen, + char *my_email, /* which of my email addresses to use (empty is ok) */ + long myelen, + char *subject, /* Subject (optional) */ + long subjlen, + char *supplied_euid, /* ...or NULL if this is irrelevant */ + long euidlen, + char *preformatted_text, /* ...or NULL to read text from client */ + long textlen, + char *references, /* Thread references */ + long reflen +); + +void AdjRefCountList(long *msgnum, long nmsg, int incr); + +#endif /* MSGBASE_H */