Example #1
0
        // 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);
        }
Example #2
0
        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);
            }
        }