summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules.h22
-rw-r--r--src/modules.cpp27
2 files changed, 45 insertions, 4 deletions
diff --git a/include/modules.h b/include/modules.h
index 18a4a6dbb..fdc1ac178 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -193,6 +193,11 @@ class Request : public ModuleMessage
/** This member holds a pointer to arbitary data set by the emitter of the message
*/
char* data;
+ /** This should be a null-terminated string identifying the type of request,
+ * all modules should define this and use it to determine the nature of the
+ * request before they attempt to cast the Request in any way.
+ */
+ const char* id;
/** This is a pointer to the sender of the message, which can be used to
* directly trigger events, or to create a reply.
*/
@@ -202,11 +207,28 @@ class Request : public ModuleMessage
Module* dest;
public:
/** Create a new Request
+ * This is for the 'old' way of casting whatever the data is
+ * to char* and hoping you get the right thing at the other end.
+ * This is slowly being depreciated in favor of the 'new' way.
*/
Request(char* anydata, Module* src, Module* dst);
+ /** Create a new Request
+ * This is for the 'new' way of defining a subclass
+ * of Request and defining it in a common header,
+ * passing an object of your Request subclass through
+ * as a Request* and using the ID string to determine
+ * what to cast it back to and the other end. This is
+ * much safer as there are no casts not confirmed by
+ * the ID string, and all casts are child->parent and
+ * can be checked at runtime with dynamic_cast<>()
+ */
+ Request(Module* src, Module* dst, const char* idstr);
/** Fetch the Request data
*/
char* GetData();
+ /** Fetch the ID string
+ */
+ const char* GetId();
/** Fetch the request source
*/
Module* GetSource();
diff --git a/src/modules.cpp b/src/modules.cpp
index ca533b523..13cc3e740 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -64,17 +64,36 @@ featurelist Features;
// version is a simple class for holding a modules version number
-Version::Version(int major, int minor, int revision, int build, int flags) : Major(major), Minor(minor), Revision(revision), Build(build), Flags(flags) { };
+Version::Version(int major, int minor, int revision, int build, int flags)
+: Major(major), Minor(minor), Revision(revision), Build(build), Flags(flags)
+{
+}
// admin is a simple class for holding a server's administrative info
-Admin::Admin(std::string name, std::string email, std::string nick) : Name(name), Email(email), Nick(nick) { };
+Admin::Admin(std::string name, std::string email, std::string nick)
+: Name(name), Email(email), Nick(nick)
+{
+}
-Request::Request(char* anydata, Module* src, Module* dst) : data(anydata), source(src), dest(dst) { };
+Request::Request(char* anydata, Module* src, Module* dst)
+: data(anydata), source(src), dest(dst)
+{
+}
+
+Request::Request(Module* src, Module* dst, const char* idstr)
+: id(idstr), source(src), dest(dst)
+{
+};
char* Request::GetData()
{
- return (char*)this->data;
+ return this->data;
+}
+
+const char* Request::GetId()
+{
+ return this->id;
}
Module* Request::GetSource()