// This function processes the action queue for all connected users when they have one.
 private void ActionWork()
 {
     foreach (User u in ServerGlobals.users)
     {
         // Process the action queue if it's not blank.
         while (u.ActionQueue.Count != 0)
         {
             Action act = u.ActionQueue.Dequeue();
             if (act == null)
             {
                 break;
             }
             if (act.binaryData == null)
             {
                 if (act.inst == null)
                 {
                     continue;
                 }
                 u.Socket.Send(ProtocolCodec.Encode(act.inst));
             }
             else
             {
                 u.Socket.Send(act.binaryData);
             }
         }
     }
 }
        private void OnWS(User u, string message)
        {
            string[] decoded = ProtocolCodec.Decode(message);
            if (decoded == null)
            {
                return;
            }

            switch (decoded[0])
            {
            default: break;

            case "mouse":
            {
                if (u.vm == null || u.connected == false)
                {
                    break;
                }

                lock (VMLock)
                {
                    u.vm.MouseMove(int.Parse(decoded[1]), int.Parse(decoded[2]));
                }
            } break;

            case "connect":
                lock (VMLock)
                {
                    if (!u.connected)
                    {
                        // Bad but unless you have 1000 vms it should be alright.
                        foreach (string id in ServerGlobals.virtualMachines.Keys)
                        {
                            if (decoded[1] == id)
                            {
                                Utils.Logger.Log(ServerGlobals.GetUserFromID(ID), "Connecting to VM " + id);
                                ServerGlobals.virtualMachines[decoded[1]].ConnectUser(ServerGlobals.GetUserFromID(ID));
                            }
                        }
                    }
                }
                break;

#if false
            case "list":
                if (!u.connected)
                {
                    List <string> vmids = new List <string>();
                    foreach (string id in ServerGlobals.virtualMachines.Keys)
                    {
                        vmids.Add(id);
                        Bitmap scalene_triangle = ServerGlobals.virtualMachines[id].vmc.GetDisplayBitmap();
                        Bitmap scaled           = ResizeImage(scalene_triangle, 160, 160);
                        //vmids.Add();
                    }
                    u.ActionQueue.Enqueue(new Action {
                        inst = vmids.ToArray()
                    });
                }
                break;
#endif
            }
        }