X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserv_extensions.c;h=3cbc5b9069d01469a50ace56f7f30ae87b90f35e;hb=13f214043d3697db7a3ca1c751cee41fd2fcf695;hp=78d721704eba60274550f2f73d60415db67ea2f8;hpb=7b446ded2584f08fe51fe9327a3769acc6937c85;p=citadel.git diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index 78d721704..3cbc5b906 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -41,6 +41,7 @@ struct ServiceFunctionHook *ServiceHookTable = NULL; struct FixedOutputHook *FixedOutputTable = NULL; struct RoomFunctionHook *RoomHookTable = NULL; struct MaintenanceThreadHook *MaintenanceThreadHookTable = NULL; +struct SearchFunctionHook *SearchFunctionHookTable = NULL; struct ProtoFunctionHook { void (*handler) (char *cmdbuf); @@ -891,6 +892,54 @@ void CtdlDestroyServiceHook(void) ServiceHookTable = NULL; } +void CtdlRegisterSearchFuncHook(void (*fcn_ptr)(int *, long **, char *), char *name) +{ + struct SearchFunctionHook *newfcn; + + if (!name || !fcn_ptr) { + return; + } + + newfcn = (struct SearchFunctionHook *) + malloc(sizeof(struct SearchFunctionHook)); + newfcn->next = SearchFunctionHookTable; + newfcn->name = name; + newfcn->fcn_ptr = fcn_ptr; + SearchFunctionHookTable = newfcn; + + lprintf(CTDL_INFO, "Registered a new search function (%s)\n", name); +} + +void CtdlUnregisterSearchFuncHook(void (*fcn_ptr)(int *, long **, char *), char *name) +{ + struct SearchFunctionHook *cur, *p; + + for (cur = SearchFunctionHookTable; cur != NULL; cur = cur->next) { + while (fcn_ptr && (cur->fcn_ptr == fcn_ptr) && name && !strcmp(name, cur->name)) { + lprintf(CTDL_INFO, "Unregistered search function(%s)\n", name); + p = cur->next; + if (cur == SearchFunctionHookTable) { + SearchFunctionHookTable = p; + } + free (cur); + cur = p; + } + } +} + +void CtdlModuleDoSearch(int *num_msgs, long **search_msgs, char *search_string, char *func_name) +{ + struct SearchFunctionHook *fcn = NULL; + + for (fcn = SearchFunctionHookTable; fcn != NULL; fcn = fcn->next) { + if (!func_name || !strcmp(func_name, fcn->name)) { + (*fcn->fcn_ptr) (num_msgs, search_msgs, search_string); + return; + } + } + *num_msgs = 0; +} + void PerformSessionHooks(int EventType) {