#include "bbs.h"
extern long Startup_Time,Time_limit;
extern char ReservedName[];
extern int QuickFlag;
extern UBYTE ShutDownFlag;
extern char lang[];
void CallerIDLog(int opt);
extern int RingCount;

static void ReserveForUser(void)
{
 int stat;
 char str[34];
 struct User TUser;
 struct UserKeys TUserkeys;

Redo:
 AEPutStr("\r\nEnter username to reserve for: ");
 stat=LineInput("",str,30,KEYBOARD_TIMEOUT);
 if(stat<0||str[0]=='\0') 	return;
 stat=ChooseAName(str,&TUser,&TUserkeys,0);
 if(stat<FAILURE) 	return;
 if(stat==FAILURE)	goto Redo;
 strcpy(ReservedName,TUserkeys.UserName);
}


char ID_DATE[20];
char ID_TIME[20];
char ID_NMBR[50];
char ID_NAME[50];


static int do_baud(ULONG baudrate)
{
	Online_Baud  = baudrate;
	Online_BaudR = Cmds->OpeningBaud;

	IO_Flags[IOFLAG_SER_OUT] = 1;
	IO_Flags[IOFLAG_SCR_OUT] = 1;

	if(Cmds->AcLvl[LVL_VARYING_LINK_RATE]==1) SetBaud(baudrate);
	ConPutStr("\014");
	time(&Time_connect);
	return(REMOTE_LOGON);
}




int CallerID=0;

