]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
Integrate K/Gline into the bancache system by making some modifications to DefaultApp...
[user/henk/code/inspircd.git] / include / modules.h
index d429288c91979125128adbe73b4eb2309ec9aa18..ef0d3f6200de3d394f5da3f27495cdf9c402ae31 100644 (file)
@@ -123,18 +123,16 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
  * loaded modules in a readable simple way, e.g.:
  * 'FOREACH_MOD(I_OnConnect,OnConnect(user));'
  */
-#define FOREACH_MOD(y,x) if (!ServerInstance->Modules->EventHandlers[y].empty()) \
+#define FOREACH_MOD(y,x) \
+for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
 { \
-       for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
+       try \
        { \
-               try \
-               { \
-                       (*_i)->x ; \
-               } \
-               catch (CoreException& modexcept) \
-               { \
-                       ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
-               } \
+               (*_i)->x ; \
+       } \
+       catch (CoreException& modexcept) \
+       { \
+               ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
        } \
 }
 
@@ -144,18 +142,16 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
  * an instance pointer to the macro. e.g.:
  * 'FOREACH_MOD_I(Instance, OnConnect, OnConnect(user));'
  */
-#define FOREACH_MOD_I(z,y,x) if (!z->Modules->EventHandlers[y].empty()) \
+#define FOREACH_MOD_I(z,y,x) \
+for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
 { \
-       for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
+       try \
        { \
-               try \
-               { \
-                       (*_i)->x ; \
-               } \
-               catch (CoreException& modexcept) \
-               { \
-                       z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
-               } \
+               (*_i)->x ; \
+       } \
+       catch (CoreException& modexcept) \
+       { \
+               z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
        } \
 }
 
@@ -164,8 +160,8 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
  * The first module to return a nonzero result is the value to be accepted,
  * and any modules after are ignored.
  */
-#define FOREACH_RESULT(y,x) if (!ServerInstance->Modules->EventHandlers[y].empty()) \
-{ \
+#define FOREACH_RESULT(y,x) \
+do { \
        MOD_RESULT = 0; \
        for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
        { \
@@ -182,7 +178,7 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
                        ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
                } \
        } \
-} 
+} while(0);
 
 
 /**
@@ -190,8 +186,8 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
  * The first module to return a nonzero result is the value to be accepted,
  * and any modules after are ignored.
  */
-#define FOREACH_RESULT_I(z,y,x) if (!z->Modules->EventHandlers[y].empty()) \
-{ \
+#define FOREACH_RESULT_I(z,y,x) \
+do { \
        MOD_RESULT = 0; \
        for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
        { \
@@ -208,7 +204,7 @@ typedef std::map<std::string, std::pair<int, modulelist> > interfacelist;
                        z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \
                } \
        } \
-}
+} while (0);
 
 /** Represents a non-local user.
  * (in fact, any FD less than -1 does)
@@ -1521,18 +1517,10 @@ class CoreExport FileReader : public classbase
  */
 typedef DLLFactory<Module> ircd_module;
 
-/** A list of loaded module handles (ircd_module)
- */
-typedef std::vector<ircd_module*> ModuleHandleList;
-
 /** A list of modules
  */
 typedef std::vector<Module*> IntModuleList;
 
-/** A list of event handlers
- */
-typedef std::vector<IntModuleList> EventHandlerList;
-
 /** An event handler iterator
  */
 typedef IntModuleList::iterator EventHandlerIter;
@@ -1556,7 +1544,7 @@ class CoreExport ModuleManager : public classbase
  private:
        /** Holds a string describing the last module error to occur
         */
-       char MODERR[MAXBUF];
+       std::string LastModuleError;
  
        /** The feature names published by various modules
         */
@@ -1566,7 +1554,7 @@ class CoreExport ModuleManager : public classbase
         */
        interfacelist Interfaces;
  
-       /** Total number of modules loaded into the ircd, minus one
+       /** Total number of modules loaded into the ircd
         */
        int ModCount; 
        
@@ -1584,7 +1572,7 @@ class CoreExport ModuleManager : public classbase
        /** Event handler hooks.
         * This needs to be public to be used by FOREACH_MOD and friends.
         */
-       EventHandlerList EventHandlers;
+       IntModuleList EventHandlers[I_END];
 
        /** Simple, bog-standard, boring constructor.
         */
@@ -1659,7 +1647,7 @@ class CoreExport ModuleManager : public classbase
        /** Returns text describing the last module error
         * @return The last error message to occur
         */
-       const char* LastError();
+       std::string& LastError();
 
        /** Load a given module file
         * @param filename The file to load