public static Packet ChangePacketClass(Packet pak, float newVersion)
        {
            LogPacketData packetData = GetPacketData(newVersion, pak.Code, pak.Direction);
            if (packetData != null && pak.GetType().Equals(packetData.Type))
            {
                pak.Attribute = packetData.Attribute;
                return pak;
            }

            Packet newPacket = CreatePacket(packetData, (int)pak.Length);
            newPacket.CopyFrom(pak);
            return newPacket;
        }
        /// <summary>
        /// Appends the packet data.
        /// </summary>
        /// <param name="text">The text to append packet data to.</param>
        /// <param name="pak">The paket.</param>
        /// <param name="stats">The current stats.</param>
        /// <param name="showPacketSequence">If set to <c>true</c> shows packet sequences.</param>
        /// <param name="baseTime">The base time.</param>
        /// <param name="timeDiff">If set to <c>true</c> shows packet time delta.</param>
        private void AppendPacketData(TextWriter text, Packet pak, ref LogDataStatistics stats, bool showPacketSequence, ref TimeSpan baseTime, bool timeDiff)
        {
            int pakIndex = 0;
            if (showPacketSequence)
            {
                if (pak.Protocol == ePacketProtocol.TCP)
                {
                    if (pak.Direction == ePacketDirection.ClientToServer)
                    {
                        pakIndex = ++stats.PacketsCountOutTCP;
                    }
                    else
                    {
                        pakIndex = ++stats.PacketsCountInTCP;
                    }
                }
                else if (pak.Protocol == ePacketProtocol.UDP)
                {
                    if (pak.Direction == ePacketDirection.ClientToServer)
                    {
                        pakIndex = ++stats.PacketsCountOutUDP;
                    }
                    else
                    {
                        pakIndex = ++stats.PacketsCountInUDP;
                    }
                }
                else
                {
                    throw new ArgumentException("Unknown packet protocol: " + (int) pak.Protocol);
                }
            }

            ++stats.PacketsCount;

            if (showPacketSequence)
            {
                text.Write("{0}:{1,-5} ", pak.Protocol, pakIndex);
            }

            // main description
            pak.ToHumanReadableString(text, baseTime, mnuPacketFlags.Checked);
            // if use WriteLine as \r\n then packets will have not correctly index in stream.
            // because after stream will be loaded in RichTextBox it will have lines delemiter as set in RichTextBox
            // Maybe need to set stream.NewLine
            text.WriteLine();

            if (timeDiff)
            {
                baseTime = pak.Time;
            }
        }
        private void UpdateInstantParseTab()
        {
            float ver;
            Util.ParseFloat(instantVersion.Text, out ver, -1);

            Packet pak = new Packet(0);
            int code;
            if (!Util.ParseInt(instantCode.Text, out code))
                code = 0;
            pak.Code = (byte)code;
            bool daocLoggerPacket = false;
            try
            {
                if (instantParseInput.Text[0] == '<')
                {
                    try
                    {
                        string[] lines = instantParseInput.Lines;

                        ePacketDirection dir;
                        ePacketProtocol prot;
                        TimeSpan time;
                        int dataLen = DaocLoggerV3TextLogReader.ParseHeader(lines[0], out code, out dir, out prot, out time);
                        pak.Code = (byte)code;
                        pak.Direction = dir;
                        pak.Protocol = prot;
                        pak.Time = time;

                        for (int i = 1; i < lines.Length; i++)
                        {
                            DaocLoggerV3TextLogReader.ParseDataLine(lines[i], pak);
                        }
                        daocLoggerPacket = true;

                        if (pak.Direction == ePacketDirection.ClientToServer)
                        {
                            instantClientToServer.Checked = true;
                        }
                        else
                        {
                            instantServerToClient.Checked = true;
                        }
                    }
                    catch(Exception) {}
                }
                // failed to read daoc logger format
                if (!daocLoggerPacket)
                {
                    pak.Position = 0;
                    foreach (string line in instantParseInput.Text.Split('\n'))
                    {
                        foreach (string str in line.Split(' '))
                        {
                            try
                            {
                                if (str.Trim().Length != 2) continue;
                                byte b = byte.Parse(str.Trim(), NumberStyles.HexNumber);
                                pak.WriteByte(b);
                            }
                            catch(Exception)
                            {
                            }
                        }
                    }
                }
            }
            catch(Exception)
            {
            }

            if (instantServerToClient.Checked)
                pak.Direction = ePacketDirection.ServerToClient;
            else
                pak.Direction = ePacketDirection.ClientToServer;

            pak = PacketManager.CreatePacket(ver, pak.Code,  pak.Direction).CopyFrom(pak);

            StringBuilder result = new StringBuilder();
            result.AppendFormat("ver:{0}  code:0x{1:X2} (old:0x{2:X2})  dir:{3}  len:{4} (0x{4:X})  logger packet:{5}", ver, pak.Code, pak.Code^168, pak.Direction, pak.Length, daocLoggerPacket);
            result.Append("\npacket class: ").Append(pak.GetType().Name).Append("\n");
            result.AppendFormat("desc: \"{0}\"\n\n", pak.Description);
            try
            {
                pak.InitException = null;
                pak.Initialized = false;
                pak.Position = 0;
                pak.Init();
                pak.PositionAfterInit = pak.Position;
                pak.Initialized = true;
                result.Append(pak.GetPacketDataString(true));
            }
            catch (OutOfMemoryException e)
            {
                pak.Initialized = false;
                pak.InitException = e;
                result.Append(e.ToString());
            }
            catch (Exception e)
            {
                pak.InitException = e;
                result.AppendFormat("{0}: {1}", e.GetType().ToString(), e.Message);
            //				result.Append("\n\n").Append(e.ToString());
            }

            if (pak.PositionAfterInit > pak.Length)
            {
                result.AppendFormat("\n(pak.PositionAfterInit > pak.Length !)");
            }

            //			string notInitialized = pak.GetNotInitializedData();
            //			if (notInitialized.Length > 0)
            //			{
            //				result.AppendFormat("\n\nnot initialized:\n{0}", notInitialized);
            //			}
            using (StringWriter sw = new StringWriter())
            {
                pak.AppendNotInitializedData(sw);
                if (sw.ToString().Length > 0)
                    result.AppendFormat("\n\nnot initialized:\n{0}", sw.ToString());
            }

            result.Append('\n');

            instantParseOut.Text = result.ToString();

            if (daocLoggerPacket)
            {
                instantCode.Text = "0x"+pak.Code.ToString("X2");
                instantClientToServer.Checked = pak.Direction == ePacketDirection.ClientToServer;
            }
        }
        public void RestoreLogPositionByPacket(Packet restorePacket)
        {
            if (restorePacket != null)
            {
                int restoreIndex = -1;
                {
                    restoreIndex = LogManager.FindTextIndexByPacket(restorePacket);
                }

                if (restoreIndex >= 0)
                {
                    logDataText.SelectionLength = 0;
                    logDataText.SelectionStart = restoreIndex;
                    logDataText.Focus();
                }
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="T:PacketInfo"/> class.
 /// </summary>
 /// <param name="newPacket">The new packet.</param>
 /// <param name="newTextIndex">New index of the text.</param>
 /// <param name="newPacketLocation">New packet location.</param>
 public PacketInfo(Packet newPacket, int newTextIndex, PacketLocation newPacketLocation)
 {
     Packet = newPacket;
     TextEndIndex = newTextIndex;
     PacketLocation = newPacketLocation;
 }
 /// <summary>
 /// Raises the filtering packet event.
 /// </summary>
 /// <param name="pak">The pak.</param>
 private void RaiseFilteringPacketEvent(Packet pak)
 {
     try
     {
         PacketAction e = FilteringPacketEvent;
         if (e != null)
             e(pak);
     }
     catch (Exception e)
     {
         Log.Error(e.Message, e);
     }
 }
        /// <summary>
        /// Determines whether the specified packet is ignored.
        /// </summary>
        /// <param name="pak">The packet.</param>
        /// <returns>
        /// 	<c>true</c> if the specified packet is ignored; otherwise, <c>false</c>.
        /// </returns>
        public bool IsPacketIgnored(Packet pak)
        {
            if (m_IgnoreFilters) // temporary Ignore filters
                return false;

            // Notify all listeners
            RaiseFilteringPacketEvent(pak);

            bool ret = false;

            if (m_loading)
            {
                ret = true;
            }
            else
            {
                if (CombineFilters) // allow if not ignored by at least on filter
                {
                    ret = true;
                    for (int i = 0; i < m_filters.Count; i++)
                    {
                        ILogFilter filter = (ILogFilter)m_filters[i];
                        if (filter.IsPacketIgnored(pak) == m_invertCheck) // not ignored = allow
                        {
                            ret = false;
                            break;
                        }
                    }
                }
                else
                {
                    ret = false;
                    for (int i = 0; i < m_filters.Count; i++)
                    {
                        ILogFilter filter = (ILogFilter)m_filters[i];
                        if (filter.IsPacketIgnored(pak) != m_invertCheck) // not ignored = allow
                        {
                            ret = true;
                            break;
                        }
                    }
                }
            }

            return ret;
        }
 /// <summary>
 /// Finds the text index by packet.
 /// </summary>
 /// <param name="packet">The packet.</param>
 /// <returns></returns>
 public int FindTextIndexByPacket(Packet packet)
 {
     return m_packetTextLocations.FindTextIndexByPacket(packet);
 }
Esempio n. 9
0
		/// <summary>
		/// Copy all data from another packet and init private fields if any
		/// </summary>
		/// <param name="pak"></param>
		/// <returns>The target packet instance (this)</returns>
		public virtual Packet CopyFrom(Packet pak)
		{
			m_code = pak.m_code;
			m_direction = pak.m_direction;
			m_time = pak.m_time;
			m_protocol = pak.m_protocol;
			SetLength(0);
			Position = 0;
			pak.Position = 0;
			pak.WriteTo(this);
			return this;
		}
 /// <summary>
 /// Processes start of filtering of a packet by filter manager.
 /// </summary>
 /// <param name="packet"></param>
 protected virtual void FilterManager_OnFilteringPacketEvent(Packet packet)
 {
 }