/**
 * Copyright (C) 2006-2007  NTT DATA CORPORATION
 * 
 * Version: 1.0.0 2007/04/01
 *  
 */
package net.cellcomputing.himawari.display;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

import net.cellcomputing.himawari.util.HimawariLogger;

/**
 * @author NTT DATA Corporation
 *TIFF形式の命令を管理するクラス。
 * 画像イメージ、ファイル名を持つ。
 */
public strictfp class TiffRequest extends DisplayRequest {
	/**
	 * tiffファイルを表す文字定数
	 */
	private static final String IMAGE_EXT = "tiff";
	
	/**
	 * コンストラクタ
	 * Request
	 * @param name Tiffファイルの名前
	 * @param type Tiff形式かどうか
	 * @param mode RGB,RGBAなどのカラー情報がはいる
	 * @param modeID modeのhash
	 * @param dataOffset 
	 * @param dataSize
	 * @param imageData このRequestが管理するImageData (BufferedImage)
	 */
	public TiffRequest(String name, final String type,final String mode,
			int modeID, int dataOffset, int dataSize ,ImageData imageData){
		super(name,type,mode,modeID,dataOffset,dataSize,imageData);
	}
	
	/**
	 * 何もしない
	 */
	public void openRequest() {
	}
	
	/**
	 * 何もしない
	 */
	public void display() {
		
	}
	
	/**
	 * 引数で指定されたimageを
	 * tiffファイルに出力する
	 * @param image
	 */
	public void saveImage(BufferedImage image){
		Iterator writers = ImageIO.getImageWritersByFormatName(IMAGE_EXT);
		
		if (writers.hasNext()) {
			ImageWriter writer = (ImageWriter)writers.next();
			
			try {
//				ImageOutputStream stream = ImageIO.createImageOutputStream( new FileOutputStream(name) );
				ImageOutputStream stream = ImageIO.createImageOutputStream(new File(name));
				writer.setOutput(stream);
				
				writer.write(image);
				writer.dispose();
				
				return;
			} catch (FileNotFoundException e) {
				HimawariLogger.outputException(e);
				HimawariLogger.getLogger().error( "Cannot open output image file: " + name + "\n");
				
			} catch (IOException e) {
				HimawariLogger.outputException(e);
				HimawariLogger.getLogger().error( "Cannot open output image file: " + name + "\n");
			}
		}
		
	}
	
	
	/**
	 * 画像データをtiff形式のファイルに
	 * 出力する。
	 */
	public void closeRequest() {
		BufferedImage image = (BufferedImage) imageData.getImage();
		saveImage(image);
		imageData = null;
	}
	
}
