예제 #1
0
        internal void EnqueueSend(PacketType type, Packet packet)
        {
            // NOTE: packet may be null in the case of Falcon system messages.

            if (packet != null && packet.BytesWritten > FalconPeer.MaxPayloadSize)
            {
                throw new InvalidOperationException(String.Format("Packet size: {0}, greater than max: {1}", packet.BytesWritten, FalconPeer.MaxPayloadSize));
            }

            bool isFalconHeaderWritten = currentDatagramTotalBufferOffset > currentDatagram.Offset;

            if (isFalconHeaderWritten)
            {
                if (packet != null && (packet.BytesWritten + Const.ADDITIONAL_PACKET_HEADER_SIZE) > (currentDatagram.Count - (currentDatagramTotalBufferOffset - currentDatagram.Offset))) // i.e. cannot fit
                {
                    // enqueue the current args and get a new one
                    EnqueueCurrentDatagram();
                    isFalconHeaderWritten = false;
                }
            }

            if (!isFalconHeaderWritten)
            {
                // write the falcon header
                FalconHelper.WriteFalconHeader(currentDatagram.BackingBuffer,
                                               currentDatagram.Offset,
                                               type,
                                               channelType,
                                               seqCount,
                                               packet == null ? (ushort)0 : (ushort)packet.BytesWritten);
                currentDatagramTotalBufferOffset += Const.FALCON_PACKET_HEADER_SIZE;
            }
            else
            {
                // TODO limit max additional to 100 so receive channel can distinguish ordinal seq

                // write additional header
                FalconHelper.WriteAdditionalFalconHeader(currentDatagram.BackingBuffer,
                                                         currentDatagramTotalBufferOffset,
                                                         type,
                                                         channelType,
                                                         packet == null ? (ushort)0 : (ushort)packet.BytesWritten);
                currentDatagramTotalBufferOffset += Const.ADDITIONAL_PACKET_HEADER_SIZE;
            }

            if (packet != null)
            {
                //---------------------------------------------------------------------------------------------------
                packet.CopyBytes(0, currentDatagram.BackingBuffer, currentDatagramTotalBufferOffset, packet.BytesWritten);
                //---------------------------------------------------------------------------------------------------

                currentDatagramTotalBufferOffset += packet.BytesWritten;
            }
        }