예제 #1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="map"></param>
        /// <param name="frequency"></param>
		private void PrintOneMap(MapPacket[] map, string frequency) {
			int i;

			for (i = 0; i < map.Length; ++i)
			{
				if (map[i] != null)
				{
					Console.WriteLine("{0} {1,5} - {2} - {3} - {4}", frequency, i, map[i].Name,
						map[i].Trusted ? "Trusted" : "Untrusted",
						map[i].Encoded ? "Unencoded" : "Zerocoded");

					foreach (MapBlock block in map[i].Blocks)
					{
						if (block.Count == -1) 
						{
							Console.WriteLine("\t{0,4} {1} (Variable)", block.KeywordPosition, block.Name);
						} 
						else 
						{
							Console.WriteLine("\t{0,4} {1} ({2})", block.KeywordPosition, block.Name, block.Count);
						}

						foreach (MapField field in block.Fields)
						{
							Console.WriteLine("\t\t{0,4} {1} ({2} / {3})", field.KeywordPosition, field.Name,
								field.Type, field.Count);
						}
					}
				}
			}
		}
예제 #2
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="mapFile"></param>
		private void LoadMapFile(string mapFile)
		{
			FileStream map;
			ushort low = 1;
			ushort medium = 1;
			ushort high = 1;

			// Load the protocol map file
			try
			{
				map = new FileStream(mapFile, FileMode.Open, FileAccess.Read); 
			}
			catch(Exception e) 
			{
				throw new Exception("Map file loading error", e);
			}

			try
			{
				StreamReader r = new StreamReader(map);        
				r.BaseStream.Seek(0, SeekOrigin.Begin);
				string newline;
				string trimmedline;
				bool inPacket = false;
				bool inBlock = false;
				MapPacket currentPacket = null;
				MapBlock currentBlock = null;
				char[] trimArray = new char[] {' ', '\t'};

				// While not at the end of the file
				while (r.Peek() > -1) 
				{
					#region ParseMap

					newline = r.ReadLine();
					trimmedline = System.Text.RegularExpressions.Regex.Replace(newline, @"\s+", " ");
					trimmedline = trimmedline.Trim(trimArray);

					if (!inPacket)
					{
						// Outside of all packet blocks

						if (trimmedline == "{")
						{
							inPacket = true;
						}
					}
					else
					{
						// Inside of a packet block

						if (!inBlock)
						{
							// Inside a packet block, outside of the blocks

							if (trimmedline == "{")
							{
								inBlock = true;
							}
							else if (trimmedline == "}")
							{
								// Reached the end of the packet
								currentPacket.Blocks.Sort();
								inPacket = false;
							}
							else 
							{
								// The packet header
								#region ParsePacketHeader

								// Splice the string in to tokens
								string[] tokens = trimmedline.Split(new char[] {' ', '\t'});

								if (tokens.Length > 3)
								{
                                    //Hash packet name to insure correct keyword ordering
                                    KeywordPosition(tokens[0]);

									if (tokens[1] == "Fixed")
									{
										// Remove the leading "0x"
										if (tokens[2].Substring(0, 2) == "0x")
										{
											tokens[2] = tokens[2].Substring(2, tokens[2].Length - 2);
										}

										uint fixedID = UInt32.Parse(tokens[2], System.Globalization.NumberStyles.HexNumber);
										// Truncate the id to a short
										fixedID ^= 0xFFFF0000;
										LowMaps[fixedID] = new MapPacket();
										LowMaps[fixedID].ID = (ushort)fixedID;
										LowMaps[fixedID].Frequency = PacketFrequency.Low;
										LowMaps[fixedID].Name = tokens[0];
										LowMaps[fixedID].Trusted = (tokens[3] == "Trusted");
										LowMaps[fixedID].Encoded = (tokens[4] == "Zerocoded");
										LowMaps[fixedID].Blocks = new List<MapBlock>();

										currentPacket = LowMaps[fixedID];
									}
									else if (tokens[1] == "Low")
									{
										LowMaps[low] = new MapPacket();
										LowMaps[low].ID = low;
										LowMaps[low].Frequency = PacketFrequency.Low;
										LowMaps[low].Name = tokens[0];
										LowMaps[low].Trusted = (tokens[2] == "Trusted");
										LowMaps[low].Encoded = (tokens[3] == "Zerocoded");
										LowMaps[low].Blocks = new List<MapBlock>();

										currentPacket = LowMaps[low];

										low++;
									}
									else if (tokens[1] == "Medium")
									{
										MediumMaps[medium] = new MapPacket();
										MediumMaps[medium].ID = medium;
										MediumMaps[medium].Frequency = PacketFrequency.Medium;
										MediumMaps[medium].Name = tokens[0];
										MediumMaps[medium].Trusted = (tokens[2] == "Trusted");
										MediumMaps[medium].Encoded = (tokens[3] == "Zerocoded");
										MediumMaps[medium].Blocks = new List<MapBlock>();

										currentPacket = MediumMaps[medium];

										medium++;
									}
									else if (tokens[1] == "High")
									{
										HighMaps[high] = new MapPacket();
										HighMaps[high].ID = high;
										HighMaps[high].Frequency = PacketFrequency.High;
										HighMaps[high].Name = tokens[0];
										HighMaps[high].Trusted = (tokens[2] == "Trusted");
										HighMaps[high].Encoded = (tokens[3] == "Zerocoded");
										HighMaps[high].Blocks = new List<MapBlock>();

										currentPacket = HighMaps[high];

										high++;
									}
									else
									{
										Logger.Log("Unknown packet frequency", Helpers.LogLevel.Error, Client);
									}
								}

								#endregion
							}
						}
						else
						{
							if (trimmedline.Length > 0 && trimmedline.Substring(0, 1) == "{")
							{
								// A field
								#region ParseField

								MapField field = new MapField();

								// Splice the string in to tokens
								string[] tokens = trimmedline.Split(new char[] {' ', '\t'});

								field.Name = tokens[1];
								field.KeywordPosition = KeywordPosition(field.Name);
								field.Type = (FieldType)Enum.Parse(typeof(FieldType), tokens[2], true);

								if (tokens[3] != "}")
								{
									field.Count = Int32.Parse(tokens[3]);
								}
								else
								{
									field.Count = 1;
								}

								// Save this field to the current block
								currentBlock.Fields.Add(field);

								#endregion
							}
							else if (trimmedline == "}")
							{
								currentBlock.Fields.Sort();
								inBlock = false;
							}
							else if (trimmedline.Length != 0 && trimmedline.Substring(0, 2) != "//")
							{
								// The block header
								#region ParseBlockHeader

								currentBlock = new MapBlock();

								// Splice the string in to tokens
								string[] tokens = trimmedline.Split(new char[] {' ', '\t'});

								currentBlock.Name = tokens[0];
								currentBlock.KeywordPosition = KeywordPosition(currentBlock.Name);
								currentBlock.Fields = new List<MapField>();
								currentPacket.Blocks.Add(currentBlock);

								if (tokens[1] == "Single")
								{
									currentBlock.Count = 1;
								}
								else if (tokens[1] == "Multiple")
								{
									currentBlock.Count = Int32.Parse(tokens[2]);
								}
								else if (tokens[1] == "Variable")
								{
									currentBlock.Count = -1;
								}
								else
								{
									Logger.Log("Unknown block frequency", Helpers.LogLevel.Error, Client);
								}

								#endregion
							}
						}
					}

					#endregion
				}

				r.Close();
				map.Close();
			}
			catch (Exception e)
			{
                throw new Exception("Map file parsing error", e); ;
			}
		}
