/*************************************************************************
*	"ntm.c" : 通信ターミナル用
*************************************************************************/

/*	#define	_NTM_DEBUG	*/

#ifdef	_NTM_DEBUG
#	define	_NTM_DSP(pos,s)	DSP_putf12(pos*8,480-16-16,C_HGREEN,0,s)
#else
#	define	_NTM_DSP(pos,s)
#endif

#define	CENTER_DAT_FN	"center.dat"
#define	DTR_OFF_TIME	2

/* タイムバッファ	*/
#define	NTM_TIME_LOGIN		(0)
#define	NTM_TIME_LOGOUT		(1)

/*************************************************************************
*	ダイアル
*************************************************************************/

int		ntm_dialStart( char *ntm, char *tel )
{
	int		ret, count, i, argc;
	char	**argv;
	char	*mosTk;
	char	*center;
	char	*cmd;

	if ( tel == NULL || tel[0] == '\0' )
	{
TEL_ERR:
		DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
		    C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
		    AplErrMsgTime, "    電話番号が指定されていません。  " );
		return (ERR);
	}
	argc = FS_argSet( tel, &argv );
	if ( argc < 1 )
		goto TEL_ERR;

	mosTk = MOS_push();
	MOS_curType(MOSCUR_TEL);
	if ( (center = NtmGetCenterPtr(ntm)) == NULL )
	{
		cmd = NULL;
	} else
	{
		cmd = NtmCenterGetModem1(center);
		if ( cmd[0] == '\0' )
			cmd = NULL;
	}
	if ( cmd )
		NTM_rsPuts(ntm,cmd);
	else
		NTM_rsPuts(ntm,"ATZ");
	NTM_rsPuts(ntm,"\r");
	ret = NTM_waitStr( ntm, 30, "OK", NULL );
	if ( ret < 0 )
	{
		DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
		    C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
		    AplErrMsgTime, "    Modem not ready!!    " );
ERR_RET:
		MOS_pop( mosTk );
		FS_argClear( argc, argv );
		return (ERR);
	}
	if ( center )
	{
		NTM_wait(1);
		cmd = NtmCenterGetModem2(center);
		if ( cmd[0] != '\0' )
		{
			NTM_rsPuts(ntm,cmd);
			NTM_rsPuts(ntm,"\r");
			NTM_wait(2);
		}
	}

	count = 0;
	ret = 1;
	while ( ret )
	{
		for ( i = 0; i < argc; ++i )
		{
			EVT_idl();
			NTM_rsPuts(ntm, "ATD");
#ifdef	_TAROPYON_SYSTEM
			/* リダイアル制限回避用	*/
			if ( argc == 1 && count & 1 )
				NTM_rsPuts(ntm, ","  );
#endif
			NTM_rsPuts(ntm, argv[i] );
			NTM_rsPuts(ntm, "\r" );
			MOS_CON();
			ret = NTM_waitStr( ntm, 60, "CONNECT","BUSY","NO CARRIER", NULL );
			if ( ret == 0 )	/* CONNECT */
			{
				SYL_puts(C_HGREEN,"<<<<< CONNECT >>>>>");
				break;
			} else if ( ret < 0 )	/* Cancel or Timeout	*/
				goto ERR_RET;
			if ( NTM_wait(5) != NORMAL )
				goto ERR_RET;
			++count;
		}
	}
	NTM_online( ntm );	/* 接続	*/
	MOS_pop(mosTk);
	FS_argClear( argc, argv );

	return (NORMAL);
}

int		ntm_chDir( char *dir )
{
	int		len;
	char	tmp[128];

	if ( (len = strlen(dir)) == 0 )
		return (NORMAL);
	if ( len > 2 && isalpha(*dir) && dir[1] == ':' )
	{	/* ドライブ指定あり	*/
		FS_chdrv( toupper(*dir) - 'A' );
	}
	if ( len > 0 && FS_isdelim(dir[len-1]) )
	{
		sprintf( tmp, "%s.", dir );
		FS_chdir( tmp );
	} else
		FS_chdir( dir );
	return (NORMAL);
}

