Example #1
0
        /// <summary>
        /// Multiple Voltron packets were sent in a Aries frame.
        /// </summary>
        /// <param name="PacketBuf">The packet buffer containing the packets to process.</param>
        private void ProcessVoltronPackets(Client Client, byte[] PacketBuf)
        {
            VoltronHeader Header = ReadVoltronHeader(PacketBuf, 12);

            MemoryStream       AriesStream = new MemoryStream(PacketBuf);
            EndianBinaryReader Reader      = new EndianBinaryReader(new BigEndianBitConverter(), AriesStream);
            int Remaining = (int)AriesStream.Length - 12;

            byte[] AriesHeader = Reader.ReadBytes(12); //Aries header.

            while (Header.PacketSize < Remaining)
            {
                byte[]        VoltronBody = Reader.ReadBytes((int)Header.PacketSize);
                VoltronPacket Packet      = new VoltronPacket(ReconstructVoltronPacket(AriesHeader,
                                                                                       VoltronBody), true);

                lock (Client.ReceivedPackets)
                    Client.ReceivedPackets.Enqueue(Packet);

                Remaining -= (int)Header.PacketSize;

                if (Header.PacketSize < Remaining)
                {
                    Header = ReadVoltronHeader(AriesStream.ToArray(), (int)(AriesStream.Position));
                }
            }

            Reader.Close();
            ReceivedData?.Invoke(this, Client);
        }
Example #2
0
        private void ProcessBuffer(Client Client)
        {
            while (m_CurrentlyReceived >= PacketSize)
            {
                byte[] PacketBuf = new byte[PacketSize];
                Array.Copy(Client.Buffer, PacketBuf, PacketSize);

                if (PacketType != 0)
                {
                    lock (Client.ReceivedPackets)
                        Client.ReceivedPackets.Enqueue(new AriesPacket(PacketBuf, true));

                    ReceivedData.InvokeSafely(this, Client);

                    m_CurrentlyReceived -= (int)PacketSize;
                }
                else
                {
                    VoltronHeader Header = ReadVoltronHeader(PacketBuf, 12);

                    if (Header.PacketSize < (PacketBuf.Length - 12))
                    {
                        ProcessVoltronPackets(Client, PacketBuf);
                    }
                    else
                    {
                        lock (Client.ReceivedPackets)
                            Client.ReceivedPackets.Enqueue(new VoltronPacket(PacketBuf, true));

                        ReceivedData.InvokeSafely(this, Client);
                    }

                    m_CurrentlyReceived -= (int)PacketSize;
                }

                if (m_CurrentlyReceived > 0)
                {
                    byte[] Remainder = new byte[m_CurrentlyReceived];
                    Array.ConstrainedCopy(Client.Buffer, (Client.Buffer.Length - m_CurrentlyReceived) + 1,
                                          Remainder, 0, m_CurrentlyReceived);

                    //Recreate the packet buffer and copy the remainder back into it.
                    Client.CreateBuffer(BUFFER_SIZE);
                    Array.Copy(Remainder, Client.Buffer, m_CurrentlyReceived);
                    Remainder = null;
                }
                else
                {
                    Client.CreateBuffer(BUFFER_SIZE);
                }
            }
        }
Example #3
0
        /// <summary>
        /// Multiple Voltron packets were sent in a Aries frame.
        /// </summary>
        /// <param name="PacketBuf">The packet buffer containing the packets to process.</param>
        private void ProcessVoltronPackets(Client C, byte[] PacketBuf)
        {
            VoltronHeader Header = ReadVoltronHeader(PacketBuf, 12);

            MemoryStream       AriesStream = new MemoryStream(PacketBuf);
            EndianBinaryReader Reader      = new EndianBinaryReader(new LittleEndianBitConverter(), AriesStream);
            int Remaining = (int)(AriesStream.Length - 1) - 12;

            byte[] AriesHeader = Reader.ReadBytes(12); //Aries header.

            Reader = new EndianBinaryReader(new BigEndianBitConverter(), AriesStream);
            Reader.BaseStream.Position = 12; //We've already read the header.

            while (Header.PacketSize < Remaining)
            {
                byte[] VoltronData = Reader.ReadBytes((int)Header.PacketSize);
                if (Header.PacketType == 0x0044)
                {
                    SplitBufferPDU SplitBufferPacket;

                    SplitBufferPacket = new SplitBufferPDU(VoltronData, false);

                    lock (C.ReceivedSplitBuffers)
                        C.ReceivedSplitBuffers.Enqueue(SplitBufferPacket);

                    if (SplitBufferPacket.EOF == 1)
                    {
                        CompileVoltronPackets(C);
                    }
                }
                else
                {
                    VoltronPacket Packet = new VoltronPacket(ReconstructVoltronPacket(AriesHeader,
                                                                                      VoltronData), true);

                    lock (C.ReceivedPackets)
                        C.ReceivedPackets.Enqueue(Packet);
                }

                Remaining -= (int)Header.PacketSize;

                if (Header.PacketSize < Remaining)
                {
                    Header = ReadVoltronHeader(AriesStream.ToArray(), (int)(AriesStream.Position));
                }
            }

            Reader.Close();

            ReceivedData?.Invoke(this, C);
        }