int Await_Logon(void)
{
 int stat,ch,c;
 int input;
 int RCount;
 ULONG sig;
 char string[81];

	sprintf(string,ctime(&Startup_Time));
	string[strlen(string)-1]='\0';
	StatMessage(48,3,string);

	strcpy(ID_DATE,"");
	strcpy(ID_NAME,"");
	strcpy(ID_TIME,"");
	strcpy(ID_NMBR,"");

	StatChatFlag();
	SetEnvStat(ENV_AWAITCONNECT);
	strcpy(lang,"txt");
	ClearProtocol();
	DisplayAwaitMsg();

	FOREVER	{

		Time_limit=1800;
		Time_holder=0;
		RCount=RingCount;

		if(TrapDoor) goto GO;
		AWAITLOGON=1;

		Cycle_The_Display();
	 	CheckIconifyMsg();
		ServerCmd=0;
		CheckDoorMsg(0);
		AWAITLOGON=0;

		if(ServerCmd)
			{
			strcpy(User.Name,"");
			strcpy(User.Location,"");

			switch(ServerCmd)
				{
case SV_RESERVE:		if(ReservedName[0]!='\0')
					{
					ReservedName[0]='\0';
					DisplayAwaitMsg();
					SetEnvStat(ENV_AWAITCONNECT);

					} else {

					IO_Flags[IOFLAG_SER_IN]=0;
					IO_Flags[IOFLAG_SER_OUT]=0;
					IO_Flags[IOFLAG_SCR_OUT]=1;
					IO_Flags[IOFLAG_KBD_IN]=1;
					Time_limit=3600L;
					Whence_The_Logon=LOCAL_LOGON;
					IntDoReset(Sopt->OffHook);
					ConPutStr("[ p\014");
					ReserveForUser();
					Reset_System(1);
					IO_Flags[IOFLAG_SER_IN]=1;
					IO_Flags[IOFLAG_SCR_OUT]=0;
					Whence_The_Logon=AWAIT_LOGON;
					strcpy(User.Name,ReservedName);
					strcpy(User.Location,"");
					SetEnvStat(ENV_RESERVE);
					DisplayAwaitMsg();
					}
                                   break;
         case SV_ACCOUNTS:
                              IO_Flags[IOFLAG_SER_IN]=0;
						IO_Flags[IOFLAG_SER_OUT]=0;
						IO_Flags[IOFLAG_SCR_OUT]=1;
						IO_Flags[IOFLAG_KBD_IN]=1;
						IntDoReset(Sopt->OffHook);
						ConPutStr("[ p\014");
						Time_limit=3600L;
						Whence_The_Logon=LOCAL_LOGON;
						Edit_Accounts();
						Reset_System(1);
						IO_Flags[IOFLAG_KBD_IN]=1;
						IO_Flags[IOFLAG_SER_IN]=1;
						if(IO_Flags[IOFLAG_FIL_IN])
							{
							IO_Flags[IOFLAG_FIL_IN]=0;
							}
						IO_Flags[IOFLAG_SCR_OUT]=0;
						IO_Flags[IOFLAG_SER_OUT]=0;
						Whence_The_Logon=AWAIT_LOGON;
                              SetEnvStat(ENV_AWAITCONNECT);
                              DisplayAwaitMsg();
                  break;
          case SV_NODEOFFHOOK: /* F10 - Exit Off Hook */
						IntDoReset(Sopt->OffHook);
						Delay(30L);
						ShutDown("!"); break;
		case SV_EXITNODE: /* F9 - Exit On Hook */
						Delay(30L);ShutDown("!"); break;
          case SV_AESHELL:
               SetEnvStat(ENV_AWAITCONNECT); break;
          case SV_INSTANT: goto GO; break;
        
         default: return(ServerCmd);
       					}

     			}



	    Delay(30L);

	    CheckRexxMessage();
	    if(ShutDownFlag)	return(SUSPEND_LOGON);

 	if(CheckCon()) {
strcpy(User.Name,""); strcpy(User.Location,"");
 		c=GetConKey(1L);
	    	if(c==155) {
 			ch=GetConKey(1L);
	    		c=GetConKey(1L);
		    	if(c==126) {
 				switch(ch) {
 					case '?':               /* Help - ToggleStat */
 						ToggleStatusDisplay();
	    					break;
	    				case '9':               /* F10 - Exit Off Hook */
		    				IntDoReset(Sopt->OffHook);
			    			Delay(30L);
				    		ShutDown("!");
		    			case '8':               /* F9 - Exit On Hook */
						    ShutDown("!");
			    	    	case '7':           /* F8 - Reprogram modem */
					    	ReInitModem();
						    Reset_System(1);
						    continue;
				    	case '6':               /* F7 - Toggle Chat Bit */
			    			if(SySChat==1)	SySChat=0;
				    		else			SySChat=1;
					    	StatChatFlag();
						    break;
					    case '5':               /* F6 - Account Editting */
 						IO_Flags[IOFLAG_SER_IN]=0;
	    					IO_Flags[IOFLAG_SER_OUT]=0;
		    				IO_Flags[IOFLAG_SCR_OUT]=1;
			    			IO_Flags[IOFLAG_KBD_IN]=1;
				    		IntDoReset(Sopt->OffHook);
					    	ConPutStr("[ p\014");
 						Time_limit=3600L;
	    					Whence_The_Logon=LOCAL_LOGON;
                              Load_Account(1,&User,&User_keys);
		    				Edit_Accounts();
			    			Reset_System(1);
				    		IO_Flags[IOFLAG_KBD_IN]=1;
					    	IO_Flags[IOFLAG_SER_IN]=1;
						    if(IO_Flags[IOFLAG_FIL_IN])
 							IO_Flags[IOFLAG_FIL_IN]=0;
	    					IO_Flags[IOFLAG_SCR_OUT]=0;
		    				IO_Flags[IOFLAG_SER_OUT]=0;
			    			Whence_The_Logon=AWAIT_LOGON;
                              SetEnvStat(ENV_AWAITCONNECT);
                                  DisplayAwaitMsg();
				    		continue;
//					    case '4':               /* F5 - Local Shell */
//						    (void)LRemoteShell();
//						    break;
 					case '3':
	    					if(ReservedName[0]!='\0') {
 							ReservedName[0]='\0';
	    						DisplayAwaitMsg();
							} else	{
 							IO_Flags[IOFLAG_SER_IN]=0;
	    						IO_Flags[IOFLAG_SER_OUT]=0;
		    					IO_Flags[IOFLAG_SCR_OUT]=1;
			    				IO_Flags[IOFLAG_KBD_IN]=1;
				    			Time_limit=3600L;
					    		Whence_The_Logon=LOCAL_LOGON;
						    	IntDoReset(Sopt->OffHook);
							    ConPutStr("[ p\014");
 							ReserveForUser();
	    						Reset_System(1);
		    					IO_Flags[IOFLAG_SER_IN]=1;
			    				IO_Flags[IOFLAG_SCR_OUT]=0;
				    			Whence_The_Logon=AWAIT_LOGON;
                                    
                                   DisplayAwaitMsg();
							}
					    	continue;
					    case '2':           /* F3 - Instant Remote Logon */
					    	goto GO;
				    	case '1':           /* F2 - Local Login */
					    	strcpy(ConnectString,"F2_LOCAL");
					    	(void)StatClearTime();
						    IO_Flags[IOFLAG_SER_IN]=0;
					    	IO_Flags[IOFLAG_SER_OUT]=0;
						    IO_Flags[IOFLAG_SCR_OUT]=1;
 						IO_Flags[IOFLAG_KBD_IN]=1;
	    					ConPutStr("[ p\014");
		    				time(&Time_connect);

				    		Online_Baud=Cmds->OpeningBaud;
					    	Online_BaudR=Cmds->OpeningBaud;
					    	IntDoReset(Sopt->OffHook);
						    return(LOCAL_LOGON);
 					case '0':           /* F1 - Sysop Login */
	    					strcpy(ConnectString,"SYSOP_LOCAL");
		    				(void)StatClearTime();
			    			IO_Flags[IOFLAG_SER_IN]=0;
				    		IO_Flags[IOFLAG_SER_OUT]=0;
					    	IO_Flags[IOFLAG_SCR_OUT]=1;
						    IO_Flags[IOFLAG_KBD_IN]=1;
 						AnsiColor=1;
	    					QuickFlag=1;
		    				ConPutStr("[ p\014");
			    			time(&Time_connect);
				    		Online_Baud=Cmds->OpeningBaud;
					    	Online_BaudR=Cmds->OpeningBaud;

						    IntDoReset(Sopt->OffHook);
 						return(SYSOP_LOGON);
					}      /* end switch */
				}          /* end if ch=126 */
			}              /* end if c==125 */
		}                  /* end if CheckCon() */



	    if(CheckSer())
		{
		strcpy(User.Name,"");
		strcpy(User.Location,"");
 		IO_Flags[IOFLAG_SER_IN]=1;
	    	IO_Flags[IOFLAG_SER_OUT]=0;


		if(!(strcmp(Cmds->SerDev,"nullmodem.device")))
			{
			SerPutStr("\r");
			strcpy(string,"CONNECT 19200");
			goto KEWL;
			}

		while(RCount)
			{
			LineInput("",string,80,5L);
			if((stat=StringCompare(string,Cmds->MRing))==FAILURE) break;
			RCount -=1;
			}
	
		if(RCount) continue;


		if(Sopt->Toggles[15] || Sopt->Toggles[16])
			{
			LineInput("",ID_DATE,14,5L);
			LineInput("",ID_DATE,14,5L);
			LineInput("",ID_TIME,14,5L);
			LineInput("",ID_NMBR,40,5L);
			if(Sopt->Toggles[16]) LineInput("",ID_NAME,40,5L);
			CallerIDLog(1);
			}

		/* OTHERWISE EQUAL, ANSWER AND SET BAUDS */

GO:
		StatClearTime();

		IO_Flags[IOFLAG_SER_IN]=1;
		IO_Flags[IOFLAG_SER_OUT]=0;

		if(!TrapDoor)
			{

			SerPutStr(Cmds->MAnswer);
			SerPutChar("\r");
			input=LineInput("",string,80,40L);
			if(input==TIMEOUT) goto Timedout;
			input=LineInput("",string,80,40L);

			} else {

			strcpy(string,TrapConnect);
			}

KEWL:
		strcpy(ConnectString,string);

		if(!TrapDoor)
			{
			if(input==TIMEOUT) goto Timedout;
			}
          
		if(!strnicmp(string,"CONNECT ",8)) return(do_baud(atol(&string[8])));

		Online_Baud=Online_BaudR;
		SetEnvStat(ENV_AWAITCONNECT);

		goto Timedout; 

		} else {

  		continue;

		}


	    /* ELSE RESET, PURGE AND CONTINUE THE LOOP */
Timedout:
		DropDTR();
		Delay(25L);

		if(Cmds->AcLvl[LVL_VARYING_LINK_RATE]==1)
			{
 			SetBaud(Cmds->OpeningBaud);
		    	Delay(25L);
			}
	 	IntDoReset(Cmds->MReset);
	 	SerPutChar("\r");
		Delay(25L);
		PurgeLine();
		}

	return(SUCCESS);
}


