// todo should be in a behave block // then we wouldn't be messing with stream seq numbers. private Chunk[] dcepDeal(SCTPStream s, DataChunk dc, DCOpen dcep) { Chunk[] rep = null; Logger.Debug("dealing with a decp for stream " + dc.getDataAsString()); if (!dcep.isAck()) { Logger.Debug("decp is not an ack... "); SCTPStreamBehaviour behave = dcep.mkStreamBehaviour(); s.setBehave(behave); s.setLabel(dcep.getLabel()); lock (s) { int seqIn = s.getNextMessageSeqIn(); s.setNextMessageSeqIn(seqIn + 1); int seqOut = s.getNextMessageSeqOut(); s.setNextMessageSeqOut(seqOut + 1); } rep = new Chunk[1]; DataChunk ack = dc.mkAck(dcep); s.outbound(ack); ack.setTsn(_nearTSN++); // check rollover - will break at maxint. rep[0] = ack; } else { Logger.Debug("got a dcep ack for " + s.getLabel()); SCTPStreamBehaviour behave = dcep.mkStreamBehaviour(); s.setBehave(behave); lock (s) { int seqIn = s.getNextMessageSeqIn(); s.setNextMessageSeqIn(seqIn + 1); int seqOut = s.getNextMessageSeqOut(); s.setNextMessageSeqOut(seqOut + 1); } } return(rep); }
public void run() { Logger.Debug("delegated message delivery from stream of type " + _stream.GetType().Name); byte[] data = _data; if (_li != null) { switch (_pPid) { case DataChunk.WEBRTCBINARYEMPTY: data = new byte[0]; goto case DataChunk.WEBRTCBINARY; case DataChunk.WEBRTCBINARY: if (typeof(SCTPByteStreamListener).IsAssignableFrom(_li.GetType())) { ((SCTPByteStreamListener)_li).onMessage(_stream, data); _delivered = true; } break; case DataChunk.WEBRTCstringEMPTY: data = new byte[0]; goto case DataChunk.WEBRTCstring; case DataChunk.WEBRTCstring: _li.onMessage(_stream, System.Text.Encoding.ASCII.GetString(_data)); _delivered = true; break; } } if (!_delivered) { Logger.Debug("Undelivered message to " + (_stream == null ? "null stream" : _stream.getLabel()) + " via " + (_li == null ? "null listener" : _li.GetType().Name) + " ppid is " + _pPid); } }