00001
00002
00003
00004
00005
00006
00007
00008 #include "ibrdtn/streams/StreamDataSegment.h"
00009 #include "ibrdtn/data/SDNV.h"
00010 #include <ibrcommon/Logger.h>
00011
00012 using namespace std;
00013
00014 namespace dtn
00015 {
00016 namespace streams
00017 {
00018 StreamDataSegment::StreamDataSegment(SegmentType type, size_t size)
00019 : _value(size), _type(type), _reason(MSG_SHUTDOWN_IDLE_TIMEOUT), _flags(0)
00020 {
00021 }
00022
00023 StreamDataSegment::StreamDataSegment(SegmentType type)
00024 : _value(0), _type(type), _reason(MSG_SHUTDOWN_IDLE_TIMEOUT), _flags(0)
00025 {
00026 }
00027
00028 StreamDataSegment::StreamDataSegment(ShutdownReason reason, size_t reconnect)
00029 : _value(reconnect), _type(MSG_SHUTDOWN), _reason(reason), _flags(3)
00030 {
00031 }
00032
00033 StreamDataSegment::~StreamDataSegment()
00034 {
00035 }
00036
00037 std::ostream &operator<<(std::ostream &stream, const StreamDataSegment &seg)
00038 {
00039 char header = seg._flags;
00040 header += ((seg._type & 0x0F) << 4);
00041
00042
00043 stream.put(header);
00044
00045 switch (seg._type)
00046 {
00047 case StreamDataSegment::MSG_DATA_SEGMENT:
00048
00049 stream << dtn::data::SDNV(seg._value);
00050 break;
00051
00052 case StreamDataSegment::MSG_ACK_SEGMENT:
00053
00054 stream << dtn::data::SDNV(seg._value);
00055 break;
00056
00057 case StreamDataSegment::MSG_REFUSE_BUNDLE:
00058 break;
00059
00060 case StreamDataSegment::MSG_KEEPALIVE:
00061 IBRCOMMON_LOGGER_DEBUG(15) << "KEEPALIVE sent" << IBRCOMMON_LOGGER_ENDL;
00062 break;
00063
00064 case StreamDataSegment::MSG_SHUTDOWN:
00065
00066 stream.put((char)seg._reason);
00067 stream << dtn::data::SDNV(seg._value);
00068 break;
00069 }
00070
00071 return stream;
00072 }
00073
00074 std::istream &operator>>(std::istream &stream, StreamDataSegment &seg)
00075 {
00076 dtn::data::SDNV value;
00077
00078 char header = 0;
00079 stream.get(header);
00080
00081 seg._type = StreamDataSegment::SegmentType( (header & 0xF0) >> 4 );
00082 seg._flags = (header & 0x0F);
00083
00084 switch (seg._type)
00085 {
00086 case StreamDataSegment::MSG_DATA_SEGMENT:
00087
00088 stream >> value;
00089 seg._value = value.getValue();
00090 break;
00091
00092 case StreamDataSegment::MSG_ACK_SEGMENT:
00093
00094 stream >> value;
00095 seg._value = value.getValue();
00096 break;
00097
00098 case StreamDataSegment::MSG_REFUSE_BUNDLE:
00099 break;
00100
00101 case StreamDataSegment::MSG_KEEPALIVE:
00102 break;
00103
00104 case StreamDataSegment::MSG_SHUTDOWN:
00105
00106 char reason;
00107 stream.get(reason);
00108 seg._reason = StreamDataSegment::ShutdownReason(reason);
00109
00110 stream >> value;
00111 seg._value = value.getValue();
00112 break;
00113 }
00114
00115 return stream;
00116 }
00117 }
00118 }