int		ntmSetDownloadDir( char *ntm )
{
	char	*center;
	char	*dir;

	if ( (center = NtmGetCenterPtr(ntm)) == NULL )
		return (ERR);
	dir = NtmCenterGetDownDir(center);
	return	ntm_chDir( dir );
}

int		ntmSetUploadDir( char *ntm )
{
	char	*center;
	char	*dir;

	if ( (center = NtmGetCenterPtr(ntm)) == NULL )
		return (ERR);
	dir = NtmCenterGetUpDir(center);
	return	ntm_chDir( dir );
}


/*************************************************************************
*	イベント処理関数
*************************************************************************/

char	*NTMUSR_EVTFUNC = "ntmUsr_evtFunc";

int		ntmUsr_evtFunc( int evtNo, char *sbj )
{
	return	NTM_cmdJump( GET_EVTSBJ_PTR(sbj), evtNo );
}

/*************************************************************************
*	[COMMAND]ボタン
*************************************************************************/

int		NtmUsr_commandMenu( char *ntm, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;

	obj = MNU_alloc(3);
	MNU_setObj(obj, 0, MNU_NOR, '1', "Input line on"  , NULL, NTMCMD_LION  ,NTMUSR_EVTFUNC, ntm );
	MNU_setObj(obj, 1, MNU_NOR, '2', "Input line off" , NULL, NTMCMD_LIOFF ,NTMUSR_EVTFUNC, ntm );
	MNU_setObj(obj, 2, MNU_NOR, 'B', "Break"          , NULL, NTMCMD_BREAK ,NTMUSR_EVTFUNC, ntm );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "COMMAND MENU" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	return (ret);
}

int		ntmPrintCutBuf()
{
	return TDP_printCutBuf(NULL);
}

/*************************************************************************
*	[MENU]メニュー
*************************************************************************/

int		NtmUsr_fileMenu( char *ntm, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;

	obj = MNU_alloc(5);
	MNU_setObj(obj, 0, MNU_NOR, 'S', "Save log buffer"  , NULL, NTMCMD_SAVELOG , NTMUSR_EVTFUNC  , ntm );
	MNU_setObj(obj, 1, MNU_NOR, 'C', "Clear log buffer" , NULL, NTMCMD_CLEARBUF, NTMUSR_EVTFUNC  , ntm );
	MNU_setObj(obj, 2, MNU_NOR, 'T', "Append to Text"   , NULL, NTMCMD_APNDTXT , NTMUSR_EVTFUNC  , ntm );
	MNU_setObj(obj, 3, MNU_BLK,  0 , NULL               , NULL, 0              , NULL            , NULL);
	MNU_setObj(obj, 4, MNU_NOR, 'P', "Print CUT-BUFFER" , NULL, 0              , "ntmPrintCutBuf", ntm );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "MENU" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	return (ret);
}

/*************************************************************************
*	テキストアップロード
*************************************************************************/

int		ntm_textUpload( int ret, char *sbj )
{
	char	*ntm;
	char	*fdl;
	char	*fn;

	ntm = GET_EVTSBJ_PTR(sbj);
	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"TEXT FILE UPLOAD");
	FDL_set_wildcard( fdl, "*.*");
	ret = FDL_start(fdl);
	fn  = FDL_get_filename(fdl);
	if ( ret == NORMAL && strlen(fn) > 0 )
	{
		NTM_fileUpload( ntm, fn );
	}
	FDL_close(fdl);

	return (NORMAL);
}

/*************************************************************************
*	X-Modem アップロード
*************************************************************************/

int		ntm_Xupload( int ret, char *sbj )
{
	char	*ntm;
	char	*fdl;
	char	*fn;

	ntm = GET_EVTSBJ_PTR(sbj);
	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"X-MODEM FILE UPLOAD");
	FDL_set_wildcard( fdl, "*.*");
	ret = FDL_start(fdl);
	fn  = FDL_get_filename(fdl);
	if ( ret == NORMAL && strlen(fn) > 0 )
	{
		NTM_Xupload( ntm, fn );
	}
	FDL_close(fdl);

	return (NORMAL);
}

