Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include "ibrdtn/data/Bundle.h"
00009 #include "ibrdtn/data/StatusReportBlock.h"
00010 #include "ibrdtn/data/CustodySignalBlock.h"
00011 #include "ibrdtn/data/ExtensionBlock.h"
00012 #include "ibrdtn/data/ExtensionBlockFactory.h"
00013 #include "ibrdtn/data/Serializer.h"
00014
00015 namespace dtn
00016 {
00017 namespace data
00018 {
00019 std::map<char, ExtensionBlockFactory*>& Bundle::getExtensionBlockFactories()
00020 {
00021 static std::map<char, ExtensionBlockFactory*> factories;
00022 return factories;
00023 }
00024
00025 Bundle::Bundle()
00026 {
00027 }
00028
00029 Bundle::~Bundle()
00030 {
00031 clearBlocks();
00032 }
00033
00034 Bundle::BlockList::BlockList()
00035 {
00036 }
00037
00038 Bundle::BlockList::~BlockList()
00039 {
00040 }
00041
00042 void Bundle::BlockList::push_front(Block *block)
00043 {
00044 if (_blocks.empty())
00045 {
00046
00047 block->set(dtn::data::Block::LAST_BLOCK, true);
00048 }
00049
00050 _blocks.push_front(refcnt_ptr<Block>(block));
00051 }
00052
00053 void Bundle::BlockList::push_back(Block *block)
00054 {
00055
00056 block->set(dtn::data::Block::LAST_BLOCK, true);
00057
00058 if (!_blocks.empty())
00059 {
00060
00061 dtn::data::Block *lastblock = (_blocks.back().getPointer());
00062 lastblock->set(dtn::data::Block::LAST_BLOCK, false);
00063 }
00064
00065 _blocks.push_back(refcnt_ptr<Block>(block));
00066 }
00067
00068 void Bundle::BlockList::insert(Block *block, const Block *before)
00069 {
00070 for (std::list<refcnt_ptr<Block> >::iterator iter = _blocks.begin(); iter != _blocks.end(); iter++)
00071 {
00072 const dtn::data::Block *lb = (*iter).getPointer();
00073
00074 if (lb == before)
00075 {
00076 _blocks.insert(iter, refcnt_ptr<Block>(block) );
00077 return;
00078 }
00079 }
00080 }
00081
00082 void Bundle::BlockList::remove(const Block *block)
00083 {
00084
00085 for (std::list<refcnt_ptr<Block> >::iterator iter = _blocks.begin(); iter != _blocks.end(); iter++)
00086 {
00087 const dtn::data::Block &lb = (*(*iter));
00088 if ( &lb == block )
00089 {
00090 _blocks.erase(iter++);
00091
00092
00093 if (!_blocks.empty())
00094 (*_blocks.back()).set(dtn::data::Block::LAST_BLOCK, true);
00095
00096 return;
00097 }
00098 }
00099 }
00100
00101 void Bundle::BlockList::clear()
00102 {
00103
00104 _blocks.clear();
00105 }
00106
00107 const std::list<const Block*> Bundle::BlockList::getList() const
00108 {
00109 std::list<const dtn::data::Block*> ret;
00110
00111 for (std::list<refcnt_ptr<Block> >::const_iterator iter = _blocks.begin(); iter != _blocks.end(); iter++)
00112 {
00113 ret.push_back( (*iter).getPointer() );
00114 }
00115
00116 return ret;
00117 }
00118
00119 const std::set<dtn::data::EID> Bundle::BlockList::getEIDs() const
00120 {
00121 std::set<dtn::data::EID> ret;
00122
00123 for (std::list<refcnt_ptr<Block> >::const_iterator iter = _blocks.begin(); iter != _blocks.end(); iter++)
00124 {
00125 std::list<EID> elist = (*iter)->getEIDList();
00126
00127 for (std::list<dtn::data::EID>::const_iterator iter = elist.begin(); iter != elist.end(); iter++)
00128 {
00129 ret.insert(*iter);
00130 }
00131 }
00132
00133 return ret;
00134 }
00135
00136 bool Bundle::operator!=(const Bundle& other) const
00137 {
00138 return PrimaryBlock(*this) != other;
00139 }
00140
00141 bool Bundle::operator==(const Bundle& other) const
00142 {
00143 return PrimaryBlock(*this) == other;
00144 }
00145
00146 bool Bundle::operator<(const Bundle& other) const
00147 {
00148 return PrimaryBlock(*this) < other;
00149 }
00150
00151 bool Bundle::operator>(const Bundle& other) const
00152 {
00153 return PrimaryBlock(*this) > other;
00154 }
00155
00156 const std::list<const dtn::data::Block*> Bundle::getBlocks() const
00157 {
00158 return _blocks.getList();
00159 }
00160
00161 void Bundle::remove(const dtn::data::Block &block)
00162 {
00163 _blocks.remove(&block);
00164 }
00165
00166 void Bundle::clearBlocks()
00167 {
00168 _blocks.clear();
00169 }
00170
00171 dtn::data::PayloadBlock& Bundle::insert(const dtn::data::Block &before, ibrcommon::BLOB::Reference &ref)
00172 {
00173 dtn::data::PayloadBlock *tmpblock = new dtn::data::PayloadBlock(ref);
00174 dtn::data::Block *block = dynamic_cast<dtn::data::Block*>(tmpblock);
00175 assert(block != NULL);
00176 _blocks.insert(block, &before);
00177 return (*tmpblock);
00178 }
00179
00180 dtn::data::PayloadBlock& Bundle::push_front(ibrcommon::BLOB::Reference &ref)
00181 {
00182 dtn::data::PayloadBlock *tmpblock = new dtn::data::PayloadBlock(ref);
00183 dtn::data::Block *block = dynamic_cast<dtn::data::Block*>(tmpblock);
00184 assert(block != NULL);
00185 _blocks.push_front(block);
00186 return (*tmpblock);
00187 }
00188
00189 dtn::data::PayloadBlock& Bundle::push_back(ibrcommon::BLOB::Reference &ref)
00190 {
00191 dtn::data::PayloadBlock *tmpblock = new dtn::data::PayloadBlock(ref);
00192 dtn::data::Block *block = dynamic_cast<dtn::data::Block*>(tmpblock);
00193 assert(block != NULL);
00194 _blocks.push_back(block);
00195 return (*tmpblock);
00196 }
00197
00198 dtn::data::Block& Bundle::push_back(dtn::data::ExtensionBlockFactory &factory)
00199 {
00200 dtn::data::Block *block = factory.create();
00201 assert(block != NULL);
00202 _blocks.push_back(block);
00203 return (*block);
00204 }
00205
00206 string Bundle::toString() const
00207 {
00208 return PrimaryBlock::toString();
00209 }
00210 }
00211 }
00212