content: /*
   * Copyright (C) 2010-2014 Andreas Maier
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */
  package edu.stanford.rsl.conrad.io;
  
  
  import ij.IJ;
  import ij.io.FileInfo;
  import ij.io.TiffDecoder;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.util.zip.ZipEntry;
  import java.util.zip.ZipInputStream;
  
  import edu.stanford.rsl.conrad.data.numeric.Grid2D;
  
  
  /**
   * Wrapper for a zip reader using imageJ. 
   * Do not use this file format in combination with tiff files, if you have big files. 
   * The tiff decoder wraps the stream into a RandomAccessStream which copies everything for later access. Use of this file format will double the memory usage for reading!
   * @author akmaier
   *
   */
  public class ZipProjectionSource extends FileProjectionSource {
  
  	boolean DICOMMultiFrameMode = false;
  	ZipInputStream zis = null;
  	
  	public void initStream (String filename) throws IOException{
  		zis = new ZipInputStream(new FileInputStream(filename));
  		is = zis;
  		if (zis==null) {
  			throw new IOException("Could not read zip header");
  		}
  		ZipEntry entry = zis.getNextEntry();
  		if (entry==null) throw new IOException("Zip was empty");
  		String name = entry.getName();
  		if (name.endsWith(".tif")) {
  			TiffDecoder td = new TiffDecoder(zis, name);
  			if (IJ.debugMode) td.enableDebugging();
  			FileInfo [] info = td.getTiffInfo();
  			fi = info[0];
  		} else if (name.endsWith(".ima")) {
  			DicomProjectionSource dicomSource = new DicomProjectionSource();
  			dicomSource.initStream(zis);
  			fi = dicomSource.fi;
  		} else if (name.endsWith(".dcm")) {
  			DICOMMultiFrameMode = true;
  			DicomProjectionSource dicomSource = new DicomProjectionSource();
  			dicomSource.initStream(zis);
  			fi = dicomSource.fi;
  		} else {
  			zis.close();
  			throw new IOException("No matching fileformat found in zip file");
  		}
  
  
  		File f = new File(filename);
  		fi.fileFormat = FileInfo.ZIP_ARCHIVE;
  		fi.fileName = f.getName();
  		fi.directory = f.getParent()+File.separator;
  
  		if (fi!=null && fi.width>0 && fi.height>0 && fi.offset>0) {
  			init();
  		} else {
  			throw new IOException("Format does not match");
  		}
  		zis.close();
  		zis = new ZipInputStream(new FileInputStream(filename));
  		is = zis;
  		if(!DICOMMultiFrameMode) zis.getNextEntry();
  	}	
  
  	@Override
  	public Grid2D getNextProjection(){
  		if (!DICOMMultiFrameMode){
  			return super.getNextProjection();
  		} else {
  			try {
  				ZipEntry entry = zis.getNextEntry();
  				if (entry == null){
  					zis.close();
  					return null;
  				}
  				DicomProjectionSource dicomSource = new DicomProjectionSource();
  				dicomSource.initStream(zis);
  				fi = dicomSource.fi;
  				Grid2D ip = dicomSource.getNextProjection();
  				currentIndex++;
  				if (showProgress){
  					IJ.showProgress((0.0 + currentIndex) / fi.nImages);
  				}
  				return ip;
  			} catch (IOException e1) {
  				e1.printStackTrace();
  				throw new RuntimeException("Error while reading projection " + this.currentIndex);
  			}
  		}
  	}
  	
  }
  