]> git.stg.codes - stg.git/blobdiff - stglibs/sgcp.lib/include/stg/sgcp_proto.h
Experimental implementation of SGCP using Boost.Asio.
[stg.git] / stglibs / sgcp.lib / include / stg / sgcp_proto.h
index 3cc35b19223e388036b18646d4a1bdb8d3bda1b5..04bc3c8835e73c81afc44ffd92102993cc63ff86 100644 (file)
 
 #include "stg/os_int.h"
 
+#include <boost/asio/basic_stream_socket.hpp>
+#include <boost/function.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/system/error_code.hpp>
+
 #include <string>
 #include <vector>
 #include <stdexcept>
@@ -40,68 +45,35 @@ class TransportProto;
 class Proto
 {
     public:
+        enum { CONTEXT = 0 };
+        enum PacketType {
+            INFO = 0,
+            PING,
+            PONG,
+            DATA
+        };
+
         struct Error : public std::runtime_error
         {
-            Error(const std::string& mesage);
-            Error();
+            Error(const std::string& mesage) : runtime_error(message) {}
         };
 
+        typedef boost::function<void (ConnectionPtr /*conn*/, const std::string& /*enpoint*/, const std::string& /*error*/)> AcceptHandler;
+
         Proto(TransportType transport, const std::string& key);
         ~Proto();
 
-        void connect(const std::string& address, uint16_t port);
-
-        void writeAllBuf(const void* buf, size_t size);
-        void readAllBuf(void* buf, size_t size);
-
-        template <typename T>
-        void writeAll(const T& value);
+        ConnectionPtr connect(const std::string& address, uint16_t port);
+        void bind(const std::string& address, uint16_t port, AcceptHandler handler);
 
-        template <typename T>
-        T readAll();
+        void run();
+        bool stop();
 
     private:
-        TransportProto* m_transport;
+        class Impl;
+        boost::scoped_ptr<Impl> m_impl;
 };
 
-template <>
-inline
-void Proto::writeAll<uint64_t>(const uint64_t& value)
-{
-    uint64_t temp = hton(value);
-    writeAllBuf(&temp, sizeof(temp));
-}
-
-template <>
-inline
-void Proto::writeAll<std::string>(const std::string& value)
-{
-    uint64_t size = hton(value.size());
-    writeAllBuf(&size, sizeof(size));
-    writeAllBuf(value.c_str(), value.size());
-}
-
-template <>
-inline
-uint64_t Proto::readAll<uint64_t>()
-{
-    uint64_t temp = 0;
-    readAllBuf(&temp, sizeof(temp));
-    return ntoh(temp);
-}
-
-template <>
-inline
-std::string Proto::readAll<std::string>()
-{
-    uint64_t size = 0;
-    readAllBuf(&size, sizeof(size));
-    size = ntoh(size);
-    std::vector<char> res(size);
-    readAllBuf(res.data(), res.size());
-    return res.data();
-}
-
 } // namespace SGCP
 } // namespace STG