summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/base.h6
-rw-r--r--include/ctables.h4
-rw-r--r--include/extensible.h2
-rw-r--r--include/inspircd.h9
-rw-r--r--include/mode.h2
-rw-r--r--include/modules.h180
-rw-r--r--include/typedefs.h12
7 files changed, 69 insertions, 146 deletions
diff --git a/include/base.h b/include/base.h
index 8324d6347..e0b3d25e3 100644
--- a/include/base.h
+++ b/include/base.h
@@ -213,7 +213,7 @@ enum ServiceType {
};
/** A structure defining something that a module can provide */
-class CoreExport providerbase : public classbase
+class CoreExport ServiceProvider : public classbase
{
public:
/** Module that is providing this service */
@@ -222,9 +222,9 @@ class CoreExport providerbase : public classbase
const std::string name;
/** Type of service (must match object type) */
const ServiceType service;
- providerbase(Module* Creator, const std::string& Name, ServiceType Type)
+ ServiceProvider(Module* Creator, const std::string& Name, ServiceType Type)
: creator(Creator), name(Name), service(Type) {}
- virtual ~providerbase();
+ virtual ~ServiceProvider();
};
diff --git a/include/ctables.h b/include/ctables.h
index 991ad1cc2..9b433d6f9 100644
--- a/include/ctables.h
+++ b/include/ctables.h
@@ -85,7 +85,7 @@ struct RouteDescriptor
/** A structure that defines a command. Every command available
* in InspIRCd must be defined as derived from Command.
*/
-class CoreExport Command : public providerbase
+class CoreExport Command : public ServiceProvider
{
public:
/** User flags needed to execute the command or 0
@@ -144,7 +144,7 @@ class CoreExport Command : public providerbase
* NICK, optionally PASS, and been resolved).
*/
Command(Module* me, const std::string &cmd, int minpara = 0, int maxpara = 0) :
- providerbase(me, cmd, SERVICE_COMMAND), flags_needed(0), min_params(minpara), max_params(maxpara),
+ ServiceProvider(me, cmd, SERVICE_COMMAND), flags_needed(0), min_params(minpara), max_params(maxpara),
use_count(0), total_bytes(0), disabled(false), works_before_reg(false), Penalty(1)
{
}
diff --git a/include/extensible.h b/include/extensible.h
index ae78c0a0d..d4c7a86d1 100644
--- a/include/extensible.h
+++ b/include/extensible.h
@@ -12,7 +12,7 @@ enum SerializeFormat
/** Class represnting an extension of some object
*/
-class CoreExport ExtensionItem : public providerbase, public usecountbase
+class CoreExport ExtensionItem : public ServiceProvider, public usecountbase
{
public:
ExtensionItem(const std::string& key, Module* owner);
diff --git a/include/inspircd.h b/include/inspircd.h
index 52035ce49..96b05488a 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -594,15 +594,6 @@ class CoreExport InspIRCd
*/
bool AddResolver(Resolver* r, bool cached);
- /** Register a service provided by a module */
- void AddService(providerbase&);
-
- inline void AddServices(providerbase** list, int count)
- {
- for(int i=0; i < count; i++)
- AddService(*list[i]);
- }
-
/** Add a command to this server's command parser
* @param f A Command command handler object to add
* @throw ModuleException Will throw ModuleExcption if the command already exists
diff --git a/include/mode.h b/include/mode.h
index f2b58a309..ce9d2ee2b 100644
--- a/include/mode.h
+++ b/include/mode.h
@@ -90,7 +90,7 @@ enum ParamSpec
* mode is expected to have a parameter, then this is
* equivalent to returning MODEACTION_DENY.
*/
-class CoreExport ModeHandler : public providerbase
+class CoreExport ModeHandler : public ServiceProvider
{
protected:
/**
diff --git a/include/modules.h b/include/modules.h
index 3efee83dc..d6625e7bf 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -258,6 +258,44 @@ class CoreExport Event : public classbase
void Send();
};
+class CoreExport DataProvider : public ServiceProvider
+{
+ public:
+ DataProvider(Module* Creator, const std::string& Name)
+ : ServiceProvider(Creator, Name, SERVICE_DATA) {}
+};
+
+class CoreExport dynamic_reference_base : public interfacebase
+{
+ private:
+ std::string name;
+ protected:
+ DataProvider* value;
+ public:
+ ModuleRef creator;
+ dynamic_reference_base(Module* Creator, const std::string& Name);
+ ~dynamic_reference_base();
+ inline void ClearCache() { value = NULL; }
+ inline const std::string& GetProvider() { return name; }
+ void SetProvider(const std::string& newname);
+ void lookup();
+ operator bool();
+};
+
+template<typename T>
+class dynamic_reference : public dynamic_reference_base
+{
+ public:
+ dynamic_reference(Module* Creator, const std::string& Name)
+ : dynamic_reference_base(Creator, Name) {}
+ inline T* operator->()
+ {
+ if (!value)
+ lookup();
+ return static_cast<T*>(value);
+ }
+};
+
/** Priority types which can be used by Module::Prioritize()
*/
enum Priority { PRIORITY_FIRST, PRIORITY_DONTCARE, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER };
@@ -1419,14 +1457,6 @@ class CoreExport ModuleManager
*/
std::string LastModuleError;
- /** The feature names published by various modules
- */
- featurelist Features;
-
- /** The interface names published by various modules
- */
- interfacelist Interfaces;
-
/** Total number of modules loaded into the ircd
*/
int ModCount;
@@ -1451,6 +1481,12 @@ class CoreExport ModuleManager
*/
IntModuleList EventHandlers[I_END];
+ /** List of data services keyed by name */
+ std::multimap<std::string, ServiceProvider*> DataProviders;
+
+ /** List of all dynamic references that are currently active */
+ std::vector<dynamic_reference_base*> ActiveDynrefs;
+
/** Simple, bog-standard, boring constructor.
*/
ModuleManager();
@@ -1566,116 +1602,24 @@ class CoreExport ModuleManager
*/
Module* Find(const std::string &name);
- /** Publish a 'feature'.
- * There are two ways for a module to find another module it depends on.
- * Either by name, using InspIRCd::FindModule, or by feature, using this
- * function. A feature is an arbitary string which identifies something this
- * module can do. For example, if your module provides SSL support, but other
- * modules provide SSL support too, all the modules supporting SSL should
- * publish an identical 'SSL' feature. This way, any module requiring use
- * of SSL functions can just look up the 'SSL' feature using FindFeature,
- * then use the module pointer they are given.
- * @param FeatureName The case sensitive feature name to make available
- * @param Mod a pointer to your module class
- * @returns True on success, false if the feature is already published by
- * another module.
- */
- bool PublishFeature(const std::string &FeatureName, Module* Mod);
-
- /** Publish a module to an 'interface'.
- * Modules which implement the same interface (the same way of communicating
- * with other modules) can publish themselves to an interface, using this
- * method. When they do so, they become part of a list of related or
- * compatible modules, and a third module may then query for that list
- * and know that all modules within that list offer the same API.
- * A prime example of this is the hashing modules, which all accept the
- * same types of Request class. Consider this to be similar to PublishFeature,
- * except for that multiple modules may publish the same 'feature'.
- * @param InterfaceName The case sensitive interface name to make available
- * @param Mod a pointer to your module class
- * @returns True on success, false on failure (there are currently no failure
- * cases)
- */
- bool PublishInterface(const std::string &InterfaceName, Module* Mod);
-
- /** Return a pair saying how many other modules are currently using the
- * interfaces provided by module m.
- * @param m The module to count usage for
- * @return A pair, where the first value is the number of uses of the interface,
- * and the second value is the interface name being used.
- */
- std::pair<int,std::string> GetInterfaceInstanceCount(Module* m);
-
- /** Mark your module as using an interface.
- * If you mark your module as using an interface, then that interface
- * module may not unload until your module has unloaded first.
- * This can be used to prevent crashes by ensuring code you depend on
- * is always in memory while your module is active.
- * @param InterfaceName The interface to use
- */
- void UseInterface(const std::string &InterfaceName);
-
- /** Mark your module as finished with an interface.
- * If you used UseInterface() above, you should use this method when
- * your module is finished with the interface (usually in its destructor)
- * to allow the modules which implement the given interface to be unloaded.
- * @param InterfaceName The interface you are finished with using.
- */
- void DoneWithInterface(const std::string &InterfaceName);
-
- /** Unpublish a 'feature'.
- * When your module exits, it must call this method for every feature it
- * is providing so that the feature table is cleaned up.
- * @param FeatureName the feature to remove
- */
- bool UnpublishFeature(const std::string &FeatureName);
-
- /** Unpublish your module from an interface
- * When your module exits, it must call this method for every interface
- * it is part of so that the interfaces table is cleaned up. Only when
- * the last item is deleted from an interface does the interface get
- * removed.
- * @param InterfaceName the interface to be removed from
- * @param Mod The module to remove from the interface list
- */
- bool UnpublishInterface(const std::string &InterfaceName, Module* Mod);
-
- /** Find a 'feature'.
- * There are two ways for a module to find another module it depends on.
- * Either by name, using InspIRCd::FindModule, or by feature, using the
- * InspIRCd::PublishFeature method. A feature is an arbitary string which
- * identifies something this module can do. For example, if your module
- * provides SSL support, but other modules provide SSL support too, all
- * the modules supporting SSL should publish an identical 'SSL' feature.
- * To find a module capable of providing the feature you want, simply
- * call this method with the feature name you are looking for.
- * @param FeatureName The feature name you wish to obtain the module for
- * @returns A pointer to a valid module class on success, NULL on failure.
- */
- Module* FindFeature(const std::string &FeatureName);
-
- /** Find an 'interface'.
- * An interface is a list of modules which all implement the same API.
- * @param InterfaceName The Interface you wish to obtain the module
- * list of.
- * @return A pointer to a deque of Module*, or NULL if the interface
- * does not exist.
- */
- modulelist* FindInterface(const std::string &InterfaceName);
-
- /** Determine if a module has published the named interface.
- * This could be used in, for example, OnLoadModule to pick up other modules that can be used.
- * @param mod The module to check.
- * @param InterfaceName the interface you want to check for
- * @return True if the module provides the interface, false otherwise.
- */
- bool ModuleHasInterface(Module* mod, const std::string& InterfaceName);
-
- /** Given a pointer to a Module, return its filename
- * @param m The module pointer to identify
- * @return The module name or an empty string
- */
- const std::string& GetModuleName(Module* m);
+ /** Register a service provided by a module */
+ void AddService(ServiceProvider&);
+
+ inline void AddServices(ServiceProvider** list, int count)
+ {
+ for(int i=0; i < count; i++)
+ AddService(*list[i]);
+ }
+
+ /** Find a service by name.
+ * If multiple modules provide a given service, the first one loaded will be chosen.
+ */
+ ServiceProvider* FindService(ServiceType Type, const std::string& name);
+
+ template<typename T> inline T* FindDataService(const std::string& name)
+ {
+ return static_cast<T*>(FindService(SERVICE_DATA, name));
+ }
/** Return a list of all modules matching the given filter
* @param filter This int is a bitmask of flags set in Module::Flags,
diff --git a/include/typedefs.h b/include/typedefs.h
index c0a5ebbc1..a1c6e774d 100644
--- a/include/typedefs.h
+++ b/include/typedefs.h
@@ -123,18 +123,6 @@ typedef std::set<User*> CUList;
*/
typedef std::vector<std::string> string_list;
-/** Holds a list of 'published features' for modules.
- */
-typedef std::map<std::string,Module*> featurelist;
-
-/** Holds a list of modules which implement an interface
- */
-typedef std::deque<Module*> modulelist;
-
-/** Holds a list of all modules which implement interfaces, by interface name
- */
-typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
-
/** Contains an ident and host split into two strings
*/
typedef std::pair<std::string, std::string> IdentHostPair;