#ifndef _CREATE_H_
#define _CREATE_H_

#ifdef __cplusplus
extern "C" {
#endif


// PAR 2.0 のパケット・ヘッダーを作成する
void set_packet_header(
	unsigned char *buf,			// ヘッダーを格納する 64バイトのバッファー
	unsigned char *set_id,		// Recovery Set ID、16バイト
	int type_num,				// そのパケットの型番号
	unsigned int body_size);	// パケットのデータ・サイズ

// ソース・ファイルの情報を集める
int get_source_files(file_ctx_c *files);

// 共通パケットを作成する
int set_common_packet(
	unsigned char *buf,
	int *packet_num,			// 共通パケットの数
	int switch_u,				// ユニコードのファイル名も記録する
	file_ctx_c *files);

// 複数ファイルのハッシュ値を同時に求めるバージョン
int set_common_packet_multi(
	unsigned char *buf,
	int *packet_num,			// 共通パケットの数
	int switch_u,				// ユニコードのファイル名も記録する
	file_ctx_c *files);

// ハッシュ値を後で計算する
int set_common_packet_1pass(
	unsigned char *buf,
	int *packet_num,			// 共通パケットの数
	int switch_u,				// ユニコードのファイル名も記録する
	file_ctx_c *files);

// パケットは作成済みなので、ハッシュ値だけ計算して追加する
int set_common_packet_hash(
	unsigned char *buf,
	file_ctx_c *files);

// ソース・ファイルの情報から共通パケットのサイズを計算する
int measure_common_packet(
	int *packet_num,			// 共通パケットの数
	int switch_u);				// ユニコードのファイル名も記録する

// 末尾パケットを作成する
int set_footer_packet(
	unsigned char *buf,
	wchar_t *par_comment,		// コメント
	unsigned char *set_id);		// Recovery Set ID

// 末尾パケットのサイズを計算する
int measure_footer_packet(
	wchar_t *par_comment);		// コメント

// リカバリ・ファイルを作成して共通パケットをコピーする
int create_recovery_file(
	wchar_t *recovery_path,		// 作業用
	int packet_limit,			// リカバリ・ファイルのパケット繰り返しの制限
	int block_distri,			// パリティ・ブロックの分配方法
	int packet_num,				// 共通パケットの数
	unsigned char *common_buf,	// 共通パケットのバッファー
	int common_size,			// 共通パケットのバッファー・サイズ
	unsigned char *footer_buf,	// 末尾パケットのバッファー
	int footer_size,			// 末尾パケットのバッファー・サイズ
	HANDLE *rcv_hFile,			// 各リカバリ・ファイルのハンドル
	parity_ctx_c *p_blk);		// 各パリティ・ブロックの情報

int create_recovery_file_1pass(
	wchar_t *recovery_base,
	wchar_t *recovery_path,		// 作業用
	int packet_limit,			// リカバリ・ファイルのパケット繰り返しの制限
	int block_distri,			// パリティ・ブロックの分配方法 (3-bit目は番号の付け方)
	int packet_num,				// 共通パケットの数
	unsigned char *common_buf,	// 共通パケットのバッファー
	int common_size,			// 共通パケットのバッファー・サイズ
	unsigned char *footer_buf,	// 末尾パケットのバッファー
	int footer_size,			// 末尾パケットのバッファー・サイズ
	HANDLE *rcv_hFile,			// 各リカバリ・ファイルのハンドル
	unsigned char *p_buf,		// 計算済みのパリティ・ブロック
	unsigned char *g_buf,		// GPU用 (GPUを使わない場合は NULLにすること)
	unsigned int unit_size);

// 作成中のリカバリ・ファイルを削除する
void delete_recovery_file(
	wchar_t *recovery_path,		// 作業用
	int block_distri,			// パリティ・ブロックの分配方法
	int switch_p,				// インデックス・ファイルを作らない
	HANDLE *rcv_hFile);			// 各リカバリ・ファイルのハンドル

// 作成中のリカバリ・ファイルを密に戻す
void dense_recovery_file(
	HANDLE *rcv_hFile);			// 各リカバリ・ファイルのハンドル

// リカバリ・ファイルのサイズを計算する
void measure_recovery_file(
	wchar_t *recovery_path,		// 作業用 (最初はコメントが入ってる)
	int packet_limit,			// リカバリ・ファイルのパケット繰り返しの制限
	int block_distri,			// パリティ・ブロックの分配方法
	int packet_num,				// 共通パケットの数
	int common_size,			// 共通パケットのバッファー・サイズ
	int footer_size,			// 末尾パケットのバッファー・サイズ
	int switch_p);				// インデックス・ファイルを作らない

// ソース・ファイルを分割する
int split_files(
	file_ctx_c *files,
	int *cur_num, int *cur_id);	// エラー発生時は、その時点でのファイル番号と分割番号が戻る

// 分割されたソース・ファイルを削除する
void delete_split_files(
	file_ctx_c *files,
	int max_num, int max_id);	// エラー発生時のファイル番号と分割番号

// リカバリ・ファイルをソース・ファイルの末尾にくっつける
int append_recovery_file(
	wchar_t *file_name,	// ソース・ファイルの名前
	HANDLE *rcv_hFile,	// 各リカバリ・ファイルのハンドル
	int no_index);		// インデックス・ファイルが存在しない


#ifdef __cplusplus
}
#endif

#endif
