Example #1
0
        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;
                }
            }
        }
Example #2
0
        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;
                    }
                }
            }
        }