27 #include <ibrcommon/thread/MutexLock.h>
28 #include <ibrcommon/Logger.h>
35 : _bundle(), _blob(ref), _initialized(false), _hasFirstFragBlocksAdded(false), _hasLastFragBlocksAdded(false), _appdatalength(0)
54 bool BundleMerger::Container::contains(
Length offset,
Length length)
const
57 for (std::set<Chunk>::const_iterator iter = _chunks.begin(); iter != _chunks.end(); ++iter)
59 const Chunk &chunk = (*iter);
61 if (offset < chunk.
offset)
break;
65 if ((offset + length) <= (chunk.
offset + chunk.
length))
return true;
72 void BundleMerger::Container::add(
Length offset,
Length length)
74 BundleMerger::Chunk chunk(offset, length);
75 _chunks.insert(chunk);
83 throw ibrcommon::Exception(
"This bundle is not a fragment!");
91 throw ibrcommon::Exception(
"This fragment does not belongs to the others.");
115 c._hasFirstFragBlocksAdded =
false;
116 c._hasLastFragBlocksAdded =
false;
118 c._initialized =
true;
121 ibrcommon::BLOB::iostream stream = c._blob.iostream();
132 ibrcommon::BLOB::Reference ref = p.
getBLOB();
133 ibrcommon::BLOB::iostream s = ref.iostream();
134 (*stream) << (*s).rdbuf() << std::flush;
144 c._hasFirstFragBlocksAdded =
true;
149 if (payload_it == obj.
end())
throw ibrcommon::Exception(
"Payload block missing.");
155 const Block ¤t_block = (**block_it);
160 if (p == c._bundle.
end())
throw ibrcommon::Exception(
"Payload block missing.");
168 block = current_block;
170 IBRCOMMON_LOGGER_DEBUG_TAG(
"BundleMerger", 5) <<
"Reassemble: Added Block before Payload: " << obj.
toString() <<
" " << block_type << IBRCOMMON_LOGGER_ENDL;
172 catch(
const ibrcommon::Exception &ex)
176 block = current_block;
178 IBRCOMMON_LOGGER_DEBUG_TAG(
"BundleMerger", 5) <<
"Reassemble: Added Block before Payload: " << obj.
toString() <<
" " << block_type << IBRCOMMON_LOGGER_ENDL;
188 c._hasLastFragBlocksAdded =
true;
194 if (payload_it == obj.
end())
throw ibrcommon::Exception(
"Payload block missing.");
197 for (payload_it++; payload_it != obj.
end(); ++payload_it)
200 const Block ¤t_block = (**payload_it);
209 block = current_block;
211 IBRCOMMON_LOGGER_DEBUG_TAG(
"BundleMerger", 5) <<
"Reassemble: Added Block after Payload: " << obj.
toString()<<
" " << block_type << IBRCOMMON_LOGGER_ENDL;
213 catch(
const ibrcommon::Exception &ex)
217 block = current_block;
219 IBRCOMMON_LOGGER_DEBUG_TAG(
"BundleMerger", 5) <<
"Reassemble: Added Block after Payload: " << obj.
toString()<<
" " << block_type << IBRCOMMON_LOGGER_ENDL;
229 ibrcommon::BLOB::Reference ref = ibrcommon::BLOB::create();
239 : offset(o), length(l)
249 if (offset < other.
offset)
return true;
250 if (offset != other.
offset)
return false;
252 return (length < other.
length);
260 for (std::set<Chunk>::const_iterator iter = chunks.begin(); iter != chunks.end(); ++iter)
262 const Chunk &chunk = (*iter);
265 if (chunk.
offset > position)
return false;
271 return (position >= length);
std::string toString() const
static bool isComplete(Length length, const std::set< Chunk > &chunks)
std::ostream & operator<<(std::ostream &stream, const BundleID &obj)
dtn::data::Timestamp timestamp
static Container getContainer()
T & insert(iterator before)
dtn::data::Number sequencenumber
bool get(FLAGS flag) const
block_list::const_iterator const_iterator
virtual Length getLength() const
Container(ibrcommon::BLOB::Reference &ref)
block_list::iterator iterator
static Factory & get(block_t type)
static const dtn::data::block_t BLOCK_TYPE
iterator find(block_t blocktype)
ibrcommon::BLOB::Reference getBLOB() const
bool operator<(const Chunk &other) const
const block_t & getType() const
dtn::data::Number fragmentoffset
void set(FLAGS flag, bool value)