/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 

package servidor.comunicaciones;

import org.quickserver.net.server.*;
import java.io.*;

public class ManejadorCliente implements ClientCommandHandler, ClientEventHandler, ClientBinaryHandler {

   public ManejadorCliente() {
   }

   @Override
   public void closingConnection(ClientHandler handler) throws java.io.IOException {
      System.out.println("Cerrando el manejador del socket " + handler.getHostAddress());
   }

   @Override
   public void lostConnection(ClientHandler handler) throws java.io.IOException {
      DatosCliente dc = (DatosCliente) handler.getClientData();
      if (dc.getCliente() != null) {
         dc.getCliente().desconectado = true;
         MensajeInterno mensaje = new MensajeInterno(MensajeInterno.MSG_CIERRE_CLIENTE + "", null);
         mensaje.clienteTratado = dc.getCliente();
         GestorColas.getGestor().encola(mensaje);
      }
   }

   @Override
   public void gotConnected(ClientHandler handler) throws java.net.SocketTimeoutException, java.io.IOException {
      DatosCliente dc = (DatosCliente) handler.getClientData();
      dc.setClientHandler(handler);
      handler.getSocket().setSendBufferSize(32768);
   }

   @Override
   public void handleCommand(ClientHandler clientHandler, String str) throws java.net.SocketTimeoutException, IOException {
      Mensaje mensaje = Mensaje.nuevoMensaje(str, clientHandler);
      if (mensaje != null) {
         if (mensaje.esValido()) {
            mensaje.marcaTiempo = new java.util.Date();
            if (mensaje.urgente) {
               mensaje.procesar();
            } else {
               GestorColas.getGestor().encola(mensaje);
            }
         }
      } else {
         String s;
         if (str.length() > 10) {
            s = str.substring(0, 10);
         } else {
            s = str;
         }
         System.err.println("Mensaje inválido: " + s);
      }
   }
   @Override
   public void handleBinary(ClientHandler handler, byte[] command) throws java.net.SocketTimeoutException, IOException {
      DatosCliente dc = (DatosCliente) handler.getClientData();
      if (dc.getCliente() != null) {
         dc.getCliente().datosBinarios(command);
      }
   }
      
}

