]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Don't try to tidy m_autoop entries (fixes extra !*@*)
[user/henk/code/inspircd.git] / include / modules.h
index 71cbc8480a8bd194f71cabf9e348835839e2bf65..3601dd659253bdaf1fc18c40f83867ff6e45eb58 100644 (file)
@@ -94,10 +94,17 @@ struct ModResult {
        }
 };
 
-/** If you change the module API in any way, increment this value.
- * This MUST be a pure integer, with no parenthesis
+/** InspIRCd major version.
+ * 1.2 -> 102; 2.1 -> 201; 2.12 -> 212
  */
-#define API_VERSION 141
+#define INSPIRCD_VERSION_MAJ 200
+/** InspIRCd API version.
+ * If you change any API elements, increment this value. This counter should be
+ * reset whenever the major version is changed. Modules can use these two values
+ * and numerical comparisons in preprocessor macros if they wish to support
+ * multiple versions of InspIRCd in one file.
+ */
+#define INSPIRCD_VERSION_API 1
 
 /**
  * This #define allows us to call a method in all
@@ -169,12 +176,8 @@ do { \
 /** Holds a module's Version information.
  * The members (set by the constructor only) indicate details as to the version number
  * of a module. A class of type Version is returned by the GetVersion method of the Module class.
- *
- * The core provides only one implementation of the template, causing a run-time linking
- * error when attempting to load a module compiled against a different API_VERSION.
  */
-template<int api>
-class CoreExport VersionBase
+class CoreExport Version
 {
  public:
        /** Module description
@@ -189,19 +192,14 @@ class CoreExport VersionBase
        const std::string link_data;
 
        /** Simple module version */
-       VersionBase(const std::string &desc, int flags = VF_NONE);
+       Version(const std::string &desc, int flags = VF_NONE);
 
        /** Complex version information, including linking compatability data */
-       VersionBase(const std::string &desc, int flags, const std::string& linkdata);
-
-       virtual ~VersionBase() {}
+       Version(const std::string &desc, int flags, const std::string& linkdata);
 
-       /** Return true if the module can link (default is identity comparison) */
-       virtual bool CanLink(const std::string& other_data);
+       virtual ~Version() {}
 };
 
-typedef VersionBase<API_VERSION> Version;
-
 /** The Request class is a unicast message directed at a given module.
  * When this class is properly instantiated it may be sent to a module
  * using the Send() method, which will call the given module's OnRequest
@@ -287,6 +285,7 @@ class CoreExport dynamic_reference_base : public interfacebase
        void SetProvider(const std::string& newname);
        void lookup();
        operator bool();
+       static void reset_all();
 };
 
 template<typename T>
@@ -305,7 +304,7 @@ class dynamic_reference : public dynamic_reference_base
 
 /** Priority types which can be used by Module::Prioritize()
  */
-enum Priority { PRIORITY_FIRST, PRIORITY_DONTCARE, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER };
+enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER };
 
 /** Implementation-specific flags which may be set in Module::Implements()
  */
@@ -1274,10 +1273,9 @@ class CoreExport Module : public classbase, public usecountbase
         * @param source The user running the /WHO query
         * @param params The parameters to the /WHO query
         * @param user The user that this line of the query is about
-        * @param channel The channel being queried (or NULL if not a channel query)
         * @param line The raw line to send; modifiable, if empty no line will be returned.
         */
-       virtual void OnSendWhoLine(User* source, const std::vector<std::string>& params, User* user, Channel* channel, std::string& line);
+       virtual void OnSendWhoLine(User* source, const std::vector<std::string>& params, User* user, std::string& line);
 };
 
 
@@ -1492,9 +1490,6 @@ class CoreExport ModuleManager
        /** 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();
@@ -1515,16 +1510,17 @@ class CoreExport ModuleManager
         * PRIO_FIRST to set the event to be first called, PRIO_LAST to
         * set it to be the last called, or PRIO_BEFORE and PRIORITY_AFTER
         * to set it to be before or after one or more other modules.
-        * @param modules If PRIO_BEFORE or PRIORITY_AFTER is set in parameter 's',
-        * then this contains a list of one or more modules your module must be
-        * placed before or after. Your module will be placed before the highest
-        * priority module in this list for PRIO_BEFORE, or after the lowest
-        * priority module in this list for PRIORITY_AFTER.
-        * @param sz The number of modules being passed for PRIO_BEFORE and PRIORITY_AFTER.
-        * Defaults to 1, as most of the time you will only want to prioritize your module
-        * to be before or after one other module.
+        * @param which If PRIO_BEFORE or PRIORITY_AFTER is set in parameter 's',
+        * then this contains a the module that your module must be placed before
+        * or after.
         */
-       bool SetPriority(Module* mod, Implementation i, Priority s, Module** modules = NULL, size_t sz = 1);
+       bool SetPriority(Module* mod, Implementation i, Priority s, Module* which = NULL);
+
+       /** Backwards compat interface */
+       inline bool SetPriority(Module* mod, Implementation i, Priority s, Module** dptr)
+       {
+               return SetPriority(mod, i, s, *dptr);
+       }
 
        /** Change the priority of all events in a module.
         * @param mod The module to set the priority of
@@ -1614,6 +1610,9 @@ class CoreExport ModuleManager
        /** Register a service provided by a module */
        void AddService(ServiceProvider&);
 
+       /** Unregister a service provided by a module */
+       void DelService(ServiceProvider&);
+
        inline void AddServices(ServiceProvider** list, int count)
        {
                for(int i=0; i < count; i++)
@@ -1645,9 +1644,9 @@ class CoreExport ModuleManager
 #define MODULE_INIT_STR MODULE_INIT_STR_FN_2(MODULE_INIT_SYM)
 #define MODULE_INIT_STR_FN_2(x) MODULE_INIT_STR_FN_1(x)
 #define MODULE_INIT_STR_FN_1(x) #x
-#define MODULE_INIT_SYM MODULE_INIT_SYM_FN_2(API_VERSION)
-#define MODULE_INIT_SYM_FN_2(x) MODULE_INIT_SYM_FN_1(x)
-#define MODULE_INIT_SYM_FN_1(x) inspircd_module_ ## x
+#define MODULE_INIT_SYM MODULE_INIT_SYM_FN_2(INSPIRCD_VERSION_MAJ, INSPIRCD_VERSION_API)
+#define MODULE_INIT_SYM_FN_2(x,y) MODULE_INIT_SYM_FN_1(x,y)
+#define MODULE_INIT_SYM_FN_1(x,y) inspircd_module_ ## x ## _ ## y
 
 #ifdef PURE_STATIC
 
@@ -1666,8 +1665,11 @@ struct AllModuleList {
 };
 
 #define MODULE_INIT(x) static Module* MK_ ## x() { return new x; } \
-       static const AllModuleList PREP_ ## x(&MK_ ## x, #x);
+       static const AllModuleList PREP_ ## x(&MK_ ## x, MODNAMESTR);
 
+#define MODNAMESTR MODNAMESTR_FN_2(MODNAME)
+#define MODNAMESTR_FN_2(x) MODNAMESTR_FN_1(x)
+#define MODNAMESTR_FN_1(x) #x
 
 #else