/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: DomainConnectionProxy.java,v 1.2 2005/09/07 13:38:06 rampil Exp $
 */
package org.logical_paradox.vsan.dfs;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * ドメイン接続オブジェクトのプロキシ
 * RMIでドメイン接続オブジェクトをクライアントに対してexportできないので
 * 代理としてこのクラスを使用する
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public interface DomainConnectionProxy extends Remote {
	/**
	 * このプロキシを破棄する．
	 * ドメイン接続オブジェクトの共有から、このプロキシを使用しているクライアントノードを解除する．<br>
	 * このメソッドを呼び出すと、回収要求マークがこのオブジェクトに設定される。<br>
	 * 接続管理スレッドが回収要求マーク設定済みのプロキシを発見した際に、初めてプロキシが破棄される。
	 * @throws RemoteException 接続解除処理に失敗
	 */
	public void disconnect() throws RemoteException;
	/**
	 * ドメインに割り当てられているファイルサイズを返す．
	 * @return ファイルサイズ
	 * @throws RemoteException ファイルサイズ取得に失敗した場合に発生する例外
	 */
	public long size() throws RemoteException;
	/**
	 * バイトデータを読み込む．
	 * 最大で指定したサイズバイト分読み込んで格納する．
	 * @param seekp シークポインタ
	 * @param length 読み込むデータのサイズ(単位:バイト)
	 * @return 取得できたドメインデータストリーム
	 * @throws RemoteException 読み込みに失敗した
	 */
	public DomainDataStream read(long seekp, int length) throws RemoteException;
	/**
	 * 指定レコードからバイトデータを読み込む．
	 * @param recordBegin 開始レコード番号
	 * @param length 読み込むデータのサイズ(単位:バイト)
	 * @return 取得できたドメインデータストリーム
	 * @throws RemoteException 読み込みに失敗した
	 */
	public DomainDataStream readRecords(long recordBegin, int length) throws RemoteException;
	/**
	 * バイト列を書き込む．
	 * @param seekp シークポインタ(-1:空いている位置へ適当に書き込む)
	 * @param b バイト列
	 * @return データの書き込みが開始されたレコード番号
	 * @throws RemoteException 書き込みに失敗した
	 */
	public long write(long seekp, byte[] b) throws RemoteException;
	/**
	 * バイト列を書き込む．
	 * @param recordBegin 開始レコード番号(-1:空いている位置へ適当に書き込む)
	 * @param b バイト列
	 * @return データの書き込みが開始されたレコード番号
	 * @throws RemoteException 書き込みに失敗した
	 */
	public long writeRecords(long recordBegin, byte[] b) throws RemoteException;
}
