IBR-DTN  1.0.0
NodeHandshake.cpp
Go to the documentation of this file.
1 /*
2  * NodeHandshake.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 "routing/NodeHandshake.h"
23 
24 namespace dtn
25 {
26  namespace routing
27  {
29  : _type((size_t)HANDSHAKE_INVALID), _lifetime(0)
30  {
31  }
32 
34  : _type((size_t)type), _lifetime(lifetime)
35  {
36  }
37 
39  {
40  clear();
41  }
42 
43  void NodeHandshake::clear()
44  {
45  for (item_set::const_iterator iter = _items.begin(); iter != _items.end(); ++iter)
46  {
47  delete (*iter);
48  }
49 
50  // clear raw items too
51  _raw_items.clear();
52  }
53 
55  {
56  _requests.insert(identifier);
57  }
58 
59  bool NodeHandshake::hasRequest(const dtn::data::Number &identifier) const
60  {
61  return (_requests.find(identifier) != _requests.end());
62  }
63 
65  {
66  return _requests;
67  }
68 
70  {
71  return _items;
72  }
73 
75  {
76  _items.push_back(item);
77  }
78 
79  bool NodeHandshake::hasItem(const dtn::data::Number &identifier) const
80  {
81  for (item_set::const_iterator iter = _items.begin(); iter != _items.end(); ++iter)
82  {
83  const NodeHandshakeItem &item = (**iter);
84  if (item.getIdentifier() == identifier) return true;
85  }
86 
87  return false;
88  }
89 
90  NodeHandshakeItem* NodeHandshake::getItem(const dtn::data::Number &identifier) const
91  {
92  for (item_set::const_iterator iter = _items.begin(); iter != _items.end(); ++iter)
93  {
94  NodeHandshakeItem *item = (*iter);
95  if (item->getIdentifier() == identifier) return item;
96  }
97 
98  return NULL;
99  }
100 
102  {
103  return NodeHandshake::MESSAGE_TYPE(_type.get<size_t>());
104  }
105 
107  {
108  return _lifetime;
109  }
110 
111  const std::string NodeHandshake::toString() const
112  {
113  std::stringstream ss;
114 
115  switch (getType()) {
116  case HANDSHAKE_INVALID:
117  ss << "HANDSHAKE_INVALID";
118  break;
119 
120  case HANDSHAKE_REQUEST:
121  ss << "HANDSHAKE_REQUEST";
122  break;
123 
124  case HANDSHAKE_RESPONSE:
125  ss << "HANDSHAKE_RESPONSE";
126  break;
127 
129  ss << "HANDSHAKE_NOTIFICATION";
130  break;
131 
132  default:
133  ss << "HANDSHAKE";
134  break;
135  }
136 
138  {
139  ss << "[";
140 
141  for (request_set::const_iterator iter = _requests.begin(); iter != _requests.end(); ++iter)
142  {
143  const dtn::data::Number &item = (*iter);
144  ss << " " << item.toString();
145  }
146  }
148  {
149  ss << "[ ttl: " << getLifetime().toString() << ",";
150 
151  for (item_set::const_iterator iter = _items.begin(); iter != _items.end(); ++iter)
152  {
153  const NodeHandshakeItem &item (**iter);
154  ss << " " << item.getIdentifier().toString();
155  }
156  }
157 
158  ss << " ]";
159 
160  return ss.str();
161  }
162 
163  std::ostream& operator<<(std::ostream &stream, const NodeHandshake &hs)
164  {
165  // first the type as SDNV
166  stream << hs._type;
167 
169  {
170  // then the number of request items
171  dtn::data::Number number_of_items(hs._requests.size());
172  stream << number_of_items;
173 
174  for (NodeHandshake::request_set::const_iterator iter = hs._requests.begin(); iter != hs._requests.end(); ++iter)
175  {
176  dtn::data::Number req(*iter);
177  stream << req;
178  }
179  }
181  {
182  // then the lifetime of this data
183  stream << hs._lifetime;
184 
185  // then the number of request items
186  dtn::data::Number number_of_items(hs._items.size());
187  stream << number_of_items;
188 
189  for (NodeHandshake::item_set::const_iterator iter = hs._items.begin(); iter != hs._items.end(); ++iter)
190  {
191  const NodeHandshakeItem &item = (**iter);
192 
193  // first the identifier of the item
194  dtn::data::Number id(item.getIdentifier());
195  stream << id;
196 
197  // then the length of the payload
198  dtn::data::Number len(item.getLength());
199  stream << len;
200 
201  item.serialize(stream);
202  }
203  }
204 
205  return stream;
206  }
207 
208  std::istream& operator>>(std::istream &stream, NodeHandshake &hs)
209  {
210  // clear the node handshake object
211  hs.clear();
212 
213  // first the type as SDNV
214  stream >> hs._type;
215 
217  {
218  // then the number of request items
219  dtn::data::Number number_of_items;
220  stream >> number_of_items;
221 
222  for (size_t i = 0; number_of_items > i; ++i)
223  {
224  dtn::data::Number req;
225  stream >> req;
226  hs._requests.insert(req);
227  }
228  }
230  {
231  // then the lifetime of this data
232  stream >> hs._lifetime;
233 
234  // then the number of request items
235  dtn::data::Number number_of_items;
236  stream >> number_of_items;
237 
238  for (size_t i = 0; number_of_items > i; ++i)
239  {
240  // first the identifier of the item
242  stream >> id;
243 
244  // then the length of the payload
245  dtn::data::Number len;
246  stream >> len;
247 
248  // add to raw map and create data container
249  //std::stringstream *data = new std::stringstream();
250  std::stringstream &data = hs._raw_items.get(id);
251 
252  // copy data to stringstream
253  ibrcommon::BLOB::copy(data, stream, len.get<std::streamsize>());
254  }
255  }
256 
257  return stream;
258  }
259 
260  NodeHandshake::StreamMap::StreamMap()
261  {
262  }
263 
264  NodeHandshake::StreamMap::~StreamMap()
265  {
266  clear();
267  }
268 
269  bool NodeHandshake::StreamMap::has(const dtn::data::Number &identifier)
270  {
271  stream_map::iterator i = _map.find(identifier);
272  return (i != _map.end());
273  }
274 
275  std::stringstream& NodeHandshake::StreamMap::get(const dtn::data::Number &identifier)
276  {
277  stream_map::iterator i = _map.find(identifier);
278 
279  if (i == _map.end())
280  {
281  std::pair<stream_map::iterator, bool> p =
282  _map.insert(std::pair<dtn::data::Number, std::stringstream* >(identifier, new stringstream()));
283  i = p.first;
284  }
285 
286  return (*(*i).second);
287  }
288 
289  void NodeHandshake::StreamMap::remove(const dtn::data::Number &identifier)
290  {
291  stream_map::iterator i = _map.find(identifier);
292 
293  if (i != _map.end())
294  {
295  delete (*i).second;
296  _map.erase(identifier);
297  }
298  }
299 
300  void NodeHandshake::StreamMap::clear()
301  {
302  for (stream_map::iterator iter = _map.begin(); iter != _map.end(); ++iter)
303  {
304  delete (*iter).second;
305  }
306  _map.clear();
307  }
308 
310  : _vector(vector)
311  {
312  }
313 
315  {
316  }
317 
319  {
320  }
321 
323  {
324  return identifier;
325  }
326 
328  {
329  return _vector.getLength();
330  }
331 
333  {
334  return _vector;
335  }
336 
337  std::ostream& BloomFilterSummaryVector::serialize(std::ostream &stream) const
338  {
339  stream << _vector;
340  return stream;
341  }
342 
343  std::istream& BloomFilterSummaryVector::deserialize(std::istream &stream)
344  {
345  stream >> _vector;
346  return stream;
347  }
348 
350 
352  : _vector(vector)
353  {
354  }
355 
357  {
358  }
359 
361  {
362  }
363 
365  {
366  return identifier;
367  }
368 
370  {
371  return _vector.getLength();
372  }
373 
375  {
376  return _vector;
377  }
378 
379  std::ostream& BloomFilterPurgeVector::serialize(std::ostream &stream) const
380  {
381  stream << _vector;
382  return stream;
383  }
384 
385  std::istream& BloomFilterPurgeVector::deserialize(std::istream &stream)
386  {
387  stream >> _vector;
388  return stream;
389  }
390 
392 
393  } /* namespace routing */
394 } /* namespace dtn */
const std::string toString() const
virtual const dtn::data::Number & getIdentifier() const =0
virtual std::ostream & serialize(std::ostream &) const =0
size_t Length
Definition: Number.h:33
void addItem(NodeHandshakeItem *item)
std::ostream & serialize(std::ostream &) const
std::istream & operator>>(std::istream &stream, NodeHandshake &hs)
bool hasItem(const dtn::data::Number &identifier) const
const dtn::data::Number & getLifetime() const
bool hasRequest(const dtn::data::Number &identifier) const
std::istream & deserialize(std::istream &)
std::list< NodeHandshakeItem * > item_set
std::string toString() const
Definition: SDNV.h:414
T get() const
Definition: SDNV.h:113
MESSAGE_TYPE getType() const
static const dtn::data::Number identifier
Definition: NodeHandshake.h:66
dtn::data::Length getLength() const
const dtn::data::Number & getIdentifier() const
const dtn::data::Number & getIdentifier() const
const request_set & getRequests() const
virtual dtn::data::Length getLength() const =0
const dtn::data::BundleSet & getVector() const
const item_set & getItems() const
std::ostream & operator<<(std::ostream &stream, const NodeHandshake &hs)
const dtn::data::BundleSet & getVector() const
std::ostream & serialize(std::ostream &) const
dtn::data::Length getLength() const
static const dtn::data::Number identifier
Definition: NodeHandshake.h:84
std::set< dtn::data::Number > request_set
void addRequest(const dtn::data::Number &identifier)
std::istream & deserialize(std::istream &)
Length getLength() const
Definition: BundleSet.cpp:135