IBR-DTNSuite
0.12
Main Page
Namespaces
Classes
Files
File List
File Members
IBR-DTNSuite
Namespaces
Classes
Files
File List
daemon
src
api
ApiP2PExtensionHandler.cpp
ApiP2PExtensionHandler.h
ApiServer.cpp
ApiServer.h
BinaryStreamClient.cpp
BinaryStreamClient.h
BundleStreamBuf.cpp
BundleStreamBuf.h
ClientHandler.cpp
ClientHandler.h
EventConnection.cpp
EventConnection.h
ExtendedApiHandler.cpp
ExtendedApiHandler.h
ManagementConnection.cpp
ManagementConnection.h
NativeSerializer.cpp
NativeSerializer.h
NativeSerializerCallback.cpp
NativeSerializerCallback.h
NativeSession.cpp
NativeSession.h
OrderedStreamHandler.cpp
OrderedStreamHandler.h
Registration.cpp
Registration.h
core
net
routing
security
storage
CapsuleWorker.cpp
CapsuleWorker.h
Component.cpp
Component.h
config.h
Configuration.cpp
Configuration.h
Debugger.cpp
Debugger.h
DevNull.cpp
DevNull.h
DTNTPWorker.cpp
DTNTPWorker.h
EchoWorker.cpp
EchoWorker.h
Main.cpp
NativeDaemon.cpp
NativeDaemon.h
NTService.cpp
ibrcommon
ibrdtn
tools
File Members
EventConnection.cpp
Go to the documentation of this file.
1
/*
2
* EventConnection.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 "
EventConnection.h
"
23
24
#include "
core/EventDispatcher.h
"
25
#include "
core/NodeEvent.h
"
26
#include "
core/GlobalEvent.h
"
27
#include "
core/CustodyEvent.h
"
28
#include "
routing/QueueBundleEvent.h
"
29
#include "
net/BundleReceivedEvent.h
"
30
#include "
net/TransferAbortedEvent.h
"
31
#include "
net/TransferCompletedEvent.h
"
32
#include "
net/ConnectionEvent.h
"
33
34
#include <
ibrdtn/utils/Utils.h
>
35
36
namespace
dtn
37
{
38
namespace
api
39
{
40
EventConnection::EventConnection
(
ClientHandler
&client,
ibrcommon::socketstream
&stream)
41
:
ProtocolHandler
(client, stream),
_running
(true)
42
{
43
}
44
45
EventConnection::~EventConnection
()
46
{
47
}
48
49
void
EventConnection::raiseEvent
(
const
dtn::core::Event
*evt)
throw
()
50
{
51
ibrcommon::MutexLock
l(_mutex);
52
if
(!
_running
)
return
;
53
54
try
{
55
const
dtn::core::NodeEvent
&node =
dynamic_cast<
const
dtn::core::NodeEvent
&
>
(*evt);
56
57
// start with the event tag
58
_stream <<
"Event: "
<< node.
getName
() << std::endl;
59
_stream <<
"Action: "
;
60
61
switch
(node.
getAction
())
62
{
63
case
dtn::core::NODE_AVAILABLE
:
64
_stream <<
"available"
;
65
break
;
66
case
dtn::core::NODE_UNAVAILABLE
:
67
_stream <<
"unavailable"
;
68
break
;
69
case
dtn::core::NODE_DATA_ADDED
:
70
_stream <<
"data_added"
;
71
break
;
72
case
dtn::core::NODE_DATA_REMOVED
:
73
_stream <<
"data_removed"
;
74
break
;
75
default
:
76
break
;
77
}
78
79
_stream << std::endl;
80
81
// write the node eid
82
_stream <<
"EID: "
<< node.
getNode
().
getEID
().
getString
() << std::endl;
83
84
// close the event
85
_stream << std::endl;
86
}
catch
(
const
std::bad_cast&) { };
87
88
try
{
89
const
dtn::core::GlobalEvent
&global =
dynamic_cast<
const
dtn::core::GlobalEvent
&
>
(*evt);
90
91
// start with the event tag
92
_stream <<
"Event: "
<< global.
getName
() << std::endl;
93
_stream <<
"Action: "
;
94
95
switch
(global.
getAction
())
96
{
97
case
dtn::core::GlobalEvent::GLOBAL_BUSY
:
98
_stream <<
"busy"
;
99
break
;
100
case
dtn::core::GlobalEvent::GLOBAL_IDLE
:
101
_stream <<
"idle"
;
102
break
;
103
case
dtn::core::GlobalEvent::GLOBAL_RESUME
:
104
_stream <<
"resume"
;
105
break
;
106
case
dtn::core::GlobalEvent::GLOBAL_RELOAD
:
107
_stream <<
"reload"
;
108
break
;
109
case
dtn::core::GlobalEvent::GLOBAL_SHUTDOWN
:
110
_stream <<
"shutdown"
;
111
break
;
112
case
dtn::core::GlobalEvent::GLOBAL_SUSPEND
:
113
_stream <<
"suspend"
;
114
break
;
115
case
dtn::core::GlobalEvent::GLOBAL_INTERNET_AVAILABLE
:
116
_stream <<
"internet available"
;
117
break
;
118
case
dtn::core::GlobalEvent::GLOBAL_INTERNET_UNAVAILABLE
:
119
_stream <<
"internet unavailable"
;
120
break
;
121
case
dtn::core::GlobalEvent::GLOBAL_START_DISCOVERY
:
122
_stream <<
"start discovery"
;
123
break
;
124
case
dtn::core::GlobalEvent::GLOBAL_STOP_DISCOVERY
:
125
_stream <<
"stop discovery"
;
126
break
;
127
default
:
128
break
;
129
}
130
_stream << std::endl;
131
132
// close the event
133
_stream << std::endl;
134
}
catch
(
const
std::bad_cast&) { };
135
136
try
{
137
const
dtn::net::BundleReceivedEvent
&received =
dynamic_cast<
const
dtn::net::BundleReceivedEvent
&
>
(*evt);
138
139
// start with the event tag
140
_stream <<
"Event: "
<< received.
getName
() << std::endl;
141
_stream <<
"Peer: "
<< received.
peer
.
getString
() << std::endl;
142
_stream <<
"Local: "
<< (received.
fromlocal
?
"true"
:
"false"
) << std::endl;
143
144
// write the bundle data
145
_stream <<
"Source: "
<< received.
bundle
.
source
.
getString
() << std::endl;
146
_stream <<
"Timestamp: "
<< received.
bundle
.
timestamp
.
toString
() << std::endl;
147
_stream <<
"Sequencenumber: "
<< received.
bundle
.
sequencenumber
.
toString
() << std::endl;
148
_stream <<
"Lifetime: "
<< received.
bundle
.
lifetime
.
toString
() << std::endl;
149
_stream <<
"Procflags: "
<< received.
bundle
.
procflags
.
toString
() << std::endl;
150
151
// write the destination eid
152
_stream <<
"Destination: "
<< received.
bundle
.
destination
.
getString
() << std::endl;
153
154
if
(received.
bundle
.
get
(
dtn::data::PrimaryBlock::FRAGMENT
))
155
{
156
// write fragmentation values
157
_stream <<
"Appdatalength: "
<< received.
bundle
.
appdatalength
.
toString
() << std::endl;
158
_stream <<
"Fragmentoffset: "
<< received.
bundle
.
fragmentoffset
.
toString
() << std::endl;
159
}
160
161
// close the event
162
_stream << std::endl;
163
}
catch
(
const
std::bad_cast&) { };
164
165
try
{
166
const
dtn::core::CustodyEvent
&custody =
dynamic_cast<
const
dtn::core::CustodyEvent
&
>
(*evt);
167
168
_stream <<
"Event: "
<< custody.
getName
() << std::endl;
169
_stream <<
"Action: "
;
170
171
switch
(custody.
getAction
())
172
{
173
case
dtn::core::CUSTODY_ACCEPT
:
174
_stream <<
"accept"
;
175
break
;
176
case
dtn::core::CUSTODY_REJECT
:
177
_stream <<
"reject"
;
178
break
;
179
default
:
180
break
;
181
}
182
_stream << std::endl;
183
184
// write the bundle data
185
_stream <<
"Source: "
<< custody.
getBundle
().
source
.
getString
() << std::endl;
186
_stream <<
"Timestamp: "
<< custody.
getBundle
().
timestamp
.
toString
() << std::endl;
187
_stream <<
"Sequencenumber: "
<< custody.
getBundle
().
sequencenumber
.
toString
() << std::endl;
188
_stream <<
"Lifetime: "
<< custody.
getBundle
().
lifetime
.
toString
() << std::endl;
189
_stream <<
"Procflags: "
<< custody.
getBundle
().
procflags
.toString() << std::endl;
190
191
// write the destination eid
192
_stream <<
"Destination: "
<< custody.
getBundle
().
destination
.
getString
() << std::endl;
193
194
if
(custody.
getBundle
().
isFragment
())
195
{
196
// write fragmentation values
197
_stream <<
"Appdatalength: "
<< custody.
getBundle
().
appdatalength
.
toString
() << std::endl;
198
_stream <<
"Fragmentoffset: "
<< custody.
getBundle
().
fragmentoffset
.
toString
() << std::endl;
199
}
200
201
// close the event
202
_stream << std::endl;
203
}
catch
(
const
std::bad_cast&) { };
204
205
try
{
206
const
dtn::net::TransferAbortedEvent
&aborted =
dynamic_cast<
const
dtn::net::TransferAbortedEvent
&
>
(*evt);
207
208
// start with the event tag
209
_stream <<
"Event: "
<< aborted.
getName
() << std::endl;
210
_stream <<
"Peer: "
<< aborted.
getPeer
().
getString
() << std::endl;
211
212
// write the bundle data
213
_stream <<
"Source: "
<< aborted.
getBundleID
().
source
.
getString
() << std::endl;
214
_stream <<
"Timestamp: "
<< aborted.
getBundleID
().
timestamp
.
toString
() << std::endl;
215
_stream <<
"Sequencenumber: "
<< aborted.
getBundleID
().
sequencenumber
.
toString
() << std::endl;
216
217
if
(aborted.
getBundleID
().
isFragment
())
218
{
219
// write fragmentation values
220
_stream <<
"Fragmentoffset: "
<< aborted.
getBundleID
().
fragmentoffset
.
toString
() << std::endl;
221
_stream <<
"Fragmentpayload: "
<< aborted.
getBundleID
().
getPayloadLength
() << std::endl;
222
}
223
224
// close the event
225
_stream << std::endl;
226
227
}
catch
(
const
std::bad_cast&) { };
228
229
try
{
230
const
dtn::net::TransferCompletedEvent
&completed =
dynamic_cast<
const
dtn::net::TransferCompletedEvent
&
>
(*evt);
231
232
// start with the event tag
233
_stream <<
"Event: "
<< completed.
getName
() << std::endl;
234
_stream <<
"Peer: "
<< completed.
getPeer
().
getString
() << std::endl;
235
236
// write the bundle data
237
_stream <<
"Source: "
<< completed.
getBundle
().
source
.
getString
() << std::endl;
238
_stream <<
"Timestamp: "
<< completed.
getBundle
().
timestamp
.
toString
() << std::endl;
239
_stream <<
"Sequencenumber: "
<< completed.
getBundle
().
sequencenumber
.
toString
() << std::endl;
240
_stream <<
"Lifetime: "
<< completed.
getBundle
().
lifetime
.
toString
() << std::endl;
241
_stream <<
"Procflags: "
<< completed.
getBundle
().
procflags
.toString() << std::endl;
242
243
// write the destination eid
244
_stream <<
"Destination: "
<< completed.
getBundle
().
destination
.
getString
() << std::endl;
245
246
if
(completed.
getBundle
().
isFragment
())
247
{
248
// write fragmentation values
249
_stream <<
"Appdatalength: "
<< completed.
getBundle
().
appdatalength
.
toString
() << std::endl;
250
_stream <<
"Fragmentoffset: "
<< completed.
getBundle
().
fragmentoffset
.
toString
() << std::endl;
251
}
252
253
// close the event
254
_stream << std::endl;
255
256
}
catch
(
const
std::bad_cast&) { };
257
258
try
{
259
const
dtn::net::ConnectionEvent
&connection =
dynamic_cast<
const
dtn::net::ConnectionEvent
&
>
(*evt);
260
261
// start with the event tag
262
_stream <<
"Event: "
<< connection.
getName
() << std::endl;
263
_stream <<
"Action: "
;
264
265
switch
(connection.
getState
())
266
{
267
case
dtn::net::ConnectionEvent::CONNECTION_UP
:
268
_stream <<
"up"
;
269
break
;
270
case
dtn::net::ConnectionEvent::CONNECTION_DOWN
:
271
_stream <<
"down"
;
272
break
;
273
case
dtn::net::ConnectionEvent::CONNECTION_SETUP
:
274
_stream <<
"setup"
;
275
break
;
276
case
dtn::net::ConnectionEvent::CONNECTION_TIMEOUT
:
277
_stream <<
"timeout"
;
278
break
;
279
default
:
280
break
;
281
}
282
_stream << std::endl;
283
284
// write the peer eid
285
_stream <<
"Peer: "
<< connection.
getNode
().
getEID
().
getString
() << std::endl;
286
287
// close the event
288
_stream << std::endl;
289
}
catch
(
const
std::bad_cast&) { };
290
291
try
{
292
const
dtn::routing::QueueBundleEvent
&queued =
dynamic_cast<
const
dtn::routing::QueueBundleEvent
&
>
(*evt);
293
294
// start with the event tag
295
_stream <<
"Event: "
<< queued.
getName
() << std::endl;
296
297
// write the bundle data
298
_stream <<
"Source: "
<< queued.
bundle
.
source
.
getString
() << std::endl;
299
_stream <<
"Timestamp: "
<< queued.
bundle
.
timestamp
.
toString
() << std::endl;
300
_stream <<
"Sequencenumber: "
<< queued.
bundle
.
sequencenumber
.
toString
() << std::endl;
301
_stream <<
"Lifetime: "
<< queued.
bundle
.
lifetime
.
toString
() << std::endl;
302
_stream <<
"Procflags: "
<< queued.
bundle
.
procflags
.toString() << std::endl;
303
304
// write the destination eid
305
_stream <<
"Destination: "
<< queued.
bundle
.
destination
.
getString
() << std::endl;
306
307
if
(queued.
bundle
.
isFragment
())
308
{
309
// write fragmentation values
310
_stream <<
"Appdatalength: "
<< queued.
bundle
.
appdatalength
.
toString
() << std::endl;
311
_stream <<
"Fragmentoffset: "
<< queued.
bundle
.
fragmentoffset
.
toString
() << std::endl;
312
}
313
314
// close the event
315
_stream << std::endl;
316
}
catch
(
const
std::bad_cast&) { };
317
}
318
319
void
EventConnection::run
()
320
{
321
std::string buffer;
322
323
// announce protocol change
324
_stream
<<
ClientHandler::API_STATUS_OK
<<
" SWITCHED TO EVENT"
<< std::endl;
325
326
// run as long the stream is ok
327
while
(
_stream
.good())
328
{
329
getline(
_stream
, buffer);
330
331
// search for '\r\n' and remove the '\r'
332
std::string::reverse_iterator iter = buffer.rbegin();
333
if
( (*iter) ==
'\r'
) buffer = buffer.substr(0, buffer.length() - 1);
334
335
std::vector<std::string> cmd =
dtn::utils::Utils::tokenize
(
" "
, buffer);
336
if
(cmd.empty())
continue
;
337
338
// return to previous level
339
if
(cmd[0] ==
"exit"
)
break
;
340
}
341
342
ibrcommon::MutexLock
l(_mutex);
343
_running =
false
;
344
}
345
346
void
EventConnection::setup
()
347
{
348
// bind to several events
349
dtn::core::EventDispatcher<dtn::core::NodeEvent>::add
(
this
);
350
dtn::core::EventDispatcher<dtn::core::GlobalEvent>::add
(
this
);
351
dtn::core::EventDispatcher<dtn::core::CustodyEvent>::add
(
this
);
352
dtn::core::EventDispatcher<dtn::net::BundleReceivedEvent>::add
(
this
);
353
dtn::core::EventDispatcher<dtn::net::TransferAbortedEvent>::add
(
this
);
354
dtn::core::EventDispatcher<dtn::net::TransferCompletedEvent>::add
(
this
);
355
dtn::core::EventDispatcher<dtn::net::ConnectionEvent>::add
(
this
);
356
dtn::core::EventDispatcher<dtn::routing::QueueBundleEvent>::add
(
this
);
357
}
358
359
void
EventConnection::finally
()
360
{
361
// unbind to events
362
dtn::core::EventDispatcher<dtn::core::NodeEvent>::remove
(
this
);
363
dtn::core::EventDispatcher<dtn::core::GlobalEvent>::remove
(
this
);
364
dtn::core::EventDispatcher<dtn::core::CustodyEvent>::remove
(
this
);
365
dtn::core::EventDispatcher<dtn::net::BundleReceivedEvent>::remove
(
this
);
366
dtn::core::EventDispatcher<dtn::net::TransferAbortedEvent>::remove
(
this
);
367
dtn::core::EventDispatcher<dtn::net::TransferCompletedEvent>::remove
(
this
);
368
dtn::core::EventDispatcher<dtn::net::ConnectionEvent>::remove
(
this
);
369
dtn::core::EventDispatcher<dtn::routing::QueueBundleEvent>::remove
(
this
);
370
}
371
372
void
EventConnection::__cancellation
() throw ()
373
{
374
}
375
}
/* namespace api */
376
}
/* namespace dtn */
daemon
src
api
EventConnection.cpp
Generated on Thu Mar 27 2014 09:26:19 for IBR-DTNSuite by
1.8.4