char	*ntm_getPara_rzsz(char *ntm)
{
	char		*rsb;
	int			baud, md;
	char		*spd, mode[8];
	static char	tmp[128];

	rsb = NtmGetRsbPtr(ntm);
	md   = _getByte(rsb);
	baud = _getByte(rsb + 1);
	switch ( baud )
	{
		case 0:	spd = "300";	break;
		case 1:	spd = "600";	break;
		case 2:	spd = "1200";	break;
		case 3:	spd = "2400";	break;
		case 4:	spd = "4800";	break;
		case 5:	spd = "9600";	break;
		case 6:	spd = "19200";	break;
	}
	mode[0] = ( md & 1 ) ? '8' : '7';
	mode[1] = ( md & 2 ) ? (md & 4 ? 'E':'O') : 'N';
	mode[2] = ( md & 8 ) ? '2' : '1';
	mode[3] = '\0';

	sprintf( tmp,"$-b%s $-m%s", spd, mode );
	return (tmp);
}

#ifdef	_NTM_EXDOWN
char	*SZ_PATH_KEY = "Sz_path";

int		ntm_EXupload( int protcol, char *sbj )
{
	int			ret;
	char	   *ntm;
	char	   *dlg;
	char	   *p, prog[128], cmd[1024];
	int			argc;
	char	  **argv;

	char	   *fdl;
	char	   *fnptr, fn[256];

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"FILE UPLOAD (EXTERNAL COMMAND)");
	FDL_set_wildcard( fdl, "*.*");
	ret = FDL_start(fdl);
	fnptr = FDL_get_filename(fdl);
	if ( ret == NORMAL && strlen(fnptr) > 0 )
	{
		strcpy( fn, fnptr );
	} else
		fn[0] = '\0';
	FDL_close(fdl);
	if ( fn[0] == '\0' )
		return (NORMAL);

	if ( (p = AMAC_getName(SysMacro,SZ_PATH_KEY)) == NULL )
	{
#ifdef	_TAROPYON_SYSTEM
		strcpy( prog, "I:/HC/GUILIB3/PRG/ZMODEM/sz.exp" );
#else
	/*	sprintf( prog, "%ssz.exp", AplGetStartPath()); */
		strcpy( prog, "sz.exp");
#endif
		AMAC_setKey( SysMacro, SZ_PATH_KEY, prog );
	} else
		strcpy( prog, p );

	ntm = GET_EVTSBJ_PTR(sbj);
	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 560,
	    " Command & parameters " );
	DLG_getsSetTitle( dlg, "Call external command" );
	switch ( protcol )
	{
		case 1:	/* Y-Modem */
			sprintf( cmd, "%s $sb $-q %s %s", prog, ntm_getPara_rzsz(ntm), fn );
			break;
		case 2:
		default:
			sprintf( cmd, "%s $sz $-q %s %s", prog, ntm_getPara_rzsz(ntm), fn );
			break;
	}
	ret = DLG_getsStart( dlg, 1023, cmd );
	DLG_getsClose(dlg);

	if ( ret > 0 && cmd[0] )
	{
		argc = FS_argSet( cmd, &argv );
		if ( argc > 0 )
		{
			if ( strcmpi( argv[0], prog ) )
			{
				strcpy( prog, argv[0] );
				AMAC_setKey( SysMacro, SZ_PATH_KEY, prog );
			}
			FS_argClear( argc, argv );
		}
		AplDtaInit();
		AplDtaSetStr( "$MainArg", "%s", cmd );
								/* ネイティブ子プロセスに渡すパラメータ */
		AplPclExec( prog,  0 );
	}
	return (NORMAL);
}
#endif

/*************************************************************************
*	[ UP ]メニュー（アップロード）
*************************************************************************/

int		NtmUsr_uploadMenu( char *ntm, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;
	int			no, onum;

	ntmSetUploadDir( ntm );
	onum = 4;
#ifdef	_NTM_EXUP
	onum += 2;
#endif
	obj = MNU_alloc(onum);

	no = 0;
	MNU_setObj(obj, no++, MNU_NOR, 'C', "Send CUT-BUFFER"    , NULL, NTMCMD_SENDCBUF, NTMUSR_EVTFUNC  , ntm );
	MNU_setObj(obj, no++, MNU_NOR, 'T', "Send text buffer"   , NULL, NTMCMD_SENDTBUF, NTMUSR_EVTFUNC  , ntm );
	MNU_setObj(obj, no++, MNU_NOR, 'N', "Normal file upload" , NULL, 0              , "ntm_textUpload", ntm );
	MNU_setObj(obj, no++, MNU_NOR, 'X', "X-Modem upload"     , NULL, 0              , "ntm_Xupload"   , ntm );
#ifdef	_NTM_EXUP
	MNU_setObj(obj, no++, MNU_NOR, 'Y', "Y-Modem (External)" , NULL, 1              , "ntm_EXupload"  , ntm );
	MNU_setObj(obj, no++, MNU_NOR, 'Z', "Z-Modem (External)" , NULL, 2              , "ntm_EXupload"  , ntm );
#endif

	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "UPLOAD" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	return (ret);
}


