/*************************************************************************
*	インストールプログラム
*************************************************************************/

#include	"ccilib.h"

/*	パレットデータ（HEwin 配色）	*/
char	PltDat[3][16] =
{
	/* G R  B								*/
	{ 0, 0, 0},	/* C_BALCK, C_THROUGH		*/
	{ 0, 0, 0},	/* C_BLUE , C_MBLACK 		*/
	{ 7, 7, 8},	/* C_RED					*/
	{12,12,13},	/* C_MAGENTA				*/
	{ 6, 5, 7},	/* C_GREEN					*/
	{ 8, 7, 9},	/* C_CYAN					*/
	{10, 9,11},	/* C_YELLOW					*/
	{11,11,12},	/* C_WHITE					*/

	{ 5, 5, 6},	/* C_HBALCK					*/
	{ 0, 0,11},	/* C_HBLUE					*/
	{ 0,11, 0},	/* C_HRED					*/
	{ 0,11,11},	/* C_HMAGENTA				*/
	{11, 0, 0},	/* C_HGEEN					*/
	{11, 0,11},	/* C_HCYAN					*/
	{11,11, 0},	/* C_HYELLOW				*/
	{14,14,15}	/* C_HWHITE					*/
};

/*************************************************************************
*	初期化
*************************************************************************/

int		init()
{
	DSP_sysInit(0);			/* 表示システム初期化		*/
	KBF_sysInit();			/* キーボードシステム初期化	*/
	KBF_kan_off();
	FDL_sysInit();			/* ファイルダイアログ初期化	*/

	sdk_control(0);			/* サイドワーク起動禁止	*/
	DSP_setPlt( PltDat );	/* パレット設定			*/

	DSP_writePage(1);
	DSP_title("INSTALL","0.99",15,7,0,0);
	evt_setDspTime( 1, 432, 4, 7, 0 );	/* 時刻表示アイドリング処理設定	*/
	SYL_clear();
}

/*************************************************************************
*	終了
*************************************************************************/

int		term()
{
	FDL_sysEnd();
	KBF_sysEnd();
	DSP_sysEnd();
}

char	*AplName = "CCI";	/* インストールするアプリの名前	*/
char	*NewDir  = "CCI";	/* 作成するディレクトリの名前	*/
char	StartPath[256];
char	ItmPath[256];		/* アイテムファイル				*/

char	*File1[3] =			/* インストールするファイル		*/
{
	"cci.exp",	/* 実行プログラム	*/
	"cci.doc",	/* 説明ファイル		*/
	NULL
};

#define	FRM_X1(_frm)	_frm[0]
#define	FRM_Y1(_frm)	_frm[1]
#define	FRM_X2(_frm)	_frm[2]
#define	FRM_Y2(_frm)	_frm[3]

int		item_set_newpos( short *newfrm )
{
	int			ret;
	int			fpos, nextFPos;
	int			etyNum;
	short		icnNum;
	char		ttlStr[128];
	char		pathStr[128];
	char		paraStr[128];
	int			atrInf;
	int			nextFPos;
	short		frm[4];

	fpos = 0;
	FRM_X1(newfrm) = 0;
	FRM_Y1(newfrm) = 0;
	FRM_X2(newfrm) = 0;
	FRM_Y2(newfrm) = 0;
	while ( (fpos = ITM_GetPhysclNextFPos( ItmPath, fpos )) > 0 )
	{
		if ( ITM_GetStair( ItmPath, fpos ) == 0 )
		{	/* ルートのみ	*/
			ret = ITM_GetItmType(ItmPath,fpos);
			switch ( ret )
			{
				case 1:	/* group */
					ITM_GetGrpData(ItmPath,fpos,&etyNum,&icnNum,ttlStr,&nextFPos,frm);
					break;
				case 2:	/* apllication */
					ITM_GetAplData(ItmPath,fpos,&icnNum,ttlStr,pathStr,paraStr,atrInf,frm);
					break;
			}
			if ( FRM_X1(newfrm) < FRM_X2(frm) )
				FRM_X1(newfrm) = FRM_X2(frm);
			if ( FRM_Y1(newfrm) < FRM_Y2(frm) )
				FRM_Y1(newfrm) = FRM_Y2(frm);
		}
	}
	FRM_Y1(newfrm) = FRM_Y1(newfrm) + 15;
	FRM_X2(newfrm) = FRM_X1(newfrm) + 24;
	FRM_Y2(newfrm) = FRM_Y1(newfrm) + 24;

	if ( FRM_X2(newfrm) > 621 )
	{
		FRM_X2(newfrm) = 621;
		FRM_X1(newfrm) = FRM_X2(newfrm) - 24;
	}
	if ( FRM_Y2(newfrm) > 410 )
	{
		FRM_Y2(newfrm) = 410;
		FRM_Y1(newfrm) = FRM_Y2(newfrm) - 24;
	}
}


/*************************************************************************
*	インストール
*************************************************************************/

