X-Git-Url: http://git.tdb.fi/?p=libs%2Fnet.git;a=blobdiff_plain;f=source%2Fnet%2Fprotocol.h;fp=source%2Fnet%2Fprotocol.h;h=f722a76c82a7cc73b83d4880b7ac8043f45bd889;hp=f6c382c9f1ca003e2dbb982e0d7f59867c3a5ae3;hb=df1b7561be0d4a57e964c783c01060c54864ec60;hpb=400f3e031834eee9d96dbd5cda25655102b75805 diff --git a/source/net/protocol.h b/source/net/protocol.h index f6c382c..f722a76 100644 --- a/source/net/protocol.h +++ b/source/net/protocol.h @@ -40,6 +40,7 @@ private: { virtual ~CompoundTypeDef() { } + virtual std::string describe() const = 0; virtual char *serialize(const C &, char *, char *) const = 0; virtual const char *deserialize(C &, const char *, const char *) const = 0; }; @@ -52,6 +53,7 @@ private: CompoundDef(const S &); virtual ~CompoundDef(); + virtual std::string describe() const; virtual char *serialize(const C &, char *, char *) const; virtual const char *deserialize(C &, const char *, const char *) const; }; @@ -64,6 +66,7 @@ private: BasicSerializer(const Protocol &) { } + std::string describe() const { return get_type_signature(); } char *serialize(const T &, char *, char *) const; const char *deserialize(T &, const char *, const char *) const; }; @@ -79,6 +82,7 @@ private: public: StringSerializer(const Protocol &); + std::string describe() const { return get_type_signature(); } char *serialize(const std::string &, char *, char *) const; const char *deserialize(std::string &, const char *, const char *) const; }; @@ -96,6 +100,7 @@ private: public: ArraySerializer(const Protocol &); + std::string describe() const; char *serialize(const A &, char *, char *) const; const char *deserialize(A &, const char *, const char *) const; }; @@ -119,6 +124,7 @@ private: public: Serializer(const Head &, Pointer, const Protocol &); + std::string describe() const; char *serialize(const P &, char *, char *) const; const char *deserialize(P &, const char *, const char *) const; }; @@ -133,6 +139,7 @@ private: typedef Serializer::Serializer> Type; }; + std::string describe() const { return std::string(); } char *serialize(const P &, char *b, char *) const { return b; } const char *deserialize(P &, const char *b, const char *) const { return b; } }; @@ -149,6 +156,7 @@ private: virtual ~PacketDefBase() { } virtual unsigned get_class_id() const = 0; unsigned get_id() const { return id; } + virtual std::string describe() const = 0; virtual const char *dispatch(ReceiverBase &, const char *, const char *) const = 0; }; @@ -172,6 +180,7 @@ private: const CompoundTypeDef

&get_compound() const { return *compound; } + virtual std::string describe() const; char *serialize(const P &, char *, char *) const; const char *deserialize(P &, const char *, const char *) const; virtual const char *dispatch(ReceiverBase &, const char *, const char *) const; @@ -233,7 +242,11 @@ public: unsigned get_packet_size(const char *, unsigned) const; unsigned dispatch(ReceiverBase &, const char *, unsigned) const; - unsigned get_hash() const; + UInt64 get_hash() const; + +private: + template + static std::string get_type_signature(); }; @@ -262,32 +275,46 @@ unsigned Protocol::serialize(const P &pkt, char *buf, unsigned size) const return size; } +template +std::string Protocol::get_type_signature() +{ + const UInt16 sig = Traits::signature; + std::string result; + result += sig&0xFF; + if(sig>=0x100) + result += '0'+(sig>>8); + return result; +} + template struct Protocol::BasicTraits { + static const UInt16 signature = K | (sizeof(T)<<8); typedef BasicSerializer Serializer; }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; -template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; +template<> struct Protocol::Traits: BasicTraits { }; template<> struct Protocol::Traits { + static const UInt16 signature = 'S'; typedef StringSerializer Serializer; }; template struct Protocol::Traits > { + static const UInt16 signature = 'A'; typedef ArraySerializer > Serializer; }; @@ -304,6 +331,12 @@ Protocol::CompoundDef::~CompoundDef() delete serializer; } +template +std::string Protocol::CompoundDef::describe() const +{ + return "{"+serializer->describe()+"}"; +} + template char *Protocol::CompoundDef::serialize(const C &com, char *buf, char *end) const { @@ -323,6 +356,12 @@ Protocol::ArraySerializer::ArraySerializer(const Protocol &proto): element_serializer(proto) { } +template +std::string Protocol::ArraySerializer::describe() const +{ + return "["+element_serializer.describe()+"]"; +} + template char *Protocol::ArraySerializer::serialize(const A &array, char *buf, char *end) const { @@ -351,6 +390,12 @@ Protocol::Serializer::Serializer(const Head &h, Pointer p, const Pro ser(proto) { } +template +std::string Protocol::Serializer::describe() const +{ + return Head::describe()+ser.describe(); +} + template char * Protocol::Serializer::serialize(const P &pkt, char *buf, char *end) const { @@ -392,6 +437,12 @@ void Protocol::PacketTypeDef

::set_serializer(const S &ser) compound = new CompoundDef(ser); } +template +std::string Protocol::PacketTypeDef

::describe() const +{ + return compound->describe(); +} + template char *Protocol::PacketTypeDef

::serialize(const P &pkt, char *buf, char *end) const {