* loaded modules in a readable simple way, e.g.:
* 'FOREACH_MOD(I_OnConnect,OnConnect(user));'
*/
-#define FOREACH_MOD(y,x) \
-for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ++_i) \
-{ \
- try \
+#define FOREACH_MOD(y,x) do { \
+ EventHandlerIter safei; \
+ for (EventHandlerIter _i = ServerInstance->Modules->EventHandlers[y].begin(); _i != ServerInstance->Modules->EventHandlers[y].end(); ) \
{ \
- (*_i)->x ; \
- } \
- catch (CoreException& modexcept) \
- { \
- ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ safei = _i; \
+ ++safei; \
+ try \
+ { \
+ (*_i)->x ; \
+ } \
+ catch (CoreException& modexcept) \
+ { \
+ ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ } \
+ _i = safei; \
} \
-}
+} while (0);
/**
* This #define allows us to call a method in all
* an instance pointer to the macro. e.g.:
* 'FOREACH_MOD_I(Instance, OnConnect, OnConnect(user));'
*/
-#define FOREACH_MOD_I(z,y,x) \
-for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ++_i) \
-{ \
- try \
- { \
- (*_i)->x ; \
- } \
- catch (CoreException& modexcept) \
+#define FOREACH_MOD_I(z,y,x) do { \
+ EventHandlerIter safei; \
+ for (EventHandlerIter _i = z->Modules->EventHandlers[y].begin(); _i != z->Modules->EventHandlers[y].end(); ) \
{ \
- z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ safei = _i; \
+ ++safei; \
+ try \
+ { \
+ (*_i)->x ; \
+ } \
+ catch (CoreException& modexcept) \
+ { \
+ z->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
+ } \
+ _i = safei; \
} \
-}
+} while (0);
/**
* This define is similar to the one above but returns a result in MOD_RESULT.
*/
#define FOREACH_RESULT(y,x) \
do { \
+ EventHandlerIter safei; \
MOD_RESULT = 0; \
- 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(); ) \
{ \
+ safei = _i; \
+ ++safei; \
try \
{ \
int res = (*_i)->x ; \
{ \
ServerInstance->Log(DEFAULT,"Exception caught: %s",modexcept.GetReason()); \
} \
+ _i = safei; \
} \
} while(0);
*/
#define FOREACH_RESULT_I(z,y,x) \
do { \
+ EventHandlerIter safei; \
MOD_RESULT = 0; \
- 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(); ) \
{ \
+ safei = _i; \
+ ++safei; \
try \
{ \
int res = (*_i)->x ; \
{ \
z->Log(DEBUG,"Exception caught: %s",modexcept.GetReason()); \
} \
+ _i = safei; \
} \
} while (0);
I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister,
I_OnOperCompare, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnCancelAway, I_OnUserList,
I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed,
- I_OnText,
+ I_OnText, I_OnReadConfig, I_OnDownloadFile,
I_END
};
+class ConfigReader;
+
/** Base class for all InspIRCd modules
* This class is the base class for InspIRCd modules. All modules must inherit from this class,
* its methods will be called when irc server events occur. class inherited from module must be
{
}
+ virtual void OnReadConfig(ServerConfig* config, ConfigReader* coreconf);
+
+ virtual int OnDownloadFile(const std::string &filename, std::stringstream &filedata);
+
/** Returns the version number of a Module.
* The method should return a Version object with its version information assigned via
* Version::Version