/*************************************************************************
*	"lhx.c" : LHx サポート
*************************************************************************/

int		_lhx_list( char *dcn )
{
	int		ret;
	char	*fdl;
	char	tmp[128], arc[128], cmd[256];

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl, "LHx l : 書庫閲覧");
	FDL_set_wildcard( fdl, "*.lzh");
	if ( FDL_start(fdl) == NORMAL && FS_setFullPathname( tmp, FDL_get_filename(fdl)) == NORMAL )
	{
		FS_unix2dos( arc, tmp );
		ret = NORMAL;
	} else
		ret = ERR;
	FDL_close(fdl);
	if ( ret == NORMAL )
	{
		sprintf( cmd, "LHx l %s", arc );
		DCN_puts( dcn, cmd );
		DCN_exec( dcn, 0, cmd );
		ret = DCNCMD_PROMPT;
	}
	return (ret);
}

int		_lhx_extract( char *dcn )
{
	int		ret;
	char	*fdl;
	char	tmp[128], arc[128], cmd[256];

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl, "LHx x : 書庫ファイル解凍");
	FDL_set_wildcard( fdl, "*.lzh");
	if ( FDL_start(fdl) == NORMAL && FS_setFullPathname( tmp, FDL_get_filename(fdl)) == NORMAL )
	{
		FS_unix2dos( arc, tmp );
		ret = NORMAL;
	} else
		ret = ERR;
	if ( ret == NORMAL )
	{
		DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
		    C_MBLACK, C_DLGBASE, COLMIX(C_TIMEBOX,C_GRAY),
		    3, "  %s : \n解凍先にディレクトリを移動してください。  ", arc );
		FDL_set_defaultFilename( fdl, "");
		FDL_set_title( fdl, "LHx x : 解凍先ディレクトリの指定");
		ret = FDL_start(fdl);
		FDL_close(fdl);
		if ( ret == NORMAL )
		{
			sprintf( cmd, "LHx x %s", arc );
			DCN_puts( dcn, cmd );
			DCN_exec( dcn, 0, cmd );
			ret = DCNCMD_PROMPT;
		}
	} else
		FDL_close(fdl);

	return (ret);
}

char	*dcn_makeTmpFile( char *fn )	/* 作業用ファイル名の取得	*/
{
	int		len;
	char	*tmp;
	char	*lst;

	lst = "_lhxlst.tmp";
	if ( (tmp = getenv("TMP")) == NULL )
	{	strcpy( fn, lst );
	} else
	{	len = strlen(tmp);
		if ( len > 0 && FS_isdelim(tmp[len-1]) )
			sprintf( fn, "%s%s"  , tmp, lst);
		else
			sprintf( fn, "%s/%s", tmp, lst);
	}
	return (fn);
}

int		_lhx_append( char *dcn )
{
	int		ret, i;
	char	*fdl;
	char	*fn, arc[128], tmp[128], res[128], cmd[256];
	UINT	cf;
	char	*fp;

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl, "LHx a : ファイル凍結");
	FDL_set_wildcard( fdl, "*.lzh");
	SYL_puts(C_HGREEN,"書庫ファイル名を入力、または選択してください。");
	ret = FDL_start(fdl);
	if ( ret != NORMAL || FS_setFullPathname( tmp, FDL_get_filename(fdl)) != NORMAL )
	{
		SYL_clear();
		FDL_close(fdl);
		return (ERR);
	}
	FDL_close(fdl);
	FS_unix2dos( arc, tmp );

	/* 凍結ファイル名の選択	*/
	if ( (fdl = FDL_open((FDL_MODE_MULTI|FDL_MODE_BIT_DIRIGN|FDL_MODE_BIT_SIDEWORK))) == NULL )
		return (ERR);

	FDL_set_title( fdl, "LHx a : ファイル凍結");
	FDL_set_wildcard( fdl, "*.*");
	SYL_puts(C_HGREEN,"凍結するファイルを指定してください。");
	ret = FDL_start(fdl);
	if ( ret != NORMAL )
	{
		SYL_clear();
		FDL_close(fdl);
		return (ERR);
	}
	SYL_clear();

	dcn_makeTmpFile( tmp );
	FS_unix2dos( res, tmp);
	if ( (fp = FM_fopen( res, "w")) == NULL )
	{
		SYL_clear();
		FDL_close(fdl);
		DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
		    C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
		    AplErrMsgTime, "    %s:    \n    作業用ファイルが作成できません。  ", tmp );
		return (ERR);
	}
	i = 0;
	while ( (fn = FDL_getMarkFile(fdl, i)) != NULL )
	{
		FS_unix2dos( tmp, fn );
		fprintf( fp,"%s\n", tmp );
		++i;
	}
	FM_fclose(fp);
	FDL_close(fdl);

	if ( i == 0 )
	{
		FS_remove( res );
		DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
		    C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
		    AplErrMsgTime, "    凍結するファイル名が指定されていません。  " );
		return (ERR);
	}

	/* 凍結開始	*/
	DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY),
	    2, "    凍結を開始します。  " );

	sprintf( cmd, "LHx a %s @%s", arc, res );
	DCN_puts( dcn, cmd );
	DCN_exec( dcn, 0, cmd );

	FS_remove( res );	/* 作業用ファイル用を削除	*/

	return	(DCNCMD_PROMPT);
}

int		_lhx_makeSfx( char *dcn )
{
	int		ret;
	char	*fdl;
	char	tmp[128], arc[128], cmd[256];

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl, "LHx s : 自己解凍プログラム作成");
	FDL_set_wildcard( fdl, "*.lzh");
	if ( FDL_start(fdl) == NORMAL && FS_setFullPathname( tmp, FDL_get_filename(fdl)) == NORMAL )
	{
		FS_unix2dos( arc, tmp );
		ret = NORMAL;
	} else
		ret = ERR;
	FDL_close(fdl);
	if ( ret == NORMAL )
	{
		sprintf( cmd, "LHa s /x %s", arc );
		DCN_puts( dcn, cmd );
		DCN_exec( dcn, 0, cmd );
		ret = DCNCMD_PROMPT;
	}
	return (ret);
}

int		dcn_lhx_menu( char *dcn )
{
	int		ret;
	char	*obj;
	char	*mnu;

	obj = MNU_alloc(4);
	MNU_setObj(obj, 0, MNU_NOR, 'L', " 書庫の閲覧 "          , NULL, 1, NULL, NULL );
	MNU_setObj(obj, 1, MNU_NOR, 'X', " 書庫の解凍 "          , NULL, 2, NULL, NULL );
	MNU_setObj(obj, 2, MNU_NOR, 'A', " ファイルの凍結"       , NULL, 3, NULL, NULL );
	MNU_setObj(obj, 3, MNU_NOR, 'S', " 自己解凍書庫の作成 "  , NULL, 4, NULL, NULL );
	mnu = MNU_open( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, MNUATT_EXIT, obj, "LHx MENU" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);
	switch ( ret )
	{
		case 1:					/* 閲覧	*/
			ret = _lhx_list(dcn);
			break;
		case 2:					/* 解凍	*/
			ret = _lhx_extract(dcn);
			break;
		case 3:					/* 凍結	*/
			ret = _lhx_append(dcn);
			break;
		case 4:					/* 自己解凍	*/
			ret = _lhx_makeSfx(dcn);
			break;
	}
	return (ret);
}
