Пример #1
0
        public Engine(DataRequestHandler db, IVisualisationHandler screen)
        {
            Database = db;
            Screen   = screen;

            //Make sure that the resources directory exists
            if (!Directory.Exists(ResourcePath))
            {
                Directory.CreateDirectory(ResourcePath);
            }
        }
Пример #2
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="maxRequestNumberPerDestination">max incoming requests buffered per destination</param>
 /// <param name="lowerLayerDataRequestHandler">lower layer handler for sending PDU</param>
 /// <param name="tail">maximum transmission unit in bytes for the lower layer</param>
 /// <param name="head">required space for header for the lower layer</param>
 /// <param name="tail">required space for tail for the lower layer</param>
 public Fragmentation(int maxRequestNumberPerDestination,
                      DataRequestHandler lowerLayerDataRequestHandler, int mtu, int head, int tail)
 {
     _maxRequestNumberPerDestination = maxRequestNumberPerDestination;
     _started = false;
     _lowerLayerDataRequest = lowerLayerDataRequestHandler;
     _lock      = new Object();
     _lowerHead = head;
     _lowerTail = tail;
     _lowerMtu  = mtu;
 }
Пример #3
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="maxRequestNumberPerDestination">max incoming requests buffered per destination</param>
        /// <param name="lowerLayerDataRequestHandler">lower layer handler for sending PDU</param>
        /// <param name="tail">maximum transmission unit in bytes for the lower layer</param>
        /// <param name="head">required space for header for the lower layer</param>
        /// <param name="tail">required space for tail for the lower layer</param>
        public Fragmentation(int maxRequestNumberPerDestination,
            DataRequestHandler lowerLayerDataRequestHandler, int mtu, int head, int tail)
        {
            _maxRequestNumberPerDestination = maxRequestNumberPerDestination;
            _started = false;
            _lowerLayerDataRequest = lowerLayerDataRequestHandler;
            _lock = new Object();
            _lowerHead = head;
            _lowerTail = tail;
            _lowerMtu = mtu;

        }
 internal InboundFragmentationMessage(
     UInt16 source,
     UInt16 destination,
     byte sequenceNumber,
     DataRequestHandler lowerLayerRequestHandler,
     int maxPduSize,
     int reservedHeaderSize,
     int reservedTailSize,
     FragmentationMessageTimer timer)
     : base(source, destination, sequenceNumber, lowerLayerRequestHandler, maxPduSize, reservedHeaderSize, reservedTailSize, timer)
 {
 }
 internal FragmentationMessage(
     UInt16 source,
     UInt16 destination,
     byte messageSeqNumber,
     DataRequestHandler lowerLayerRequestHandler,
     int maxPduSize,
     int reservedHeaderSize,
     int reservedTailSize,
     FragmentationMessageTimer timer)
 {
     _timer = timer;
     _lowerLayerRequestHandler = lowerLayerRequestHandler;
     _currentState             = FragmentationMessageState.Initial;
     _source                        = source;
     _destination                   = destination;
     _messageSeqNumber              = messageSeqNumber;
     _lock                          = new object();
     _timeoutTicks                  = long.MaxValue;
     _maxPduSize                    = maxPduSize;
     _reservedHeaderSize            = reservedHeaderSize;
     _reservedTailSize              = reservedTailSize;
     _lastFragmentSeqNumberReceived = 0xFF;
     _lastFragmentSeqNumberSent     = 0xFF;
 }
