예제 #1
0
        public static IEnumerable <OutgoingMessage> TrySplit(OutgoingMessage msg, int mtu)
        {
            if (msg.BodyLength <= mtu) //does not need split this message
            {
                return new OutgoingMessage[1] {
                           msg
                }
            }
            ;
            if (msg.BodyLength > (byte.MaxValue + 1) * mtu)
            {
                throw new AgNetException("Message too long. Maximum message size is " + (byte.MaxValue * mtu).ToString());
            }

            List <OutgoingMessage> list = new List <OutgoingMessage>();

            byte[] data         = msg.GetBody();
            int    needMessages = (int)Math.Ceiling(msg.BodyLength / (double)mtu);

            for (byte i = 0; i < needMessages; i++)
            {
                OutgoingMessage newMsg = new OutgoingMessage(PacketType.PartialMessage);
                newMsg.Channel = i;
                if (i == needMessages - 1)
                {
                    newMsg.Channel = byte.MaxValue;
                }
                int offset = i * mtu;
                newMsg.Write(data, offset, Math.Min(mtu, data.Length - offset));
                list.Add(newMsg);
            }

            return(list);
        }