/*************************************************************************
*	テキストダウンロード
*************************************************************************/

int		ntm_textDownload( int ret, char *sbj )
{
	char	*ntm;
	char	*fdl;
	char	*fn;

	ntm = GET_EVTSBJ_PTR(sbj);

	if ( NTM_fileDownCheck(ntm) )
		return (ERR);

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"TEXT FILE DOWNLOAD");
	FDL_set_wildcard( fdl, "*.*");
	ret = FDL_start(fdl);
	fn  = FDL_get_filename(fdl);
	if ( ret == NORMAL && strlen(fn) > 0 )
	{
		NTM_fileDownload( ntm, fn );
	}
	FDL_close(fdl);

	return (NORMAL);
}

/*************************************************************************
*	X-Modem ダウンロード
*************************************************************************/

int		ntm_Xdownload( int ret, char *sbj )
{
	char	*ntm;
	char	*fdl;
	char	*fn;

	ntm = GET_EVTSBJ_PTR(sbj);
	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"X-MODEM FILE DOWNLOAD");
	FDL_set_wildcard( fdl, "*.*");
	ret = FDL_start(fdl);
	fn  = FDL_get_filename(fdl);
	if ( ret == NORMAL && strlen(fn) > 0 )
	{
		NTM_Xdownload( ntm, fn );
	}
	FDL_close(fdl);

	return (NORMAL);
}

#ifdef	_NTM_EXDOWN
char	*RZ_PATH_KEY = "Rz_path";

int		ntm_EXdownload( int protcol, char *sbj )
{
	int			ret;
	char	   *ntm;
	char	   *dlg;
	char	   *p, prog[128], cmd[1024];
	int			argc;
	char	  **argv;

	if ( (p = AMAC_getName( SysMacro, RZ_PATH_KEY)) == NULL )
	{
#ifdef	_TAROPYON_SYSTEM
		strcpy( prog, "I:/HC/GUILIB3/PRG/ZMODEM/rz.exp");
#else
	/*	sprintf( prog, "%srz.exp", AplGetStartPath());	*/
		strcpy( prog, "rz.exp");
#endif
		AMAC_setKey( SysMacro, RZ_PATH_KEY, prog );
	} else
		strcpy( prog, p );
	ntm = GET_EVTSBJ_PTR(sbj);
	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 560,
	    " Command & parameters " );
	DLG_getsSetTitle( dlg, "Call external command" );
	switch ( protcol )
	{
		case 1:
			sprintf( cmd, "%s $-q $rb %s", prog, ntm_getPara_rzsz(ntm) );
			break;
		case 2:
		default:
			sprintf( cmd, "%s $-q $rz %s", prog, ntm_getPara_rzsz(ntm) );
			break;
	}
	ret = DLG_getsStart( dlg, 1023, cmd );
	DLG_getsClose(dlg);

	if ( ret > 0 && cmd[0] )
	{
		argc = FS_argSet( cmd, &argv );
		if ( argc > 0 )
		{
			if ( strcmpi( argv[0], prog ) )
			{
				strcpy( prog, argv[0] );
				AMAC_setKey( SysMacro, RZ_PATH_KEY, prog );
			}
			FS_argClear( argc, argv );
		}
		AplDtaInit();
		AplDtaSetStr( "$MainArg", "%s", cmd );
		AplPclExec( prog,  0 );
	}
	return (NORMAL);
}
#endif

#ifdef	_NTM_DOSCALL
/*************************************************************************
*	DOS コマンドを使ったダウンロード
*************************************************************************/

