#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>
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