/*************************************************************************
*	インストール処理
*************************************************************************/

int		install_exec( char **probuf )
{
	int			ret, i, fcopy_att, drv, argc, srcdrv;
	char	  **argv, *p, *typename;
	char		instdir[256];
	char		softname[80];
	char		srcdir[128], instfile[128];
	char		helpfn[128];
	char		item_ttl[80],item_prog[32], item_para[128];
	int			item_setup, item_num, item_att;
	char		arcfn[128], arcdir[128], arcflag;
	char		runfn[128], runpara[128];
	char		demo_msg[80], demo_func[80];
	char	   *lhalib;
	char	   *dlgTxm;
	char		tmp[256], tmp2[256];

	fcopy_att = FCOPY_ATT_SUBDIR | FCOPY_ATT_TIMESTAMP | FCOPY_ATT_CHK_OVERWRITE;
	instdir[0]   = '\0';
	srcdir[0]    = '\0';
	instfile[0]  = '\0';
	helpfn[0]    = '\0';
	item_num     =  0;
	item_ttl[0]  = '\0';
	arcfn[0]     = '\0';
	arcdir[0]    = '\0';
	arcflag      = 0;
	runpara[0]   = '\0';
	runfn[0]     = '\0';
	demo_msg[0]  = '\0';
	demo_func[0] = '\0';

	srcdrv = toupper(DirStart[0]) - 'A';

	/* インストールプロジェクト設定		--------------------------------*/
	for ( i = 0; probuf[i] != NULL; ++i )
	{
		if ( (argc = DTA_makeArg(probuf[i],&argv)) > 0 )
		{
			typename = argv[0];
			if ( strcmpi(typename,"softname") == 0 )
			{
				if ( argc >= 2 )
					strcpy( softname, argv[1]);
			} else if ( strcmpi(typename,"instfile") == 0 )
			{
				if ( argc >= 2 )
					strcpy(srcdir  , argv[1]);
				if ( argc >= 3 )
					strcpy(instfile, argv[2]);
				if ( argc >= 4 )
				{
					if ( strcmpi(argv[3],"-nocopydir") == 0 )
						fcopy_att &= (~FCOPY_ATT_SUBDIR);
				}
			} else if ( strcmpi(typename,"help") == 0 )
			{
				if ( argc >= 2 )
				{
					if ( FS_isDelim(argv[1][0]) )
						strcpy(helpfn, argv[1]);
					else if ( srcdir[0] != '\0' )
						sprintf(helpfn,"%s/%s",srcdir,argv[1]);
				}
			} else if ( strcmpi(typename,"item") == 0 )
			{
				++item_num;
				if ( argc >= 5 )
				{
					strcpy(item_ttl , argv[1]);
					strcpy(item_prog, argv[2]);
					strcpy(item_para, argv[3]);
					item_att = atoi(argv[4]);
				}
			} else if ( strcmpi(typename,"arcfile") == 0 )
			{	/* arcfile "filename.lzh" <展開ディクトリ>	*/
				if ( argc >= 2 )
				{
					strcpy( arcfn , argv[1]);
					arcflag = 1;
				}
				if ( argc >= 3 )	/* ソースリストとみなす */
					strcpy( arcdir, argv[2]);
			} else if ( strcmpi(typename,"runexp") == 0 )
			{
				if ( argc >= 2 && srcdir[0] )
				{
					strcpy(runfn,srcdir);
					add_path_fn(runfn,argv[1]);
				}
				if ( argc >= 3 )
					strcpy(runpara,argv[2]);
			} else if ( strcmpi(typename,"demo") == 0 )
			{
				if ( argc >= 3 )
				{
					strcpy(demo_msg ,argv[1]);
					strcpy(demo_func,argv[2]);
				}
			}
			DTA_clearArg(argc,argv);
		}
	}

	/* インストールトップメニュー	------------------------------------*/
_TOP:
	syl_putf("%s",softname);
	dlgTxm = DlgTxm_open(ColBoxNormal);
	DlgTxm_setTitle(dlgTxm,Fnt16x16,softname);
	DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
	    "%s をインストールします。", softname );
	DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\r'  , KA_EXEC  ,
	    1, "", NULL, "ｲﾝｽﾄｰﾙ : [実行]");
	DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'H'   , KA_H     ,
	    2, "inst_help", helpfn, "説明 : [H]");
	if ( runfn[0] )
	{
		DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'R'   , KA_R     ,
		    3, "", NULL, "実行 : [R]");
	} else if ( demo_msg[0] )
	{
		DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'D'   , KA_D     ,
		    3, "", NULL, "%s : [D]", demo_msg);
	}
	DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\x1B', KA_CANCEL,
	    4, "", NULL, "取消 : [取消]");
	DlgTxm_setSize(dlgTxm,320,40);
	DlgTxm_setPosition(dlgTxm,DLGPOS_CENTER_OF_SCREEN);
	do
	{
		ret = DlgTxm_start(dlgTxm);
	} while ( ret == 2 );
	DlgTxm_close(dlgTxm);
	if ( ret == 3 )
	{
		if ( runfn[0] )
		{
			dlgTxm = DlgTxm_open(ColBoxCaution);
			DlgTxm_setTitle(dlgTxm,Fnt16x16,softname);
			DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
			    "%s を実行します。", softname );
			DlgTxm_putf( dlgTxm, Fnt16x12, TXMDAT_ATT_CENTER,"");
			DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
			    "※　メモリが不足している場合は実行できません。" );
			DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\r'  , KA_EXEC  ,
			    1, "", NULL, "実行 : [実行]");
			DlgTxm_setBtn( dlgTxm, Fnt16x16, 128, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\x1B', KA_CANCEL,
			    0, "", NULL, "取消 : [取消]");
			DlgTxm_setSize(dlgTxm,400,40);
			DlgTxm_setPosition(dlgTxm,DLGPOS_CENTER_OF_SCREEN);
			ret = DlgTxm_start(dlgTxm);
			DlgTxm_close(dlgTxm);
			if ( ret == 1 )
				exprun(runfn,runpara);
		} else if ( demo_msg )
		{
			_funcCall(demo_func, 0);
		}
		goto _TOP;
	} else if ( ret != 1 )
		goto _RET;


	/* ソース展開確認	------------------------------------------------*/
	if ( arcfn[0] && arcdir[0] )
	{
		dlgTxm = DlgTxm_open(ColBoxNormal);
		DlgTxm_setTitle(dlgTxm,Fnt16x16,softname);
		DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
		    "ソースプログラムもインストールしますか？" );
		DlgTxm_setBtn( dlgTxm, Fnt16x16, 160, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'S'   , KA_S    ,
		    1, "", 0, "ｿｰｽをｲﾝｽﾄｰﾙする : [S]");
		DlgTxm_setBtn( dlgTxm, Fnt16x16, 160, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\x1B', KA_CANCEL,
		    0, "", 0, "ｲﾝｽﾄｰﾙしない : [取消]");
		DlgTxm_setSize(dlgTxm,480,40);
		DlgTxm_setPosition(dlgTxm,DLGPOS_CENTER_OF_SCREEN);
		ret = DlgTxm_start(dlgTxm);
		DlgTxm_close(dlgTxm);
		arcflag = (ret == 1) ? 1 : 0;
	}

	/* インストール先指定	--------------------------------------------*/
	ret = APL_setInstallDir(instdir,"%s : インストール先指定", softname);
	if ( ret )
		goto _TOP;

	dlgTxm = DlgTxm_open(ColBoxNormal);
	DlgTxm_setTitle(dlgTxm,Fnt16x16,softname);
	DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
	    "%s", instdir );
	DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
	    "このディレクトリにインストールしてもいいですか？" );
	DlgTxm_putf( dlgTxm, Fnt16x12, TXMDAT_ATT_CENTER,"");
	if ( item_ttl[0] )
	{
		DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
		    "ｲﾝｽﾄｰﾙ1 … ファイルを複写してTownsMENU にアイテム登録");
		DlgTxm_putf( dlgTxm, Fnt16x16, TXMDAT_ATT_CENTER,
		    "ｲﾝｽﾄｰﾙ2 … ファイルを複写（アイテム登録はしない）    ");

		DlgTxm_setBtn( dlgTxm, Fnt16x16, 144, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\r'  , KA_EXEC  , 1, "", 0, "ｲﾝｽﾄｰﾙ1 : [実行]");
		DlgTxm_setBtn( dlgTxm, Fnt16x16, 144, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, 'C'   , KA_C     , 2, "", 0, "ｲﾝｽﾄｰﾙ2 : [C]");
	} else
	{	/* アイテム登録はなし	*/
		DlgTxm_setBtn( dlgTxm, Fnt16x16, 144, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\r'  , KA_EXEC  , 2, "", 0, "ｲﾝｽﾄｰﾙ : [実行]");
	}
	DlgTxm_setBtn( dlgTxm, Fnt16x16, 144, 20, C_MBLACK, C_WHITE, C_HILIGHT, C_DARK, '\x1B', KA_CANCEL, 3, "", 0, "取消 : [取消]");
	DlgTxm_setSize(dlgTxm,320,40);
	DlgTxm_setPosition(dlgTxm,DLGPOS_CENTER_OF_SCREEN);
	ret = DlgTxm_start(dlgTxm);
	DlgTxm_close(dlgTxm);
	if ( ret != 1 && ret != 2 )
		goto _TOP;
	item_setup = (ret == 1 ? 1 : 0);


	/* インストール開始	------------------------------------------------*/
	syl_putf("INSTALL START");
	FS_chdrv(srcdrv);
	if ( *srcdir == '\0' || *srcdir == '.' )
	{
		strcpy(tmp,DirStart);
		ret = strlen(tmp);
		if ( ret > 3 && FS_isDelim(tmp[ret-1]) )
			tmp[ret-1] = '\0';
	} else
	{
		if ( FS_isDelim(*srcdir) )
			strcpy(tmp,srcdir);
		else
			sprintf(tmp,"%s%s",DirStart, srcdir);
	}
	if ( instfile[0] )
	{
		FS_getFullPn(tmp2,tmp);
		srcdir = tmp2;
		ret = FCOPY_exec(fcopy_att, srcdir, instfile, instdir);
	}

	/* 書庫展開	--------------------------------------------------------*/
	if ( arcfn[0] && arcflag )
	{
		syl_putf("ARC(.LZH) FILE EXTRACT");
		FS_chdrv(srcdrv);
		strcpy(tmp,srcdir);
		add_path_fn(tmp,arcfn);

		strcpy(tmp2,instdir);
		if ( arcdir[0] )
			add_path_fn(tmp2,arcdir);
		if ( (lhalib = LHA_openArc(tmp)) != NULL )
		{
			ret = LHA_extractAll(lhalib,tmp2);
			LHA_closeArc(lhalib);
		} else
		{
			syl_putf("ARC OPEN ERROR");
			ret = ERR;
		}
	}

	/* アイテム登録	----------------------------------------------------*/
	if ( ret == NORMAL && item_setup != 0 )
	{
		syl_putf("ITEM SETUP");
		drv = toupper(instdir[0]) - 'A';
		if ( item_num == 1 )
		{	/* 単一	*/
			strcpy(tmp,instdir);
			add_path_fn(tmp,item_prog);
			item_setApl( drv, 1024, item_ttl, tmp, item_para, item_att );
		} else
		{	/* 複数登録	*/
			for ( i = 0; probuf[i] != NULL; ++i )
			{
				if ( (argc = DTA_makeArg(probuf[i],&argv)) > 0 )
				{
					typename = argv[0];
					if ( strcmpi(typename,"item") == 0 )
					{
						if ( argc >= 5 )
						{
							strcpy(item_ttl , argv[1]);
							strcpy(item_prog, argv[2]);
							strcpy(item_para, argv[3]);
							item_att = atoi(argv[4]);
							strcpy(tmp,instdir);
							add_path_fn(tmp,item_prog);
							item_setApl( drv, 1024, item_ttl, tmp, item_para, item_att );
						}
					}
					DTA_clearArg(argc,argv);
				}
			}
		}
	}
	install_end( softname, ret );

_RET:
	syl_clear();

	return (0);
}
