IBR-DTNSuite  0.10
BundleBuilder.cpp
Go to the documentation of this file.
1 /*
2  * BundleBuilder.cpp
3  *
4  * Created on: 10.01.2013
5  * Author: morgenro
6  */
7 
9 #include <iterator>
10 
11 namespace dtn
12 {
13  namespace data
14  {
15  BundleBuilder::BundleBuilder(Bundle &target, POSITION alignment, int pos)
16  : _target(&target), _alignment(alignment), _pos(pos)
17  {
18  }
19 
21  {
22  }
23 
25  {
26  switch (_alignment)
27  {
28  case FRONT:
29  {
30  dtn::data::Block &block = _target->push_front(f);
31  bool last_block = block.get(dtn::data::Block::LAST_BLOCK);
32  block._procflags = procflags;
33  block.set(dtn::data::Block::LAST_BLOCK, last_block);
34  return block;
35  }
36 
37  case END:
38  {
39  dtn::data::Block &block = _target->push_back(f);
40  bool last_block = block.get(dtn::data::Block::LAST_BLOCK);
41  block._procflags = procflags;
42  block.set(dtn::data::Block::LAST_BLOCK, last_block);
43  return block;
44  }
45 
46  default:
47  if(_pos <= 0) {
48  dtn::data::Block &block = _target->push_front(f);
49  bool last_block = block.get(dtn::data::Block::LAST_BLOCK);
50  block._procflags = procflags;
51  block.set(dtn::data::Block::LAST_BLOCK, last_block);
52  return block;
53  }
54 
55  dtn::data::Bundle::iterator it = _target->begin();
56  std::advance(it, _pos-1);
57 
58  dtn::data::Block &block = (it == _target->end()) ? _target->push_back(f) : _target->insert(it, f);
59 
60  bool last_block = block.get(dtn::data::Block::LAST_BLOCK);
61  block._procflags = procflags;
62  block.set(dtn::data::Block::LAST_BLOCK, last_block);
63  return block;
64  }
65  }
66 
68  {
69  return _alignment;
70  }
71 
73  {
74  // exit if the block type is zero
75  if (block_type == 0) throw dtn::InvalidDataException("block type is zero");
76 
77  if (block_type == dtn::data::PayloadBlock::BLOCK_TYPE)
78  {
79  // use standard payload routines to add a payload block
80  return insert<dtn::data::PayloadBlock>(procflags);
81  }
82  else
83  {
84  // get a extension block factory
85  try {
87  return insert(f, procflags);
88  } catch (const ibrcommon::Exception &ex) {
89  dtn::data::ExtensionBlock &block = insert<dtn::data::ExtensionBlock>(procflags);
90 
91  // set block type of this unknown block
92  block.setType(block_type);
93 
95  {
96  // remove the block
97  _target->remove(block);
98 
99  throw DiscardBlockException();
100  }
101 
102  return block;
103  }
104  }
105  }
106  } /* namespace data */
107 } /* namespace dtn */