Example #4
0
        private VoltronHeader ReadVoltronHeader(byte[] Buffer, int Position = 0)
        {
            VoltronHeader Header = new VoltronHeader();

            EndianBinaryReader Reader = new EndianBinaryReader(new BigEndianBitConverter(),
                                                               new MemoryStream(Buffer));

            if (Position != 0)
            {
                Reader.Seek(Position, SeekOrigin.Begin);
            }

            Header.PacketType = Reader.ReadUInt16();
            Header.PacketSize = Reader.ReadUInt32();
            Reader.Close();

            return(Header);
        }
Example #5
0
        private void CompileVoltronPackets(Client C)
        {
            MemoryStream       OutputStream = new MemoryStream();
            EndianBinaryReader Reader;
            EndianBinaryWriter Writer;

            AriesHeader AHeader = new AriesHeader();

            AHeader.PacketSize = m_PacketSize;
            AHeader.PacketType = m_PacketType;

            //Reassemble all the Voltron packets.
            for (int i = 0; i < C.ReceivedSplitBuffers.Count; i++)
            {
                SplitBufferPDU SplitBuffer;
                C.ReceivedSplitBuffers.TryDequeue(out SplitBuffer);

                Reader = new EndianBinaryReader(new BigEndianBitConverter(), OutputStream);
                Writer = new EndianBinaryWriter(new BigEndianBitConverter(), OutputStream);

                Writer.Write(Reader.ReadBytes((int)SplitBuffer.FragmentSize));
                Writer.Flush();
            }

            MemoryStream VoltronPackets = new MemoryStream(OutputStream.ToArray());
            uint         BufSize        = (uint)VoltronPackets.Length;

            for (int i = 0; i < BufSize; i++)
            {
                Reader = new EndianBinaryReader(new BigEndianBitConverter(), VoltronPackets);
                VoltronHeader Header = ReadVoltronHeader(Reader.ReadBytes(12));
                Reader.BaseStream.Position = 0; //Backtrack to beginning of stream.

                VoltronPacket VPacket = new VoltronPacket(
                    ReconstructVoltronPacket(AHeader, Reader.ReadBytes((int)Header.PacketSize)), true);
                C.ReceivedPackets.Enqueue(VPacket);
                BufSize -= Header.PacketSize;

                ReceivedData?.Invoke(this, C);
            }
        }
Example #6
0
        private void ProcessBuffer(Client C)
        {
            lock (m_LockingObj) //The following code won't execute unless it's able to acquire a lock.
            {
                while (m_CurrentlyReceived >= m_PacketSize)
                {
                    byte[] PacketBuf = new byte[m_PacketSize];

                    if (!m_PartialPacketReceived)
                    {
                        Array.Copy(C.Buffer, PacketBuf, m_PacketSize);
                    }
                    else //The slushbuffer wasn't empty, so combine the two buffers into a packet buffer.
                    {
                        Array.ConstrainedCopy(C.SlushBuffer, 0, PacketBuf, 0, m_SizeOfSlush);
                        Array.ConstrainedCopy(C.Buffer, 0, PacketBuf, m_SizeOfSlush, m_CurrentlyReceived);

                        C.CreateSlushBuffer(0);
                        m_SizeOfSlush = 0;

                        m_PartialPacketReceived = false;
                    }

                    if (m_PacketType != 0)
                    {
                        lock (C.ReceivedPackets)
                            C.ReceivedPackets.Enqueue(new AriesPacket(PacketBuf, true));

                        m_CurrentlyReceived -= (int)m_PacketSize;

                        ReceivedData?.Invoke(this, C);
                    }
                    else
                    {
                        VoltronHeader Header = ReadVoltronHeader(PacketBuf, 12);

                        if (Header.PacketSize < ((PacketBuf.Length - 1) - 12))
                        {
                            ProcessVoltronPackets(C, PacketBuf);
                        }
                        else
                        {
                            lock (C.ReceivedPackets)
                                C.ReceivedPackets.Enqueue(new VoltronPacket(PacketBuf, true));

                            ReceivedData?.Invoke(this, C);
                        }

                        m_CurrentlyReceived -= (int)m_PacketSize;
                    }

                    if (m_CurrentlyReceived > 0)
                    {
                        byte[] Remainder = new byte[m_CurrentlyReceived];
                        Array.ConstrainedCopy(C.Buffer, (C.Buffer.Length - m_CurrentlyReceived) + 1,
                                              Remainder, 0, m_CurrentlyReceived);
                        m_SizeOfSlush = m_CurrentlyReceived;

                        C.CreateBuffer(BUFFER_SIZE);
                        C.CreateSlushBuffer(m_SizeOfSlush);
                        Array.Copy(Remainder, C.SlushBuffer, m_CurrentlyReceived);
                        Remainder = null;
                        m_PartialPacketReceived = true;
                    }
                    else
                    {
                        C.CreateBuffer(BUFFER_SIZE);
                    }
                }
            }
        }