예제 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="mapFile"></param>
        private void LoadMapFile(string mapFile)
        {
            ushort low    = 1;
            ushort medium = 1;
            ushort high   = 1;

            // Load the protocol map file
            try
            {
                using (FileStream map = new FileStream(mapFile, FileMode.Open, FileAccess.Read))
                {
                    using (StreamReader r = new StreamReader(map))
                    {
                        r.BaseStream.Seek(0, SeekOrigin.Begin);
                        string    newline;
                        string    trimmedline;
                        bool      inPacket      = false;
                        bool      inBlock       = false;
                        MapPacket currentPacket = null;
                        MapBlock  currentBlock  = null;
                        char[]    trimArray     = new char[] { ' ', '\t' };

                        // While not at the end of the file
                        while (r.Peek() > -1)
                        {
                            #region ParseMap

                            newline     = r.ReadLine();
                            trimmedline = System.Text.RegularExpressions.Regex.Replace(newline, @"\s+", " ");
                            trimmedline = trimmedline.Trim(trimArray);

                            if (!inPacket)
                            {
                                // Outside of all packet blocks

                                if (trimmedline == "{")
                                {
                                    inPacket = true;
                                }
                            }
                            else
                            {
                                // Inside of a packet block

                                if (!inBlock)
                                {
                                    // Inside a packet block, outside of the blocks

                                    if (trimmedline == "{")
                                    {
                                        inBlock = true;
                                    }
                                    else if (trimmedline == "}")
                                    {
                                        // Reached the end of the packet
                                        currentPacket.Blocks.Sort();
                                        inPacket = false;
                                    }
                                    else
                                    {
                                        // The packet header
                                        #region ParsePacketHeader

                                        // Splice the string in to tokens
                                        string[] tokens = trimmedline.Split(new char[] { ' ', '\t' });

                                        if (tokens.Length > 3)
                                        {
                                            //Hash packet name to insure correct keyword ordering
                                            KeywordPosition(tokens[0]);

                                            if (tokens[1] == "Fixed")
                                            {
                                                // Remove the leading "0x"
                                                if (tokens[2].Substring(0, 2) == "0x")
                                                {
                                                    tokens[2] = tokens[2].Substring(2, tokens[2].Length - 2);
                                                }

                                                uint fixedID = UInt32.Parse(tokens[2], System.Globalization.NumberStyles.HexNumber);
                                                // Truncate the id to a short
                                                fixedID                   ^= 0xFFFF0000;
                                                LowMaps[fixedID]           = new MapPacket();
                                                LowMaps[fixedID].ID        = (ushort)fixedID;
                                                LowMaps[fixedID].Frequency = PacketFrequency.Low;
                                                LowMaps[fixedID].Name      = tokens[0];
                                                LowMaps[fixedID].Trusted   = (tokens[3] == "Trusted");
                                                LowMaps[fixedID].Encoded   = (tokens[4] == "Zerocoded");
                                                LowMaps[fixedID].Blocks    = new List <MapBlock>();

                                                currentPacket = LowMaps[fixedID];
                                            }
                                            else if (tokens[1] == "Low")
                                            {
                                                LowMaps[low]           = new MapPacket();
                                                LowMaps[low].ID        = low;
                                                LowMaps[low].Frequency = PacketFrequency.Low;
                                                LowMaps[low].Name      = tokens[0];
                                                LowMaps[low].Trusted   = (tokens[2] == "Trusted");
                                                LowMaps[low].Encoded   = (tokens[3] == "Zerocoded");
                                                LowMaps[low].Blocks    = new List <MapBlock>();

                                                currentPacket = LowMaps[low];

                                                low++;
                                            }
                                            else if (tokens[1] == "Medium")
                                            {
                                                MediumMaps[medium]           = new MapPacket();
                                                MediumMaps[medium].ID        = medium;
                                                MediumMaps[medium].Frequency = PacketFrequency.Medium;
                                                MediumMaps[medium].Name      = tokens[0];
                                                MediumMaps[medium].Trusted   = (tokens[2] == "Trusted");
                                                MediumMaps[medium].Encoded   = (tokens[3] == "Zerocoded");
                                                MediumMaps[medium].Blocks    = new List <MapBlock>();

                                                currentPacket = MediumMaps[medium];

                                                medium++;
                                            }
                                            else if (tokens[1] == "High")
                                            {
                                                HighMaps[high]           = new MapPacket();
                                                HighMaps[high].ID        = high;
                                                HighMaps[high].Frequency = PacketFrequency.High;
                                                HighMaps[high].Name      = tokens[0];
                                                HighMaps[high].Trusted   = (tokens[2] == "Trusted");
                                                HighMaps[high].Encoded   = (tokens[3] == "Zerocoded");
                                                HighMaps[high].Blocks    = new List <MapBlock>();

                                                currentPacket = HighMaps[high];

                                                high++;
                                            }
                                            else
                                            {
                                                Logger.Log("Unknown packet frequency", Helpers.LogLevel.Error, Client);
                                            }
                                        }

                                        #endregion
                                    }
                                }
                                else
                                {
                                    if (trimmedline.Length > 0 && trimmedline.Substring(0, 1) == "{")
                                    {
                                        // A field
                                        #region ParseField

                                        MapField field = new MapField();

                                        // Splice the string in to tokens
                                        string[] tokens = trimmedline.Split(new char[] { ' ', '\t' });

                                        field.Name            = tokens[1];
                                        field.KeywordPosition = KeywordPosition(field.Name);
                                        field.Type            = (FieldType)Enum.Parse(typeof(FieldType), tokens[2], true);

                                        if (tokens[3] != "}")
                                        {
                                            field.Count = Int32.Parse(tokens[3]);
                                        }
                                        else
                                        {
                                            field.Count = 1;
                                        }

                                        // Save this field to the current block
                                        currentBlock.Fields.Add(field);

                                        #endregion
                                    }
                                    else if (trimmedline == "}")
                                    {
                                        currentBlock.Fields.Sort();
                                        inBlock = false;
                                    }
                                    else if (trimmedline.Length != 0 && trimmedline.Substring(0, 2) != "//")
                                    {
                                        // The block header
                                        #region ParseBlockHeader

                                        currentBlock = new MapBlock();

                                        // Splice the string in to tokens
                                        string[] tokens = trimmedline.Split(new char[] { ' ', '\t' });

                                        currentBlock.Name            = tokens[0];
                                        currentBlock.KeywordPosition = KeywordPosition(currentBlock.Name);
                                        currentBlock.Fields          = new List <MapField>();
                                        currentPacket.Blocks.Add(currentBlock);

                                        if (tokens[1] == "Single")
                                        {
                                            currentBlock.Count = 1;
                                        }
                                        else if (tokens[1] == "Multiple")
                                        {
                                            currentBlock.Count = Int32.Parse(tokens[2]);
                                        }
                                        else if (tokens[1] == "Variable")
                                        {
                                            currentBlock.Count = -1;
                                        }
                                        else
                                        {
                                            Logger.Log("Unknown block frequency", Helpers.LogLevel.Error, Client);
                                        }

                                        #endregion
                                    }
                                }
                            }

                            #endregion
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new Exception("Map file parsing error", e);;
            }
        }