#ifndef	_CRI_ADXF_H_INCLUDED
#define	_CRI_ADXF_H_INCLUDED
/****************************************************************************/
/*																			*/
/*			$title$ ＡＤＸファイルシステム ライブラリ						*/
/*				ADXF (ADX File System) Library								*/
/*																			*/
/*			Copyright (c) 1998 CSK Research Institute						*/
/*				1998.7.3		written by S.Hosaka							*/
/*																			*/
/****************************************************************************/

/****************************************************************************/
/*      インクルードファイル												*/
/****************************************************************************/

/****************************************************************************/
/*	定数マクロ																*/
/****************************************************************************/

/* Copyright */
							/*              1         2         3        4 */
							/*    1234567890123456789012345678901234567890 */
							/*    +++++++++++++++++++++++++++++++++        */
#define	ADXF_CPY_STR			("Copyright (c) 1998 CRI")
#define	ADXF_CPY_SIZ			(32) 

/* Version */
							/*              1         2         3        4 */
							/*    1234567890123456789012345678901234567890 */
							/*    +++++++++++++++++++++++++++++++++        */
#define	ADXF_VER_STR			("ADXF Version 5.30")
#define	ADXF_VER_SIZ 			(32)


/* 最大パーティション数 */
#define	ADXF_PART_MAX			(256)
/* 最大ファイル数 */
#define	ADXF_FILE_MAX			(65536)
/*	ADXFハンドルオブジェクトの個数	*/
#define	ADXF_OBJ_MAX			(16)

/* $define$ ハンドルの状態(ADXF_STAT_〜) */
#define	ADXF_STAT_STOP			(1)					/* 停止中				*/
#define ADXF_STAT_READING		(2)					/* データ読み込み中		*/
#define ADXF_STAT_READEND		(3)					/* データ読み込み終了	*/
#define ADXF_STAT_ERROR			(4)					/* 読み込みエラー発生	*/

/* $define$ シークタイプ(ADXF_SEEK_〜) */
#define	ADXF_SEEK_SET			(0)					/* ファイルの先頭		*/
#define ADXF_SEEK_CUR			(1)					/* 現在の位置			*/
#define ADXF_SEEK_END			(2)					/* ファイルの終端		*/

/* $define$ エラーコード */
#define	ADXF_ERR_OK				(0)					/* 正常終了				*/
#define	ADXF_ERR_FATAL			(-1)				/* 外部のエラー			*/
#define	ADXF_ERR_INTERNAL		(-2)				/* 内部のエラー			*/
#define	ADXF_ERR_PRM			(-3)				/* 不正なパラメータ		*/
#define	ADXF_ERR_AFS_FILE		(-4)				/* 不正なAFSファイル	*/

/* 既定値 */
#define	ADXF_DEF_SCT_SIZE		(2048)				/* CD-ROMのセクタサイズ	*/
#define	ADXF_DEF_DMA_ALIGN		(32)				/* DMAのアライメント	*/

/****************************************************************************/
/*	列挙定数																*/
/****************************************************************************/

/****************************************************************************/
/*	処理マクロ																*/
/****************************************************************************/

/* パーティション情報に必要な領域の計算 */
#define	ADXF_PTIF_CMN_SZ			(5*sizeof(long))

#define	ADXF_CALC_PTINFO_REAL_SIZE(n)	\
								(ADXF_PTIF_CMN_SZ+(((n)+1)*sizeof(short)))

#define	ADXF_CALC_PTINFO_SIZE(n)	\
					((ADXF_CALC_PTINFO_REAL_SIZE(n)+sizeof(short))/4*4)

#define	ADXF_CALC_ADD_PTINFO_SIZE(n)	\
					(ADXF_PTIF_CMN_SZ+((n)*(2*sizeof(short)+sizeof(long))))

/****************************************************************************/
/*	データ型																*/
/****************************************************************************/

#ifndef ADXSTM_DEFINED
#define ADXSTM_DEFINED
typedef void *ADXSTM;
#endif

