]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Merge pull request #591 from SaberUK/master+config-tweaks
[user/henk/code/inspircd.git] / include / modules.h
index a5f99ee86d87c829f86b0eaf13dad204a6a0dc6f..d13ff58b0cb8c5e2b9822423e239e080cb7ab9fa 100644 (file)
@@ -119,23 +119,21 @@ struct ModResult {
 /**
  * This #define allows us to call a method in all
  * loaded modules in a readable simple way, e.g.:
- * 'FOREACH_MOD(I_OnConnect,OnConnect(user));'
+ * 'FOREACH_MOD(OnConnect,(user));'
  */
 #define FOREACH_MOD(y,x) do { \
-       EventHandlerIter safei; \
-       for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
+       const IntModuleList& _handlers = ServerInstance->Modules->EventHandlers[I_ ## y]; \
+       for (IntModuleList::const_reverse_iterator _i = _handlers.rbegin(), _next; _i != _handlers.rend(); _i = _next) \
        { \
-               safei = _i; \
-               ++safei; \
+               _next = _i+1; \
                try \
                { \
-                       (*_i)->x ; \
+                       (*_i)->x ; \
                } \
                catch (CoreException& modexcept) \
                { \
                        ServerInstance->Logs->Log("MODULE", LOG_DEFAULT, "Exception caught: %s",modexcept.GetReason()); \
                } \
-               _i = safei; \
        } \
 } while (0);
 
@@ -147,21 +145,19 @@ struct ModResult {
  */
 #define DO_EACH_HOOK(n,v,args) \
 do { \
-       EventHandlerIter iter_ ## n = ServerInstance->Modules->EventHandlers[I_ ## n].begin(); \
-       while (iter_ ## n != ServerInstance->Modules->EventHandlers[I_ ## n].end()) \
+       const IntModuleList& _handlers = ServerInstance->Modules->EventHandlers[I_ ## n]; \
+       for (IntModuleList::const_reverse_iterator _i = _handlers.rbegin(), _next; _i != _handlers.rend(); _i = _next) \
        { \
-               Module* mod_ ## n = *iter_ ## n; \
-               iter_ ## n ++; \
+               _next = _i+1; \
                try \
                { \
-                       v = (mod_ ## n)->n args;
+                       v = (*_i)->n args;
 
 #define WHILE_EACH_HOOK(n) \
                } \
                catch (CoreException& except_ ## n) \
                { \
                        ServerInstance->Logs->Log("MODULE", LOG_DEFAULT, "Exception caught: %s", (except_ ## n).GetReason()); \
-                       (void) mod_ ## n; /* catch mismatched pairs */ \
                } \
        } \
 } while(0)
@@ -245,74 +241,6 @@ class CoreExport DataProvider : public ServiceProvider
                : ServiceProvider(Creator, Name, SERVICE_DATA) {}
 };
 
-class CoreExport dynamic_reference_base : public interfacebase
-{
- private:
-       std::string name;
-       void resolve();
- protected:
-       ServiceProvider* value;
- public:
-       ModuleRef creator;
-       dynamic_reference_base(Module* Creator, const std::string& Name);
-       ~dynamic_reference_base();
-       inline const std::string& GetProvider() { return name; }
-       void SetProvider(const std::string& newname);
-       void check();
-       operator bool() { return (value != NULL); }
-       static void reset_all();
-};
-
-inline void dynamic_reference_base::check()
-{
-       if (!value)
-               throw ModuleException("Dynamic reference to '" + name + "' failed to resolve");
-}
-
-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->()
-       {
-               check();
-               return static_cast<T*>(value);
-       }
-
-       T* operator*()
-       {
-               return operator->();
-       }
-};
-
-template<typename T>
-class dynamic_reference_nocheck : public dynamic_reference_base
-{
- public:
-       dynamic_reference_nocheck(Module* Creator, const std::string& Name)
-               : dynamic_reference_base(Creator, Name) {}
-
-       T* operator->()
-       {
-               return static_cast<T*>(value);
-       }
-
-       T* operator*()
-       {
-               return operator->();
-       }
-};
-
-class ModeReference : public dynamic_reference_nocheck<ModeHandler>
-{
- public:
-       ModeReference(Module* mod, const std::string& modename)
-               : dynamic_reference_nocheck<ModeHandler>(mod, "mode/" + modename) {}
-};
-
 /** Priority types which can be used by Module::Prioritize()
  */
 enum Priority { PRIORITY_FIRST, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER };
@@ -348,6 +276,11 @@ enum Implementation
  */
 class CoreExport Module : public classbase, public usecountbase
 {
+       /** Detach an event from this module
+        * @param i Event type to detach
+        */
+       void DetachEvent(Implementation i);
+
  public:
        /** File that this module was loaded from
         */
@@ -843,7 +776,7 @@ class CoreExport Module : public classbase, public usecountbase
 
        /** Called when a 005 numeric is about to be output.
         * The module should modify the 005 numeric if needed to indicate its features.
-       * @param output The 005 map to be modified if neccessary.
+       * @param tokens The 005 map to be modified if neccessary.
        */
        virtual void On005Numeric(std::map<std::string, std::string>& tokens);
 
@@ -1202,7 +1135,7 @@ class CoreExport FileReader : public classbase
        FileReader() : totalSize(0) { }
 
        /** Initializes a new file reader and reads the specified file.
-        * @param file The file to read into memory.
+        * @param filename The file to read into memory.
         */
        FileReader(const std::string& filename);
 
@@ -1340,6 +1273,11 @@ class CoreExport ModuleManager
         */
        void DetachAll(Module* mod);
 
+       /** Attach all events to a module (used on module load)
+        * @param mod Module to attach to all events
+        */
+       void AttachAll(Module* mod);
+
        /** Returns text describing the last module error
         * @return The last error message to occur
         */
@@ -1481,7 +1419,7 @@ struct AllModuleList {
        { \
                return new y; \
        } \
-       extern "C" const char inspircd_src_version[] = VERSION " r" REVISION;
+       extern "C" const char inspircd_src_version[] = VERSION " " REVISION;
 #endif
 
 #define COMMAND_INIT(c) MODULE_INIT(CommandModule<c>)