int		ntm_DOSdownload( int ret, char *sbj )
{
	char	*ntm;
	char	*dlg;
	char	cmd[80];
	int		ret;

	ntm = GET_EVTSBJ_PTR(sbj);
	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	    " DOS command ? " );
	DLG_getsSetTitle( dlg, "Call Child process" );
	strcpy( cmd, "rz");
	ret = DLG_getsStart( dlg, 79, cmd );
	DLG_getsClose(dlg);

	if ( ret > 0 )
	{	/* ダウンロード開始	*/
		dlg = DLG_msgOpen( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN,
		    80*6, 14*12, C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY),
		    "DOWNLOAD" );
		if ( dlg )
		{
			DLG_msgSetConfig( dlg, 4, 6, 12 );
			DLG_msgClear( dlg, -1 );
			DLG_msgConsSet( dlg, C_MBLACK, C_HWHITE);	/* コンソール出力設定	*/
		}
		MOS_DEC();
		RS_pause();
		system( cmd );
		RS_continue();
		MOS_INC();
		if ( dlg )
		{
			DLG_msgPrintf(dlg,"\r\n***** COMPLETED *****\r\n");
			NTM_wait(2);
			DLG_msgConsEnd( dlg );
			DLG_msgClose(dlg);
		}
	}
	return (NORMAL);
}
#endif

/*************************************************************************
*	[DOWN]メニュー（ダウンロード）
*************************************************************************/

int		NtmUsr_downloadMenu( char *ntm, int x, int y )
{
	int			ret;
	char		*mnu;
	char		*obj;
	int			no, onum;

	ntmSetDownloadDir(ntm);
	onum = 2;
#ifdef	_NTM_DOSCALL
	++onum;
#endif
#ifdef	_NTM_EXDOWN
	onum += 2;
#endif
	obj = MNU_alloc(onum);
	no = 0;
	MNU_setObj(obj, no++, MNU_NOR, 'N', "Normal file download"  , NULL, 0, "ntm_textDownload", ntm );
	MNU_setObj(obj, no++, MNU_NOR, 'X', "X-Modem download"      , NULL, 0, "ntm_Xdownload"   , ntm );
#ifdef	_NTM_EXDOWN
	MNU_setObj(obj, no++, MNU_NOR, 'Y', "Y-Modem (External)"    , NULL, 1, "ntm_EXdownload"  , ntm );
	MNU_setObj(obj, no++, MNU_NOR, 'Z', "Z-Modem (External)"    , NULL, 2, "ntm_EXdownload"  , ntm );
#endif
#ifdef	_NTM_DOSCALL
	MNU_setObj(obj, no++, MNU_NOR, 'C', "Call DOS child process", NULL, 0, "ntm_DOSdownload" , ntm );
#endif
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "DOWNLOAD" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	return (ret);
}

/*************************************************************************
*	直接ダイアル
*************************************************************************/

int		ntm_directDial( char *ntm )
{
	int				ret;
	char			*dlg;
	static	char	tel[256];

	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	    "電話番号を入力してください。");
	DLG_getsSetTitle( dlg, "DIAL" );
	ret = DLG_getsStart( dlg, 255, tel );
	DLG_getsClose(dlg);
	if ( ret > 0 )
	{
		ntm_dialStart( ntm, tel );
	}
	return (NORMAL);
}

int		ntm_centerSelect( char *ntm )
{
	char	*center;
	char	*keyWord;

	if ( (center = NTM_centerSelect()) != NULL )
	{	keyWord = NtmCenterGetKeyWord( center );
		NTM_setCenter( ntm, keyWord );	/* センタを指定	*/
	}
	return (NORMAL);
}

/*************************************************************************
*	[AUTO]メニュー（センター未登録状態）
*************************************************************************/