#ifndef SJ_DEFINED
#define SJ_DEFINED
typedef void *SJ;
#endif

/*	$data$ ADXFハンドル (ADXF)	*/
#ifndef ADXF_DEFINED
#define	ADXF_DEFINED
typedef	struct _adx_fs {
	char	used;						/*	使用中か否か				*/
	char	stat;						/*	ハンドルの状態				*/
	char	sjflag;						/*	外部から設定されたSJか否か	*/
	char	rev;						/*	予約領域					*/
	ADXSTM	stm;						/*	ADXSTMハンドル				*/
	SJ		sj;							/*	ストリームジョイント		*/
	long	fad;						/*	ファイルアドレス			*/
	long	fnsct;						/*	ファイルサイズ(セクタ)		*/
	long	fsize;						/*	ファイルサイズ(バイト)		*/
	long	skpos;						/*	アクセスポインタの位置		*/
	long	rdstpos;					/*	読み込み開始位置			*/
	long	rqsct;						/*	読み込み要求データ量(セクタ)*/
	long	rdsct;						/*	読み込んだデータ量(セクタ)	*/
} ADX_FS;
typedef	ADX_FS	*ADXF;
#endif

/* パーティション情報 */
#ifndef ADXF_PTINFO_DEFINED
#define ADXF_PTINFO_DEFINED
typedef struct _adxf_ptinfo {
	struct _adxf_ptinfo	*next;		/*	次のパーティション(NULL:オリジナル)	*/
	long				size;		/*	パーティション情報領域サイズ		*/
	long				fad;		/*	パーティションの先頭FAD				*/
	long				nfile;		/*	パーティション内のファイル数		*/
	unsigned short		nentry;		/*	パーティション内の登録ファイル数	*/
	char				type;		/*	オリジナルか追記かのフラグ			*/
	char				rev;		/*	予約領域							*/
	long				top;		/*	ファイル情報の先頭					*/
} ADXF_PTINFO;
#endif

/* 追記ファイルの情報 */
#ifndef ADXF_ADD_DEFINED
#define ADXF_ADD_DEFINED
typedef struct _adxf_add_info {
	unsigned short	flid;			/*	ファイルID							*/
	unsigned short	fnsct;			/*	ファイルサイズ						*/
	long			ofst;			/*	オフセット							*/
} ADXF_ADD_INFO;
#endif


/****************************************************************************/
/*	変数宣言																*/
/****************************************************************************/

/****************************************************************************/
/*	関数の宣言																*/
/****************************************************************************/

/*===========================================================================
		$group$ ライブラリの初期化と終了処理
  ===========================================================================*/

/* $func$ ライブラリの初期化
 * [書　式] void	ADXF_Init( void );
 * [入　力] なし
 * [出　力] なし
 * [関数値] なし
 * [機　能] ライブラリを初期化する。
 */
void ADXF_Init(void);

/* $func$ ライブラリの終了処理
 * [書　式] void ADXF_Finish(void);
 * [入　力] なし
 * [出　力] なし
 * [関数値] なし
 * [機　能] ライブラリの終了処理をする。
 */
void ADXF_Finish(void);

/* $func$ パーティションのロード
 * [書　式] long ADXF_LoadPartition(long ptid, char *fname, 
 *													void *ptinfo, long nfile);
 * [入　力] ptid	:パーティションID
 *			fname	:AFSファイルの名前
 *			ptinfo	:パーティション情報読み込み領域
 *			nfile	:ファイル数
 * [出　力] なし
 * [関数値] エラーコード
 * [機　能] AFSファイル名をパーティションIDに設定する。
 */
long ADXF_LoadPartition(long ptid, char *fname, void *ptinfo, long nfile);

/* $func$ パーティションの追加
 * [書　式] long ADXF_AddPartition(long ptid, char *fname, 
 *													void *ptinfo, long nfile);
 * [入　力] ptid	:パーティションID
 *			fname	:AFSファイルの名前
 *			ptinfo	:パーティション情報読み込み領域
 *			nfile	:ファイル数
 * [出　力] なし
 * [関数値] エラーコード
 * [機　能] AFSファイルをパーティションIDに追加設定する。
 */
