00001 // -*- C++ -*- 00002 /* 00003 * File: Serializer.h 00004 * Author: morgenro 00005 * 00006 * Created on 30. Mai 2010, 15:31 00007 */ 00008 00009 #ifndef _SERIALIZER_H 00010 #define _SERIALIZER_H 00011 00012 #include <iostream> 00013 #include "ibrdtn/data/Dictionary.h" 00014 #include "ibrdtn/data/PrimaryBlock.h" 00015 #include "ibrdtn/data/Exceptions.h" 00016 00017 namespace dtn 00018 { 00019 namespace data 00020 { 00021 class Bundle; 00022 class Block; 00023 class PrimaryBlock; 00024 00025 class Serializer 00026 { 00027 public: 00028 virtual ~Serializer() {}; 00029 00030 virtual Serializer &operator<<(const dtn::data::Bundle &obj) = 0; 00031 virtual Serializer &operator<<(const dtn::data::PrimaryBlock &obj) = 0; 00032 virtual Serializer &operator<<(const dtn::data::Block &obj) = 0; 00033 00034 virtual size_t getLength(const dtn::data::Bundle &obj) = 0; 00035 virtual size_t getLength(const dtn::data::PrimaryBlock &obj) const = 0; 00036 virtual size_t getLength(const dtn::data::Block &obj) const = 0; 00037 }; 00038 00039 class Deserializer 00040 { 00041 public: 00042 virtual ~Deserializer() {}; 00043 00044 virtual Deserializer &operator>>(dtn::data::Bundle &obj) = 0; 00045 virtual Deserializer &operator>>(dtn::data::PrimaryBlock &obj) = 0; 00046 virtual Deserializer &operator>>(dtn::data::Block &obj) = 0; 00047 }; 00048 00049 class Validator 00050 { 00051 public: 00052 class RejectedException : public dtn::SerializationFailedException 00053 { 00054 public: 00055 RejectedException(string what = "A validate method has the bundle rejected.") throw() : dtn::SerializationFailedException(what) 00056 { 00057 }; 00058 }; 00059 00060 virtual void validate(const dtn::data::PrimaryBlock&) const throw (RejectedException) = 0; 00061 virtual void validate(const dtn::data::Block&, const size_t) const throw (RejectedException) = 0; 00062 virtual void validate(const dtn::data::Bundle&) const throw (RejectedException) = 0; 00063 }; 00064 00065 class AcceptValidator : public Validator 00066 { 00067 public: 00068 AcceptValidator(); 00069 virtual ~AcceptValidator(); 00070 00071 virtual void validate(const dtn::data::PrimaryBlock&) const throw (RejectedException); 00072 virtual void validate(const dtn::data::Block&, const size_t) const throw (RejectedException); 00073 virtual void validate(const dtn::data::Bundle&) const throw (RejectedException); 00074 }; 00075 00076 class DefaultSerializer : public Serializer 00077 { 00078 public: 00083 DefaultSerializer(std::ostream &stream); 00084 00091 DefaultSerializer(std::ostream &stream, const Dictionary &d); 00092 00096 virtual ~DefaultSerializer() {}; 00097 00098 virtual Serializer &operator<<(const dtn::data::Bundle &obj); 00099 virtual Serializer &operator<<(const dtn::data::PrimaryBlock &obj); 00100 virtual Serializer &operator<<(const dtn::data::Block &obj); 00101 00102 virtual size_t getLength(const dtn::data::Bundle &obj); 00103 virtual size_t getLength(const dtn::data::PrimaryBlock &obj) const; 00104 virtual size_t getLength(const dtn::data::Block &obj) const; 00105 00106 protected: 00107 void rebuildDictionary(const dtn::data::Bundle &obj); 00108 bool isCompressable(const dtn::data::Bundle &obj) const; 00109 std::ostream &_stream; 00110 00111 Dictionary _dictionary; 00112 bool _compressable; 00113 }; 00114 00115 class DefaultDeserializer : public Deserializer 00116 { 00117 public: 00122 DefaultDeserializer(std::istream &stream); 00123 00131 DefaultDeserializer(std::istream &stream, Validator &v); 00132 00140 DefaultDeserializer(std::istream &stream, const Dictionary &d); 00141 00146 virtual ~DefaultDeserializer() {}; 00147 00148 virtual Deserializer &operator>>(dtn::data::Bundle &obj); 00149 virtual Deserializer &operator>>(dtn::data::PrimaryBlock &obj); 00150 virtual Deserializer &operator>>(dtn::data::Block &obj); 00151 00152 protected: 00153 std::istream &_stream; 00154 Validator &_validator; 00155 AcceptValidator _default_validator; 00156 00157 private: 00158 Dictionary _dictionary; 00159 bool _compressed; 00160 }; 00161 00162 class SeparateSerializer : public DefaultSerializer 00163 { 00164 public: 00165 SeparateSerializer(std::ostream &stream); 00166 virtual ~SeparateSerializer(); 00167 00168 virtual Serializer &operator<<(const dtn::data::Block &obj); 00169 virtual size_t getLength(const dtn::data::Block &obj) const; 00170 }; 00171 00172 class SeparateDeserializer : public DefaultDeserializer 00173 { 00174 public: 00175 SeparateDeserializer(std::istream &stream, Bundle &b); 00176 virtual ~SeparateDeserializer(); 00177 00178 void readBlock(); 00179 00180 virtual Deserializer &operator>>(dtn::data::Block &obj); 00181 00182 private: 00183 Bundle &_bundle; 00184 }; 00185 } 00186 } 00187 00188 00189 #endif /* _SERIALIZER_H */ 00190
1.7.1