package jp.cssj.cti.ctip;

import java.io.IOException;

import jp.cssj.cti.helpers.RequestConsumer;

/**
 * クライアントがサーバーからデータを受け取るためのインターフェースです。
 * 
 * 断片化されたデータを生成する他、エラーメッセージを返します。
 * 
 * @author <a href="mailto:miyabe at gnn.co.jp">MIYABE Tatsuhiko </a>
 * @version $Id: ContentProducer.java,v 1.2 2005/08/18 04:51:26 harumanx Exp $
 */
public interface ContentProducer {
	/**
	 * 断片追加パケットです。
	 */
	public static final byte ADD = 1;

	/**
	 * 断片挿入パケットです。
	 * 
	 * getAnchorIdで直後の断片IDを得ることができます。
	 */
	public static final byte INSERT = 2;

	/**
	 * エラーメッセージパケットです。
	 * 
	 * getLevel,getMessageでエラーレベルとメッセージを得ることができます。
	 */
	public static final byte ERROR = 3;

	/**
	 * データパケットです。
	 * 
	 * getId,readで断片IDとデータを得ることができます。
	 */
	public static final byte DATA = 4;

	/**
	 * CSSの文法エラーなどの警告を表します。
	 */
	public static final byte ERROR_WARN = 1;

	/**
	 * リソースの取得失敗など、生成される文書の情報が欠落すようなエラーです。
	 */
	public static final byte ERROR_ERROR = 2;

	/**
	 * 処理の続行を妨げるような深刻なエラーです。
	 */
	public static final byte ERROR_FATAL = 3;

	/**
	 * サーバーに接続し、リクエストを開始します。
	 * 
	 * @param request
	 * @throws IOException
	 */
	public RequestConsumer connect() throws IOException;

	/**
	 * 次のパケットにカーソルを移します。
	 * 
	 * @return 終了パケットを受信した場合はfalse、それ以外はtrue。
	 * @throws IOException
	 */
	public boolean next() throws IOException;

	/**
	 * 現在のパケットのデータのタイプを返します。
	 * 
	 * @return
	 * @throws IOException
	 */
	public byte getType() throws IOException;

	/**
	 * 断片のIDを返します。
	 * 
	 * @return
	 * @throws IOException
	 */
	public int getId() throws IOException;

	/**
	 * アンカーとなる断片のIDを返します。
	 * 
	 * @return
	 * @throws IOException
	 */
	public int getAnchorId() throws IOException;

	/**
	 * 進行状況を返します。
	 * 
	 * @return
	 * @throws IOException
	 */
	public long getProgress() throws IOException;

	/**
	 * エラーレベルを返します。
	 * 
	 * @return
	 * @throws IOException
	 */
	public byte getLevel() throws IOException;

	/**
	 * エラーメッセージを返します。
	 * 
	 * @return
	 * @throws IOException
	 */
	public String getMessage() throws IOException;

	/**
	 * データを取得します。
	 * 
	 * @param b
	 *            データが格納されるバッファ。
	 * @param off
	 *            バッファの開始位置。
	 * @param len
	 *            バッファに格納可能なバイト数。
	 * @return 取得されたデータの長さ。データがない場合は-1。
	 * @throws IOException
	 */
	public int read(byte[] b, int off, int len) throws IOException;
}