]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules.h
More stuff for allowing hostnames in <bind> and <link> again - note there is a FIXME...
[user/henk/code/inspircd.git] / include / modules.h
index 2a8c42dfd33496c4d1ceb742d69cfe5cbe21caf9..d303f7c727b136064f64eaba8435d9cf4b3f058d 100644 (file)
@@ -64,10 +64,11 @@ enum TargetTypeFlags {
        TYPE_OTHER
 };
 
+#include "globals.h"
 #include "dynamic.h"
 #include "base.h"
 #include "ctables.h"
-#include "socket.h"
+#include "inspsocket.h"
 #include <string>
 #include <deque>
 #include <sstream>
@@ -77,6 +78,9 @@ enum TargetTypeFlags {
 class Server;
 class ServerConfig;
 
+// Forward-delacare module for ModuleMessage etc
+class Module;
+
 /** Low level definition of a FileReader classes file cache area
  */
 typedef std::deque<std::string> file_cache;
@@ -87,10 +91,15 @@ typedef file_cache string_list;
 typedef std::deque<userrec*> chanuserlist;
 
 
-// This #define allows us to call a method in all
-// loaded modules in a readable simple way, e.g.:
-// 'FOREACH_MOD OnConnect(user);'
+/** Holds a list of 'published features' for modules.
+ */
+typedef std::map<std::string,Module*> featurelist;
 
+/**
+ * This #define allows us to call a method in all
+ * loaded modules in a readable simple way, e.g.:
+ * 'FOREACH_MOD(I_OnXonnwxr,OnConnect(user));'
+ */
 #define FOREACH_MOD(y,x) if (Config->global_implementation[y] > 0) { \
        for (int _i = 0; _i <= MODCOUNT; _i++) { \
        if (Config->implement_lists[_i][y]) \
@@ -100,17 +109,16 @@ typedef std::deque<userrec*> chanuserlist;
                } \
                catch (ModuleException& modexcept) \
                { \
-                       log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                       log(DEBUG,"Module exception caught: %s",modexcept.GetReason()); \
                } \
        } \
   }
 
-// This define is similar to the one above but returns a result in MOD_RESULT.
-// The first module to return a nonzero result is the value to be accepted,
-// and any modules after are ignored.
-
-// *********************************************************************************************
-
+/**
+ *  This define is similar to the one above but returns a result in MOD_RESULT.
+ * 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 (Config->global_implementation[y] > 0) { \
                        MOD_RESULT = 0; \
                        for (int _i = 0; _i <= MODCOUNT; _i++) { \
@@ -131,8 +139,6 @@ typedef std::deque<userrec*> chanuserlist;
                } \
        } \
  }
-   
-// *********************************************************************************************
 
 #define FD_MAGIC_NUMBER -42
 
@@ -142,12 +148,6 @@ typedef std::deque<userrec*> chanuserlist;
 #define IS_REMOTE(x) (x->fd < 0)
 #define IS_MODULE_CREATED(x) (x->fd == FD_MAGIC_NUMBER)
 
-/*extern void createcommand(char* cmd, handlerfunc f, char flags, int minparams, char* source);
-extern void server_mode(char **parameters, int pcnt, userrec *user);*/
-
-// class Version holds the version information of a Module, returned
-// by Module::GetVersion (thanks RD)
-
 /** Holds a module's Version information
  *  The four 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.
@@ -171,13 +171,6 @@ class Admin : public classbase
         Admin(std::string name, std::string email, std::string nick);
 };
 
-
-// Forward-delacare module for ModuleMessage etc
-class Module;
-
-// Thanks to Rob (from anope) for the idea of this message passing API
-// (its been done before, but this seemed a very neat and tidy way...
-
 /** The ModuleMessage class is the base class of Request and Event
  * This class is used to represent a basic data structure which is passed
  * between modules for safe inter-module communications.
@@ -201,7 +194,7 @@ class Request : public ModuleMessage
  protected:
        /** This member holds a pointer to arbitary data set by the emitter of the message
         */
