]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules.cpp
Fix a bunch of weird indentation and spacing issues.
[user/henk/code/inspircd.git] / src / modules.cpp
index 6c7929b1f6d5f87de2d07551ff92152436e1152e..f940a0fd8948e20aaf0cf6ed53a99fd3a3eb50fa 100644 (file)
@@ -15,7 +15,7 @@
  *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2007 Oliver Lupton <om@inspircd.org>
  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2006-2010 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2005-2010 Craig Edwards <brain@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
@@ -132,18 +132,19 @@ void              Module::OnUserInvite(User*, User*, Channel*, time_t, unsigned int, CUList&
 void           Module::OnPostTopicChange(User*, Channel*, const std::string&) { DetachEvent(I_OnPostTopicChange); }
 void           Module::OnDecodeMetaData(Extensible*, const std::string&, const std::string&) { DetachEvent(I_OnDecodeMetaData); }
 void           Module::OnChangeHost(User*, const std::string&) { DetachEvent(I_OnChangeHost); }
+void           Module::OnChangeRealHost(User*, const std::string&) { DetachEvent(I_OnChangeRealHost); }
 void           Module::OnChangeRealName(User*, const std::string&) { DetachEvent(I_OnChangeRealName); }
 void           Module::OnChangeIdent(User*, const std::string&) { DetachEvent(I_OnChangeIdent); }
 void           Module::OnAddLine(User*, XLine*) { DetachEvent(I_OnAddLine); }
 void           Module::OnDelLine(User*, XLine*) { DetachEvent(I_OnDelLine); }
 void           Module::OnExpireLine(XLine*) { DetachEvent(I_OnExpireLine); }
-void           Module::OnCleanup(ExtensionItem::ExtensibleType, Extensible*) { }
+void           Module::OnCleanup(ExtensionItem::ExtensibleType, Extensible*) { }
 ModResult      Module::OnChannelPreDelete(Channel*) { DetachEvent(I_OnChannelPreDelete); return MOD_RES_PASSTHRU; }
 void           Module::OnChannelDelete(Channel*) { DetachEvent(I_OnChannelDelete); }
 void           Module::OnBuildNeighborList(User*, IncludeChanList&, std::map<User*,bool>&) { DetachEvent(I_OnBuildNeighborList); }
 void           Module::OnGarbageCollect() { DetachEvent(I_OnGarbageCollect); }
 ModResult      Module::OnSetConnectClass(LocalUser* user, ConnectClass* myclass) { DetachEvent(I_OnSetConnectClass); return MOD_RES_PASSTHRU; }
-void           Module::OnUserMessage(User*, const MessageTarget&, const MessageDetails&) { DetachEvent(I_OnUserMessage); }
+void           Module::OnUserMessage(User*, const MessageTarget&, const MessageDetails&) { DetachEvent(I_OnUserMessage); }
 ModResult      Module::OnNumeric(User*, const Numeric::Numeric&) { DetachEvent(I_OnNumeric); return MOD_RES_PASSTHRU; }
 ModResult   Module::OnAcceptConnection(int, ListenSocket*, irc::sockets::sockaddrs*, irc::sockets::sockaddrs*) { DetachEvent(I_OnAcceptConnection); return MOD_RES_PASSTHRU; }
 void           Module::OnSetUserIP(LocalUser*) { DetachEvent(I_OnSetUserIP); }
@@ -166,6 +167,26 @@ void ServiceProvider::DisableAutoRegister()
                stdalgo::erase(*ServerInstance->Modules->NewServices, this);
 }
 
+const char* ServiceProvider::GetTypeString() const
+{
+       switch (service)
+       {
+               case SERVICE_COMMAND:
+                       return "command";
+               case SERVICE_MODE:
+                       return "mode";
+               case SERVICE_METADATA:
+                       return "metadata";
+               case SERVICE_IOHOOK:
+                       return "iohook";
+               case SERVICE_DATA:
+                       return "data service";
+               case SERVICE_CUSTOM:
+                       return "module service";
+       }
+       return "unknown service";
+}
+
 ModuleManager::ModuleManager()
 {
 }
@@ -404,11 +425,14 @@ void ModuleManager::DoSafeUnload(Module* mod)
                user->doUnhookExtensions(items);
        }
 
