// These declarations define the behavours of the base class Module (which does nothing at all)
-Module::Module() { }
+Module::Module() : refcount(1) { }
CullResult Module::cull()
{
return classbase::cull();
}
-Module::~Module() { }
+Module::~Module()
+{
+ if (refcount != 1)
+ ServerInstance->Logs->Log("MODULE", DEFAULT, "References remain to destructed module " + ModuleSourceFile);
+}
ModResult Module::OnSendSnotice(char &snomask, std::string &type, const std::string &message) { return MOD_RES_PASSTHRU; }
void Module::OnUserConnect(User*) { }
{
std::map<std::string, Module*>::iterator modfind = Modules.find(mod->ModuleSourceFile);
- std::vector<ExtensionItem*> items;
+ std::vector<reference<ExtensionItem> > items;
ServerInstance->Extensions.BeginUnregister(modfind->second, items);
/* Give the module a chance to tidy out all its metadata */
for (chan_hash::iterator c = ServerInstance->chanlist->begin(); c != ServerInstance->chanlist->end(); c++)
mod->OnCleanup(TYPE_USER,u->second);
u->second->doUnhookExtensions(items);
}
+ for(char m='A'; m <= 'z'; m++)
+ {
+ ModeHandler* mh;
+ mh = ServerInstance->Modes->FindMode(m, MODETYPE_USER);
+ if (mh && mh->creator == mod)
+ ServerInstance->Modes->DelMode(mh);
+ mh = ServerInstance->Modes->FindMode(m, MODETYPE_CHANNEL);
+ if (mh && mh->creator == mod)
+ ServerInstance->Modes->DelMode(mh);
+ }
/* Tidy up any dangling resolvers */
ServerInstance->Res->CleanResolvers(mod);
std::map<std::string, Module*>::iterator me = i++;
if (CanUnload(me->second))
{
- ServerInstance->GlobalCulls.AddItem(me->second);
- Modules.erase(me);
+ DoSafeUnload(me->second);
}
}
ServerInstance->GlobalCulls.Apply();
this->Modes->Process(parameters, user);
}
-void InspIRCd::DumpText(User* user, const std::string &text)
-{
- if (IS_LOCAL(user))
- {
- user->Write(text);
- }
- else
- {
- PI->PushToClient(user, text);
- }
-}
-
-void InspIRCd::DumpText(User* user, const char *text, ...)
-{
- va_list argsPtr;
- char line[MAXBUF];
-
- va_start(argsPtr, text);
- vsnprintf(line, MAXBUF, text, argsPtr);
- va_end(argsPtr);
-
- DumpText(user, std::string(line));
-}
-
-void InspIRCd::DumpText(User* user, const std::string &LinePrefix, std::stringstream &TextStream)
-{
- char line[MAXBUF];
- int start_pos = LinePrefix.length();
- int pos = start_pos;
- memcpy(line, LinePrefix.data(), pos);
- std::string Word;
- while (TextStream >> Word)
- {
- int len = Word.length();
- if (pos + len + 12 > MAXBUF)
- {
- line[pos] = '\0';
- DumpText(user, std::string(line));
- pos = start_pos;
- }
- line[pos] = ' ';
- memcpy(line + pos + 1, Word.data(), len);
- pos += len + 1;
- }
- line[pos] = '\0';
- DumpText(user, std::string(line));
-}
-
bool InspIRCd::AddResolver(Resolver* r, bool cached)
{
if (!cached)