Пример #6
0
        protected IAsyncResult HandleRequestItem(RequestItem requestItem)
        {
            DataRequestHandler handler = dispatcher.getHandler(requestItem.getService());

            return(handler == null ? null : handler.handleItem(requestItem));
        }
        internal OutboundFragmentationMessage(
            UInt16 source,
            UInt16 destination,
            byte messageSeqNumber,
            DataRequestHandler lowerLayerRequestHandler,
            ref Frame sdu,
            Byte sduHandle,
            DataConfirmHandler handler,
            int maxPduSize,
            int reservedHeaderSize,
            int reservedTailSize,
            FragmentationMessageTimer timer
            )
            : base(source, destination, messageSeqNumber, lowerLayerRequestHandler, maxPduSize, reservedHeaderSize, reservedTailSize, timer)
        {
            if (sdu.LengthDataUsed == 0)
            {
                Frame.Release(ref sdu);
                throw new ArgumentException("sdu is empty", "sdu");
            }

            int payloadSize = maxPduSize - 2 - 2; // 2 for our own header, 1 for nb fragment, 1 for fragment id

            if (payloadSize == 0)
            {
                Frame.Release(ref sdu);
                throw new ArgumentException("PDU is too small", "maxPduSize");
            }

            ushort flag = (ushort)(1 << 15);

            _isBroadcast = (destination & flag) > 0 ? true : false;

            _sdu                   = sdu;
            sdu                    = null;
            _sduHandle             = sduHandle;
            _dataConfirmHandler    = handler;
            _messageSeqNumber      = messageSeqNumber;
            _timeoutForResending   = c_defaultTimeoutForResending;
            _maxFragmentsBeforeAck = c_defaultMaxFragmentsBeforeAck;
            // compute required nb fragments and respective indices.

            int nbFragments = ((_sdu.LengthDataUsed % payloadSize) == 0) ? _sdu.LengthDataUsed / payloadSize : 1 + _sdu.LengthDataUsed / payloadSize;

            if (nbFragments > byte.MaxValue)
            {
                throw new ArgumentException("sdu is too large.");
            }
            _nbFragments   = (byte)nbFragments;
            _endingIndices = new int[_nbFragments];
            int lastIndex = -1;

            for (int i = 0; i + 1 < _nbFragments; i++)
            {
                lastIndex        += payloadSize;
                _endingIndices[i] = lastIndex;
            }

            lastIndex += ((_sdu.LengthDataUsed % payloadSize) == 0) ? payloadSize : _sdu.LengthDataUsed % payloadSize;
            _endingIndices[_nbFragments - 1]  = lastIndex;
            _successfullyTransmittedFragments = new BitArray(_nbFragments, false);
            _lastFragmentSent = new BitArray(_nbFragments, false);
        }
        internal InboundFragmentationMessage(
            UInt16 source,
            UInt16 destination,
            byte sequenceNumber,
            DataRequestHandler lowerLayerRequestHandler,
            int maxPduSize,
            int reservedHeaderSize,
            int reservedTailSize,
            FragmentationMessageTimer timer)
            : base(source, destination, sequenceNumber, lowerLayerRequestHandler, maxPduSize, reservedHeaderSize, reservedTailSize, timer)
        {

        }
        internal OutboundFragmentationMessage(
            UInt16 source,
            UInt16 destination,
            byte messageSeqNumber,
            DataRequestHandler lowerLayerRequestHandler,
            ref Frame sdu,
            Byte sduHandle,
            DataConfirmHandler handler,
            int maxPduSize,
            int reservedHeaderSize,
            int reservedTailSize,
            FragmentationMessageTimer timer
            )
            : base(source, destination, messageSeqNumber, lowerLayerRequestHandler, maxPduSize, reservedHeaderSize, reservedTailSize, timer)
        {
            if (sdu.LengthDataUsed == 0)
            {
                Frame.Release(ref sdu);
                throw new ArgumentException("sdu is empty", "sdu");
            }

            int payloadSize = maxPduSize - 2 - 2; // 2 for our own header, 1 for nb fragment, 1 for fragment id
            if (payloadSize == 0)
            {
                Frame.Release(ref sdu);
                throw new ArgumentException("PDU is too small", "maxPduSize");
            }

            ushort flag = (ushort)(1 << 15);
            _isBroadcast = (destination & flag) > 0 ? true : false;

            _sdu = sdu;
            sdu = null;
            _sduHandle = sduHandle;
            _dataConfirmHandler = handler;
            _messageSeqNumber = messageSeqNumber;
            _timeoutForResending = c_defaultTimeoutForResending;
            _maxFragmentsBeforeAck = c_defaultMaxFragmentsBeforeAck;
            // compute required nb fragments and respective indices.

            int nbFragments = ((_sdu.LengthDataUsed % payloadSize) == 0) ? _sdu.LengthDataUsed / payloadSize : 1 + _sdu.LengthDataUsed / payloadSize;
            if (nbFragments > byte.MaxValue)
                throw new ArgumentException("sdu is too large.");
            _nbFragments = (byte)nbFragments;
            _endingIndices = new int[_nbFragments];
            int lastIndex = -1;
            for (int i = 0; i + 1 < _nbFragments; i++)
            {
                lastIndex += payloadSize;
                _endingIndices[i] = lastIndex;
            }

            lastIndex += ((_sdu.LengthDataUsed % payloadSize) == 0) ? payloadSize : _sdu.LengthDataUsed % payloadSize;
            _endingIndices[_nbFragments - 1] = lastIndex;
            _successfullyTransmittedFragments = new BitArray(_nbFragments, false);
            _lastFragmentSent = new BitArray(_nbFragments, false);
        }
 internal FragmentationMessage(
     UInt16 source,
     UInt16 destination,
     byte messageSeqNumber,
     DataRequestHandler lowerLayerRequestHandler,
     int maxPduSize,
     int reservedHeaderSize,
     int reservedTailSize,
     FragmentationMessageTimer timer)
 {
     _timer = timer;
     _lowerLayerRequestHandler = lowerLayerRequestHandler;
     _currentState = FragmentationMessageState.Initial;
     _source = source;
     _destination = destination;
     _messageSeqNumber = messageSeqNumber;
     _lock = new object();
     _timeoutTicks = long.MaxValue;
     _maxPduSize = maxPduSize;
     _reservedHeaderSize = reservedHeaderSize;
     _reservedTailSize = reservedTailSize;
     _lastFragmentSeqNumberReceived = 0xFF;
     _lastFragmentSeqNumberSent = 0xFF;
 }
Пример #11
0
 /**
 * Adds a custom handler.
 */
 public void addHandler(String service, DataRequestHandler handler) 
 {
     handlers.Add(service, handler);
 }