Ejemplo n.º 1
0
        /// <summary>
        /// Processes the received message.
        /// </summary>
        /// <param name="message">The message.</param>
        private void ProcessRecievedMessage(BitFieldMessage message)
        {
            message.CannotBeNull();

            if (this.HandshakeState == HandshakeState.SendAndReceived)
            {
                if (message.BitField.Length >= this.pieceManager.BlockCount)
                {
                    for (int i = 0; i < this.BitField.Length; i++)
                    {
                        this.BitField[i] = message.BitField[i];
                    }

                    // notify downloading thread
                    this.EnqueueDownloadMessage(message);
                }
                else
                {
                    this.OnCommunicationErrorOccurred(this, new PeerCommunicationErrorEventArgs("Invalid bit field message.", true));
                }
            }
            else
            {
                this.OnCommunicationErrorOccurred(this, new PeerCommunicationErrorEventArgs("Invalid message sequence.", true));
            }
        }
        public void TestTryDecodeBitfieldMessage()
        {
            BitFieldMessage message;
            int             offset = 0;

            byte[] data = "0000000d05fffffffffffffffffffffff8".ToByteArray();
            bool   isIncomplete;

            if (BitFieldMessage.TryDecode(data, ref offset, data.Length, out message, out isIncomplete))
            {
                Assert.AreEqual(17, message.Length);
                Assert.AreEqual(96, message.BitField.Length);
                Assert.AreEqual(true, message.BitField[0]);
                Assert.AreEqual(false, isIncomplete);
                Assert.AreEqual(data.Length, offset);

                for (int i = 0; i < message.BitField.Length; i++)
                {
                    if (i == 88 ||
                        i == 89 ||
                        i == 90)
                    {
                        Assert.IsFalse(message.BitField[i]);
                    }
                    else
                    {
                        Assert.IsTrue(message.BitField[i]);
                    }
                }

                CollectionAssert.AreEqual(data, message.Encode());
            }
            else
            {
                Assert.Fail();
            }
        }