-       char* data;
+       void* data;
        /** This is a pointer to the sender of the message, which can be used to
         * directly trigger events, or to create a reply.
         */
@@ -212,7 +205,7 @@ class Request : public ModuleMessage
  public:
        /** Create a new Request
         */
-       Request(char* anydata, Module* src, Module* dst);
+       Request(void* anydata, Module* src, Module* dst);
        /** Fetch the Request data
         */
        char* GetData();
@@ -241,7 +234,7 @@ class Event : public ModuleMessage
  protected:
        /** This member holds a pointer to arbitary data set by the emitter of the message
         */
-       char* data;
+       void* data;
        /** This is a pointer to the sender of the message, which can be used to
         * directly trigger events, or to create a reply.
         */
@@ -254,7 +247,7 @@ class Event : public ModuleMessage
  public:
        /** Create a new Event
         */
-       Event(char* anydata, Module* src, const std::string &eventid);
+       Event(void* anydata, Module* src, const std::string &eventid);
        /** Get the Event data
         */
        char* GetData();
@@ -342,7 +335,7 @@ enum Implementation {       I_OnUserConnect, I_OnUserQuit, I_OnUserDisconnect, I_OnUse
 /** 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
- *  instantiated by the ModuleFactory class (see relevent section) for the plugin to be initialised.
+ *  instantiated by the ModuleFactory class (see relevent section) for the module to be initialised.
  */
 class Module : public classbase
 {
@@ -1248,8 +1241,14 @@ class Module : public classbase
         */
        virtual int OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult);
 
+       /** Called whenever a user sets away.
+        * This method has no parameter for the away message, as it is available in the
+        * user record as userrec::awaymsg.
+        */
        virtual void OnSetAway(userrec* user);
 
+       /** Called when a user cancels their away state.
+        */
        virtual void OnCancelAway(userrec* user);
 };
 
@@ -1307,6 +1306,43 @@ class Server : public classbase
         */
        std::string GetVersion();
 
+       /** Publish a 'feature'.
+        * There are two ways for a module to find another module it depends on.
+        * Either by name, using Server::FindModule, or by feature, using this
+        * function. A feature is an arbitary string which identifies something this
+        * module can do. For example, if your module provides SSL support, but other
+        * modules provide SSL support too, all the modules supporting SSL should
+        * publish an identical 'SSL' feature. This way, any module requiring use
+        * of SSL functions can just look up the 'SSL' feature using FindFeature,
+        * then use the module pointer they are given.
+        * @param FeatureName The case sensitive feature name to make available
+        * @param Mod a pointer to your module class
+        * @returns True on success, false if the feature is already published by
+        * another module.
+        */
+       bool PublishFeature(std::string FeatureName, Module* Mod);
+
+       /** Unpublish a 'feature'.
+        * When your module exits, it must call this method for every feature it
+        * is providing so that the feature table is cleaned up.
+        * @param FeatureName the feature to remove
+        */
+       bool UnpublishFeature(std::string FeatureName);
+
+       /** Find a 'feature'.
+        * There are two ways for a module to find another module it depends on.
+        * Either by name, using Server::FindModule, or by feature, using the
+        * Server::PublishFeature method. A feature is an arbitary string which
+        * identifies something this module can do. For example, if your module
+        * provides SSL support, but other modules provide SSL support too, all
+        * the modules supporting SSL should publish an identical 'SSL' feature.
+        * To find a module capable of providing the feature you want, simply
+        * call this method with the feature name you are looking for.
+        * @param FeatureName The feature name you wish to obtain the module for
+        * @returns A pointer to a valid module class on success, NULL on failure.
+        */
+       Module* FindFeature(std::string FeatureName);
+
        /** Writes a log string.
         * This method writes a line of text to the log. If the level given is lower than the
         * level given in the configuration, this command has no effect.
@@ -1373,7 +1409,7 @@ class Server : public classbase
         * back to the user from which it originated, as seen in NICK (see RFC 1459). Otherwise, it
         * is only sent to the other recipients, as seen in QUIT.
         */