long ADXF_AddPartition(long ptid, char *fname, void *ptinfo, long nfile);

/* $func$ パーティション情報サイズの取得
 * [書　式] long ADXF_GetPtinfoSize(long ptid);
 * [入　力] ptid	:パーティションID
 * [出　力] なし
 * [関数値] パーティション情報サイズ(単位：バイト)
 * [機　能] パーティション情報領域のサイズを取得する。
 */
long ADXF_GetPtinfoSize(long ptid);

/*===========================================================================
		$group$ ファイルの読み込み
  ===========================================================================*/

/*	$func$ ファイルのオープン(ISO9660のファイル)
 * [書　式] ADXF ADXF_Open(char *fname, void *atr);
 * [入　力] fname	: ファイル名
 *			atr		: ファイルの属性
 * [出　力] なし
 * [関数値] ADXFハンドル、エラーの場合NULL
 * [機　能] 指定のファイルをオープンし、ADXFハンドルを返す。
 */
ADXF ADXF_Open(char *fname, void *atr);

/*	$func$ ファイルのオープン(AFSフォーマット)
 * [書　式] ADXF ADXF_OpenAfs(long ptid, long flid);
 * [入　力] ptid	: パーティションID
 *			flid	: ファイルID
 * [出　力] なし
 * [関数値] ADXFハンドル、エラーの場合NULL
 * [機　能] パーティションIDとファイルIDで指定されたAFSファイルをオープンし、
 *			ADXFハンドルを返す。
 */
ADXF ADXF_OpenAfs(long ptid, long flid);

/* $func$ ファイルのクローズ
 * [書　式] void ADXF_Close(ADXF adxf);
 * [入　力] adxf	: ADXFハンドル
 * [出　力] なし
 * [関数値] なし
 * [機　能] 指定されたADXFハンドルをクローズする。
 */
void ADXF_Close(ADXF adxf);

/* $func$ SJへのデータ読み込み開始
 * [書　式] void ADXF_ReadSj32(ADXF adxf, long nsct, SJ sj);
 * [入　力] adxf	: ADXFハンドル
 *			nsct	: 読み込みデータの量(単位：セクタ)
 *			SJ		: ストリームジョイント
 * [出　力] なし
 * [関数値] 読み込みデータ量(単位：セクタ)
 * [機　能] ストリームジョイントにデータ読み込みのリクエストを発行する。
 *			ストリームジョイントのバッファサイズは、セクタの整数倍でなければ
 *			ならない。
 *			ストリームジョイントからユーザがデータを読み出すと、自動的にストリー *			ムジョイントにデータが読み出される。
 *			リクエストしたアクセス動作が完了すると、アクセスポインタは
 *			nsctセクタ進む。
 */
long ADXF_ReadSj32(ADXF adxf, long nsct, SJ sj);

/* $func$ データの読み込み開始
 * [書　式] void ADXF_ReadNw32(ADXF adxf, long nsct, void *buf);
 * [入　力] adxf	: ADXFハンドル
 *			nsct	: 読み込みデータの量(単位：セクタ)
 *			buf		: 読み込み領域
 * [出　力] なし
 * [関数値] 読み込みデータ量(単位：セクタ)
 * [機　能] データ読み込みのリクエストを発行する。
 *			リクエストしたアクセス動作が完了すると、アクセスポインタは
 *			nsctセクタ進む。
 */
long ADXF_ReadNw32(ADXF adxf, long nsct, void *buf);

/* $func$ データの読み込み中止
 * [書　式] long ADXF_Stop(ADXF adxf);
 * [入　力] adxf	: ADXFハンドル
 * [出　力] なし
 * [関数値] 中止した時点でのアクセスポインタの位置
 * [機　能] データの読み込みを中止する。
 */
long ADXF_Stop(ADXF adxf);

/* $func$ サーバ関数
 * [書　式] void ADXF_ExecServer(void);
 * [入　力] なし
 * [出　力] なし
 * [関数値] なし
 * [機　能] 内部状態を更新する。
 */