int		NtmUsr_autoFreeMenu( char *ntm, int x, int y )
{
	int		ret;
	char	*obj;
	char	*mnu;

	obj = MNU_alloc(5);
	MNU_setObj(obj, 0, MNU_NOR, 'D', "ダイアル"           , NULL, 1, NULL, NULL );
	MNU_setObj(obj, 1, MNU_NOR, 'S', "センター指定"       , NULL, 2, NULL, NULL );
	MNU_setObj(obj, 2, MNU_BLK,  0 , NULL                 , NULL, 0, NULL, NULL );
	MNU_setObj(obj, 3, MNU_NOR, 'N', "新規センター登録"   , NULL, 3, NULL, NULL );
	MNU_setObj(obj, 4, MNU_NOR, 'K', "センターデータ削除" , NULL, 4, NULL, NULL );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "AUTO MENU" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);
	switch( ret )
	{
		case 1:	ret = ntm_directDial(ntm);		break;
		case 2:	ret = ntm_centerSelect(ntm);	break;
		case 3:	ret = NTM_makeNewCenter();		break;
		case 4:	ret = NTM_centerDelete();		break;
	}
	return (ret);
}


/*************************************************************************
*	[AUTO]メニュー（非接続状態）
*************************************************************************/

int		NtmUsr_autoOffLineMenu( char *ntm, int x, int y )
{
	int		ret, n;
	char	*center;
	char	*name, *keyWord;
	char	*obj;
	char	*mnu;

	center = NtmGetCenterPtr( ntm );
	if ( center == NULL )
	{	/* センターが指定されていない	*/
		return	NtmUsr_autoFreeMenu( ntm, x, y );
	} else
	{
		name    = NtmCenterGetName(center);
		keyWord = NtmCenterGetKeyWord(center);
		n = 6;
		obj = MNU_alloc( n );
		n = 0;
		MNU_setObj(obj, n++, MNU_NOR, 'L', "オートログイン"     , NULL, 1, NULL, NULL );
		MNU_setObj(obj, n++, MNU_NOR, 'C', "センターデータ設定" , NULL, 3, NULL, NULL );
		MNU_setObj(obj, n++, MNU_NOR, 'S', "センター変更"       , NULL, 4, NULL, NULL );
		MNU_setObj(obj, n++, MNU_BLK,  0 , NULL                 , NULL, 0, NULL, NULL );
		MNU_setObj(obj, n++, MNU_NOR, 'N', "新規センター登録"   , NULL, 5, NULL, NULL );
		MNU_setObj(obj, n++, MNU_NOR, 'K', "センターデータ削除" , NULL, 6, NULL, NULL );
		mnu = MNU_open( x, y, MNUATT_EXIT, obj, name );
		ret = MNU_start ( mnu );
		MNU_close(mnu);
		MNU_free(obj);
		switch ( ret )
		{
			case 1:	/* Dial & login	*/
				return NTM_callLogin( ntm );
			case 3:	/* Config		*/
				ret = NTM_centerConfig( keyWord );
				if ( ret == NORMAL )
				{	/* パラメータ再設定	*/
					NTM_setCenter( ntm, keyWord );
				}
				return (ret);
			case 4:	/* センター変更	*/
				return	ntm_centerSelect(ntm);	break;
			case 5:	/* 新規センター登録	*/
				return	NTM_makeNewCenter();
			case 6:	/* センター削除	*/
				return	NTM_centerDelete();
		}
		return (NORMAL);
	}
}

/*************************************************************************
*	[AUTO]メニュー（接続状態）
*************************************************************************/

int		NtmUsr_autoOnLineMenu( char *ntm, int x, int y )
{
	int		ret;
	char	*center;
	char	*obj;
	char	*mnu;

	center = NtmGetCenterPtr( ntm );
	if ( center == NULL )
	{	/* センターが指定されていない	*/
		obj = MNU_alloc(1);
		MNU_setObj(obj, 0, MNU_NOR, 'O', "OFF 回線切断", NULL, 1, NULL, NULL );
		mnu = MNU_open( x, y, MNUATT_EXIT, obj, "AUTO MENU" );
		ret = MNU_start ( mnu );
		MNU_close(mnu);
		MNU_free(obj);
		switch ( ret )
		{
			case 1:	return	NTM_offline(ntm,DTR_OFF_TIME);
		}
		return (NORMAL);
	} else
	{
		return	NTM_callAutoMenu( ntm, x, y );
	}
}

