/// <summary> /// Decodes the message. /// </summary> /// <param name="buffer">The buffer.</param> /// <param name="offsetFrom">The offset from.</param> /// <param name="offsetTo">The offset to.</param> /// <param name="message">The message.</param> /// <param name="isIncomplete">if set to <c>true</c> the message is incomplete.</param> /// <param name="destination">The destination data array.</param> /// <returns> /// True if decoding was successful; false otherwise. /// </returns> public static bool TryDecode(byte[] buffer, ref int offsetFrom, int offsetTo, out PieceMessage message, out bool isIncomplete, byte[] destination = null) { int messageLength; byte messageId; int pieceIndex; int blockOffset; int blockDataLength = 0; int destinationOffset = 0; int offsetFrom2 = offsetFrom; message = null; isIncomplete = false; if (buffer != null && buffer.Length > offsetFrom2 + MessageLengthLength + MessageIdLength + PieiceIndexLength + BlockOffsetLength && offsetFrom2 >= 0 && offsetFrom2 < buffer.Length && offsetTo >= offsetFrom2 && offsetTo <= buffer.Length) { messageLength = Message.ReadInt(buffer, ref offsetFrom2); messageId = Message.ReadByte(buffer, ref offsetFrom2); pieceIndex = Message.ReadInt(buffer, ref offsetFrom2); blockOffset = Message.ReadInt(buffer, ref offsetFrom2); blockDataLength = messageLength - MessageIdLength - PieiceIndexLength - BlockOffsetLength; if (messageLength > MessageIdLength + PieiceIndexLength + BlockOffsetLength && messageId == MessageId && pieceIndex >= 0 && blockOffset >= 0 && blockDataLength >= 0) { if (offsetFrom2 + blockDataLength <= offsetTo) { if (destination == null) { destination = new byte[blockDataLength]; destinationOffset = 0; } else { destinationOffset = blockOffset; } Message.Copy(buffer, offsetFrom2, destination, ref destinationOffset, blockDataLength); message = new PieceMessage(pieceIndex, blockOffset, blockDataLength, destination); offsetFrom = offsetFrom2 + blockDataLength; } else { isIncomplete = true; } } } return(message != null); }
/// <summary> /// Determines whether the specified <see cref="object" />, is equal to this instance. /// </summary> /// <param name="obj">The <see cref="object" /> to compare with this instance.</param> /// <returns> /// <c>true</c> if the specified <see cref="object" /> is equal to this instance; otherwise, <c>false</c>. /// </returns> public override bool Equals(object obj) { PieceMessage msg = obj as PieceMessage; if (msg == null) { return(false); } else if (this.PieceIndex == msg.PieceIndex && this.BlockOffset == msg.BlockOffset && this.Data.ToHexaDecimalString() == msg.Data.ToHexaDecimalString()) { return(true); } else { return(false); } }
/// <summary> /// Decodes the message. /// </summary> /// <param name="buffer">The buffer.</param> /// <param name="offsetFrom">The offset from.</param> /// <param name="offsetTo">The offset to.</param> /// <param name="message">The message.</param> /// <param name="isIncomplete">if set to <c>true</c> the message is incomplete.</param> /// <returns> /// True if decoding was successful; false otherwise. /// </returns> public static bool TryDecode(byte[] buffer, ref int offsetFrom, int offsetTo, out PeerMessage message, out bool isIncomplete) { byte messageId; int messageLength; int offset2 = offsetFrom; message = null; isIncomplete = false; if (buffer.IsNotNullOrEmpty() && buffer.Length >= offsetFrom + Message.IntLength + Message.ByteLength) { messageLength = Message.ReadInt(buffer, ref offset2); messageId = Message.ReadByte(buffer, ref offset2); offset2 = offsetFrom; // reset offset ////if (messageLength == 0) ////{ //// KeepAliveMessage message2; //// KeepAliveMessage.TryDecode(buffer, ref offset2, out message2); //// message = message2; ////} if (messageId == ChokeMessage.MessageId) { ChokeMessage message2; ChokeMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == UnchokeMessage.MessageId) { UnchokeMessage message2; UnchokeMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == InterestedMessage.MessageId) { InterestedMessage message2; InterestedMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == UninterestedMessage.MessageId) { UninterestedMessage message2; UninterestedMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == HaveMessage.MessageId) { HaveMessage message2; HaveMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == BitFieldMessage.MessageId) { BitFieldMessage message2; BitFieldMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == RequestMessage.MessageId) { RequestMessage message2; RequestMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == CancelMessage.MessageId) { CancelMessage message2; CancelMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == PortMessage.MessageId) { PortMessage message2; PortMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else if (messageId == PieceMessage.MessageId) { PieceMessage message2; PieceMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } else { HandshakeMessage message2; HandshakeMessage.TryDecode(buffer, ref offset2, offsetTo, out message2, out isIncomplete); message = message2; } } if (message != null) { offsetFrom = offset2; } return(message != null); }