1
0
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:
Robin Burchell w00t@inspircd.org
2008-11-09 03:03:12 +00:00
parent b7d84f0b68
commit d353167118
6 changed files with 212 additions and 170 deletions
+9
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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;
}
+13
View File
@@ -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
View File
@@ -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