protected override void OnMessage(MessageEventArgs e)
        {
            Debug.WriteLine("NEW MESSAGE RECEIVED: " + e.Data);
            string    message         = e.Data;
            SMCommand receivedCommand = ParseCommand(ref message);

            switch (receivedCommand.cmdType())
            {
            // this is a request command, send the request to all clients
            // connected to server. Except the sender
            case SMCommandType.SM_COMMAND_REQUEST:

                foreach (string _clientId in Sessions.ActiveIDs)
                {
                    if (_clientId != ID)
                    {
                        Sessions.SendTo("@REQUEST " + receivedCommand.cmdData, _clientId);
                        //   Debug.WriteLine("\nSending Request back to " + _clientId);
                    }
                }


                break;


            // this is when a client response to a request from another client,
            // this response will be sent to all connected client except the responder
            case SMCommandType.SM_COMMAND_RESPONSE:
                foreach (string _clientId in Sessions.ActiveIDs)
                {
                    if (_clientId != ID)
                    {
                        Sessions.SendTo("@RESPONSE " + receivedCommand.cmdData, _clientId);
                        // Debug.WriteLine("\nSending Response back to " + _clientId);
                    }
                }

                break;

            // transmit JSON to all connected clients except the sender
            case SMCommandType.SM_COMMAND_TRANSMIT_JSON:
                foreach (string _clientId in Sessions.ActiveIDs)
                {
                    if (_clientId != ID)
                    {
                        Sessions.SendTo("@JSON " + receivedCommand.cmdData, _clientId);
                        //Debug.WriteLine("\nSending Request back to " + _clientId);
                    }
                }
                break;

            // send data directly to printer
            case SMCommandType.SM_COMMAND_PRINT:
                ServerController.Printer.OpenPrint(Config.PrinterName);
                ServerController.Printer.SendStringToPrinter(Config.PrinterName, SMCommand.ESC_INIT + message);
                ServerController.Printer.ClosePrint();
                break;

            // open drawer command
            // also send command to all COM port o fdrawer kicker
            case SMCommandType.SM_COMMAND_OPEN_DRAWER:
                if (ServerController.COM.IsOpen)
                {
                    ServerController.COM.Write("O");
                }
                break;

            // print base64 data
            case SMCommandType.SM_COMMAND_PRINT_BASE64:
                ServerController.Printer.OpenPrint(Config.PrinterName);
                ServerController.Printer.SendStringToPrinter(Config.PrinterName, SMCommand.ESC_INIT + receivedCommand.cmdData);
                ServerController.Printer.ClosePrint();
                SM_Lib.Logger.getInstance().write("\n@PRINT64");
                break;

            /*case SMCommandType.SM_COMMAND_REGISTER_SERVER:
             *  ServerController.Servers.Add(client);
             *  SM_Lib.Logger.getInstance().write("- Register client [" + client.getId() + "] as Server");
             *  break;
             *
             * case SMCommandType.SM_COMMAND_REGISTER_CLIENT:
             *  ServerController.Clients.Add(client);
             *  Logger.getInstance().write("- Register client [" + client.getId() + "] as Client");
             *  break;
             */
            default:
                SM_Lib.Logger.getInstance().write("\n[Err] Invalid command: " + receivedCommand.cmdName);
                break;
            }
        }
        public static void onMessageReceived(Server server, Client client, string message)
        {
            Debug.WriteLine("NEW MESSAGE RECEIVED: " + message);
            SMCommand receivedCommand = ParseCommand(ref message);

            switch (receivedCommand.cmdType())
            {
            // this is a request command, send the request to all clients
            // connected to server. Except the sender
            case SMCommandType.SM_COMMAND_REQUEST:

                foreach (Client _client in server.ClientCollection)
                {
                    if (client.getId() != _client.getId())
                    {
                        _client.SendMessage("@REQUEST " + receivedCommand.cmdData);
                        Debug.WriteLine("\nSending Request back to " + _client.getId());
                    }
                }


                break;


            // this is when a client response to a request from another client,
            // this response will be sent to all connected client except the responder
            case SMCommandType.SM_COMMAND_RESPONSE:
                foreach (Client _client in server.ClientCollection)
                {
                    if (client.getId() != _client.getId())
                    {
                        _client.SendMessage("@RESPONSE " + receivedCommand.cmdData);
                    }
                }
                break;

            // transmit JSON to all connected clients except the sender
            case SMCommandType.SM_COMMAND_TRANSMIT_JSON:
                foreach (Client _client in server.ClientCollection)
                {
                    if (client.getId() != _client.getId())
                    {
                        _client.SendMessage("@JSON " + receivedCommand.cmdData);
                    }
                }
                break;

            // send data directly to printer
            case SMCommandType.SM_COMMAND_PRINT:
                ServerController.Printer.OpenPrint(Config.PrinterName);
                ServerController.Printer.SendStringToPrinter(Config.PrinterName, SMCommand.ESC_INIT + message);
                ServerController.Printer.ClosePrint();
                break;

            // open drawer command
            // also send command to all COM port o fdrawer kicker
            case SMCommandType.SM_COMMAND_OPEN_DRAWER:
                if (ServerController.COM.IsOpen)
                {
                    ServerController.COM.Write("O");
                }
                break;

            // print base64 data
            case SMCommandType.SM_COMMAND_PRINT_BASE64:
                ServerController.Printer.OpenPrint(Config.PrinterName);
                ServerController.Printer.SendStringToPrinter(Config.PrinterName, SMCommand.ESC_INIT + receivedCommand.cmdData);
                ServerController.Printer.ClosePrint();
                Logger.getInstance().write("\n@PRINT64");
                break;

            case SMCommandType.SM_COMMAND_REGISTER_SERVER:
                //ServerController.Servers.Add(client);
                Logger.getInstance().write("- Register client [" + client.getId() + "] as Server");
                break;

            case SMCommandType.SM_COMMAND_REGISTER_CLIENT:
                //ServerController.Clients.Add(client);
                Logger.getInstance().write("- Register client [" + client.getId() + "] as Client");
                break;

            default:
                Logger.getInstance().write("\n[Err] Invalid command: " + receivedCommand.cmdName);
                break;
            }
        }