/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2007 ComPiere, Inc. All Rights Reserved. *
* This program is free software, you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY, without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program, if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package ar.com.ergio.print.fiscal.comm;
import ar.com.ergio.print.fiscal.FiscalPacket;
import ar.com.ergio.print.fiscal.hasar.HasarFiscalPacket;
/**
* Clase helper, utilizada por SpoolerTCPComm, que sirve para saber conservativamente cuando una
* secuencia deteminada de bytes enviadas por el Spooler de Hasar es una respuesta completa a un
* determinado comando Hasar que la genero.
* <br>
* NOTA: esta clase no tiene actualmente en cuenta el modelo de la impresora a la cual se esta conectando
* por lo tanto, a futuro o se debe parametrizar para que tenga esto en cuenta (ya que las longitudes
* de las respuestas puede variar dependiendo del modelo de impresor), o dejarlo tal como esta hecho
* actualmente: solo se consideran completas aquellas respuestas que :
* <ul>
* <li> Tienen longitud fija en todos los modelos, teniendo ciertos patrones
* <li> El comando inicial que genero la respuesta es muy usado (no tiene mucho sentido
* optimizar comandos usados muy de vez en cuando, arriesgando la correctitud)
* </ul>
* <br>
* Version actual soporta chequeos para los sig. comandos:
* <ul>
* <li> PrintLineItem
* </ul>
*/
public class SpoolerManagerResponse {
protected static final int OP_CMD_PRINT_LINE_ITEM = 0x42;
protected static final byte FS_HASAR = 0x1C;
private static SpoolerManagerResponse defInst= null;
public static SpoolerManagerResponse getDefInst()
{
if (defInst == null)
{
defInst = new SpoolerManagerResponse();
}
return defInst;
}
public boolean isResponseCompleted(FiscalPacket request, byte[] rspBytes)
{
//casos comunes
if (request == null)
return false;
if (rspBytes == null)
return false;
if (rspBytes.length == 0)
return false;
if (!(request instanceof HasarFiscalPacket))
return false;
HasarFiscalPacket reqHasar = (HasarFiscalPacket) request;
//chequeos por tipo de comandos
if (checkPrintLineItem(reqHasar, rspBytes))
return true;
//agregar otros aca o en subclases; por ej, LastItemDiscount, etc
return false;
}
private boolean checkPrintLineItem(HasarFiscalPacket request,byte[] rspBytes)
{
//si el comanod no era PrintLineItem este check no se puede aplicar
if (!isPrintLineItem(request))
{
return false;
}
//NOTA: las respuestas de Hasar que no contienen datos tienen longitud real
//de 11 bytes: Op (1 byte) + FS (1 byte) + Status Impresora (4 bytes) + FS (1 byte) + Status Fiscal (4 bytes)
//Pero el spooler de Hasar elimina OP y el siguiente FS, por lo que le llega a SpoolerTCPComm
//los últimos nueve bytes (los dos Status y el FS que los separa).
//Por lo tanto se considera que una respuesta completa a PrintLineItem tiene que
//tener 9 bytes, con FS en el 5to. NO SE INTERPRETAN los bits de respuesta de manera exhaustiva,
//ya que se asumen que
//1) En caso de que haya un error marcado en los mismos, de todas maneras la logica
//de los drivers va a fallar; aún cuando en el futuro no falle (por ej, se reintenta un comando)
//la respuesta de error sigue (a falta de mejor documentacion de Hasar....) siendo de longitud
//fija (despues de estos bits no se envia por ej, una string de descricion del error, al menos
//bajo modelos actuales)
//2) En caso de que en estos status no haya ningun error, los bits activados pueden ser distintos
//dependiendo del modelo o de estados no necesariente relacionados a errores (por ej,
//"C080"+FS+"3600" o "0080"+FS+"3600" son posibles).
//De todas maneras, no hay tatans variantes posibles, se podria hacer un mejor chequeo
//a futuro. Por lo pronto por simplicidad solo se va a verifcar la longitud y el FS
if ( rspBytes.length == 9 && rspBytes[4]== FS_HASAR)
{
return true;
}
return false;
}
private boolean isPrintLineItem(HasarFiscalPacket request)
{
return request.getCommandCode() == OP_CMD_PRINT_LINE_ITEM;
}
}