-       for(std::multimap<std::string, ServiceProvider*>::iterator i = DataProviders.begin(); i != DataProviders.end(); )
+       for (DataProviderMap::iterator i = DataProviders.begin(); i != DataProviders.end(); )
        {
-               std::multimap<std::string, ServiceProvider*>::iterator curr = i++;
+               DataProviderMap::iterator curr = i++;
                if (curr->second->creator == mod)
+               {
                        DataProviders.erase(curr);
+                       FOREACH_MOD(OnServiceDel, (*curr->second));
+               }
        }
 
        dynamic_reference_base::reset_all();
@@ -418,7 +442,7 @@ void ModuleManager::DoSafeUnload(Module* mod)
        Modules.erase(modfind);
        ServerInstance->GlobalCulls.AddItem(mod);
 
-       ServerInstance->Logs->Log("MODULE", LOG_DEFAULT, "Module %s unloaded",mod->ModuleSourceFile.c_str());
+       ServerInstance->Logs->Log("MODULE", LOG_DEFAULT, "The %s module was unloaded", mod->ModuleSourceFile.c_str());
        ServerInstance->ISupport.Build();
 }
 
@@ -478,13 +502,17 @@ void ModuleManager::LoadAll()
        for (ConfigIter i = tags.first; i != tags.second; ++i)
        {
                ConfigTag* tag = i->second;
-               std::string name = ExpandModName(tag->getString("name"));
-               this->NewServices = &servicemap[name];
+
+               const std::string shortname = tag->getString("name");
+               if (shortname.empty())
+                       continue; // Skip malformed module tags.
 
                // Skip modules which are already loaded.
+               const std::string name = ExpandModName(shortname);
                if (Modules.find(name) != Modules.end())
                        continue;
 
+               this->NewServices = &servicemap[name];
                std::cout << "[" << con_green << "*" << con_reset << "] Loading module:\t" << con_green << name << con_reset << std::endl;
                if (!this->Load(name, true))
                {
@@ -557,6 +585,8 @@ void ModuleManager::AddServices(const ServiceList& list)
 
 void ModuleManager::AddService(ServiceProvider& item)
 {
+       ServerInstance->Logs->Log("SERVICE", LOG_DEBUG, "Adding %s %s provided by %s", item.name.c_str(),
+               item.GetTypeString(), item.creator ? item.creator->ModuleSourceFile.c_str() : "the core");
        switch (item.service)
        {
                case SERVICE_DATA:
@@ -584,6 +614,8 @@ void ModuleManager::AddService(ServiceProvider& item)
 
 void ModuleManager::DelService(ServiceProvider& item)
 {
+       ServerInstance->Logs->Log("SERVICE", LOG_DEBUG, "Deleting %s %s provided by %s", item.name.c_str(),
+               item.GetTypeString(), item.creator ? item.creator->ModuleSourceFile.c_str() : "the core");
        switch (item.service)
        {
                case SERVICE_MODE:
@@ -594,7 +626,7 @@ void ModuleManager::DelService(ServiceProvider& item)
                case SERVICE_IOHOOK:
                {
                        DelReferent(&item);
-                       return;
+                       break;
                }
                default:
                        throw ModuleException("Cannot delete unknown service type");
@@ -610,7 +642,7 @@ ServiceProvider* ModuleManager::FindService(ServiceType type, const std::string&
                case SERVICE_DATA:
                case SERVICE_IOHOOK:
                {
-                       std::multimap<std::string, ServiceProvider*>::iterator i = DataProviders.find(name);
+                       DataProviderMap::iterator i = DataProviders.find(name);
                        if (i != DataProviders.end() && i->second->service == type)
                                return i->second;
                        return NULL;
@@ -664,7 +696,7 @@ void dynamic_reference_base::resolve()
 {
        // Because find() may return any element with a matching key in case count(key) > 1 use lower_bound()
        // to ensure a dynref with the same name as another one resolves to the same object
-       std::multimap<std::string, ServiceProvider*>::iterator i = ServerInstance->Modules.DataProviders.lower_bound(name);
+       ModuleManager::DataProviderMap::iterator i = ServerInstance->Modules.DataProviders.lower_bound(name);
        if ((i != ServerInstance->Modules.DataProviders.end()) && (i->first == this->name))
        {
                ServiceProvider* newvalue = i->second;
@@ -697,7 +729,7 @@ void ModuleManager::AddReferent(const std::string& name, ServiceProvider* servic
 
 void ModuleManager::DelReferent(ServiceProvider* service)
 {
-       for (std::multimap<std::string, ServiceProvider*>::iterator i = DataProviders.begin(); i != DataProviders.end(); )
+       for (DataProviderMap::iterator i = DataProviders.begin(); i != DataProviders.end(); )
        {
                ServiceProvider* curr = i->second;
                if (curr == service)