int		install()
{
	int		i, ret, len;
	char	*btn;
	char	*fdl;
	int		drv;
	char	*p, tmp[256], path[256], whare[256], src[256], dst[256];
	short	frm[4];

_RETRY:
	btn = MNU_allocBtn( 2 );
	MNU_setBtn( btn, 0, '\r'  , KA_EXEC  , 1, "INSTALL : [実行]" );
	MNU_setBtn( btn, 1, '\x1B', KA_CANCEL, 2, "CANECEL : [取消]" );
	ret = MNU_selectBtn( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_LEFT, 2, btn,
	    "    %s のインストールを行いますか？  ", AplName );
	MNU_freeBtn( btn );
	if ( ret != 1 )
		return (0);

	DLG_tmpMsgTime( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN,
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY),
	    3, "\n    インストール先に移動してください。  \n" );

	/* インストール	*/
	if ( (fdl = FDL_open(0)) == NULL )
		return (-1);
	FDL_set_title( fdl,"インストール先指定");
	FDL_set_wildcard( fdl, "*.*");
	ret = FDL_start(fdl);
	if ( ret == NORMAL )
	{
		drv = FDL_get_drv(fdl);
		strcpy( whare, FDL_get_whare(fdl) );
	}
	FDL_close(fdl);
	if ( ret )
		goto _RETRY;

	sprintf( tmp, "%c:/%s", drv+'A', whare );
	len = strlen(tmp);
	if ( len > 0 && tmp[len-1] != '/' && tmp[len-1] != '\\' )
	{
		tmp[len++] = '/';
		tmp[len]   = '\0';
	}
	sprintf( path, "%s%s", tmp, NewDir);

	ret = FS_isFileExist(path);
	if ( ret == 0 )
	{	/* ファイルは存在しない	*/
		/* ディレクトリ作成確認	*/
		btn = MNU_allocBtn( 2 );
		MNU_setBtn( btn, 0, '\r'  , KA_EXEC  , 1, "MKDIR : [実行]" );
		MNU_setBtn( btn, 1, '\x1B', KA_CANCEL, 2, "CANECEL : [取消]" );
		ret = MNU_selectBtn( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
		    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_CENTER, 2, btn,
		    "    インストール先にディレクトリを作成します。  \n%s", path );
		MNU_freeBtn( btn );
		if ( ret != 1 )
			goto _RETRY;
		FS_mkdir(path);
	} else if ( ret == 1 )
	{	/* ファイルが存在	*/
		MNU_sure( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN,
		    C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY), SELBTN_ATT_CENTER,
		    "    %s    \n    インストール先に同名のファイルが存在しています。  ", path );
		goto _RETRY;
	}

	/* インストール先確認	--------------------------------------------*/
	btn = MNU_allocBtn( 2 );
	MNU_setBtn( btn, 0, '\r'  , KA_EXEC  , 1, "INSTALL : [実行]" );
	MNU_setBtn( btn, 1, '\x1B', KA_CANCEL, 2, "CANECEL : [取消]" );
	ret = MNU_selectBtn( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_CENTER, 2, btn,
	    "  インストール先 : %s  \n    インストールを行いますか？  ", path );
	MNU_freeBtn( btn );
	if ( ret != 1 )
		goto _RETRY;

	/* ファイルの複写	------------------------------------------------*/
	ret = i = 0;
	while ( (p = File1[i++]) != NULL && ret == 0 )
	{
		SYL_puts( C_INFO, "copy %s", p );
		sprintf( src, "%s%s", StartPath, p );
		ret = FileCopy2( src, path, FCOPY_OVERWRITE_CHECK|FCOPY_LAST_MSG_IGN );
	}

	if ( ret )
	{	/* error */
		MNU_sure( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN,
		    C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY), SELBTN_ATT_CENTER,
		    "FILE COPY ERROR\n    インストールに失敗しました。  " );
		return (-1);
	}

	/* アイテム登録		------------------------------------------------*/
	SYL_puts( C_INFO, "アイテム登録を行います。" );
	sprintf( ItmPath, "%c:\\tmenu.itm", drv+'A');
	if ( FS_isFileExist(ItmPath) == 0 )
	{	/* アイテムファイルま作成	*/
		ITM_CreateItemFile(ItmPath);
	}
	item_set_newpos( frm );

	sprintf( tmp, "%s/%s", path, File1[0]);
	FS_unix2dos( dst, tmp );
	ITM_AddAplItem( ItmPath, 0, 1024, AplName, dst, "", 0, frm );

	SYL_puts( C_INFO, "***** Completed *****");
	DLG_tmpMsgTime( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN,
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY),
	    3, "    インストール終了しました。  " );

	return (0);
}

/*************************************************************************
*	MAIN
*************************************************************************/

int		main( int argc, char **argv )
{
	char	tmp[256];

	init();

	FS_setFullPathname( tmp, argv[0] );
	FS_getDnam( StartPath, tmp );

	install();

	term();
	return (0);
}