void Server(int Code)
{
   switch(Code)
   {
     case SV_SYSOPLOG:
          strcpy(ConnectString,"SYSOP_LOCAL");
		(void)StatClearTime();
		IO_Flags[IOFLAG_SER_IN]=0;
		IO_Flags[IOFLAG_SER_OUT]=0;
		IO_Flags[IOFLAG_SCR_OUT]=1;
		IO_Flags[IOFLAG_KBD_IN]=1;
		AnsiColor=1;
		QuickFlag=1;
		ConPutStr("[ p\014");
		time(&Time_connect);
		Online_Baud=Cmds->OpeningBaud;
		Online_BaudR=Cmds->OpeningBaud;
		IntDoReset(Sopt->OffHook);
          ServerCmd=SYSOP_LOGON;
          break;
     case SV_LOCALLOG:
	strcpy(ConnectString,"F2_LOCAL");
					    
						(void)StatClearTime();
						IO_Flags[IOFLAG_SER_IN]=0;
						IO_Flags[IOFLAG_SER_OUT]=0;
						IO_Flags[IOFLAG_SCR_OUT]=1;
						IO_Flags[IOFLAG_KBD_IN]=1;
						ConPutStr("[ p\014");
						time(&Time_connect);
						Online_Baud=Cmds->OpeningBaud;
						Online_BaudR=Cmds->OpeningBaud;
						IntDoReset(Sopt->OffHook);
						ServerCmd=LOCAL_LOGON;
          break;
     case SV_ACCOUNTS:
          ServerCmd=SV_ACCOUNTS; break;
     case SV_CHAT:
          ServerCmd=SV_CHAT; break;
     case SV_EXITNODE:
          ServerCmd=SV_EXITNODE; break;
     case SV_NODEOFFHOOK:
          ServerCmd=SV_NODEOFFHOOK; break;
     case SV_INITMODEM:
          ServerCmd=0;ReInitModem();Reset_System(0);IO_Flags[IOFLAG_KBD_IN]=0;IO_Flags[IOFLAG_SCR_OUT]=0;break;
     case SV_INSTANT:
          ServerCmd=SV_INSTANT; break;
     case SV_RESERVE:
          ServerCmd=SV_RESERVE; break;
     case SV_CHATTOGGLE:
          ServerCmd=0; if(SySChat) SySChat=0; else SySChat=1;
          StatChatFlag();
          break;
     case SV_QUIETNODE:
          ServerCmd=0; if(QuietNode) QuietNode=0; else QuietNode=1;
          SendQuietFlag(QuietNode); break;
     case SV_AESHELL:
          ServerCmd=SV_AESHELL; break;
   }
}

