diff options
-rw-r--r-- | include/base.h | 8 | ||||
-rw-r--r-- | include/ctables.h | 4 | ||||
-rw-r--r-- | include/extensible.h | 4 | ||||
-rw-r--r-- | include/mode.h | 5 | ||||
-rw-r--r-- | include/modules.h | 11 | ||||
-rw-r--r-- | src/base.cpp | 10 | ||||
-rw-r--r-- | src/command_parse.cpp | 6 | ||||
-rw-r--r-- | src/mode.cpp | 6 | ||||
-rw-r--r-- | src/modules.cpp | 45 |
9 files changed, 74 insertions, 25 deletions
diff --git a/include/base.h b/include/base.h index dcbb2e5c7..c378afc1c 100644 --- a/include/base.h +++ b/include/base.h @@ -235,7 +235,9 @@ enum ServiceType { /** is a data processing provider (MD5, SQL) */ SERVICE_DATA, /** is an I/O hook provider (SSL) */ - SERVICE_IOHOOK + SERVICE_IOHOOK, + /** Service managed by a module */ + SERVICE_CUSTOM }; /** A structure defining something that a module can provide */ @@ -251,6 +253,10 @@ class CoreExport ServiceProvider : public classbase ServiceProvider(Module* Creator, const std::string& Name, ServiceType Type); virtual ~ServiceProvider(); + /** Register this service in the appropriate registrar + */ + virtual void RegisterService(); + /** If called, this ServiceProvider won't be registered automatically */ void DisableAutoRegister(); diff --git a/include/ctables.h b/include/ctables.h index abf65f561..bc4226ea9 100644 --- a/include/ctables.h +++ b/include/ctables.h @@ -218,6 +218,10 @@ class CoreExport Command : public CommandBase */ virtual CmdResult Handle(const std::vector<std::string>& parameters, User* user) = 0; + /** Register this object in the CommandParser + */ + void RegisterService() CXX11_OVERRIDE; + /** Destructor * Removes this command from the command parser */ diff --git a/include/extensible.h b/include/extensible.h index 5ac4fa9da..1a51fdaaf 100644 --- a/include/extensible.h +++ b/include/extensible.h @@ -69,6 +69,10 @@ class CoreExport ExtensionItem : public ServiceProvider, public usecountbase /** Free the item */ virtual void free(void* item) = 0; + /** Register this object in the ExtensionManager + */ + void RegisterService() CXX11_OVERRIDE; + protected: /** Get the item from the internal map */ void* get_raw(const Extensible* container) const; diff --git a/include/mode.h b/include/mode.h index eebfbedd6..d8884bf9f 100644 --- a/include/mode.h +++ b/include/mode.h @@ -168,6 +168,11 @@ class CoreExport ModeHandler : public ServiceProvider ModeHandler(Module* me, const std::string& name, char modeletter, ParamSpec params, ModeType type, Class mclass = MC_OTHER); virtual CullResult cull(); virtual ~ModeHandler(); + + /** Register this object in the ModeParser + */ + void RegisterService() CXX11_OVERRIDE; + /** * Returns true if the mode is a list mode */ diff --git a/include/modules.h b/include/modules.h index f86f88087..93e5c05a0 100644 --- a/include/modules.h +++ b/include/modules.h @@ -1213,6 +1213,17 @@ class CoreExport ModuleManager : public fakederef<ModuleManager> * @return A ModuleMap containing all loaded modules */ const ModuleMap& GetModules() const { return Modules; } + + /** Make a service referenceable by dynamic_references + * @param name Name that will be used by dynamic_references to find the object + * @param service Service to make referenceable by dynamic_references + */ + void AddReferent(const std::string& name, ServiceProvider* service); + + /** Make a service no longer referenceable by dynamic_references + * @param service Service to make no longer referenceable by dynamic_references + */ + void DelReferent(ServiceProvider* service); }; /** Do not mess with these functions unless you know the C preprocessor diff --git a/src/base.cpp b/src/base.cpp index 496b23ef5..0ff3fbe4c 100644 --- a/src/base.cpp +++ b/src/base.cpp @@ -95,6 +95,10 @@ ServiceProvider::~ServiceProvider() { } +void ServiceProvider::RegisterService() +{ +} + ExtensionItem::ExtensionItem(const std::string& Key, ExtensibleType exttype, Module* mod) : ServiceProvider(mod, Key, SERVICE_METADATA) , type(exttype) @@ -140,6 +144,12 @@ void* ExtensionItem::unset_raw(Extensible* container) return rv; } +void ExtensionItem::RegisterService() +{ + if (!ServerInstance->Extensions.Register(this)) + throw ModuleException("Extension already exists: " + name); +} + bool ExtensionManager::Register(ExtensionItem* item) { return types.insert(std::make_pair(item->name, item)).second; diff --git a/src/command_parse.cpp b/src/command_parse.cpp index 7998d9cc3..c123353b0 100644 --- a/src/command_parse.cpp +++ b/src/command_parse.cpp @@ -379,6 +379,12 @@ Command::~Command() ServerInstance->Parser.RemoveCommand(this); } +void Command::RegisterService() +{ + if (!ServerInstance->Parser.AddCommand(this)) + throw ModuleException("Command already exists: " + name); +} + void CommandParser::ProcessBuffer(std::string &buffer,LocalUser *user) { if (buffer.empty()) diff --git a/src/mode.cpp b/src/mode.cpp index 671b5d854..6038f6f5b 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -90,6 +90,12 @@ bool ModeHandler::ResolveModeConflict(std::string& theirs, const std::string& ou return (theirs < ours); } +void ModeHandler::RegisterService() +{ + ServerInstance->Modes.AddMode(this); + ServerInstance->Modules.AddReferent((GetModeType() == MODETYPE_CHANNEL ? "mode/" : "umode/") + name, this); +} + ModeAction SimpleUserModeHandler::OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding) { /* We're either trying to add a mode we already have or diff --git a/src/modules.cpp b/src/modules.cpp index 79a71652c..d77221c39 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -528,22 +528,6 @@ void ModuleManager::AddService(ServiceProvider& item) { switch (item.service) { - case SERVICE_COMMAND: - if (!ServerInstance->Parser.AddCommand(static_cast<Command*>(&item))) - throw ModuleException("Command "+std::string(item.name)+" already exists."); - return; - case SERVICE_MODE: - { - ModeHandler* mh = static_cast<ModeHandler*>(&item); - ServerInstance->Modes->AddMode(mh); - DataProviders.insert(std::make_pair((mh->GetModeType() == MODETYPE_CHANNEL ? "mode/" : "umode/") + item.name, &item)); - dynamic_reference_base::reset_all(); - return; - } - case SERVICE_METADATA: - if (!ServerInstance->Extensions.Register(static_cast<ExtensionItem*>(&item))) - throw ModuleException("Extension " + std::string(item.name) + " already exists."); - return; case SERVICE_DATA: case SERVICE_IOHOOK: { @@ -561,7 +545,7 @@ void ModuleManager::AddService(ServiceProvider& item) return; } default: - throw ModuleException("Cannot add unknown service type"); + item.RegisterService(); } } @@ -576,13 +560,7 @@ void ModuleManager::DelService(ServiceProvider& item) case SERVICE_DATA: case SERVICE_IOHOOK: { - for(std::multimap<std::string, ServiceProvider*>::iterator i = DataProviders.begin(); i != DataProviders.end(); ) - { - std::multimap<std::string, ServiceProvider*>::iterator curr = i++; - if (curr->second == &item) - DataProviders.erase(curr); - } - dynamic_reference_base::reset_all(); + DelReferent(&item); return; } default: @@ -674,3 +652,22 @@ Module* ModuleManager::Find(const std::string &name) else return modfind->second; } + +void ModuleManager::AddReferent(const std::string& name, ServiceProvider* service) +{ + DataProviders.insert(std::make_pair(name, service)); + dynamic_reference_base::reset_all(); +} + +void ModuleManager::DelReferent(ServiceProvider* service) +{ + for (std::multimap<std::string, ServiceProvider*>::iterator i = DataProviders.begin(); i != DataProviders.end(); ) + { + ServiceProvider* curr = i->second; + if (curr == service) + DataProviders.erase(i++); + else + ++i; + } + dynamic_reference_base::reset_all(); +} |