ace/Source/ACE.Server/Network/ClientPacket.cs
Mag-nus ac678dd99e
Packets log level to separate configurable value via log4net.config file. (#974)
* GetPlayerBiotas and Player SaveBiotas moved to log.Debug level.

* Packets are now in separate configurable log
2018-08-26 06:45:47 -05:00

70 lines
2.4 KiB
C#

using System;
using System.IO;
using log4net;
namespace ACE.Server.Network
{
public class ClientPacket : Packet
{
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private static readonly ILog packetLog = LogManager.GetLogger(System.Reflection.Assembly.GetEntryAssembly(), "Packets");
public BinaryReader Payload { get; private set; }
public PacketHeaderOptional HeaderOptional { get; private set; }
public bool IsValid { get; private set; } = false;
public ClientPacket(byte[] data)
{
ParsePacketData(data);
if (IsValid)
ReadFragments();
}
private void ParsePacketData(byte[] data)
{
try
{
using (var stream = new MemoryStream(data))
{
using (var reader = new BinaryReader(stream))
{
Header = new PacketHeader(reader);
Data = new MemoryStream(reader.ReadBytes(Header.Size), 0, Header.Size, false, true);
Payload = new BinaryReader(Data);
HeaderOptional = new PacketHeaderOptional(Payload, Header);
}
}
IsValid = true;
}
catch(Exception ex)
{
log.Error("Invalid packet data", ex);
}
}
private void ReadFragments()
{
if (Header.HasFlag(PacketHeaderFlags.BlobFragments))
{
while (Payload.BaseStream.Position != Payload.BaseStream.Length)
Fragments.Add(new ClientPacketFragment(Payload));
}
}
public bool VerifyChecksum(uint issacXor)
{
uint fragmentChecksum = 0u;
foreach (ClientPacketFragment fragment in Fragments)
{
fragmentChecksum += fragment.CalculateHash32();
}
uint payloadChecksum = HeaderOptional.CalculateHash32() + fragmentChecksum;
uint finalChecksum = Header.CalculateHash32() + (payloadChecksum ^ issacXor);
packetLog.DebugFormat("Checksum is calculated as {0} and is {1} in header", finalChecksum, Header.Checksum);
return finalChecksum == Header.Checksum;
}
}
}