/*******************************************************************************
 * Copyright (c) 2003, 2008 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Junji MAEDA - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.visualization.engines.lowvision.internal.io;

import java.awt.image.BufferedImage;
import java.util.Date;

import org.eclipse.actf.visualization.engines.lowvision.internal.util.DebugUtil;

class ImageFileReaderController {
	private static final long MAX_TIME_TO_GET = 30000; // msec

	private String fileName = null;

	private boolean gottenFlag = false;

	private BufferedImage image = null;

	private ImageFileReaderGetter getter = null;

	ImageFileReaderController(String _fileName) {
		fileName = _fileName;
		// timer = new ImageFileReaderTimer( this, MAX_TIME_TO_GET );
		getter = new ImageFileReaderGetter(this, _fileName);
		// timer.start();
		getter.setDaemon(true);
		getter.start();
		waitForData();
	}

	BufferedImage getImage() {
		return (image);
	}

	private void waitForData() {
		try {
			for (long st = (new Date()).getTime(); (new Date()).getTime() - st <= MAX_TIME_TO_GET; Thread
					.sleep(50)) {
				if (gottenFlag /* || timeOutFlag */) {
					getter.interrupt();
					return;
				}
			}
			DebugUtil.outMsg(null, "Thread for getting \"" + fileName
					+ "\" was timed out.");
		} catch (InterruptedException ie) {
			ie.printStackTrace();
		} finally {
			getter.interrupt();
		}
	}

	void setGottenFlag(boolean _b) {
		gottenFlag = _b;
	}

	void setBufferedImage(BufferedImage _bi) {
		image = _bi;

	}
}
