00001 /* 00002 * Bundle.cpp 00003 * 00004 * Created on: 29.05.2009 00005 * Author: morgenro 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 // set the last block flag 00047 block->_procflags |= dtn::data::Block::LAST_BLOCK; 00048 } 00049 00050 _blocks.push_front(refcnt_ptr<Block>(block)); 00051 } 00052 00053 void Bundle::BlockList::push_back(Block *block) 00054 { 00055 // set the last block flag 00056 block->_procflags |= dtn::data::Block::LAST_BLOCK; 00057 00058 if (!_blocks.empty()) 00059 { 00060 // remove the last block flag of the previous block 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 // delete all blocks 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 // set the last block bit 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 // clear the list of objects 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
1.5.6