summaryrefslogtreecommitdiff
path: root/src/module.cpp
diff options
context:
space:
mode:
authorRobin Burchell w00t@inspircd.org <Robin Burchell w00t@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>2008-11-09 03:03:12 +0000
committerRobin Burchell w00t@inspircd.org <Robin Burchell w00t@inspircd.org@5417fbe8-f217-4b02-8779-1006273d7864>2008-11-09 03:03:12 +0000
commitd35316711894c64f781d923a88243da5757cc2ab (patch)
tree7f1d8545a6806c798fcd41c16878b6319ed61fc0 /src/module.cpp
parentb7d84f0b68ec15e80d2b69e63306e85443e24648 (diff)
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
Diffstat (limited to 'src/module.cpp')
-rw-r--r--src/module.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/src/module.cpp b/src/module.cpp
new file mode 100644
index 000000000..422d1a643
--- /dev/null
+++ b/src/module.cpp
@@ -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;
+}