]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Fix a couple of issues
[user/henk/code/inspircd.git] / include / modules.h
index 8ef646a08eee3e922469a70448979541f95aafc3..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)
@@ -280,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
         */
@@ -1272,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
         */
@@ -1413,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>)