private void HandleControlPacket(Packet packet) { base.HandlePacket(packet); while (true) { UInt16 len; PacketStream.State prevState = stream.CurrentState; try { stream.Seek(2, SeekOrigin.Current); len = stream.PeekU16(); } catch (EndOfStreamException) { if (stream.HasNextDirection()) { stream.NextDirection(); prevState = stream.CurrentState; continue; } else { return; } } finally { stream.CurrentState = prevState; } if (stream.Length - stream.Position >= len + 4) { try { ParseControlCommand(); } catch (StreamSessionParseError e) { logger.AddMessage(String.Format("Failed to parse RRAC command: {0}", e.Message)); } stream.CurrentState = prevState; stream.Seek(4 + len, SeekOrigin.Current); } else { return; } } }
public override void HandlePacket(Packet packet) { base.HandlePacket(packet); while (true) { PacketStream.State prevState = stream.CurrentState; try { List <PacketSlice> slices = new List <PacketSlice>(2); TransactionNode node; if (stream.Direction == PacketDirection.PACKET_DIRECTION_OUTGOING) { RemSyncCommand cmdType; string cmdTypeStr; List <PacketSlice> argSlices = new List <PacketSlice>(2); UInt16 arg = stream.ReadU16(argSlices); UInt16 cmdTypeRaw = stream.ReadU16(slices); ParseCommandType(cmdTypeRaw, out cmdType, out cmdTypeStr); node = new TransactionNode(cmdTypeStr); switch (cmdType) { case RemSyncCommand.SetStatus: node.AddField("MessageSize", Convert.ToString(arg), "Size of zero-terminated unicode string following the next field.", argSlices); break; case RemSyncCommand.SetProgressValue: node.AddField("NewValue", Convert.ToString(arg), "The new progress value, within ProgressMin and ProgressMax as specified with SetProgressRange.", argSlices); break; default: node.AddField("Argument", Convert.ToString(arg), "Argument, meaning depending on the NotificationType field.", argSlices); break; } node.AddField("NotificationType", cmdTypeStr, "Type of notification.", slices); UInt16 u16; switch (cmdType) { case RemSyncCommand.SetStatus: string msg = stream.ReadCString(arg, slices); node.AddField("MessageBytes", msg, "A zero-terminated unicode LE16 string with the size as specified by MessageSize (which includes the terminating NUL byte).", slices); break; case RemSyncCommand.SetProgressRange: u16 = stream.ReadU16(slices); node.AddField("ProgressMin", Convert.ToString(u16), "Progressbar min value.", slices); u16 = stream.ReadU16(slices); node.AddField("ProgressMax", Convert.ToString(u16), "Progressbar max value.", slices); break; } } else { node = new TransactionNode("RemSync::UNKNOWN_REPLY"); byte[] bytes = stream.ReadBytes((int)stream.Length, slices); node.AddField("UnknownBytes", Util.FormatByteArray(bytes), "Unknown reply data.", slices); } node.Description = node.Name; AddTransactionNode(node); } catch (EndOfStreamException) { if (stream.HasNextDirection()) { stream.NextDirection(); continue; } else { stream.CurrentState = prevState; return; } } } }