/* 
* 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 cargador;

import java.io.*;
import java.util.zip.*;

public class ReceptorFichero {
   private long numBytes;
   private long crc;
   private Adler32 adler32;
   private FileOutputStream fp;
   private long escritos;
   public File fichero;

   public ReceptorFichero(String numBytes, String crcEsperado) {
      this.numBytes = Long.parseLong(numBytes);
      this.crc = Long.parseLong(crcEsperado);
   }

   public boolean abrir(File fichero) {
      this.fichero = fichero;
      return abrir(fichero, false);
   }

   public boolean abrir(File fichero, boolean añadir) {
      adler32 = new Adler32();
      try {
         fp = new FileOutputStream(fichero, añadir);
         escritos = 0;
      } catch (FileNotFoundException exc) {
         return false;
      }
      return true;
   }

   public boolean masBytes(byte[] bufer, int cuantos) throws IOException {
      fp.write(bufer, 0, cuantos);
      escritos += cuantos;
      adler32.update(bufer, 0, cuantos);
      if (escritos >= numBytes) {
         fp.close();
         return false;
      }
      return true;
   }

   public void dispose() {
      try {
         fp.close();
      } catch (Exception exc) {
      }
   }

   public long getEscritos() {
      return escritos;
   }

   public long getCrc() {
      return adler32.getValue();
   }

   public long getCrcEsperado() {
      return crc;
   }

   public boolean isCrcOK() {
      return (adler32.getValue() == crc);
   }
}
