libt2n: (gerd) improve docu, cleanup for public release
[libt2n] / src / command_server.hxx
index 2f3df5a..be3a6ab 100644 (file)
@@ -19,6 +19,7 @@
 #ifndef __LIBT2N_COMMAND_SERVER
 #define __LIBT2N_COMMAND_SERVER
 
+#include "command.hxx"
 #include "server.hxx"
 
 namespace libt2n
@@ -32,15 +33,40 @@ class command_server
 
         void handle_packet(const std::string& packet, server_connection* conn);
 
+    protected:
+        virtual command* cast_command(command* input)
+            { return input; }
+
     public:
         command_server(server& _s);
 
-        void handle(long long usec_timeout=-1);
+        void handle(long long usec_timeout=-1, long long* usec_timeout_remaining=NULL);
 
-        void new_connection_callback(server_connection* conn);
+        void send_hello(unsigned int conn_id);
 };
 
-}
+template<class T, class B> struct Derived_from {
+        static void constraints(T* p) { B* pb = p; }
+        Derived_from() { void(*p)(T*) = constraints; }
+};
 
+/** @brief server handling group of incoming commands
+
+    the template must be derived from libt2n::command.
+*/
+template<class COMMAND_GROUP>
+class group_command_server : public command_server
+{
+    private:
+        virtual command* cast_command(command* input)
+            { return dynamic_cast<COMMAND_GROUP*>(input); }
+
+    public:
+        group_command_server(server& _s)
+            : command_server(_s)
+        { Derived_from<COMMAND_GROUP,command>(); }
+};
+
+}
 #endif