IBR-DTNSuite 0.6

ibrdtn/ibrdtn/data/Serializer.h

Go to the documentation of this file.
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