int		_ntm_setFilterFunc( char *ntm, char *func )
{
	int		ret;

	if ( (ret = NtmSetFilterFunc( ntm, func)) != NORMAL )
	{	/* error */
		DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
		    C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
		    AplErrMsgTime, "    %s : \n    このフィルタ関数は他のウィンドゥで既に使われています。  ",
		    func );
	} else
	{
		NtmFilterModeOn( ntm );
	}
	return (ret);
}

/*************************************************************************
*	フィルター用正規表現の入力と設定
*************************************************************************/

int		_ntm_inputFilterPtn( char *ntm )
{
	int			ret;
	char		*dlg;
	char		tmp[256];

	strncpy( tmp, NtmGetFilterPtn(ntm), 255 );
	tmp[255] = '\0';
	dlg = DLG_getsOpen( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME, 320,
	                    "%s", tmp );
	DLG_getsSetTitle( dlg, "FILTER PATTERN" );
	ret = DLG_getsStart( dlg, 255, tmp );
	DLG_getsClose(dlg);
	if ( ret > 0 )
	{
		if ( NtmSetFilterPtn(ntm,tmp,1) == NORMAL )
		{
			NtmSetFilterFunc( ntm, NULL );	/* フィルタ関数解除	*/
			NtmFilterModeOn( ntm );
		}
	}

	return (NORMAL);
}

int		_ntm_filterTest( char *ntm )
{
	char	*fdl;
	char	*fp;
	int		ret;
	char	*fn, tmp[256], buf[BUFSIZ];

	if ( (fdl = FDL_open(0)) == NULL )
		return (ERR);
	FDL_set_title( fdl,"FILTER SEND FILE");
	FDL_set_wildcard( fdl, "*.*");
	ret = FDL_start(fdl);
	fn  = FDL_get_filename(fdl);
	if ( ret == NORMAL && strlen(fn) > 0 )
	{
		strcpy( tmp, fn );
	} else
		ret = ERR;
	FDL_close(fdl);

	if ( ret == NORMAL )
	{
		NTM_puts( ntm, "\r\n***** FILTER TEST *****\r\n");
		if ( (fp = FM_fopen( tmp,"rb")) == NULL )
		{
			NTM_puts( ntm, "\r\n@ File open error!!\r\n");
			return (ERR);
		}
		while ( fgets(buf,BUFSIZ,fp) != NULL )
		{
			NTM_sendFilter( ntm, buf );
			if ( kbhit() )
			{
				NTM_puts( ntm, "\r\n***** BREAK *****\r\n");
				break;
			}
		}
		FM_fclose(fp);
	}
	return (0);
}


/*************************************************************************
*	センター非選択状態のフィルタメニュー
*************************************************************************/

int		NtmUsr_filterMenu( char *ntm, int x, int y )
{
	int		ret;
	char	*obj;
	char	*mnu;

	obj = MNU_alloc(3);
	MNU_setObj(obj, 0, MNU_NOR, 'F', "Set filter pattern" , NULL, 1, NULL, NULL );
	MNU_setObj(obj, 1, MNU_NOR, 'O', "Filter mode off"    , NULL, 2, NULL, NULL );
	MNU_setObj(obj, 2, MNU_NOR, 'T', "Filter test"        , NULL, 3, NULL, NULL );
	mnu = MNU_open( x, y, MNUATT_EXIT, obj, "FILTER MENU" );
	ret = MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);
	switch ( ret )
	{
		case 1:
			_ntm_inputFilterPtn( ntm );
			break;
		case 2:	/* filter off */
			NtmSetFilterPtn( ntm, "",0 );
			NtmSetFilterFunc( ntm, NULL );
			NtmFilterModeOff( ntm );
			break;
		case 3:
			_ntm_filterTest( ntm );
			break;
	}
	return (NORMAL);
}


int	NtmUsr_func_01( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_FILEMENU );	}
int	NtmUsr_func_02( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_UPMENU   );	}
int	NtmUsr_func_03( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_DOWNMENU );	}
int	NtmUsr_func_04( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_AUTOMENU );	}
int	NtmUsr_func_05( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_SETUP    );	}
int	NtmUsr_func_06( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_FILTER   );	}

int	NtmUsr_func_10( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_BREAK    );	}
int	NtmUsr_func_11( char *ntm ) {        NTM_help( ntm ); return (NORMAL)   ;	}
int	NtmUsr_func_12( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_RESMAX   );	}
int	NtmUsr_func_32( char *ntm ) { return NTM_cmdJump( ntm, NTMCMD_RESMIN   );	}

