|
IBR-DTNSuite 0.6
|
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 #include "ibrdtn/data/BundleFragment.h" 00017 00018 namespace dtn 00019 { 00020 namespace data 00021 { 00022 class Bundle; 00023 class Block; 00024 class PrimaryBlock; 00025 class PayloadBlock; 00026 00027 class Serializer 00028 { 00029 public: 00030 virtual ~Serializer() {}; 00031 00032 virtual Serializer &operator<<(const dtn::data::Bundle &obj) = 0; 00033 virtual Serializer &operator<<(const dtn::data::PrimaryBlock &obj) = 0; 00034 virtual Serializer &operator<<(const dtn::data::Block &obj) = 0; 00035 virtual Serializer &operator<<(const dtn::data::BundleFragment &obj) 00036 { 00037 (*this) << obj._bundle; 00038 return (*this); 00039 }; 00040 00041 virtual size_t getLength(const dtn::data::Bundle &obj) = 0; 00042 virtual size_t getLength(const dtn::data::PrimaryBlock &obj) const = 0; 00043 virtual size_t getLength(const dtn::data::Block &obj) const = 0; 00044 }; 00045 00046 class Deserializer 00047 { 00048 public: 00049 virtual ~Deserializer() {}; 00050 00051 virtual Deserializer &operator>>(dtn::data::Bundle &obj) = 0; 00052 virtual Deserializer &operator>>(dtn::data::PrimaryBlock &obj) = 0; 00053 virtual Deserializer &operator>>(dtn::data::Block &obj) = 0; 00054 }; 00055 00056 class Validator 00057 { 00058 public: 00059 class RejectedException : public dtn::SerializationFailedException 00060 { 00061 public: 00062 RejectedException(string what = "A validate method has the bundle rejected.") throw() : dtn::SerializationFailedException(what) 00063 { 00064 }; 00065 }; 00066 00067 virtual void validate(const dtn::data::PrimaryBlock&) const throw (RejectedException) = 0; 00068 virtual void validate(const dtn::data::Block&, const size_t) const throw (RejectedException) = 0; 00069 virtual void validate(const dtn::data::Bundle&) const throw (RejectedException) = 0; 00070 }; 00071 00072 class AcceptValidator : public Validator 00073 { 00074 public: 00075 AcceptValidator(); 00076 virtual ~AcceptValidator(); 00077 00078 virtual void validate(const dtn::data::PrimaryBlock&) const throw (RejectedException); 00079 virtual void validate(const dtn::data::Block&, const size_t) const throw (RejectedException); 00080 virtual void validate(const dtn::data::Bundle&) const throw (RejectedException); 00081 }; 00082 00083 class DefaultSerializer : public Serializer 00084 { 00085 public: 00090 DefaultSerializer(std::ostream &stream); 00091 00098 DefaultSerializer(std::ostream &stream, const Dictionary &d); 00099 00103 virtual ~DefaultSerializer() {}; 00104 00105 virtual Serializer &operator<<(const dtn::data::Bundle &obj); 00106 virtual Serializer &operator<<(const dtn::data::PrimaryBlock &obj); 00107 virtual Serializer &operator<<(const dtn::data::Block &obj); 00108 virtual Serializer &operator<<(const dtn::data::BundleFragment &obj); 00109 00110 virtual size_t getLength(const dtn::data::Bundle &obj); 00111 virtual size_t getLength(const dtn::data::PrimaryBlock &obj) const; 00112 virtual size_t getLength(const dtn::data::Block &obj) const; 00113 00114 protected: 00115 Serializer &serialize(const dtn::data::PayloadBlock& obj, size_t clip_offset, size_t clip_length); 00116 void rebuildDictionary(const dtn::data::Bundle &obj); 00117 bool isCompressable(const dtn::data::Bundle &obj) const; 00118 std::ostream &_stream; 00119 00120 Dictionary _dictionary; 00121 bool _compressable; 00122 }; 00123 00124 class DefaultDeserializer : public Deserializer 00125 { 00126 public: 00131 DefaultDeserializer(std::istream &stream); 00132 00140 DefaultDeserializer(std::istream &stream, Validator &v); 00141 00149 DefaultDeserializer(std::istream &stream, const Dictionary &d); 00150 00155 virtual ~DefaultDeserializer() {}; 00156 00157 virtual Deserializer &operator>>(dtn::data::Bundle &obj); 00158 virtual Deserializer &operator>>(dtn::data::PrimaryBlock &obj); 00159 virtual Deserializer &operator>>(dtn::data::Block &obj); 00160 00161 protected: 00162 std::istream &_stream; 00163 Validator &_validator; 00164 AcceptValidator _default_validator; 00165 00166 private: 00167 Dictionary _dictionary; 00168 bool _compressed; 00169 }; 00170 00171 class SeparateSerializer : public DefaultSerializer 00172 { 00173 public: 00174 SeparateSerializer(std::ostream &stream); 00175 virtual ~SeparateSerializer(); 00176 00177 virtual Serializer &operator<<(const dtn::data::Block &obj); 00178 virtual size_t getLength(const dtn::data::Block &obj) const; 00179 }; 00180 00181 class SeparateDeserializer : public DefaultDeserializer 00182 { 00183 public: 00184 SeparateDeserializer(std::istream &stream, Bundle &b); 00185 virtual ~SeparateDeserializer(); 00186 00187 dtn::data::Block& readBlock(); 00188 00189 virtual Deserializer &operator>>(dtn::data::Block &obj); 00190 00191 private: 00192 Bundle &_bundle; 00193 }; 00194 } 00195 } 00196 00197 00198 #endif /* _SERIALIZER_H */ 00199