private void ParsePacket() { /** Can we parse it? **/ try { var packet = Packet.Packet; if (packet.Type == PacketType.VOLTRON) { var voltronClazz = VoltronPackets.GetByPacketCode((ushort)packet.SubType); if (voltronClazz != null) { IVoltronPacket parsed = (IVoltronPacket)Activator.CreateInstance(voltronClazz); //TODO: VoltronContext parsed.Deserialize(IoBuffer.Wrap(GetBytes()), Context); this.ParsedPacket = parsed; this.parsedInspetor.SelectedObject = ParsedPacket; } } else if (packet.Type == PacketType.ARIES) { var ariesClazz = AriesPackets.GetByPacketCode(packet.SubType); if (ariesClazz != null) { IAriesPacket parsed = (IAriesPacket)Activator.CreateInstance(ariesClazz); parsed.Deserialize(IoBuffer.Wrap(GetBytes()), Context); this.ParsedPacket = parsed; this.parsedInspetor.SelectedObject = ParsedPacket; } } } catch (Exception ex) { } }
static AriesPackets() { ARIES_PACKET_BY_TYPEID = new Dictionary <uint, Type>(); foreach (Type packetType in ARIES_PACKETS) { IAriesPacket packet = (IAriesPacket)Activator.CreateInstance(packetType); ARIES_PACKET_BY_TYPEID.Add(packet.GetPacketType().GetPacketCode(), packetType); } }
private void EncodeAries(IoSession session, object message, IProtocolEncoderOutput output) { IAriesPacket ariesPacket = (IAriesPacket)message; AriesPacketType ariesPacketType = ariesPacket.GetPacketType(); var payload = IoBuffer.Allocate(128); payload.Order = ByteOrder.LittleEndian; payload.AutoExpand = true; ariesPacket.Serialize(payload, Context); payload.Flip(); int payloadSize = payload.Remaining; IoBuffer headers = IoBuffer.Allocate(12); headers.Order = ByteOrder.LittleEndian; /** * Aries header * uint32 type * uint32 timestamp * uint32 payloadSize */ uint timestamp = (uint)TimeSpan.FromTicks(DateTime.Now.Ticks - session.CreationTime.Ticks).TotalMilliseconds; headers.PutUInt32(ariesPacketType.GetPacketCode()); headers.PutUInt32(timestamp); headers.PutUInt32((uint)payloadSize); if (payloadSize > 0) { headers.AutoExpand = true; headers.Put(payload); } headers.Flip(); output.Write(headers); //output.Flush(); }
public override void MessageSent(INextFilter nextFilter, IoSession session, IWriteRequest writeRequest) { IVoltronPacket voltronPacket = writeRequest.OriginalRequest.Message as IVoltronPacket; if (voltronPacket != null) { var voltronBuffer = IoBuffer.Allocate(512); voltronBuffer.Order = ByteOrder.BigEndian; voltronBuffer.AutoExpand = true; voltronPacket.Serialize(voltronBuffer, Context); voltronBuffer.Flip(); var byteArray = new byte[voltronBuffer.Remaining]; voltronBuffer.Get(byteArray, 0, voltronBuffer.Remaining); PacketLogger.OnPacket(new Packet { Data = byteArray, Type = PacketType.VOLTRON, SubType = voltronPacket.GetPacketType().GetPacketCode(), Direction = PacketDirection.OUTPUT }); nextFilter.MessageSent(session, writeRequest); return; } IAriesPacket ariesPacket = writeRequest.OriginalRequest.Message as IAriesPacket; if (ariesPacket != null) { IoBuffer ariesBuffer = IoBuffer.Allocate(128); ariesBuffer.AutoExpand = true; ariesBuffer.Order = ByteOrder.LittleEndian; ariesPacket.Serialize(ariesBuffer, Context); ariesBuffer.Flip(); var byteArray = new byte[ariesBuffer.Remaining]; ariesBuffer.Get(byteArray, 0, ariesBuffer.Remaining); PacketLogger.OnPacket(new Packet { Data = byteArray, Type = PacketType.ARIES, SubType = ariesPacket.GetPacketType().GetPacketCode(), Direction = PacketDirection.OUTPUT }); nextFilter.MessageSent(session, writeRequest); return; } IoBuffer buffer = writeRequest.Message as IoBuffer; if (buffer == null) { nextFilter.MessageSent(session, writeRequest); return; } TryParseAriesFrame(buffer, PacketDirection.OUTPUT); nextFilter.MessageSent(session, writeRequest); }
protected override bool DoDecode(IoSession session, IoBuffer buffer, IProtocolDecoderOutput output) { if (buffer.Remaining < 12) { return(false); } /** * We expect aries, voltron or electron packets */ var startPosition = buffer.Position; buffer.Order = ByteOrder.LittleEndian; uint packetType = buffer.GetUInt32(); uint timestamp = buffer.GetUInt32(); uint payloadSize = buffer.GetUInt32(); if (buffer.Remaining < payloadSize) { /** Not all here yet **/ buffer.Position = startPosition; return(false); } //LOG.Info("[ARIES] " + packetType + " (" + payloadSize + ")"); if (packetType == AriesPacketType.Voltron.GetPacketCode()) { DecodeVoltronStylePackets(buffer, ref payloadSize, output, VoltronPackets.GetByPacketCode); } else if (packetType == AriesPacketType.Electron.GetPacketCode()) { DecodeVoltronStylePackets(buffer, ref payloadSize, output, ElectronPackets.GetByPacketCode); } else if (packetType == AriesPacketType.Gluon.GetPacketCode()) { DecodeVoltronStylePackets(buffer, ref payloadSize, output, GluonPackets.GetByPacketCode); } else { //Aries var packetClass = AriesPackets.GetByPacketCode(packetType); if (packetClass != null) { byte[] data = new byte[(int)payloadSize]; buffer.Get(data, 0, (int)payloadSize); IAriesPacket packet = (IAriesPacket)Activator.CreateInstance(packetClass); packet.Deserialize(IoBuffer.Wrap(data), Context); output.Write(packet); payloadSize = 0; } else { buffer.Skip((int)payloadSize); payloadSize = 0; } } return(true); }