public void ConnectToLoginServer(string server = null) { if (!string.IsNullOrEmpty(server)) { Server = server; } if (string.IsNullOrEmpty(Server)) { throw new ArgumentException("OwnerServer"); } if (Session == null) { Session = new Session(); } var addr = Dns.GetHostAddresses(Server); if (addr.Length == 0) { _logger.Error("Failed to resolve '{0}' to an ipaddress", Server); return; } _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); _socketReader = new SocketReader(Session, _socket); _socketWriter = new SocketWriter(Session, _socket); var ip = addr.First(); _logger.Trace("resolved {0} to '{1}'", ip, Server); var endpoint = new IPEndPoint(ip, 44453); _socketReader.MaxMessageSize = 496; Session.Command = SessionCommand.Connect; _socket.Connect(endpoint); _socketReader.Start().WaitOne(Timeout); _socketWriter.Start().WaitOne(Timeout); var timeout = DateTime.Now.AddMilliseconds(Timeout); while (Session.Status != SessionStatus.Connected && Session.Status != SessionStatus.Error) { if (timeout <= DateTime.Now) { throw new TimeoutException("Timeout waiting for server conenction"); } Thread.Sleep(Timeout / 10); } }
protected void ParseData(IFFFile.Node node, ITemplateRepository repo, Action <IFFFile.Node, ITemplateRepository> parseDataAction, LogAbstraction.ILogger logger, Action <IFFFile.Node, ITemplateRepository> parseDerveAction = null, bool parseNext = true) { if (parseDerveAction == null) { parseDerveAction = ParseDerv; } var derv = node.FindSubNode("DERV"); if (derv != null) { parseDerveAction(node, repo); } var nextNode = derv != null?derv.FindNextSibling() : node.Children.FirstOrDefault(); if (nextNode == null) { _Logger.Trace("unable to locate next node for node {0}", node.Type); return; } var sizeNode = nextNode.FindSubNode("PCNT", true); if (sizeNode == null || nextNode.Children == null) { logger.Trace("Unable to locate PCNT node or its parent for node {0}", node.Type); return; } var nodeList = nextNode.Children.ToList(); var size = sizeNode.Data.ReadInt32(); if (size == 0 || size != nodeList.Count - 1) { return; } for (int i = 0; i < size; i++) { switch (nodeList[i].Type) { case "PCNT": continue; case "XXXX": parseDataAction(nodeList[i], repo); break; case "DERV": parseDerveAction(nodeList[i], repo); break; default: logger.Warn("Invalid node type {0}", nodeList[i].Type); break; } } nextNode = nextNode.FindNextSibling(); if (parseNext && nextNode != null) { ReadNode(nextNode, repo); } }
protected override void DoWork() { if (Session == null) { return; } while (Session.IncomingMessageQueue.Count > 0) { Message msg; if (!Session.IncomingMessageQueue.TryDequeue(out msg)) { continue; } Message transformed; IMessageParseFactory factory; if (!MessageFactories.TryGetValue(msg.MessageOpCode, out factory) || !factory.TryParse(msg.MessageOpCode, msg, out transformed)) { if (!FallbackFactory.TryParse(msg.MessageOpCode, msg, out transformed)) { long tmpVal; if (long.TryParse(msg.MessageOpCodeEnum.ToString(), out tmpVal)) { _msgLogger.Trace(BitConverter.ToString(msg.Data).Replace("-", "")); _msgLogger.Trace("{0}", msg.OpcodeCount); _msgLogger.Trace("{0}", msg.SourcePacketType); } continue; } } Messages.Add(transformed); //Func<Message, Message> createFunc = null; //Message transformed = null; //if (RegisteredObjects.TryGetValue(msg.MessageOpCode, out createFunc) && // (transformed = createFunc(msg)) != null) //{ // Messages.Add(transformed); SceneCreateObject obj = transformed as SceneCreateObject; if (obj != null) { string objToCreate = null; if (_crcMap.TryGetValue((uint)obj.ObjectCRC, out objToCreate)) { _creatObjlogger.Debug("create obj {0}", objToCreate); } } if (msg.MessageOpCodeEnum == MessageOp.CmdStartScene) { _logger.Info("Got scene start! Trn: {0}", ((SceneStart)transformed).TerrainMap); } //} //else //{ // _logger.Warn("Unable to find registered message factory for {0}({1:X})", msg.MessageOpCodeEnum, msg.MessageOpCode); //} } Thread.Sleep(300); }