From 022704b942b4d3a2f7727c6e1c7cb94ee102f8e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Wed, 9 Apr 2014 20:57:30 +0200 Subject: [PATCH] Erste mapping-Funktionen im Parser --- src/Parser.cs | 193 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 188 insertions(+), 5 deletions(-) diff --git a/src/Parser.cs b/src/Parser.cs index 4ca3ec1..28a1830 100644 --- a/src/Parser.cs +++ b/src/Parser.cs @@ -3,16 +3,33 @@ using System.Linq; using System.Threading; using System.Collections.Generic; using System.Text.RegularExpressions; +using Frontend; namespace WorldOfPeacecraft { public class Parser { + public const string MessUpdate = "upd"; + public const string MessDelete = "del"; + public const string MessMap = "map"; + public const string MessMessage = "mes"; + public const string MessResult = "result"; + public const string MessChallenge = "challenge"; + public const string MessPlayer = "player"; + public const string MessYourid = "yourid"; + public const string MessTime = "time"; + public const string MessOnline = "online"; + public const string MessEntities = "ents"; + public const string MessPlayers = "players"; + public const string MessDragon = "dragon"; + public const string MessMapcell = "cell"; + private Queue Buffer = new Queue (); private AutoResetEvent BufferFilledEvent = new AutoResetEvent (false); private Thread ParserThread; private LinkedList Message; private Regex LastLineRegex; + private Backend backend; public Parser () { @@ -44,16 +61,182 @@ namespace WorldOfPeacecraft // If package is not complete wait for more lines if (!IsCompletePackage ()) return; - String[] aMessage = Enumerable.ToArray(Message); + String[] aMessage = Enumerable.ToArray (Message); Block mainBlock = new Block (aMessage, 0, aMessage.Length - 1); - MapData (mainBlock); + ProcessData (mainBlock); } - private void MapData (Block block) + private void ProcessData (Block parentBlock) { - // TODO Implement + if (parentBlock.GetStringValue ("ans") != null) { + ProcessAnswer (parentBlock); + return; + } + CheckBlocksSize(parentBlock.GetBlocks(), 1, 1); + Block block = parentBlock.GetBlocks ().First.Value; + switch (block.GetName ()) { + case MessUpdate: + ProcessUpdate (block); + break; + case MessDelete: + ProcessDelete (block); + break; + case MessMap: + ProcessMap (block); + break; + case MessMessage: + ProcessMessage (block); + break; + case MessResult: + ProcessResult (block); + break; + case MessChallenge: + ProcessChallenge (block); + break; + case MessPlayer: + ProcessPlayer (block); + break; + case MessYourid: + ProcessYourid (block); + break; + case MessTime: + ProcessTime (block); + break; + case MessOnline: + ProcessOnline (block); + break; + case MessEntities: + ProcessEntities (block); + break; + case MessPlayers: + ProcessEntities (block); + break; + default: + ThrowUnknownBlockException (parentBlock, block); + break; + } } - + + private void ProcessUpdate (Block updateBlock) + { + LinkedList blocks = updateBlock.GetBlocks (); + CheckBlocksSize (updateBlock, 1, 1); + Block block = blocks.First.Value; + switch (block.GetName ()) { + case MessDragon: + ProcessDragon (block); + break; + case MessPlayer: + ProcessPlayer (block); + break; + case MessMapcell: + ProcessMapcell (block); + break; + default: + ThrowUnknownBlockException (updateBlock, block); + break; + } + } + + private void ProcessDelete (Block deleteBlock) + { + LinkedList blocks = deleteBlock; + CheckBlocksSize (deleteBlock, 1, 1); + Block block = blocks.First.Value; + switch (block.GetName ()) { + case MessPlayer: + Player player = MapPlayer(block); + backend.removePlayer(player); + break; + case MessDragon: + Dragon dragon = MapDragon(block); + backend.removeDragon(dragon); + break; + } + } + + private void ProcessMap (Block block) + { + + } + + private void ProcessMessage (Block block) + { + } + + private void ProcessAnswer (Block block) + { + } + + private void ProcessResult (Block block) + { + } + + private void ProcessChallenge (Block block) + { + } + + private void ProcessPlayer (Block block) + { + } + + private void ProcessYourid (Block block) + { + } + + private void ProcessTime (Block block) + { + } + + private void ProcessOnline (Block block) + { + } + + private void ProcessEntities (Block block) + { + } + + private void ProcessPlayers (Block block) + { + } + + private void ProcessMapcell (Block block) + { + } + + private void ProcessDragon (Block block) + { + } + + private Dragon MapDragon (Block block) + { + } + + private Player MapPlayer (Block block) + { + } + + private void ThrowUnknownBlockException (Block parentBlock, Block childBlock) + { + throw new ParsingException("Unknown Block: '" + childBlock.GetName() + "' (as subblock of '" + parentBlock.GetName() + "')"); + } + + private void CheckBlocksSize (Block parentBlock, int min, int max) + { + LinkedList blocks = parentBlock.GetBlocks(); + if (blocks.Count < min || (max >= 0 && blocks.Count > max)) { + if (min == max) { + throw new ParsingException("The block '" + parentBlock.GetName() + "' has to contain exactly '" + min + "' Block, but contained '" + blocks.Count + "'"); + } + else if (max < 0) { + throw new ParsingException("The block '" + parentBlock.GetName() + "' has to contain at least '" + min + "' Blocks, but contained '" + blocks.Count + "'"); + } + else { + throw new ParsingException("The block '" + parentBlock.GetName () + "' has to contain between '" + min + "' and '" + max + "' Blocks, but contained '" + blocks.Count + "'"); + } + } + } + private bool IsCompletePackage () { string lastLine = Message.Last.Value;