26 #include <ibrcommon/refcnt_ptr.h>
27 #include <ibrcommon/data/Base64Stream.h>
28 #include <ibrcommon/data/Base64Reader.h>
29 #include <ibrcommon/Logger.h>
59 : _stream(stream), _encoding(enc)
73 _stream <<
"Blocks: " << obj.
size() << std::endl;
110 _stream <<
"Block: " << (int)((
unsigned char)obj.
getType()) << std::endl;
112 std::stringstream flags;
116 flags <<
" LAST_BLOCK";
121 flags <<
" REPLICATE_IN_EVERY_FRAGMENT";
126 flags <<
" TRANSMIT_STATUSREPORT_IF_NOT_PROCESSED";
131 flags <<
" DELETE_BUNDLE_IF_NOT_PROCESSED";
136 flags <<
" DISCARD_IF_NOT_PROCESSED";
141 flags <<
" FORWARDED_WITHOUT_PROCESSED";
144 if (flags.str().length() > 0)
146 _stream <<
"Flags:" << flags.str() << std::endl;
151 std::list<dtn::data::EID> eid_list = obj.
getEIDList();
153 for (std::list<dtn::data::EID>::const_iterator iter = eid_list.begin(); iter != eid_list.end(); ++iter)
155 _stream <<
"EID: " << (*iter).getString() << std::endl;
159 _stream <<
"Length: " << obj.
getLength() << std::endl;
165 _stream << std::endl;
173 ibrcommon::Base64Stream b64(_stream,
false, 80);
181 _stream << std::flush;
188 }
catch (
const std::exception &ex) {
189 std::cerr << ex.what() << std::endl;
192 _stream << std::endl;
214 : _stream(stream), _lastblock(false)
236 while (!_stream.eof() && !_lastblock)
241 IBRCOMMON_LOGGER_DEBUG_TAG(
"PlainDeserializer", 5) <<
"unknown block has been discarded " << obj.
toString() <<
" has been removed" << IBRCOMMON_LOGGER_ENDL;
243 IBRCOMMON_LOGGER_DEBUG_TAG(
"PlainDeserializer", 5) <<
"unknown administrative block in bundle " << obj.
toString() <<
" has been removed" << IBRCOMMON_LOGGER_ENDL;
245 IBRCOMMON_LOGGER_DEBUG_TAG(
"PlainDeserializer", 5) <<
"unprocessable block in bundle " << obj.
toString() <<
" has been removed" << IBRCOMMON_LOGGER_ENDL;
257 while (_stream.good())
259 getline(_stream, data);
261 std::string::reverse_iterator iter = data.rbegin();
262 if ( (*iter) ==
'\r' ) data = data.substr(0, data.length() - 1);
268 if (data.size() == 0)
break;
274 if (values.size() < 1)
throw ibrcommon::Exception(
"parsing error");
277 if (values[0] ==
"Processing flags")
281 else if (values[0] ==
"Timestamp")
285 else if (values[0] ==
"Sequencenumber")
289 else if (values[0] ==
"Source")
293 else if (values[0] ==
"Destination")
297 else if (values[0] ==
"Reportto")
301 else if (values[0] ==
"Custodian")
305 else if (values[0] ==
"Lifetime")
309 else if (values[0] ==
"Fragment offset")
313 else if (values[0] ==
"Application data length")
329 while (_stream.good())
331 getline(_stream, data);
333 std::string::reverse_iterator iter = data.rbegin();
334 if ( (*iter) ==
'\r' ) data = data.substr(0, data.length() - 1);
340 if (data.size() == 0)
break;
346 if(values.size() < 2)
350 if (values[0] ==
"Flags")
354 for (std::vector<std::string>::const_iterator iter = flags.begin(); iter != flags.end(); ++iter)
356 const std::string &value = (*iter);
357 if (value ==
"LAST_BLOCK")
362 else if (value ==
"FORWARDED_WITHOUT_PROCESSED")
366 else if (value ==
"DISCARD_IF_NOT_PROCESSED")
370 else if (value ==
"DELETE_BUNDLE_IF_NOT_PROCESSED")
374 else if (value ==
"TRANSMIT_STATUSREPORT_IF_NOT_PROCESSED")
378 else if (value ==
"REPLICATE_IN_EVERY_FRAGMENT")
384 else if (values[0] ==
"EID")
389 else if (values[0] ==
"Length")
391 std::stringstream ss; ss.str(values[1]);
394 else if (values[0] ==
"Encoding")
396 std::stringstream ss; ss << values[1]; ss.clear(); ss >> values[1];
402 IBRCOMMON_LOGGER_DEBUG_TAG(
"PlainDeserializer", 20) <<
"API expecting payload size of " << blocksize << IBRCOMMON_LOGGER_ENDL;
408 ibrcommon::Base64Reader base64_decoder(_stream, blocksize);
423 getline(_stream, buffer);
424 std::string::reverse_iterator iter = buffer.rbegin();
425 if ( (*iter) ==
'\r' ) buffer = buffer.substr(0, buffer.length() - 1);
429 getline(_stream, buffer);
430 iter = buffer.rbegin();
431 if ( (*iter) ==
'\r' ) buffer = buffer.substr(0, buffer.length() - 1);
444 while (_stream.good())
446 getline(_stream, data);
448 std::string::reverse_iterator iter = data.rbegin();
449 if ( (*iter) ==
'\r' ) data = data.substr(0, data.length() - 1);
452 if (data.size() == 0)
break;
458 if(values.size() < 1)
462 if (values[0] ==
"Length")
464 std::stringstream ss; ss.str(values[1]);
467 else if (values[0] ==
"Encoding")
469 std::stringstream ss; ss << values[1]; ss.clear(); ss >> values[1];
479 ibrcommon::Base64Reader base64_decoder(_stream, blocksize);
480 ibrcommon::BLOB::copy(*obj, base64_decoder, blocksize);
484 ibrcommon::BLOB::copy(*obj, _stream, blocksize);
494 getline(_stream, buffer);
495 std::string::reverse_iterator iter = buffer.rbegin();
496 if ( (*iter) ==
'\r' ) buffer = buffer.substr(0, buffer.length() - 1);
500 getline(_stream, buffer);
501 iter = buffer.rbegin();
502 if ( (*iter) ==
'\r' ) buffer = buffer.substr(0, buffer.length() - 1);
510 _stream <<
"Length: " << block.
getLength() << std::endl;
512 _stream << std::endl;
521 ibrcommon::Base64Stream b64(_stream,
false, 80);
534 _stream << std::endl;
539 _stream <<
"Length: " << len << std::endl;
541 _stream << std::endl;
547 ibrcommon::Base64Stream b64(_stream,
false, 80);
548 ibrcommon::BLOB::copy(b64, stream, len);
554 ibrcommon::BLOB::copy(_stream, stream, len);
555 _stream << std::flush;
561 _stream << std::endl;
574 getline(_stream, data);
576 std::string::reverse_iterator iter = data.rbegin();
577 if ( (*iter) ==
'\r' ) data = data.substr(0, data.length() - 1);
580 if (data.size() == 0)
break;
585 if (values[0] ==
"Length")
587 std::stringstream ss; ss.str(values[1]);
590 else if (values[0] ==
"Encoding")
592 std::stringstream ss; ss << values[1]; ss.clear(); ss >> values[1];
603 ibrcommon::Base64Stream b64(stream,
true);
607 getline(_stream, data);
609 std::string::reverse_iterator iter = data.rbegin();
610 if ( (*iter) ==
'\r' ) data = data.substr(0, data.length() - 1);
613 if (data.size() == 0)
break;
621 ibrcommon::BLOB::copy(stream, _stream, len);
631 getline(_stream, buffer);
633 std::string::reverse_iterator iter = buffer.rbegin();
634 if ( (*iter) ==
'\r' ) buffer = buffer.substr(0, buffer.length() - 1);
642 if (values[0] ==
"Block")
644 std::stringstream ss; ss.str(values[1]);
std::string toString() const
virtual ~PlainDeserializer()
Bitset< FLAGS > procflags
bool get(ProcFlags flag) const
static Encoding parseEncoding(const std::string &data)
void readData(std::ostream &stream)
dtn::data::Timestamp timestamp
dtn::data::Block & readBlock(dtn::data::BundleBuilder &builder)
void writeData(const dtn::data::Block &block)
void set(ProcFlags flag, const bool &value)
virtual void addEID(const dtn::data::EID &eid)
virtual std::ostream & serialize(std::ostream &stream, Length &length) const =0
dtn::data::Length getLength(const dtn::data::Bundle &obj)
PlainDeserializer(std::istream &stream)
virtual std::istream & deserialize(std::istream &stream, const Length &length)=0
dtn::data::Deserializer & operator>>(dtn::data::Bundle &obj)
dtn::data::Number sequencenumber
std::string toString() const
block_list::const_iterator const_iterator
dtn::data::Serializer & operator<<(const dtn::data::Bundle &obj)
virtual ~PlainSerializer()
virtual const eid_list & getEIDList() const
PlainSerializer(std::ostream &stream, Encoding enc=BASE64)
T & insert(const Bitset< Block::ProcFlags > &procflags)
void fromString(const std::string &data)
virtual Length getLength() const =0
std::string getString() const
static std::string printEncoding(const Encoding &enc)
const block_t & getType() const
dtn::data::Number fragmentoffset
static std::vector< std::string > tokenize(const std::string &token, const std::string &data, const std::string::size_type max=std::string::npos)