int		ntm_saveColTbl( int ret, char *sbj )
{
	char	*ntm;
	char	*cns;

	ntm = GET_EVTSBJ_PTR(sbj);
	cns = NtmGetCnsPtr( ntm );
	CnsUsr_saveColTbl( cns );
	return (NORMAL);
}

/*************************************************************************
*	[SETUP2]
*************************************************************************/

int	NtmUsr_func_25( char *ntm )	/* [SHIFT]＋[PF5]	*/
{
	char		*mnu;
	char		*obj;

	obj = MNU_alloc(4);
	MNU_setObj(obj, 0, MNU_NOR, 'F' , "Change font size"  , NULL, NTMCMD_CHGFONT , NTMUSR_EVTFUNC  , ntm  );
	MNU_setObj(obj, 1, MNU_BLK,  0  , NULL                , NULL, 0              , NULL            , NULL );
	MNU_setObj(obj, 2, MNU_NOR, 'C' , "Change color table", NULL, NTMCMD_CHGCOLOR, NTMUSR_EVTFUNC  , ntm  );
	MNU_setObj(obj, 3, MNU_NOR, 'T' , "Save color table"  , NULL, 0              , "ntm_saveColTbl", ntm  );

	mnu = MNU_open( DLGPOS_MOS_SET_HOME, DLGPOS_MOS_SET_HOME,
	    MNUATT_EXIT, obj, "SETUP2" );
	MNU_start ( mnu );
	MNU_close(mnu);
	MNU_free(obj);

	return (NORMAL);
}

#include	"ntmlib.c"

#ifdef	_NIFTY
#	include	"nifty.c"
#endif
#ifdef	_NANNO
#	include	"PERSONAL/nanno.c"
#endif
#ifdef	_JATIC
#	include	"PERSONAL/jatic.c"
#endif
#ifdef	_OFN
#	include	"PERSONAL/ofn.c"
#endif
#ifdef	_HELINK
#	include	"PERSONAL/helink.c"
#endif

#ifdef	_CENTER00
#	include	"center00.c"
#endif
#ifdef	_CENTER01
#	include	"center01.c"
#endif
#ifdef	_CENTER02
#	include	"center02.c"
#endif
#ifdef	_CENTER03
#	include	"center03.c"
#endif
#ifdef	_CENTER04
#	include	"center04.c"
#endif


/*************************************************************************
*	システム初期化
*************************************************************************/

int		NtmUsr_sysInit()
{
	int			i;

#ifdef	_NIFTY
	_NIFTY_init();	/* NIFTY-Serve センター登録					*/
#endif
#ifdef	_NANNO
	_NANNO_init();	/* Nanno netセンター登録					*/
#endif
#ifdef	_JATIC
	_JATIC_init();	/* JATIC センター登録						*/
#endif
#ifdef	_OFN
	_OFN_init();	/* Oh!FM ＴＯＷＮＳ NET センター登録		*/
#endif
#ifdef	_HELINK
	_HELINK_init();	/* HE-LINK センター登録						*/
#endif

#ifdef	_CENTER00
	_CENTER00_init();
#endif
#ifdef	_CENTER01
	_CENTER01_init();
#endif
#ifdef	_CENTER02
	_CENTER02_init();
#endif
#ifdef	_CENTER03
	_CENTER03_init();
#endif
#ifdef	_CENTER04
	_CENTER04_init();
#endif

	NTM_loadCenterData( CENTER_DAT_FN );
}

int		NtmUsr_sysTerm( int saveFlag )
{
	if ( saveFlag )
		NTM_saveCenterData( CENTER_DAT_FN );
	return (NORMAL);
}


/*************************************************************************
*	受信ラインチェック
*************************************************************************/

int		NtmUsr_lineCheck( char *ntm, char *buf )
{
	return (NORMAL);
}

/*************************************************************************
*	入力文字列の送信
*************************************************************************/

int		NtmUsr_inputCheck( char *ntm, char *s )
{
	NTM_rsPuts( ntm, s );
	NTM_rsPuts( ntm, "\r" );
	return (NORMAL);
}
