IBR-DTN  1.0.0
CapsuleWorker.cpp
Go to the documentation of this file.
1 /*
2  * CapsuleWorker.cpp
3  *
4  * Copyright (C) 2011 IBR, TU Braunschweig
5  *
6  * Written-by: Johannes Morgenroth <morgenroth@ibr.cs.tu-bs.de>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21 
22 #include "Configuration.h"
23 #include "CapsuleWorker.h"
25 #include "core/BundleCore.h"
27 #include <ibrdtn/utils/Clock.h>
28 #include <ibrcommon/Logger.h>
29 
30 namespace dtn
31 {
32  namespace daemon
33  {
35  {
36  AbstractWorker::initialize("bundle-in-bundle");
37  }
38 
40  {
41  }
42 
44  {
45  try {
46  const PayloadBlock &payload = capsule.find<PayloadBlock>();
47  ibrcommon::BLOB::iostream stream = payload.getBLOB().iostream();
48 
49  // read the number of bundles
51  (*stream) >> nob;
52 
53  // read all offsets
54  for (size_t i = 0; (nob - 1) > i; ++i)
55  {
56  dtn::data::Number offset;
57  (*stream) >> offset;
58  }
59 
60  // create a deserializer for all bundles
63 
64  try {
65  // read all bundles
66  for (size_t i = 0; nob > i; ++i)
67  {
68  // deserialize the next bundle
69  deserializer >> b;
70 
71  // pass extracted bundle through the filter
72  FilterContext context;
73  context.setBundle(b);
74  context.setPeer(capsule.source.getNode());
75  if (BundleCore::getInstance().filter(BundleFilter::INPUT, context, b) == BundleFilter::ACCEPT)
76  {
77  // raise default bundle received event
79  }
80  }
81  }
82  catch (const dtn::InvalidDataException &ex) {
83  // display the rejection
84  IBRCOMMON_LOGGER_DEBUG_TAG("CapsuleWorker", 2) << "invalid bundle-data received: " << ex.what() << IBRCOMMON_LOGGER_ENDL;
85  }
87  }
88  }
89 }
void setBundle(const dtn::data::Bundle &data)
void setPeer(const dtn::data::EID &endpoint)
EID getNode() const
Definition: EID.cpp:528
iterator find(block_t blocktype)
Definition: Bundle.cpp:307
ibrcommon::BLOB::Reference getBLOB() const
void callbackBundleReceived(const dtn::data::Bundle &b)
dtn::data::EID source
Definition: BundleID.h:53
static void raise(const dtn::data::EID &peer, const dtn::data::Bundle &bundle, const bool local=false)
static BundleCore & getInstance()
Definition: BundleCore.cpp:82