X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules.cpp;h=f940a0fd8948e20aaf0cf6ed53a99fd3a3eb50fa;hb=b4a174ee9c32d62ea6bf010e837e8c5b1c3d36a3;hp=77e4142b3b9b569a33e11fc927083749ef101120;hpb=6214094a84f33ea80af4dac88dd1b82bd59a0b5c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules.cpp b/src/modules.cpp index 77e4142b3..f940a0fd8 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -15,7 +15,7 @@ * Copyright (C) 2007-2008 Robin Burchell * Copyright (C) 2007 Oliver Lupton * Copyright (C) 2007 Dennis Friis - * Copyright (C) 2006-2010 Craig Edwards + * Copyright (C) 2005-2010 Craig Edwards * * 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 @@ -138,13 +138,13 @@ void Module::OnChangeIdent(User*, const std::string&) { DetachEvent(I_OnChangeI 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&) { 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); } @@ -167,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() { } @@ -405,11 +425,14 @@ void ModuleManager::DoSafeUnload(Module* mod) user->doUnhookExtensions(items); } - for(std::multimap::iterator i = DataProviders.begin(); i != DataProviders.end(); ) + for (DataProviderMap::iterator i = DataProviders.begin(); i != DataProviders.end(); ) { - std::multimap::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(); @@ -419,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(); } @@ -562,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: @@ -589,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: @@ -599,7 +626,7 @@ void ModuleManager::DelService(ServiceProvider& item) case SERVICE_IOHOOK: { DelReferent(&item); - return; + break; } default: throw ModuleException("Cannot delete unknown service type"); @@ -615,7 +642,7 @@ ServiceProvider* ModuleManager::FindService(ServiceType type, const std::string& case SERVICE_DATA: case SERVICE_IOHOOK: { - std::multimap::iterator i = DataProviders.find(name); + DataProviderMap::iterator i = DataProviders.find(name); if (i != DataProviders.end() && i->second->service == type) return i->second; return NULL; @@ -669,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::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; @@ -702,7 +729,7 @@ void ModuleManager::AddReferent(const std::string& name, ServiceProvider* servic void ModuleManager::DelReferent(ServiceProvider* service) { - for (std::multimap::iterator i = DataProviders.begin(); i != DataProviders.end(); ) + for (DataProviderMap::iterator i = DataProviders.begin(); i != DataProviders.end(); ) { ServiceProvider* curr = i->second; if (curr == service)