• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

ibrdtn/ibrdtn/data/Bundle.cpp

Go to the documentation of this file.
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->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                         // set the last block flag
00056                         block->set(dtn::data::Block::LAST_BLOCK, true);
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 

Generated on Thu Nov 11 2010 09:49:47 for IBR-DTNSuite by  doxygen 1.7.1