void ADXF_ExecServer(void);

/*===========================================================================
		$group$ アクセスポインタの制御
  ===========================================================================*/

/* $func$ アクセスポインタの移動
 * [書　式] long ADXF_Seek(ADXF adxf, long pos, long type);
 * [入　力] adxf	: ADXFハンドル
 *			pos		: アクセスポインタの移動量(単位：セクタ)
 *			type	: 移動基準(シークタイプ：ADXF_SEEK_〜)
 * [出　力] なし
 * [関数値] アクセスポインタの位置、負の値はエラーコード
 * [機　能] アクセスポインタをtypeからposセクタ離れた位置に移動させる。
 */
long ADXF_Seek(ADXF adxf, long pos, long type);

/* $func$ アクセスポインタの取得
 * [書　式] long ADXF_Tell(ADXF adxf);
 * [入　力] adxf	: ADXFハンドル
 * [出　力] なし
 * [関数値] アクセスポインタの位置
 * [機　能] アクセスポインタの位置を取得する。
 */
long ADXF_Tell(ADXF adxf);

/*===========================================================================
		$group$ 情報の取得
  ===========================================================================*/

/* $func$ ファイルサイズの取得
 * [書　式] long ADXF_GetFsizeSct(ADXF adxf);
 * [入　力] adxf	: ADXFハンドル
 * [出　力] なし
 * [関数値] ファイルサイズ(単位：セクタ)
 * [機　能] 指定されたファイルのサイズをセクタ単位で取得する。
 */
long ADXF_GetFsizeSct(ADXF adxf);

/* $func$ ファイルサイズの取得
 * [書　式] long ADXF_GetFsizeByte(ADXF adxf);
 * [入　力] adxf	: ADXFハンドル
 * [出　力] なし
 * [関数値] ファイルサイズ(単位：バイト)
 * [機　能] 指定されたファイルのサイズをバイト単位で取得する。
 */
long ADXF_GetFsizeByte(ADXF adxf);

/* $func$ 読み込み要求情報の取得
 * [書　式] long ADXF_GetNumReqSct(ADXF adxf, long *seekpos);
 * [入　力] adxf	: ADXFハンドル
 * [出　力] seekpos	: 読み込み位置
 * [関数値] 要求した読み込みデータ量(単位：セクタ)
 * [機　能] 要求した読み込み位置とデータ量を取得する。
 */
long ADXF_GetNumReqSct(ADXF adxf, long *seekpos);

/* $func$ 実際に読み込んだセクタ数の取得
 * [書　式] long ADXF_GetNumReadSct(ADXF adxf);
 * [入　力] adxf	: ADXFハンドル
 * [出　力] なし
 * [関数値] 読み込んだデータ量(単位：セクタ)
 * [機　能] 実際に読み込んだデータ量を取得する。
 */
long ADXF_GetNumReadSct(ADXF adxf);

/* $func$ ハンドルの状態の取得
 * [書　式] long ADXF_GetStat(ADXF adxf);
 * [入　力] adxf	: ADXFハンドル
 * [出　力] なし
 * [関数値] ADXFハンドルの内部状態(状態：ADXF_STAT_〜)
 * [機　能] ADXFハンドルの内部状態を取得する。
 */
long ADXF_GetStat(ADXF adxf);

/* $func$ FADとファイルサイズの取得
 * [書　式] long ADXF_GetAfsRange(long ptid, long flid, 
 *													long *fad, long *fnsct);
 * [入　力] ptid	: パーティションID
 *			flid	: ファイルID
 * [出　力] fad		: ファイルアドレス
 *			nsct	: ファイルサイズ(単位:セクタ)
 * [関数値] エラーコード
 * [機　能] パーティション内のファイルのファイルアドレスとサイズを取得する。
 */
long ADXF_GetFileRange(long ptid, long flid, long *fad, long *fnsct);

#endif	/* _CRI_ADXF_H_INCLUDED */
