public PBHosterEventArgs(PBCommandType cmd, PBClimber clm, int route, ManualResetEvent ev)
 {
     this.cmd   = cmd;
     this.clm   = clm;
     this.route = route;
     this.ev    = ev;
 }
 public void SetClimber(PBClimber clm, PBHosterEventArgs e)
 {
     if (clm == null)
     {
         this.clm = PBClimber.GetEmpty();
     }
     else
     {
         this.clm = clm;
     }
     e.Event.Set();
 }
        private void ProcessData(byte[] data, args a)
        {
            string        msg = Encoding.UTF8.GetString(data);
            PBCommandType cmd;
            string        strTmp = PBClimber.getParam(msg, CommandStart);

            try { cmd = (PBCommandType)Enum.Parse(typeof(PBCommandType), strTmp); }
            catch
            {
                sendError(a);
                return;
            }
            PBHosterEventArgs e = null;
            ManualResetEvent  ev = new ManualResetEvent(false);
            int route, iid;

            switch (cmd)
            {
            case PBCommandType.GETLIST:
                e = new PBHosterEventArgs(cmd, null, 0, ev);
                break;

            case PBCommandType.GETNEXT:
                if (int.TryParse(PBClimber.getParam(msg, "ROUTE"), out route))
                {
                    e = new PBHosterEventArgs(cmd, null, route, ev);
                }
                break;

            case PBCommandType.GETBYIID:
                if (int.TryParse(PBClimber.getParam(msg, "ROUTE"), out route))
                {
                    if (int.TryParse(PBClimber.getParam(msg, "IID"), out iid))
                    {
                        e = new PBHosterEventArgs(cmd,
                                                  new PBClimber(iid, "", "", 0), route, ev);
                    }
                }
                break;

            case PBCommandType.GETBYSTART:
                if (int.TryParse(PBClimber.getParam(msg, "ROUTE"), out route))
                {
                    if (int.TryParse(PBClimber.getParam(msg, "START"), out iid))
                    {
                        e = new PBHosterEventArgs(cmd,
                                                  new PBClimber(0, "", "", iid), route, ev);
                    }
                }
                break;

            case PBCommandType.SETRES:
                if (int.TryParse(PBClimber.getParam(msg, "ROUTE"), out route))
                {
                    PBClimber clm = PBClimber.GetFromString(msg);
                    if (clm != null && !clm.Empty)
                    {
                        e = new PBHosterEventArgs(cmd, clm, route, ev);
                    }
                }
                break;
            }
            bool toSetErr = true;

            if (e != null)
            {
                if (PBHosterEvent != null)
                {
                    PBHosterEvent(this, e);
                    toSetErr = false;
                    ev.WaitOne();
                }
            }
            if (toSetErr)
            {
                sendError(a);
            }
            else
            {
                string pck = CommandStart + "=";
                switch (cmd)
                {
                case PBCommandType.GETLIST:
                    pck += PBCommandType.LIST.ToString() + ";NAME=" + opResStr + ";";
                    break;

                case PBCommandType.SETRES:
                    if (opRes)
                    {
                        pck += PBCommandType.ACK.ToString() + ";";
                    }
                    else
                    {
                        pck += PBCommandType.DECL.ToString() + ";";
                    }
                    break;

                default:
                    pck += clm.ToString();
                    break;
                }
                pck += CommandEnd;
                List <byte> pc = new List <byte>();
                pc.Add(CommandPr);
                foreach (byte b in Encoding.UTF8.GetBytes(pck))
                {
                    pc.Add(b);
                }
                pc.Add(CommandTail);
                a.buffer = pc.ToArray();
                a.cnt    = 0;
                a.s.BeginSend(a.buffer, 0, a.buffer.Length, SocketFlags.None,
                              EndSend, a);
            }
        }