enable future server-side handlers.
$Log$
+Revision 1.368 1999/09/19 21:28:33 ajc
+* Finished off the message architecture stuff with a new class of hooks to
+ enable future server-side handlers.
+
Revision 1.367 1999/09/19 15:57:06 ajc
* migrated cmd_ent3() to CtdlSaveMessage()
Fri Jul 10 1998 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
* Initial CVS import
+
#include "housekeeping.h"
#include "user_ops.h"
#include "logging.h"
-#include "support.h"
#include "msgbase.h"
+#include "support.h"
#include "locate_host.h"
#include "room_ops.h"
#include "file_ops.h"
#endif
#include <limits.h>
#include <ctype.h>
-#include "dynloader.h"
#include "citadel.h"
#include "server.h"
+#include "dynloader.h"
#include "sysdep_decls.h"
+#include "msgbase.h"
#include "tools.h"
#ifndef HAVE_SNPRINTF
struct SessionFunctionHook *SessionHookTable = NULL;
struct UserFunctionHook *UserHookTable = NULL;
struct XmsgFunctionHook *XmsgHookTable = NULL;
+struct MessageFunctionHook *MessageHookTable = NULL;
struct ProtoFunctionHook {
void (*handler) (char *cmdbuf);
}
+void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *),
+ int EventType)
+{
+
+ struct MessageFunctionHook *newfcn;
+
+ newfcn = (struct MessageFunctionHook *)
+ mallok(sizeof(struct MessageFunctionHook));
+ newfcn->next = MessageHookTable;
+ newfcn->h_function_pointer = handler;
+ newfcn->eventtype = EventType;
+ MessageHookTable = newfcn;
+
+ lprintf(5, "Registered a new message function (type %d)\n",
+ EventType);
+}
+
+
void CtdlRegisterXmsgHook(int (*fcn_ptr) (char *, char *, char *), int order)
{
}
}
+int PerformMessageHooks(struct CtdlMessage *msg, int EventType)
+{
+ struct MessageFunctionHook *fcn;
+ int total_retval = 0;
+
+ for (fcn = MessageHookTable; fcn != NULL; fcn = fcn->next) {
+ if (fcn->eventtype == EventType) {
+ total_retval = total_retval +
+ (*fcn->h_function_pointer) (msg);
+ }
+ }
+
+ return total_retval;
+}
+
int PerformXmsgHooks(char *sender, char *recp, char *msg)
{
struct XmsgFunctionHook *fcn;
void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc);
void CtdlRegisterUserHook(void (*fcn_ptr)(char*, long), int EventType);
void CtdlRegisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order);
+void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *), int EventType);
+int PerformMessageHooks(struct CtdlMessage *, int EventType);
char *Dynamic_Module_Init(void);
} while ((field_length > 0) && (field_header != 'M'));
cdb_free(dmsgtext);
+
+ /* Perform "before read" hooks (aborting if any return nonzero) */
+ if (PerformMessageHooks(ret, EVT_BEFOREREAD) > 0) {
+ CtdlFreeMessage(ret);
+ return NULL;
+ }
+
return (ret);
}
}
}
+ /* Perform "before save" hooks (aborting if any return nonzero) */
+ if (PerformMessageHooks(msg, EVT_BEFORESAVE) > 0) return;
+
/* Network mail - send a copy to the network program. */
if ((strlen(recipient) > 0) && (mailtype != MES_LOCAL)) {
sprintf(aaa, "./network/spoolin/netmail.%04lx.%04x.%04x",
smi.smi_refcount = successful_local_recipients;
safestrncpy(smi.smi_content_type, content_type, 64);
PutSuppMsgInfo(&smi);
+
+ /* Perform "after save" hooks */
+ PerformMessageHooks(msg, EVT_AFTERSAVE);
}
extern struct CitContext *ContextList;
+
+
char *Dynamic_Module_Init(void)
{
CtdlRegisterProtoHook(cmd_chat, "CHAT", "Begin real-time chat");
*/
#define DEBUG_MEMORY_LEAKS
+struct CtdlMessage;
/*
* Generic per-session variable or data structure storage
#define EVT_OUTPUTMSG 101 /* Outputting a message */
+/*
+ * MessageFunctionHook extensions are used for hooks which implement handlers
+ * for various types of message operations (save, read, etc.)
+ */
+struct MessageFunctionHook {
+ struct MessageFunctionHook *next;
+ int (*h_function_pointer) (struct CtdlMessage *msg);
+ int eventtype;
+};
+extern struct MessageFunctionHook *MessageHookTable;
+
+#define EVT_BEFOREREAD 200
+#define EVT_BEFORESAVE 201
+#define EVT_AFTERSAVE 202
/*