mirror of
https://github.com/anope/anope.git
synced 2026-07-07 11:23:13 +02:00
Add module.cpp and modulemanager.cpp.
- module.cpp: contains (new/"good") code relating to modules. Crappy/stuff to be replaced will stay in modules.c - modulemanager.cpp: contains stuff *manipulating* modules. git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@1611 5417fbe8-f217-4b02-8779-1006273d7864
This commit is contained in:
@@ -132,6 +132,15 @@ struct ModuleLang_ {
|
||||
char **argv;
|
||||
};
|
||||
|
||||
/** Used to manage modules.
|
||||
*/
|
||||
CoreExport class ModuleManager
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
/** Every module in Anope is actually a class.
|
||||
*/
|
||||
CoreExport class Module
|
||||
{
|
||||
public:
|
||||
|
||||
+4
-2
@@ -1,11 +1,11 @@
|
||||
OBJS = actions.o base64.o bots.o botserv.o channels.o chanserv.o commands.o compat.o \
|
||||
config.o datafiles.o encrypt.o events.o hashcomp.o helpserv.o hostserv.o init.o ircd.o language.o log.o mail.o main.o \
|
||||
memory.o memoserv.o messages.o misc.o modules.o news.o nickserv.o operserv.o \
|
||||
process.o send.o servers.o sessions.o slist.o sockutil.o timeout.o users.o
|
||||
process.o send.o servers.o sessions.o slist.o sockutil.o timeout.o users.o module.o modulemanager.o
|
||||
SRCS = actions.c base64.c bots.cpp botserv.c channels.c chanserv.c commands.c compat.c \
|
||||
config.c datafiles.c encrypt.c events.c hashcomp.cpp helpserv.c hostserv.c init.c ircd.c language.c log.c mail.c main.c \
|
||||
memory.c memoserv.c messages.c misc.c modules.c news.c nickserv.c operserv.c \
|
||||
process.c send.c servers.c sessions.c s sockutil.c timeout.c users.c
|
||||
process.c send.c servers.c sessions.c s sockutil.c timeout.c users.c module.cpp modulemanager.cpp
|
||||
|
||||
INCLUDES = ../include/commands.h ../include/defs.h ../include/language.h \
|
||||
../include/pseudo.h ../include/sysconf.h ../include/config.h \
|
||||
@@ -59,6 +59,8 @@ memory.o: memory.c $(INCLUDES)
|
||||
memoserv.o: memoserv.c $(INCLUDES)
|
||||
messages.o: messages.c $(INCLUDES)
|
||||
modules.o: modules.c $(INCLUDES)
|
||||
module.o: module.cpp $(INCLUDES)
|
||||
modulemanager.o: modulemanager.cpp $(INCLUDES)
|
||||
misc.o: misc.c $(INCLUDES)
|
||||
news.o: news.c $(INCLUDES)
|
||||
nickserv.o: nickserv.c $(INCLUDES)
|
||||
|
||||
+4
-2
@@ -22,13 +22,13 @@ OBJS = actions.obj base64.obj bots.obj botserv.obj channels.obj chanserv.obj co
|
||||
init.obj ircd.obj language.obj list.obj log.obj mail.obj main.obj memory.obj \
|
||||
memoserv.obj messages.obj misc.obj modules.obj mod_version.obj news.obj nickserv.obj operserv.obj \
|
||||
process.obj send.obj servers.obj sessions.obj slist.obj sockutil.obj \
|
||||
timeout.obj users.obj
|
||||
timeout.obj users.obj module.obj modulemanager.obj
|
||||
|
||||
SRCS = actions.c base64.c botserv.c bots.cpp channels.c chanserv.c commands.c compat.c \
|
||||
config.c datafiles.c encrypt.c events.c helpserv.c hostserv.c init.c ircd.c \
|
||||
language.c list.c log.c mail.c main.c memory.c memoserv.c messages.c misc.c \
|
||||
modules.c mod_version.c news.c nickserv.c operserv.c process.c send.c servers.obj sessions.c \
|
||||
slist.c sockutil.c timeout.c users.c
|
||||
slist.c sockutil.c timeout.c users.c module.cpp modulemanager.cpp
|
||||
|
||||
###########################################################################
|
||||
|
||||
@@ -86,6 +86,8 @@ memory.obj: memory.c ..\include\services.h
|
||||
memoserv.obj: memoserv.c ..\include\services.h ..\include\pseudo.h
|
||||
messages.obj: messages.c ..\include\services.h ..\include\messages.h ..\include\language.h
|
||||
modules.obj: modules.c ..\include\modules.h ..\include\language.h ..\include\version.h
|
||||
module.obj: module.cpp ..\include\modules.h ..\include\language.h ..\include\version.h
|
||||
modulemanager.obj: modulemanager.cpp ..\include\modules.h ..\include\language.h ..\include\version.h
|
||||
mod_version.obj: mod_version.c ..\include\modules.h ..\include\version.h
|
||||
misc.obj: misc.c ..\include\services.h ..\include\language.h
|
||||
news.obj: news.c ..\include\services.h ..\include\pseudo.h
|
||||
|
||||
+182
@@ -0,0 +1,182 @@
|
||||
/* Modular support
|
||||
*
|
||||
* (C) 2008 Anope Team
|
||||
* Contact us at info@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
#include "modules.h"
|
||||
#include "language.h"
|
||||
#include "version.h"
|
||||
|
||||
#if !defined(_WIN32)
|
||||
#include <dlfcn.h>
|
||||
#else
|
||||
const char *ano_moderr(void);
|
||||
#endif
|
||||
|
||||
Module::Module(const std::string &mname, const std::string &creator)
|
||||
{
|
||||
this->name = mname; /* Our name */
|
||||
this->filename = NULL;
|
||||
this->nickHelp = NULL;
|
||||
this->chanHelp = NULL;
|
||||
this->memoHelp = NULL;
|
||||
this->botHelp = NULL;
|
||||
this->operHelp = NULL;
|
||||
this->hostHelp = NULL;
|
||||
this->helpHelp = NULL;
|
||||
this->type = THIRD;
|
||||
this->handle = NULL;
|
||||
|
||||
for (int i = 0; i < NUM_LANGS; i++)
|
||||
{
|
||||
this->lang[i].argc = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Module::~Module()
|
||||
{
|
||||
int i = 0;
|
||||
mod_current_module = this;
|
||||
|
||||
for (i = 0; i < NUM_LANGS; i++)
|
||||
moduleDeleteLanguage(i);
|
||||
|
||||
if (this->filename)
|
||||
{
|
||||
remove(this->filename);
|
||||
free(this->filename);
|
||||
}
|
||||
|
||||
if (this->handle)
|
||||
{
|
||||
if ((ano_modclose(this->handle)) != 0)
|
||||
alog("%s", ano_moderr());
|
||||
}
|
||||
|
||||
int idx;
|
||||
CommandHash *current = NULL;
|
||||
MessageHash *mcurrent = NULL;
|
||||
EvtMessageHash *ecurrent = NULL;
|
||||
EvtHookHash *ehcurrent = NULL;
|
||||
|
||||
Command *c;
|
||||
Message *msg;
|
||||
EvtMessage *eMsg;
|
||||
EvtHook *eHook;
|
||||
int status = 0;
|
||||
|
||||
/* Kill any active callbacks this module has */
|
||||
moduleCallBackPrepForUnload(this->name.c_str());
|
||||
|
||||
/* Remove any stored data this module has */
|
||||
moduleDelAllDataMod(this);
|
||||
|
||||
/**
|
||||
* ok, im going to walk every hash looking for commands we own, now, not exactly elegant or efficiant :)
|
||||
**/
|
||||
for (idx = 0; idx < MAX_CMD_HASH; idx++) {
|
||||
for (current = HS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(HOSTSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = BS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(BOTSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = MS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(MEMOSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = NS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(NICKSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = CS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(CHANSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = HE_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(HELPSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = OS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (stricmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(OPERSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (mcurrent = IRCD[idx]; mcurrent; mcurrent = mcurrent->next) {
|
||||
for (msg = mcurrent->m; msg; msg = msg->next) {
|
||||
if ((msg->mod_name)
|
||||
&& (stricmp(msg->mod_name, this->name.c_str()) == 0)) {
|
||||
moduleDelMessage(msg->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (ecurrent = EVENT[idx]; ecurrent; ecurrent = ecurrent->next) {
|
||||
for (eMsg = ecurrent->evm; eMsg; eMsg = eMsg->next) {
|
||||
if ((eMsg->mod_name)
|
||||
&& (stricmp(eMsg->mod_name, this->name.c_str()) == 0)) {
|
||||
status = delEventHandler(EVENT, eMsg, this->name.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
for (ehcurrent = EVENTHOOKS[idx]; ehcurrent;
|
||||
ehcurrent = ehcurrent->next) {
|
||||
for (eHook = ehcurrent->evh; eHook; eHook = eHook->next) {
|
||||
if ((eHook->mod_name)
|
||||
&& (stricmp(eHook->mod_name, this->name.c_str()) == 0)) {
|
||||
status = delEventHook(EVENTHOOKS, eHook, this->name.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void Module::SetType(MODType ntype)
|
||||
{
|
||||
this->type = ntype;
|
||||
}
|
||||
|
||||
void Module::SetVersion(const std::string &nversion)
|
||||
{
|
||||
this->version = nversion;
|
||||
}
|
||||
|
||||
void Module::SetAuthor(const std::string &nauthor)
|
||||
{
|
||||
this->author = nauthor;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
/* Modular support
|
||||
*
|
||||
* (C) 2008 Anope Team
|
||||
* Contact us at info@anope.org
|
||||
*
|
||||
* Please read COPYING and README for further details.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
#include "modules.h"
|
||||
#include "language.h"
|
||||
#include "version.h"
|
||||
-166
@@ -1,4 +1,3 @@
|
||||
|
||||
/* Modular support
|
||||
*
|
||||
* (C) 2003-2008 Anope Team
|
||||
@@ -277,169 +276,6 @@ void modules_unload_all(bool fini, bool unload_proto)
|
||||
}
|
||||
}
|
||||
|
||||
Module::Module(const std::string &mname, const std::string &creator)
|
||||
{
|
||||
this->name = mname; /* Our name */
|
||||
this->filename = NULL;
|
||||
this->nickHelp = NULL;
|
||||
this->chanHelp = NULL;
|
||||
this->memoHelp = NULL;
|
||||
this->botHelp = NULL;
|
||||
this->operHelp = NULL;
|
||||
this->hostHelp = NULL;
|
||||
this->helpHelp = NULL;
|
||||
this->type = THIRD;
|
||||
this->handle = NULL;
|
||||
|
||||
for (int i = 0; i < NUM_LANGS; i++)
|
||||
{
|
||||
this->lang[i].argc = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Module::~Module()
|
||||
{
|
||||
int i = 0;
|
||||
mod_current_module = this;
|
||||
|
||||
for (i = 0; i < NUM_LANGS; i++)
|
||||
moduleDeleteLanguage(i);
|
||||
|
||||
if (this->filename)
|
||||
{
|
||||
remove(this->filename);
|
||||
free(this->filename);
|
||||
}
|
||||
|
||||
if (this->handle)
|
||||
{
|
||||
if ((ano_modclose(this->handle)) != 0)
|
||||
alog("%s", ano_moderr());
|
||||
}
|
||||
|
||||
int idx;
|
||||
CommandHash *current = NULL;
|
||||
MessageHash *mcurrent = NULL;
|
||||
EvtMessageHash *ecurrent = NULL;
|
||||
EvtHookHash *ehcurrent = NULL;
|
||||
|
||||
Command *c;
|
||||
Message *msg;
|
||||
EvtMessage *eMsg;
|
||||
EvtHook *eHook;
|
||||
int status = 0;
|
||||
|
||||
/* Kill any active callbacks this module has */
|
||||
moduleCallBackPrepForUnload(this->name.c_str());
|
||||
|
||||
/* Remove any stored data this module has */
|
||||
moduleDelAllDataMod(this);
|
||||
|
||||
/**
|
||||
* ok, im going to walk every hash looking for commands we own, now, not exactly elegant or efficiant :)
|
||||
**/
|
||||
for (idx = 0; idx < MAX_CMD_HASH; idx++) {
|
||||
for (current = HS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(HOSTSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = BS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(BOTSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = MS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(MEMOSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = NS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(NICKSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = CS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(CHANSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = HE_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (strcmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(HELPSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (current = OS_cmdTable[idx]; current; current = current->next) {
|
||||
for (c = current->c; c; c = c->next) {
|
||||
if ((c->mod_name) && (stricmp(c->mod_name, this->name.c_str()) == 0)) {
|
||||
this->DelCommand(OPERSERV, c->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (mcurrent = IRCD[idx]; mcurrent; mcurrent = mcurrent->next) {
|
||||
for (msg = mcurrent->m; msg; msg = msg->next) {
|
||||
if ((msg->mod_name)
|
||||
&& (stricmp(msg->mod_name, this->name.c_str()) == 0)) {
|
||||
moduleDelMessage(msg->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (ecurrent = EVENT[idx]; ecurrent; ecurrent = ecurrent->next) {
|
||||
for (eMsg = ecurrent->evm; eMsg; eMsg = eMsg->next) {
|
||||
if ((eMsg->mod_name)
|
||||
&& (stricmp(eMsg->mod_name, this->name.c_str()) == 0)) {
|
||||
status = delEventHandler(EVENT, eMsg, this->name.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
for (ehcurrent = EVENTHOOKS[idx]; ehcurrent;
|
||||
ehcurrent = ehcurrent->next) {
|
||||
for (eHook = ehcurrent->evh; eHook; eHook = eHook->next) {
|
||||
if ((eHook->mod_name)
|
||||
&& (stricmp(eHook->mod_name, this->name.c_str()) == 0)) {
|
||||
status = delEventHook(EVENTHOOKS, eHook, this->name.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void Module::SetType(MODType type)
|
||||
{
|
||||
this->type = type;
|
||||
}
|
||||
|
||||
void Module::SetVersion(const std::string &version)
|
||||
{
|
||||
this->version = version;
|
||||
}
|
||||
|
||||
void Module::SetAuthor(const std::string &author)
|
||||
{
|
||||
this->author = author;
|
||||
}
|
||||
|
||||
void Module::InsertLanguage(int langNumber, int ac, const char **av)
|
||||
{
|
||||
int i;
|
||||
@@ -459,8 +295,6 @@ void Module::InsertLanguage(int langNumber, int ac, const char **av)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Add the module to the list of currently loaded modules.
|
||||
* @param m the currently loaded module
|
||||
|
||||
Reference in New Issue
Block a user