-       virtual void SendCommon(userrec* User, std::string text, bool IncludeSender);
+       virtual void SendCommon(userrec* User, const std::string &text, bool IncludeSender);
 
        /** Sends a WALLOPS message.
         * This method writes a WALLOPS message to all users with the +w flag, originating from the
@@ -1608,14 +1644,14 @@ class Server : public classbase
         * dhost member of userrec, as any change applied via this method will be propogated to any
         * linked servers.
         */     
-       virtual void ChangeHost(userrec* user, std::string host);
+       virtual void ChangeHost(userrec* user, const std::string &host);
        
        /** Change GECOS (fullname) of a user.
         * You should always call this method to change a user's GECOS rather than writing directly to the
         * fullname member of userrec, as any change applied via this method will be propogated to any
         * linked servers.
         */     
-       virtual void ChangeGECOS(userrec* user, std::string gecos);
+       virtual void ChangeGECOS(userrec* user, const std::string &gecos);
        
        /** Returns true if the servername you give is ulined.
         * ULined servers have extra privilages. They are allowed to change nicknames on remote servers,
@@ -1661,7 +1697,7 @@ class Server : public classbase
         * to indicate who or what sent the data, usually this is the nickname of a person, or a server
         * name.
         */
-       virtual void AddQLine(long duration, const std::string &source, const std::string &reason, const std::string nickname);
+       virtual void AddQLine(long duration, const std::string &source, const std::string &reason, const std::string &nickname);
 
        /** Adds a Z-line
         * The Z-line is propogated to all of the servers in the mesh and enforced as soon as it is added.
@@ -1739,13 +1775,28 @@ class Server : public classbase
         */
        virtual void DelSocket(InspSocket* sock);
 
+       /** Causes the local server to rehash immediately.
+        * WARNING: Do not call this method from within your rehash method, for
+        * obvious reasons!
+        */
        virtual void RehashServer();
 
+       /** This method returns the total number of channels on the network.
+        */
        virtual long GetChannelCount();
 
+       /** This method returns a channel whos index is greater than or equal to 0 and less than the number returned by Server::GetChannelCount().
+        * This is slower (by factors of dozens) than requesting a channel by name with Server::FindChannel(), however there are times when
+        * you wish to safely iterate the channel list, saving your position, with large amounts of time in between, which is what this function
+        * is useful for.
+        */
        virtual chanrec* GetChannelIndex(long index);
 
-       void DumpText(userrec* User, std::string LinePrefix, stringstream &TextStream);
+       /** Dumps text (in a stringstream) to a user. The stringstream should not contain linefeeds, as it will be split
+        * automatically by the function into safe amounts. The line prefix given is prepended onto each line (e.g. a servername
+        * and a numeric).
+        */
+       void DumpText(userrec* User, const std::string &LinePrefix, stringstream &TextStream);
 };
 
 
@@ -1769,10 +1820,11 @@ class ConfigReader : public classbase
         * core is changed). It will contain a pointer to the configuration file data with unneeded data
         * (such as comments) stripped from it.
         */
-       std::stringstream *cache;
-       std::stringstream *errorlog;
+       ConfigDataHash* data;
+       std::ostringstream* errorlog;;
        /** Used to store errors
         */
+       bool privatehash; // If we're using our own config data hash or not.
        bool readerror;
        long error;
        
@@ -1852,6 +1904,8 @@ class ConfigReader : public classbase
  */
 class FileReader : public classbase
 {
+       /** The file contents
+        */
        file_cache fc;
  public:
         /** Default constructor.
@@ -1919,6 +1973,8 @@ class ModuleFactory : public classbase
 
 
 typedef DLLFactory<ModuleFactory> ircd_module;
+typedef std::vector<Module*> ModuleList;
+typedef std::vector<ircd_module*> FactoryList;
 
 bool ModeDefined(char c, int i);
 bool ModeDefinedOper(char c, int i);